mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 11:01:37 -05:00
Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f579d1bb8d | ||
|
|
b35241dbe6 | ||
|
|
588b9a1fcf | ||
|
|
0c870ed4e6 | ||
|
|
3d6929e78f | ||
|
|
fd08943244 | ||
|
|
8c99e22fb4 | ||
|
|
86fbc4002a | ||
|
|
2f57356ae8 | ||
|
|
eca946a885 | ||
|
|
601bd4bd03 | ||
|
|
87b064aa7e | ||
|
|
d87eebd6a5 | ||
|
|
9c14910c55 | ||
|
|
61e3700ed4 | ||
|
|
09f017c6f4 | ||
|
|
b01218cbbc | ||
|
|
f984e89493 | ||
|
|
479fac2310 | ||
|
|
32ea281e11 | ||
|
|
29031462c7 | ||
|
|
7379d66729 | ||
|
|
705a7d7dc6 | ||
|
|
9764438982 |
@@ -179,13 +179,6 @@ steps:
|
||||
zip -d $(agent.builddirectory)/VSCode-darwin.zip "*.pkg"
|
||||
displayName: Clean Archive
|
||||
|
||||
- script: |
|
||||
set -e
|
||||
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
||||
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
|
||||
node build/azure-pipelines/common/createAsset.js darwin-unnotarized archive "VSCode-darwin-$VSCODE_QUALITY.zip" $(agent.builddirectory)/VSCode-darwin.zip
|
||||
displayName: Publish Unnotarized Build
|
||||
|
||||
- script: |
|
||||
APP_ROOT=$(agent.builddirectory)/VSCode-darwin
|
||||
APP_NAME="`ls $APP_ROOT | head -n 1`"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[
|
||||
{
|
||||
"name": "Microsoft.sqlservernotebook",
|
||||
"version": "0.3.4",
|
||||
"version": "0.3.5",
|
||||
"repo": "https://github.com/Microsoft/azuredatastudio"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -39,6 +39,11 @@
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"description": "%config.enablePublicCloudDescription%"
|
||||
},
|
||||
"accounts.azure.enableDeviceCodeLogin": {
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"description": "%config.enableDeviceCodeLogin%"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -21,5 +21,6 @@
|
||||
"config.enableUsGovCloudDescription": "Should US Government Azure cloud (Fairfax) integration be enabled",
|
||||
"config.enableChinaCloudDescription": "Should Azure China integration be enabled",
|
||||
"config.enableGermanyCloudDescription": "Should Azure Germany integration be enabled",
|
||||
"config.enableArcFeatures": "Should features related to Azure Arc be enabled (preview)"
|
||||
"config.enableArcFeatures": "Should features related to Azure Arc be enabled (preview)",
|
||||
"config.enableDeviceCodeLogin": "Enable Azure Active Directory device code login mechanism"
|
||||
}
|
||||
|
||||
@@ -44,6 +44,10 @@ export class AzureAccountProvider implements azdata.AccountProvider {
|
||||
constructor(private metadata: AzureAccountProviderMetadata, private _tokenCache: TokenCache, private _context: vscode.ExtensionContext) {
|
||||
this.commonAuthorityUrl = url.resolve(this.metadata.settings.host, AzureAccountProvider.AadCommonTenant);
|
||||
}
|
||||
// interface method
|
||||
clearTokenCache(): Thenable<void> {
|
||||
return this._tokenCache.clear();
|
||||
}
|
||||
|
||||
// interface method
|
||||
initialize(storedAccounts: azdata.Account[]): Thenable<azdata.Account[]> {
|
||||
|
||||
@@ -10,7 +10,8 @@ import * as path from 'path';
|
||||
import * as vscode from 'vscode';
|
||||
import CredentialServiceTokenCache from './tokenCache';
|
||||
import providerSettings from './providerSettings';
|
||||
import { AzureAccountProvider as AzureAccountProvider } from './azureAccountProvider2';
|
||||
import { AzureAccountProvider as OAuthAzureAccountProvider } from './azureAccountProvider2';
|
||||
import { AzureAccountProvider as DeviceCodeAzureAccountProvider } from './azureAccountProvider';
|
||||
import { AzureAccountProviderMetadata, ProviderSettings } from './interfaces';
|
||||
import * as loc from '../localizedConstants';
|
||||
|
||||
@@ -70,8 +71,7 @@ export class AzureAccountProviderService implements vscode.Disposable {
|
||||
// let self = this;
|
||||
|
||||
let promises: Thenable<void>[] = providerSettings.map(provider => {
|
||||
// return self._accountProviders[provider.metadata.id].clearTokenCache();
|
||||
return Promise.resolve();
|
||||
return this._accountProviders[provider.metadata.id]?.clearTokenCache();
|
||||
});
|
||||
|
||||
return Promise.all(promises)
|
||||
@@ -133,12 +133,18 @@ export class AzureAccountProviderService implements vscode.Disposable {
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
//let config = vscode.workspace.getConfiguration(AzureAccountProviderService.ConfigurationSection);
|
||||
let config = vscode.workspace.getConfiguration(AzureAccountProviderService.ConfigurationSection);
|
||||
|
||||
let tokenCacheKey = `azureTokenCache-${provider.metadata.id}`;
|
||||
let tokenCachePath = path.join(this._userStoragePath, tokenCacheKey);
|
||||
let tokenCache = new CredentialServiceTokenCache(self._credentialProvider, tokenCacheKey, tokenCachePath);
|
||||
let accountProvider = new AzureAccountProvider(provider.metadata as AzureAccountProviderMetadata, tokenCache, this._context);
|
||||
const enableDeviceCode = config.get('enableDeviceCodeLogin');
|
||||
let accountProvider: azdata.AccountProvider;
|
||||
if (enableDeviceCode === undefined || enableDeviceCode === false) {
|
||||
accountProvider = new OAuthAzureAccountProvider(provider.metadata as AzureAccountProviderMetadata, tokenCache, this._context);
|
||||
} else {
|
||||
accountProvider = new DeviceCodeAzureAccountProvider(provider.metadata as AzureAccountProviderMetadata, tokenCache);
|
||||
}
|
||||
self._accountProviders[provider.metadata.id] = accountProvider;
|
||||
self._accountDisposals[provider.metadata.id] = azdata.accounts.registerAccountProvider(provider.metadata, accountProvider);
|
||||
resolve();
|
||||
|
||||
@@ -149,13 +149,26 @@ export function registerAzureResourceCommands(appContext: AppContext, tree: Azur
|
||||
};
|
||||
}).sort((a, b) => a.label.localeCompare(b.label));
|
||||
|
||||
const selectedSubscriptionQuickPickItems = await window.showQuickPick(subscriptionQuickPickItems, { canPickMany: true });
|
||||
if (selectedSubscriptionQuickPickItems && selectedSubscriptionQuickPickItems.length > 0) {
|
||||
await tree.refresh(node, false);
|
||||
const selectedQuickPickItems = subscriptionQuickPickItems.filter(s => s.picked);
|
||||
|
||||
selectedSubscriptions = selectedSubscriptionQuickPickItems.map((subscriptionItem) => subscriptionItem.subscription);
|
||||
await subscriptionFilterService.saveSelectedSubscriptions(accountNode.account, selectedSubscriptions);
|
||||
}
|
||||
const quickPick = window.createQuickPick<AzureResourceSubscriptionQuickPickItem>();
|
||||
quickPick.ok = true;
|
||||
quickPick.items = subscriptionQuickPickItems;
|
||||
quickPick.canSelectMany = true;
|
||||
quickPick.selectedItems = selectedQuickPickItems;
|
||||
|
||||
quickPick.show();
|
||||
|
||||
quickPick.onDidAccept(async event => {
|
||||
quickPick.hide();
|
||||
const selectedSubscriptionQuickPickItems = quickPick.selectedItems;
|
||||
if (selectedSubscriptionQuickPickItems && selectedSubscriptionQuickPickItems.length > 0) {
|
||||
await tree.refresh(node, false);
|
||||
|
||||
selectedSubscriptions = selectedSubscriptionQuickPickItems.map((subscriptionItem) => subscriptionItem.subscription);
|
||||
await subscriptionFilterService.saveSelectedSubscriptions(accountNode.account, selectedSubscriptions);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
appContext.apiWrapper.registerCommand('azure.resource.refreshall', () => tree.notifyNodeChanged(undefined));
|
||||
|
||||
@@ -54,19 +54,21 @@ export class AzureResourceSubscriptionFilterService implements IAzureResourceSub
|
||||
filters.push(...selectedSubscriptionsCache[accountId].map((subcription) => `${accountId}/${subcription.id}/${subcription.name}`));
|
||||
}
|
||||
|
||||
const resourceFilterConfig = this._config.inspect<string[]>(AzureResourceSubscriptionFilterService.filterConfigName);
|
||||
let configTarget = ConfigurationTarget.Global;
|
||||
if (resourceFilterConfig) {
|
||||
if (resourceFilterConfig.workspaceFolderValue) {
|
||||
configTarget = ConfigurationTarget.WorkspaceFolder;
|
||||
} else if (resourceFilterConfig.workspaceValue) {
|
||||
configTarget = ConfigurationTarget.Workspace;
|
||||
} else if (resourceFilterConfig.globalValue) {
|
||||
configTarget = ConfigurationTarget.Global;
|
||||
if (this._config) {
|
||||
const resourceFilterConfig = this._config.inspect<string[]>(AzureResourceSubscriptionFilterService.filterConfigName);
|
||||
let configTarget = ConfigurationTarget.Global;
|
||||
if (resourceFilterConfig) {
|
||||
if (resourceFilterConfig.workspaceFolderValue) {
|
||||
configTarget = ConfigurationTarget.WorkspaceFolder;
|
||||
} else if (resourceFilterConfig.workspaceValue) {
|
||||
configTarget = ConfigurationTarget.Workspace;
|
||||
} else if (resourceFilterConfig.globalValue) {
|
||||
configTarget = ConfigurationTarget.Global;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await this._config.update(AzureResourceSubscriptionFilterService.filterConfigName, filters, configTarget);
|
||||
await this._config.update(AzureResourceSubscriptionFilterService.filterConfigName, filters, configTarget);
|
||||
}
|
||||
}
|
||||
|
||||
private _config: WorkspaceConfiguration = undefined;
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.451 5.609l-.579-.939-1.068.812-.076.094c-.335.415-.927 1.341-1.124 2.876l-.021.165.033.163.071.345c0 1.654-1.346 3-3 3-.795 0-1.545-.311-2.107-.868-.563-.567-.873-1.317-.873-2.111 0-1.431 1.007-2.632 2.351-2.929v2.926s2.528-2.087 2.984-2.461h.012l3.061-2.582-4.919-4.1h-1.137v2.404c-3.429.318-6.121 3.211-6.121 6.721 0 1.809.707 3.508 1.986 4.782 1.277 1.282 2.976 1.988 4.784 1.988 3.722 0 6.75-3.028 6.75-6.75 0-1.245-.349-2.468-1.007-3.536z" fill="#2D2D30"/><path d="M12.6 6.134l-.094.071c-.269.333-.746 1.096-.91 2.375.057.277.092.495.092.545 0 2.206-1.794 4-4 4-1.098 0-2.093-.445-2.817-1.164-.718-.724-1.163-1.718-1.163-2.815 0-2.206 1.794-4 4-4l.351.025v1.85s1.626-1.342 1.631-1.339l1.869-1.577-3.5-2.917v2.218l-.371-.03c-3.176 0-5.75 2.574-5.75 5.75 0 1.593.648 3.034 1.695 4.076 1.042 1.046 2.482 1.694 4.076 1.694 3.176 0 5.75-2.574 5.75-5.75-.001-1.106-.318-2.135-.859-3.012z" fill="#C5C5C5"/></svg>
|
||||
|
After Width: | Height: | Size: 986 B |
1
extensions/big-data-cluster/resources/light/refresh.svg
Normal file
1
extensions/big-data-cluster/resources/light/refresh.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.451 5.609l-.579-.939-1.068.812-.076.094c-.335.415-.927 1.341-1.124 2.876l-.021.165.033.163.071.345c0 1.654-1.346 3-3 3-.795 0-1.545-.311-2.107-.868-.563-.567-.873-1.317-.873-2.111 0-1.431 1.007-2.632 2.351-2.929v2.926s2.528-2.087 2.984-2.461h.012l3.061-2.582-4.919-4.1h-1.137v2.404c-3.429.318-6.121 3.211-6.121 6.721 0 1.809.707 3.508 1.986 4.782 1.277 1.282 2.976 1.988 4.784 1.988 3.722 0 6.75-3.028 6.75-6.75 0-1.245-.349-2.468-1.007-3.536z" fill="#F6F6F6"/><path d="M12.6 6.134l-.094.071c-.269.333-.746 1.096-.91 2.375.057.277.092.495.092.545 0 2.206-1.794 4-4 4-1.098 0-2.093-.445-2.817-1.164-.718-.724-1.163-1.718-1.163-2.815 0-2.206 1.794-4 4-4l.351.025v1.85s1.626-1.342 1.631-1.339l1.869-1.577-3.5-2.917v2.218l-.371-.03c-3.176 0-5.75 2.574-5.75 5.75 0 1.593.648 3.034 1.695 4.076 1.042 1.046 2.482 1.694 4.076 1.694 3.176 0 5.75-2.574 5.75-5.75-.001-1.106-.318-2.135-.859-3.012z" fill="#424242"/></svg>
|
||||
|
After Width: | Height: | Size: 986 B |
@@ -698,43 +698,6 @@
|
||||
"isRequired": false,
|
||||
"isArray": false
|
||||
},
|
||||
{
|
||||
"specialValueType": null,
|
||||
"isIdentity": false,
|
||||
"name": "attestationProtocol",
|
||||
"displayName": "%mssql.connectionOptions.enclaveAttestationProtocol.displayName%",
|
||||
"description": "%mssql.connectionOptions.enclaveAttestationProtocol.description%",
|
||||
"groupName": "Security",
|
||||
"valueType": "category",
|
||||
"defaultValue": null,
|
||||
"objectType": null,
|
||||
"categoryValues": [
|
||||
{
|
||||
"displayName": "%mssql.connectionOptions.enclaveAttestationProtocol.categoryValues.HGS%",
|
||||
"name": "HGS"
|
||||
},
|
||||
{
|
||||
"displayName": "%mssql.connectionOptions.enclaveAttestationProtocol.categoryValues.AAS%",
|
||||
"name": "AAS"
|
||||
}
|
||||
],
|
||||
"isRequired": false,
|
||||
"isArray": false
|
||||
},
|
||||
{
|
||||
"specialValueType": null,
|
||||
"isIdentity": false,
|
||||
"name": "enclaveAttestationUrl",
|
||||
"displayName": "%mssql.connectionOptions.enclaveAttestationUrl.displayName%",
|
||||
"description": "%mssql.connectionOptions.enclaveAttestationUrl.description%",
|
||||
"groupName": "Security",
|
||||
"valueType": "string",
|
||||
"defaultValue": null,
|
||||
"objectType": null,
|
||||
"categoryValues": null,
|
||||
"isRequired": false,
|
||||
"isArray": false
|
||||
},
|
||||
{
|
||||
"specialValueType": null,
|
||||
"isIdentity": false,
|
||||
|
||||
@@ -91,14 +91,8 @@
|
||||
"mssql.connectionOptions.connectTimeout.description": "The length of time (in seconds) to wait for a connection to the server before terminating the attempt and generating an error",
|
||||
"mssql.connectionOptions.currentLanguage.displayName": "Current language",
|
||||
"mssql.connectionOptions.currentLanguage.description": "The SQL Server language record name",
|
||||
"mssql.connectionOptions.columnEncryptionSetting.displayName": "Always Encrypted",
|
||||
"mssql.connectionOptions.columnEncryptionSetting.description": "Enables or disables Always Encrypted for the connection",
|
||||
"mssql.connectionOptions.enclaveAttestationProtocol.displayName": "Attestation Protocol",
|
||||
"mssql.connectionOptions.enclaveAttestationProtocol.description": "Specifies a protocol for attesting a server-side enclave used with Always Encrypted with secure enclaves",
|
||||
"mssql.connectionOptions.enclaveAttestationProtocol.categoryValues.AAS": "Azure Attestation",
|
||||
"mssql.connectionOptions.enclaveAttestationProtocol.categoryValues.HGS": "Host Guardian Service",
|
||||
"mssql.connectionOptions.enclaveAttestationUrl.displayName": "Enclave Attestation URL",
|
||||
"mssql.connectionOptions.enclaveAttestationUrl.description": "Specifies an endpoint for attesting a server-side enclave used with Always Encrypted with secure enclaves",
|
||||
"mssql.connectionOptions.columnEncryptionSetting.displayName": "Column encryption",
|
||||
"mssql.connectionOptions.columnEncryptionSetting.description": "Default column encryption setting for all the commands on the connection",
|
||||
"mssql.connectionOptions.encrypt.displayName": "Encrypt",
|
||||
"mssql.connectionOptions.encrypt.description": "When true, SQL Server uses SSL encryption for all data sent between the client and server if the server has a certificate installed",
|
||||
"mssql.connectionOptions.persistSecurityInfo.displayName": "Persist security info",
|
||||
|
||||
@@ -12,7 +12,8 @@ const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const externals = {
|
||||
'node-fetch': 'commonjs node-fetch'
|
||||
'node-fetch': 'commonjs node-fetch',
|
||||
'adm-zip': 'commonjs adm-zip'
|
||||
};
|
||||
|
||||
// conditionally add ws if we are going to be running in a node environment
|
||||
|
||||
@@ -480,7 +480,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@jupyterlab/services": "^3.2.1",
|
||||
"decompress": "^4.2.0",
|
||||
"@types/adm-zip": "^0.4.32",
|
||||
"@types/tar": "^4.0.3",
|
||||
"adm-zip": "^0.4.14",
|
||||
"error-ex": "^1.3.1",
|
||||
"fast-glob": "^3.0.4",
|
||||
"figures": "^2.0.0",
|
||||
@@ -488,6 +490,7 @@
|
||||
"glob": "^7.1.1",
|
||||
"node-fetch": "^2.3.0",
|
||||
"request": "^2.88.0",
|
||||
"tar": "^6.0.1",
|
||||
"temp-write": "^3.4.0",
|
||||
"vscode-languageclient": "^5.3.0-next.1",
|
||||
"vscode-nls": "^4.0.0",
|
||||
|
||||
@@ -37,5 +37,5 @@
|
||||
"title.openJupyterBook": "Open Jupyter Book",
|
||||
"title.closeJupyterBook": "Close Jupyter Book",
|
||||
"title.revealInBooksViewlet": "Reveal in Books",
|
||||
"title.createJupyterBook": "Create Book"
|
||||
"title.createJupyterBook": "Create Book (Preview)"
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"# Jupyter Books\n",
|
||||
"# Create Jupyter Book\n",
|
||||
"\n",
|
||||
"## 1. Installation\n",
|
||||
"\n",
|
||||
@@ -41,7 +41,7 @@
|
||||
"#install jupyter-book\r\n",
|
||||
"cmd = f'{sys.executable} -m pip show jupyter-book'\r\n",
|
||||
"cmdOutput = !{cmd}\r\n",
|
||||
"if len(cmdOutput) > 0 and '0.6.4' in cmdOutput[1]:\r\n",
|
||||
"if len(cmdOutput) > 1 and '0.6.4' in cmdOutput[1]:\r\n",
|
||||
" print('Jupyter-book required version is already installed!')\r\n",
|
||||
"else:\r\n",
|
||||
" !pip install jupyter-book"
|
||||
@@ -183,48 +183,6 @@
|
||||
"outputs": [],
|
||||
"execution_count": null
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### <span style=\"color:red\">Issue:</span> generate_toc.py is missing\r\n",
|
||||
"\r\n",
|
||||
"Jupyter Book uses the Table of Contents to define the structure of your book. For example, your chapters, sub-chapters, etc.\r\n",
|
||||
"\r\n",
|
||||
"Need to manually modify the Table of Contents (located here: mybookname/_data/toc.yml) following structure below:\r\n",
|
||||
"\r\n",
|
||||
"```\r\n",
|
||||
"- title: mytitle # Title of chapter or section\r\n",
|
||||
" url: /myurl # URL of section relative to the /content/ folder.\r\n",
|
||||
" sections: # Contains a list of more entries that make up the chapter's sections\r\n",
|
||||
" not_numbered: true # if the section shouldn't have a number in the sidebar\r\n",
|
||||
" (e.g. Introduction or appendices)\r\n",
|
||||
" expand_sections: true # if you'd like the sections of this chapter to always\r\n",
|
||||
" be expanded in the sidebar.\r\n",
|
||||
" external: true # Whether the URL is an external link or points to content in the book\r\n",
|
||||
"```\r\n",
|
||||
"\r\n",
|
||||
"Example from demo book:\r\n",
|
||||
"\r\n",
|
||||
"```\r\n",
|
||||
"- title: Getting started\r\n",
|
||||
" url: /guide/01_overview\r\n",
|
||||
" not_numbered: true\r\n",
|
||||
" expand_sections: true\r\n",
|
||||
" sections:\r\n",
|
||||
" - title: Create your book\r\n",
|
||||
" url: /guide/02_create\r\n",
|
||||
" - title: Build and publish your book\r\n",
|
||||
" url: /guide/03_build\r\n",
|
||||
" - title: FAQ\r\n",
|
||||
" url: /guide/04_faq\r\n",
|
||||
" - title: How-to and advanced topics\r\n",
|
||||
" url: /guide/05_advanced\r\n",
|
||||
"```"
|
||||
],
|
||||
"metadata": {
|
||||
"azdata_cell_guid": "5439d5e9-6a98-4255-8afa-3c2ba48bfc7e"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
@@ -241,7 +199,8 @@
|
||||
"import re, os\r\n",
|
||||
"from IPython.display import *\r\n",
|
||||
"if os.name == 'nt':\r\n",
|
||||
" display(HTML(\"<h2><b><a href=\\\"command:bookTreeView.openBook?"\"+str(re.escape(book_name))+\""\\\"><font size=\\\"3\\\">Click here to open your Book in ADS</font></a></b></h2>\"))\r\n",
|
||||
" bookPath = book_name.replace('\\\\', '\\\\\\\\')\r\n",
|
||||
" display(HTML(\"<h2><b><a href=\\\"command:bookTreeView.openBook?"\"+str(bookPath)+\""\\\"><font size=\\\"3\\\">Click here to open your Book in ADS</font></a></b></h2>\"))\r\n",
|
||||
"else:\r\n",
|
||||
" display(HTML(\"<h2><b><a href=\\\"command:bookTreeView.openBook?"\"+str(book_name)+\""\\\"><font size=\\\"3\\\">Click here to open your Book in ADS</font></a></b></h2>\"))"
|
||||
],
|
||||
@@ -258,7 +217,7 @@
|
||||
"<span style=\"color:red\">**Note**: On clicking the above link, we create a temporary toc.yml file for your convenience.</span>\r\n",
|
||||
"\r\n",
|
||||
" Please update that file inside your book (located at: *YourbookPath*/_data/toc.yml) if you want to further customize your book following \r\n",
|
||||
" the above instructions or https://jupyterbook.org/guide/01-5_tour.html#Table-of-Contents.\r\n",
|
||||
" instructions at https://jupyterbook.org/guide/01-5_tour.html#Table-of-Contents.\r\n",
|
||||
""
|
||||
],
|
||||
"metadata": {
|
||||
@@ -271,7 +230,8 @@
|
||||
"display(HTML(\"<h1><b>That's it!</b></h1><br/><p>You are good to view your book in Azure Data Studio by clicking on the above link.</p>\"))"
|
||||
],
|
||||
"metadata": {
|
||||
"azdata_cell_guid": "bd2fe173-66ce-48b3-8dc3-c4d7560953c8"
|
||||
"azdata_cell_guid": "bd2fe173-66ce-48b3-8dc3-c4d7560953c8",
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [],
|
||||
"execution_count": null
|
||||
|
||||
@@ -45,7 +45,7 @@ export class BookTreeItem extends vscode.TreeItem {
|
||||
this.contextValue = 'savedBook';
|
||||
}
|
||||
} else {
|
||||
if (book.type === BookTreeItemType.Markdown && book.page.expand_sections) {
|
||||
if (book.page && book.page.sections && book.page.sections.length > 0) {
|
||||
this.contextValue = 'section';
|
||||
}
|
||||
this.setPageVariables();
|
||||
|
||||
@@ -8,8 +8,9 @@ import * as path from 'path';
|
||||
import * as nls from 'vscode-nls';
|
||||
import * as azdata from 'azdata';
|
||||
import { ExecOptions } from 'child_process';
|
||||
import * as decompress from 'decompress';
|
||||
import * as request from 'request';
|
||||
import * as zip from 'adm-zip';
|
||||
import * as tar from 'tar';
|
||||
|
||||
import { ApiWrapper } from '../common/apiWrapper';
|
||||
import * as constants from '../common/constants';
|
||||
@@ -229,8 +230,15 @@ export class JupyterServerInstallation implements IJupyterServerInstallation {
|
||||
return reject(err);
|
||||
}
|
||||
}
|
||||
decompress(pythonPackagePathLocal, installPath).then(files => {
|
||||
//Delete zip/tar file
|
||||
if (utils.getOSPlatform() === utils.Platform.Windows) {
|
||||
try {
|
||||
let zippedFile = new zip(pythonPackagePathLocal);
|
||||
zippedFile.extractAllTo(installPath);
|
||||
} catch (err) {
|
||||
backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonUnpackError);
|
||||
reject(err);
|
||||
}
|
||||
// Delete zip file
|
||||
fs.unlink(pythonPackagePathLocal, (err) => {
|
||||
if (err) {
|
||||
backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonUnpackError);
|
||||
@@ -241,10 +249,23 @@ export class JupyterServerInstallation implements IJupyterServerInstallation {
|
||||
outputChannel.appendLine(msgPythonDownloadComplete);
|
||||
backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonDownloadComplete);
|
||||
resolve();
|
||||
}).catch(err => {
|
||||
backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonUnpackError);
|
||||
reject(err);
|
||||
});
|
||||
} else {
|
||||
tar.extract({ file: pythonPackagePathLocal, cwd: installPath }).then(() => {
|
||||
// Delete tar file
|
||||
fs.unlink(pythonPackagePathLocal, (err) => {
|
||||
if (err) {
|
||||
backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonUnpackError);
|
||||
reject(err);
|
||||
}
|
||||
});
|
||||
outputChannel.appendLine(msgPythonDownloadComplete);
|
||||
backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonDownloadComplete);
|
||||
resolve();
|
||||
}).catch(err => {
|
||||
backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonUnpackError);
|
||||
reject(err);
|
||||
});
|
||||
}
|
||||
})
|
||||
.on('error', (downloadError) => {
|
||||
backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonDownloadError);
|
||||
|
||||
@@ -157,6 +157,13 @@
|
||||
dependencies:
|
||||
"@phosphor/algorithm" "^1.1.2"
|
||||
|
||||
"@types/adm-zip@^0.4.32":
|
||||
version "0.4.32"
|
||||
resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.4.32.tgz#6de01309af60677065d2e52b417a023303220931"
|
||||
integrity sha512-hv1O7ySn+XvP5OeDQcJFWwVb2v+GFGO1A9aMTQ5B/bzxb7WW21O8iRhVdsKKr8QwuiagzGmPP+gsUAYZ6bRddQ==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/caseless@*":
|
||||
version "0.12.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8"
|
||||
@@ -212,6 +219,13 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
|
||||
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
|
||||
|
||||
"@types/minipass@*":
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/minipass/-/minipass-2.2.0.tgz#51ad404e8eb1fa961f75ec61205796807b6f9651"
|
||||
integrity sha512-wuzZksN4w4kyfoOv/dlpov4NOunwutLA/q7uc00xU02ZyUY+aoM5PWIXEKBMnm0NHd4a+N71BMjq+x7+2Af1fg==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/mocha@^5.2.5":
|
||||
version "5.2.6"
|
||||
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.6.tgz#b8622d50557dd155e9f2f634b7d68fd38de5e94b"
|
||||
@@ -245,6 +259,14 @@
|
||||
"@types/glob" "*"
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/tar@^4.0.3":
|
||||
version "4.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/tar/-/tar-4.0.3.tgz#e2cce0b8ff4f285293243f5971bd7199176ac489"
|
||||
integrity sha512-Z7AVMMlkI8NTWF0qGhC4QIX0zkV/+y0J8x7b/RsHrN0310+YNjoJd8UrApCiGBCWtKjxS9QhNqLi2UJNToh5hA==
|
||||
dependencies:
|
||||
"@types/minipass" "*"
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/temp-write@^3.3.0":
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/temp-write/-/temp-write-3.3.0.tgz#40fe3d1fae6e98a2e40a13abe83e7a1996ea51ee"
|
||||
@@ -279,6 +301,11 @@ acorn@5.X, acorn@^5.0.3:
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
|
||||
integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
|
||||
|
||||
adm-zip@^0.4.14:
|
||||
version "0.4.14"
|
||||
resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.14.tgz#2cf312bcc9f8875df835b0f6040bd89be0a727a9"
|
||||
integrity sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==
|
||||
|
||||
aggregate-error@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
|
||||
@@ -598,11 +625,6 @@ balanced-match@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
||||
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
|
||||
|
||||
base64-js@^1.0.2:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
|
||||
integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==
|
||||
|
||||
base@^0.11.1:
|
||||
version "0.11.2"
|
||||
resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
|
||||
@@ -640,14 +662,6 @@ bindings@^1.5.0:
|
||||
dependencies:
|
||||
file-uri-to-path "1.0.0"
|
||||
|
||||
bl@^1.0.0:
|
||||
version "1.2.2"
|
||||
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
|
||||
integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
|
||||
dependencies:
|
||||
readable-stream "^2.3.5"
|
||||
safe-buffer "^5.1.1"
|
||||
|
||||
brace-expansion@^1.1.7:
|
||||
version "1.1.11"
|
||||
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
|
||||
@@ -684,47 +698,16 @@ browser-stdout@1.3.1:
|
||||
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
|
||||
integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
|
||||
|
||||
buffer-alloc-unsafe@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
|
||||
integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
|
||||
|
||||
buffer-alloc@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
|
||||
integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
|
||||
dependencies:
|
||||
buffer-alloc-unsafe "^1.1.0"
|
||||
buffer-fill "^1.0.0"
|
||||
|
||||
buffer-crc32@~0.2.3:
|
||||
version "0.2.13"
|
||||
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
|
||||
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
|
||||
|
||||
buffer-equal@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
|
||||
integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74=
|
||||
|
||||
buffer-fill@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
|
||||
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
|
||||
|
||||
buffer-from@^1.0.0:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
|
||||
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
|
||||
|
||||
buffer@^5.2.1:
|
||||
version "5.2.1"
|
||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6"
|
||||
integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==
|
||||
dependencies:
|
||||
base64-js "^1.0.2"
|
||||
ieee754 "^1.1.4"
|
||||
|
||||
builtin-modules@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
|
||||
@@ -813,6 +796,11 @@ chokidar@^2.0.0:
|
||||
optionalDependencies:
|
||||
fsevents "^1.2.7"
|
||||
|
||||
chownr@^1.1.3:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
|
||||
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
|
||||
|
||||
circular-json@^0.3.1:
|
||||
version "0.3.3"
|
||||
resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
|
||||
@@ -946,13 +934,6 @@ commander@^2.12.1, commander@~2.20.3:
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
|
||||
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
|
||||
|
||||
commander@~2.8.1:
|
||||
version "2.8.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
|
||||
integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=
|
||||
dependencies:
|
||||
graceful-readlink ">= 1.0.0"
|
||||
|
||||
comment-json@^1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-1.1.3.tgz#6986c3330fee0c4c9e00c2398cd61afa5d8f239e"
|
||||
@@ -1082,59 +1063,6 @@ decode-uri-component@^0.2.0:
|
||||
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
|
||||
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
|
||||
|
||||
decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
|
||||
integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
|
||||
dependencies:
|
||||
file-type "^5.2.0"
|
||||
is-stream "^1.1.0"
|
||||
tar-stream "^1.5.2"
|
||||
|
||||
decompress-tarbz2@^4.0.0:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
|
||||
integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
|
||||
dependencies:
|
||||
decompress-tar "^4.1.0"
|
||||
file-type "^6.1.0"
|
||||
is-stream "^1.1.0"
|
||||
seek-bzip "^1.0.5"
|
||||
unbzip2-stream "^1.0.9"
|
||||
|
||||
decompress-targz@^4.0.0:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
|
||||
integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
|
||||
dependencies:
|
||||
decompress-tar "^4.1.1"
|
||||
file-type "^5.2.0"
|
||||
is-stream "^1.1.0"
|
||||
|
||||
decompress-unzip@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
|
||||
integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k=
|
||||
dependencies:
|
||||
file-type "^3.8.0"
|
||||
get-stream "^2.2.0"
|
||||
pify "^2.3.0"
|
||||
yauzl "^2.4.2"
|
||||
|
||||
decompress@^4.2.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d"
|
||||
integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=
|
||||
dependencies:
|
||||
decompress-tar "^4.0.0"
|
||||
decompress-tarbz2 "^4.0.0"
|
||||
decompress-targz "^4.0.0"
|
||||
decompress-unzip "^4.0.1"
|
||||
graceful-fs "^4.1.10"
|
||||
make-dir "^1.0.0"
|
||||
pify "^2.3.0"
|
||||
strip-dirs "^2.0.0"
|
||||
|
||||
deep-is@~0.1.3:
|
||||
version "0.1.3"
|
||||
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
|
||||
@@ -1519,13 +1447,6 @@ fastq@^1.6.0:
|
||||
dependencies:
|
||||
reusify "^1.0.0"
|
||||
|
||||
fd-slicer@~1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
|
||||
integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
|
||||
dependencies:
|
||||
pend "~1.2.0"
|
||||
|
||||
figures@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
|
||||
@@ -1533,21 +1454,6 @@ figures@^2.0.0:
|
||||
dependencies:
|
||||
escape-string-regexp "^1.0.5"
|
||||
|
||||
file-type@^3.8.0:
|
||||
version "3.9.0"
|
||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
|
||||
integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
|
||||
|
||||
file-type@^5.2.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
|
||||
integrity sha1-LdvqfHP/42No365J3DOMBYwritY=
|
||||
|
||||
file-type@^6.1.0:
|
||||
version "6.2.0"
|
||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
|
||||
integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
|
||||
|
||||
file-uri-to-path@1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
|
||||
@@ -1669,11 +1575,6 @@ fragment-cache@^0.2.1:
|
||||
dependencies:
|
||||
map-cache "^0.2.2"
|
||||
|
||||
fs-constants@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
||||
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
|
||||
|
||||
fs-extra@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd"
|
||||
@@ -1683,6 +1584,13 @@ fs-extra@^5.0.0:
|
||||
jsonfile "^4.0.0"
|
||||
universalify "^0.1.0"
|
||||
|
||||
fs-minipass@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
|
||||
integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
|
||||
dependencies:
|
||||
minipass "^3.0.0"
|
||||
|
||||
fs-mkdirp-stream@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
|
||||
@@ -1724,14 +1632,6 @@ get-caller-file@^2.0.1:
|
||||
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
|
||||
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
|
||||
|
||||
get-stream@^2.2.0:
|
||||
version "2.3.1"
|
||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
|
||||
integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=
|
||||
dependencies:
|
||||
object-assign "^4.0.1"
|
||||
pinkie-promise "^2.0.0"
|
||||
|
||||
get-value@^2.0.3, get-value@^2.0.6:
|
||||
version "2.0.6"
|
||||
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
|
||||
@@ -1887,16 +1787,11 @@ graceful-fs@4.X, graceful-fs@^4.1.11, graceful-fs@^4.2.2:
|
||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
|
||||
integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
|
||||
|
||||
graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
|
||||
graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
|
||||
version "4.1.15"
|
||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
|
||||
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
|
||||
|
||||
"graceful-readlink@>= 1.0.0":
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
|
||||
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
|
||||
|
||||
growl@1.10.3:
|
||||
version "1.10.3"
|
||||
resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f"
|
||||
@@ -2102,11 +1997,6 @@ http-signature@~1.2.0:
|
||||
jsprim "^1.2.2"
|
||||
sshpk "^1.7.0"
|
||||
|
||||
ieee754@^1.1.4:
|
||||
version "1.1.12"
|
||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
|
||||
integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==
|
||||
|
||||
ignore@^5.1.1:
|
||||
version "5.1.4"
|
||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
|
||||
@@ -2291,11 +2181,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
|
||||
dependencies:
|
||||
is-extglob "^2.1.1"
|
||||
|
||||
is-natural-number@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
|
||||
integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=
|
||||
|
||||
is-negated-glob@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
|
||||
@@ -2782,6 +2667,21 @@ minimist@~1.2.0:
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
|
||||
integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
|
||||
|
||||
minipass@^3.0.0:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5"
|
||||
integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==
|
||||
dependencies:
|
||||
yallist "^4.0.0"
|
||||
|
||||
minizlib@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.0.tgz#fd52c645301ef09a63a2c209697c294c6ce02cf3"
|
||||
integrity sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==
|
||||
dependencies:
|
||||
minipass "^3.0.0"
|
||||
yallist "^4.0.0"
|
||||
|
||||
mixin-deep@^1.2.0:
|
||||
version "1.3.2"
|
||||
resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
|
||||
@@ -2804,6 +2704,11 @@ mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@~0.5.1:
|
||||
dependencies:
|
||||
minimist "0.0.8"
|
||||
|
||||
mkdirp@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.3.tgz#4cf2e30ad45959dddea53ad97d518b6c8205e1ea"
|
||||
integrity sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==
|
||||
|
||||
mocha-junit-reporter@^1.17.0:
|
||||
version "1.18.0"
|
||||
resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.18.0.tgz#9209a3fba30025ae3ae5e6bfe7f9c5bc3c2e8ee2"
|
||||
@@ -2998,7 +2903,7 @@ oauth-sign@~0.9.0:
|
||||
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
|
||||
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
|
||||
|
||||
object-assign@4.X, object-assign@^4.0.1:
|
||||
object-assign@4.X:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
|
||||
@@ -3236,11 +3141,6 @@ path-type@^4.0.0:
|
||||
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
|
||||
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
|
||||
|
||||
pend@~1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
|
||||
integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
|
||||
|
||||
performance-now@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
|
||||
@@ -3256,7 +3156,7 @@ picomatch@^2.0.5:
|
||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6"
|
||||
integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==
|
||||
|
||||
pify@^2.0.0, pify@^2.3.0:
|
||||
pify@^2.0.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
||||
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
|
||||
@@ -3407,7 +3307,7 @@ read-pkg@^1.0.0:
|
||||
string_decoder "^1.1.1"
|
||||
util-deprecate "^1.0.1"
|
||||
|
||||
readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6:
|
||||
readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.3.5, readable-stream@~2.3.6:
|
||||
version "2.3.6"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
|
||||
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
|
||||
@@ -3634,7 +3534,7 @@ run-parallel@^1.1.9:
|
||||
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
|
||||
integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
|
||||
|
||||
safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
||||
safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
||||
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
||||
@@ -3656,13 +3556,6 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
|
||||
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
||||
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
||||
|
||||
seek-bzip@^1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
|
||||
integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=
|
||||
dependencies:
|
||||
commander "~2.8.1"
|
||||
|
||||
semver-greatest-satisfied-range@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b"
|
||||
@@ -3995,13 +3888,6 @@ strip-bom@^2.0.0:
|
||||
dependencies:
|
||||
is-utf8 "^0.2.0"
|
||||
|
||||
strip-dirs@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
|
||||
integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
|
||||
dependencies:
|
||||
is-natural-number "^4.0.1"
|
||||
|
||||
strip-json-comments@2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
|
||||
@@ -4050,18 +3936,17 @@ sver-compat@^1.5.0:
|
||||
es6-iterator "^2.0.1"
|
||||
es6-symbol "^3.1.1"
|
||||
|
||||
tar-stream@^1.5.2:
|
||||
version "1.6.2"
|
||||
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
|
||||
integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
|
||||
tar@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.1.tgz#7b3bd6c313cb6e0153770108f8d70ac298607efa"
|
||||
integrity sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==
|
||||
dependencies:
|
||||
bl "^1.0.0"
|
||||
buffer-alloc "^1.2.0"
|
||||
end-of-stream "^1.0.0"
|
||||
fs-constants "^1.0.0"
|
||||
readable-stream "^2.3.0"
|
||||
to-buffer "^1.1.1"
|
||||
xtend "^4.0.0"
|
||||
chownr "^1.1.3"
|
||||
fs-minipass "^2.0.0"
|
||||
minipass "^3.0.0"
|
||||
minizlib "^2.1.0"
|
||||
mkdirp "^1.0.3"
|
||||
yallist "^4.0.0"
|
||||
|
||||
temp-dir@^1.0.0:
|
||||
version "1.0.0"
|
||||
@@ -4111,7 +3996,7 @@ through2@^3.0.1:
|
||||
dependencies:
|
||||
readable-stream "2 || 3"
|
||||
|
||||
through@^2.3.8, through@~2.3.8:
|
||||
through@~2.3.8:
|
||||
version "2.3.8"
|
||||
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
||||
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
|
||||
@@ -4137,11 +4022,6 @@ to-absolute-glob@^2.0.0:
|
||||
is-absolute "^1.0.0"
|
||||
is-negated-glob "^1.0.0"
|
||||
|
||||
to-buffer@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
|
||||
integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
|
||||
|
||||
to-object-path@^0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
|
||||
@@ -4285,14 +4165,6 @@ uglify-js@^3.1.4:
|
||||
commander "~2.20.3"
|
||||
source-map "~0.6.1"
|
||||
|
||||
unbzip2-stream@^1.0.9:
|
||||
version "1.3.3"
|
||||
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a"
|
||||
integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==
|
||||
dependencies:
|
||||
buffer "^5.2.1"
|
||||
through "^2.3.8"
|
||||
|
||||
unc-path-regex@^0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
|
||||
@@ -4596,7 +4468,7 @@ xml@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5"
|
||||
integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=
|
||||
|
||||
xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
|
||||
xtend@~4.0.0, xtend@~4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
|
||||
integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
|
||||
@@ -4611,6 +4483,11 @@ y18n@^4.0.0:
|
||||
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
|
||||
integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
|
||||
|
||||
yallist@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
||||
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
||||
|
||||
yargs-parser@13.1.1, yargs-parser@^13.1.1:
|
||||
version "13.1.1"
|
||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
|
||||
@@ -4669,11 +4546,3 @@ yargs@^7.1.0:
|
||||
which-module "^1.0.0"
|
||||
y18n "^3.2.1"
|
||||
yargs-parser "^5.0.0"
|
||||
|
||||
yauzl@^2.4.2:
|
||||
version "2.10.0"
|
||||
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
|
||||
integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
|
||||
dependencies:
|
||||
buffer-crc32 "~0.2.3"
|
||||
fd-slicer "~1.1.0"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"version": "0.0.1",
|
||||
"description": "Dependencies shared by all extensions",
|
||||
"dependencies": {
|
||||
"typescript": "3.8.2"
|
||||
"typescript": "3.8.3"
|
||||
},
|
||||
"scripts": {
|
||||
"postinstall": "node ./postinstall"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
typescript@3.8.2:
|
||||
version "3.8.2"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.2.tgz#91d6868aaead7da74f493c553aeff76c0c0b1d5a"
|
||||
integrity sha512-EgOVgL/4xfVrCMbhYKUQTdF37SQn4Iw73H5BgCrF1Abdun7Kwy/QZsE/ssAy0y4LxBbvua3PIbFsbRczWWnDdQ==
|
||||
typescript@3.8.3:
|
||||
version "3.8.3"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061"
|
||||
integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==
|
||||
|
||||
5
src/sql/azdata.d.ts
vendored
5
src/sql/azdata.d.ts
vendored
@@ -2300,6 +2300,11 @@ declare module 'azdata' {
|
||||
* and call the end OAuth method.
|
||||
*/
|
||||
autoOAuthCancelled(): Thenable<void>;
|
||||
|
||||
/**
|
||||
* Clears token cache
|
||||
*/
|
||||
clearTokenCache(): Thenable<void>;
|
||||
}
|
||||
|
||||
// Resource provider interfaces -----------------------------------------------------------------------
|
||||
|
||||
@@ -3,6 +3,15 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
.vs .codicon.settings {
|
||||
background-image: url('settings.svg');
|
||||
}
|
||||
|
||||
.vs-dark .codicon.settings,
|
||||
.hc-black .codicon.settings {
|
||||
background-image: url('settings_inverse.svg');
|
||||
}
|
||||
|
||||
.vs .codicon.backup {
|
||||
background: url("backup.svg") center center no-repeat;
|
||||
}
|
||||
|
||||
3
src/sql/media/icons/settings.svg
Normal file
3
src/sql/media/icons/settings.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.9297 7.71875V7.8594C13.9297 7.90625 13.9323 7.9531 13.9375 8V8.1406C13.9375 8.1875 13.9349 8.2344 13.9297 8.28125L15.9531 9.53905L14.7109 12.5312L12.3906 12C12.2656 12.1354 12.1354 12.2656 12 12.3906L12.5312 14.7109L9.53905 15.9531L8.28125 13.9297H8.1406C8.09375 13.9297 8.0469 13.9323 8 13.9375H7.8594C7.8125 13.9375 7.7656 13.9349 7.71875 13.9297L6.46095 15.9531L3.46875 14.7109L4 12.3906C3.86458 12.2656 3.73438 12.1354 3.60938 12L1.28906 12.5312L0.046875 9.53905L2.07031 8.28125V8.1406C2.07031 8.09375 2.06771 8.0469 2.0625 8V7.8594C2.0625 7.8125 2.06511 7.7656 2.07031 7.71875L0.046875 6.46095L1.28906 3.46875L3.60938 4C3.73438 3.86458 3.86458 3.73438 4 3.60938L3.46875 1.28906L6.46095 0.046875L7.71875 2.07031H7.8594C7.90625 2.07031 7.9531 2.06771 8 2.0625H8.1406C8.1875 2.0625 8.2344 2.06511 8.28125 2.07031L9.53905 0.046875L12.5312 1.28906L12 3.60938C12.1354 3.73438 12.2656 3.86458 12.3906 4L14.7109 3.46875L15.9531 6.46095L13.9297 7.71875ZM13.0156 8.7344C13.0261 8.6094 13.0364 8.487 13.0469 8.3672C13.0573 8.2474 13.0625 8.1224 13.0625 7.9922C13.0625 7.8724 13.0573 7.75 13.0469 7.625C13.0364 7.5 13.0261 7.3776 13.0156 7.2578L14.8594 6.1094L14.1875 4.48438L12.0703 4.97656C11.9089 4.77865 11.7448 4.59635 11.5781 4.42969C11.4115 4.26302 11.2265 4.09635 11.0234 3.92969L11.5156 1.8125L9.8906 1.14062L8.7344 2.98438C8.6146 2.97396 8.4922 2.96354 8.3672 2.95312C8.2422 2.94271 8.1198 2.9375 8 2.9375C7.875 2.9375 7.7526 2.94271 7.6328 2.95312C7.513 2.96354 7.388 2.97396 7.2578 2.98438L6.1094 1.14062L4.48438 1.8125L4.97656 3.92969C4.77865 4.09114 4.59635 4.25521 4.42969 4.42188C4.26302 4.58854 4.09635 4.77344 3.92969 4.97656L1.8125 4.48438L1.14062 6.1094L2.98438 7.2656C2.97396 7.3906 2.96354 7.513 2.95312 7.6328C2.94271 7.7526 2.9375 7.8776 2.9375 8.0078C2.9375 8.1276 2.94271 8.25 2.95312 8.375C2.96354 8.5 2.97396 8.6224 2.98438 8.7422L1.14062 9.8906L1.8125 11.5156L3.92969 11.0234C4.09114 11.2213 4.25521 11.4037 4.42188 11.5703C4.58854 11.737 4.77344 11.9037 4.97656 12.0703L4.48438 14.1875L6.1094 14.8594L7.2656 13.0156C7.3854 13.0261 7.5078 13.0364 7.6328 13.0469C7.7578 13.0573 7.8802 13.0625 8 13.0625C8.125 13.0625 8.2474 13.0573 8.3672 13.0469C8.487 13.0364 8.612 13.0261 8.7422 13.0156L9.8906 14.8594L11.5156 14.1875L11.0234 12.0703C11.2213 11.9089 11.4037 11.7448 11.5703 11.5781C11.737 11.4115 11.9037 11.2265 12.0703 11.0234L14.1875 11.5156L14.8594 9.8906L13.0156 8.7344ZM8 5.0625C8.40625 5.0625 8.78645 5.138 9.1406 5.28905C9.4948 5.4401 9.8073 5.65105 10.0781 5.9219C10.349 6.1927 10.5573 6.5026 10.7031 6.85155C10.849 7.2005 10.9271 7.58335 10.9375 8C10.9375 8.40625 10.862 8.78645 10.7109 9.1406C10.5599 9.4948 10.349 9.8073 10.0781 10.0781C9.8073 10.349 9.4974 10.5573 9.14845 10.7031C8.7995 10.849 8.41665 10.9271 8 10.9375C7.59375 10.9375 7.21355 10.862 6.8594 10.7109C6.5052 10.5599 6.1927 10.349 5.9219 10.0781C5.65105 9.8073 5.4427 9.4974 5.2969 9.14845C5.15105 8.7995 5.0729 8.41665 5.0625 8C5.0625 7.59375 5.138 7.21355 5.28905 6.8594C5.4401 6.5052 5.65105 6.1927 5.9219 5.9219C6.1927 5.65105 6.5026 5.4427 6.85155 5.2969C7.2005 5.15105 7.58335 5.0729 8 5.0625ZM8 10.0625C8.28645 10.0625 8.5547 10.0104 8.8047 9.90625C9.0547 9.8021 9.27345 9.65365 9.46095 9.46095C9.64845 9.26825 9.79425 9.0495 9.89845 8.8047C10.0026 8.5599 10.0573 8.29165 10.0625 8C10.0625 7.71355 10.0104 7.4453 9.90625 7.1953C9.8021 6.9453 9.65365 6.72655 9.46095 6.53905C9.26825 6.35155 9.0495 6.20575 8.8047 6.10155C8.5599 5.9974 8.29165 5.9427 8 5.9375C7.71355 5.9375 7.4453 5.9896 7.1953 6.09375C6.9453 6.1979 6.72655 6.34635 6.53905 6.53905C6.35155 6.73175 6.20575 6.9505 6.10155 7.1953C5.9974 7.4401 5.9427 7.70835 5.9375 8C5.9375 8.28645 5.9896 8.5547 6.09375 8.8047C6.1979 9.0547 6.34635 9.27345 6.53905 9.46095C6.73175 9.64845 6.9505 9.79425 7.1953 9.89845C7.4401 10.0026 7.70835 10.0573 8 10.0625Z" fill="black"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
3
src/sql/media/icons/settings_inverse.svg
Normal file
3
src/sql/media/icons/settings_inverse.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.9297 7.71875V7.8594C13.9297 7.90625 13.9323 7.9531 13.9375 8V8.1406C13.9375 8.1875 13.9349 8.2344 13.9297 8.28125L15.9531 9.53905L14.7109 12.5312L12.3906 12C12.2656 12.1354 12.1354 12.2656 12 12.3906L12.5312 14.7109L9.53905 15.9531L8.28125 13.9297H8.1406C8.09375 13.9297 8.0469 13.9323 8 13.9375H7.8594C7.8125 13.9375 7.7656 13.9349 7.71875 13.9297L6.46095 15.9531L3.46875 14.7109L4 12.3906C3.86458 12.2656 3.73438 12.1354 3.60938 12L1.28906 12.5312L0.046875 9.53905L2.07031 8.28125V8.1406C2.07031 8.09375 2.06771 8.0469 2.0625 8V7.8594C2.0625 7.8125 2.06511 7.7656 2.07031 7.71875L0.046875 6.46095L1.28906 3.46875L3.60938 4C3.73438 3.86458 3.86458 3.73438 4 3.60938L3.46875 1.28906L6.46095 0.046875L7.71875 2.07031H7.8594C7.90625 2.07031 7.9531 2.06771 8 2.0625H8.1406C8.1875 2.0625 8.2344 2.06511 8.28125 2.07031L9.53905 0.046875L12.5312 1.28906L12 3.60938C12.1354 3.73438 12.2656 3.86458 12.3906 4L14.7109 3.46875L15.9531 6.46095L13.9297 7.71875ZM13.0156 8.7344C13.0261 8.6094 13.0364 8.487 13.0469 8.3672C13.0573 8.2474 13.0625 8.1224 13.0625 7.9922C13.0625 7.8724 13.0573 7.75 13.0469 7.625C13.0364 7.5 13.0261 7.3776 13.0156 7.2578L14.8594 6.1094L14.1875 4.48438L12.0703 4.97656C11.9089 4.77865 11.7448 4.59635 11.5781 4.42969C11.4115 4.26302 11.2265 4.09635 11.0234 3.92969L11.5156 1.8125L9.8906 1.14062L8.7344 2.98438C8.6146 2.97396 8.4922 2.96354 8.3672 2.95312C8.2422 2.94271 8.1198 2.9375 8 2.9375C7.875 2.9375 7.7526 2.94271 7.6328 2.95312C7.513 2.96354 7.388 2.97396 7.2578 2.98438L6.1094 1.14062L4.48438 1.8125L4.97656 3.92969C4.77865 4.09114 4.59635 4.25521 4.42969 4.42188C4.26302 4.58854 4.09635 4.77344 3.92969 4.97656L1.8125 4.48438L1.14062 6.1094L2.98438 7.2656C2.97396 7.3906 2.96354 7.513 2.95312 7.6328C2.94271 7.7526 2.9375 7.8776 2.9375 8.0078C2.9375 8.1276 2.94271 8.25 2.95312 8.375C2.96354 8.5 2.97396 8.6224 2.98438 8.7422L1.14062 9.8906L1.8125 11.5156L3.92969 11.0234C4.09114 11.2213 4.25521 11.4037 4.42188 11.5703C4.58854 11.737 4.77344 11.9037 4.97656 12.0703L4.48438 14.1875L6.1094 14.8594L7.2656 13.0156C7.3854 13.0261 7.5078 13.0364 7.6328 13.0469C7.7578 13.0573 7.8802 13.0625 8 13.0625C8.125 13.0625 8.2474 13.0573 8.3672 13.0469C8.487 13.0364 8.612 13.0261 8.7422 13.0156L9.8906 14.8594L11.5156 14.1875L11.0234 12.0703C11.2213 11.9089 11.4037 11.7448 11.5703 11.5781C11.737 11.4115 11.9037 11.2265 12.0703 11.0234L14.1875 11.5156L14.8594 9.8906L13.0156 8.7344ZM8 5.0625C8.40625 5.0625 8.78645 5.138 9.1406 5.28905C9.4948 5.4401 9.8073 5.65105 10.0781 5.9219C10.349 6.1927 10.5573 6.5026 10.7031 6.85155C10.849 7.2005 10.9271 7.58335 10.9375 8C10.9375 8.40625 10.862 8.78645 10.7109 9.1406C10.5599 9.4948 10.349 9.8073 10.0781 10.0781C9.8073 10.349 9.4974 10.5573 9.14845 10.7031C8.7995 10.849 8.41665 10.9271 8 10.9375C7.59375 10.9375 7.21355 10.862 6.8594 10.7109C6.5052 10.5599 6.1927 10.349 5.9219 10.0781C5.65105 9.8073 5.4427 9.4974 5.2969 9.14845C5.15105 8.7995 5.0729 8.41665 5.0625 8C5.0625 7.59375 5.138 7.21355 5.28905 6.8594C5.4401 6.5052 5.65105 6.1927 5.9219 5.9219C6.1927 5.65105 6.5026 5.4427 6.85155 5.2969C7.2005 5.15105 7.58335 5.0729 8 5.0625ZM8 10.0625C8.28645 10.0625 8.5547 10.0104 8.8047 9.90625C9.0547 9.8021 9.27345 9.65365 9.46095 9.46095C9.64845 9.26825 9.79425 9.0495 9.89845 8.8047C10.0026 8.5599 10.0573 8.29165 10.0625 8C10.0625 7.71355 10.0104 7.4453 9.90625 7.1953C9.8021 6.9453 9.65365 6.72655 9.46095 6.53905C9.26825 6.35155 9.0495 6.20575 8.8047 6.10155C8.5599 5.9974 8.29165 5.9427 8 5.9375C7.71355 5.9375 7.4453 5.9896 7.1953 6.09375C6.9453 6.1979 6.72655 6.34635 6.53905 6.53905C6.35155 6.73175 6.20575 6.9505 6.10155 7.1953C5.9974 7.4401 5.9427 7.70835 5.9375 8C5.9375 8.28645 5.9896 8.5547 6.09375 8.8047C6.1979 9.0547 6.34635 9.27345 6.53905 9.46095C6.73175 9.64845 6.9505 9.79425 7.1953 9.89845C7.4401 10.0026 7.70835 10.0573 8 10.0625Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
@@ -77,6 +77,9 @@ export class TestAccountManagementService implements IAccountManagementService {
|
||||
}
|
||||
|
||||
export class AccountProviderStub implements azdata.AccountProvider {
|
||||
clearTokenCache(): Thenable<void> {
|
||||
return Promise.resolve();
|
||||
}
|
||||
autoOAuthCancelled(): Thenable<void> {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
@@ -86,6 +86,9 @@ export class MainThreadAccountManagement extends Disposable implements MainThrea
|
||||
},
|
||||
refresh(account: azdata.Account): Thenable<azdata.Account | azdata.PromptFailedResult> {
|
||||
return self._proxy.$refresh(handle, account);
|
||||
},
|
||||
clearTokenCache(): Thenable<void> {
|
||||
return self._proxy.$clearTokenCache();
|
||||
}
|
||||
};
|
||||
this._accountManagementService.registerProvider(providerMetadata, accountProvider);
|
||||
|
||||
@@ -35,6 +35,7 @@ export abstract class ExtHostAccountManagementShape {
|
||||
$prompt(handle: number): Thenable<azdata.Account | azdata.PromptFailedResult> { throw ni(); }
|
||||
$refresh(handle: number, account: azdata.Account): Thenable<azdata.Account | azdata.PromptFailedResult> { throw ni(); }
|
||||
$accountsChanged(handle: number, accounts: azdata.Account[]): Thenable<void> { throw ni(); }
|
||||
$clearTokenCache(): Thenable<void> { throw ni(); }
|
||||
}
|
||||
|
||||
export abstract class ExtHostConnectionManagementShape {
|
||||
|
||||
@@ -339,7 +339,7 @@ export abstract class Modal extends Disposable implements IThemable {
|
||||
// Try to find focusable element in dialog pane rather than overall container. _modalBodySection contains items in the pane for a wizard.
|
||||
// This ensures that we are setting the focus on a useful element in the form when possible.
|
||||
const focusableElements = this._modalBodySection ?
|
||||
this._modalBodySection.querySelectorAll('input') :
|
||||
this._modalBodySection.querySelectorAll(tabbableElementsQuerySelector) :
|
||||
this._bodyContainer.querySelectorAll(tabbableElementsQuerySelector);
|
||||
|
||||
this._focusedElementBeforeOpen = <HTMLElement>document.activeElement;
|
||||
|
||||
@@ -41,7 +41,7 @@ export async function setMode(accessor: ServicesAccessor, modeSupport: IModeSupp
|
||||
if (newInputCreator) { // if we know how to handle the new language, tranform the input and replace the editor (e.x notebook, sql, etc)
|
||||
const newInput = newInputCreator.convertInput(input || activeEditor);
|
||||
if (newInput) { // the factory will return undefined if it doesn't know how to handle the input
|
||||
await editorService.replaceEditors([{ editor: activeEditor, replacement: newInput }], activeControl.group);
|
||||
await editorService.replaceEditors([{ editor: activeEditor, replacement: await newInput }], activeControl.group);
|
||||
}
|
||||
} else if (oldInputCreator) { // if we don't know handle to handle the new language but we know how to handle the current language, replace the editor with the reverted input (e.x sql -> text)
|
||||
await editorService.replaceEditors([{ editor: activeEditor, replacement: input }], activeControl.group);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
import { dispose, Disposable } from 'vs/base/common/lifecycle';
|
||||
import { Event, Emitter } from 'vs/base/common/event';
|
||||
import { isUndefined } from 'vs/base/common/types';
|
||||
|
||||
export class GridPanelState {
|
||||
public tableStates: GridTableState[] = [];
|
||||
@@ -30,7 +31,7 @@ export class GridTableState extends Disposable {
|
||||
/* The top row of the current scroll */
|
||||
public scrollPositionY = 0;
|
||||
public scrollPositionX = 0;
|
||||
public columnSizes?: number[] = undefined;
|
||||
public columnSizes?: number[];
|
||||
public selection?: Slick.Range[];
|
||||
public activeCell?: Slick.Cell;
|
||||
|
||||
@@ -43,7 +44,7 @@ export class GridTableState extends Disposable {
|
||||
}
|
||||
|
||||
public set canBeMaximized(val: boolean | undefined) {
|
||||
if (!val || val === this._canBeMaximized) {
|
||||
if (isUndefined(val) || val === this._canBeMaximized) {
|
||||
return;
|
||||
}
|
||||
this._canBeMaximized = val;
|
||||
@@ -55,7 +56,7 @@ export class GridTableState extends Disposable {
|
||||
}
|
||||
|
||||
public set maximized(val: boolean | undefined) {
|
||||
if (!val || val === this._maximized) {
|
||||
if (isUndefined(val) || val === this._maximized) {
|
||||
return;
|
||||
}
|
||||
this._maximized = val;
|
||||
@@ -209,9 +209,9 @@ export abstract class QueryEditorInput extends EditorInput implements IConnectab
|
||||
} else {
|
||||
title += localize('disconnected', "disconnected");
|
||||
}
|
||||
return this._text.getName() + (longForm ? (' - ' + title) : ` - ${trimTitle(title)}`);
|
||||
return this.text.getName() + (longForm ? (' - ' + title) : ` - ${trimTitle(title)}`);
|
||||
} else {
|
||||
return this._text.getName();
|
||||
return this.text.getName();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import { TopOperationsState } from 'sql/workbench/common/editor/query/topOperati
|
||||
import { ChartState } from 'sql/workbench/common/editor/query/chartState';
|
||||
import { QueryPlanState } from 'sql/workbench/common/editor/query/queryPlanState';
|
||||
import { MessagePanelState } from 'sql/workbench/common/editor/query/messagePanelState';
|
||||
import { GridPanelState } from 'sql/workbench/common/editor/query/gridPanelState';
|
||||
import { GridPanelState } from 'sql/workbench/common/editor/query/gridTableState';
|
||||
import { QueryModelViewState } from 'sql/workbench/common/editor/query/modelViewState';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ import { assign } from 'vs/base/common/objects';
|
||||
import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput';
|
||||
import { ChartView } from 'sql/workbench/contrib/charts/browser/chartView';
|
||||
import { ConfigureChartDialog } from 'sql/workbench/contrib/charts/browser/configureChartDialog';
|
||||
|
||||
export interface IChartActionContext {
|
||||
options: IInsightOptions;
|
||||
@@ -106,6 +108,28 @@ export class CreateInsightAction extends Action {
|
||||
}
|
||||
}
|
||||
|
||||
export class ConfigureChartAction extends Action {
|
||||
public static ID = 'chartview.configureChart';
|
||||
public static LABEL = localize('configureChartLabel', "Configure Chart");
|
||||
public static ICON = 'settings';
|
||||
|
||||
private dialog: ConfigureChartDialog;
|
||||
|
||||
constructor(private _chart: ChartView,
|
||||
@IInstantiationService private readonly instantiationService: IInstantiationService) {
|
||||
super(ConfigureChartAction.ID, ConfigureChartAction.LABEL, ConfigureChartAction.ICON);
|
||||
}
|
||||
|
||||
public run(context: IChartActionContext): Promise<boolean> {
|
||||
if (!this.dialog) {
|
||||
this.dialog = this.instantiationService.createInstance(ConfigureChartDialog, ConfigureChartAction.LABEL, ConfigureChartAction.ID, this._chart);
|
||||
this.dialog.render();
|
||||
}
|
||||
this.dialog.open();
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
}
|
||||
|
||||
export class CopyAction extends Action {
|
||||
public static ID = 'chartview.copy';
|
||||
public static LABEL = localize('copyChartLabel', "Copy as image");
|
||||
|
||||
@@ -16,7 +16,7 @@ export class ChartTab implements IPanelTab {
|
||||
public readonly view: ChartView;
|
||||
|
||||
constructor(@IInstantiationService instantiationService: IInstantiationService) {
|
||||
this.view = instantiationService.createInstance(ChartView);
|
||||
this.view = instantiationService.createInstance(ChartView, true);
|
||||
}
|
||||
|
||||
public set queryRunner(runner: QueryRunner) {
|
||||
|
||||
@@ -20,8 +20,8 @@ import { attachSelectBoxStyler, attachInputBoxStyler } from 'vs/platform/theme/c
|
||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { isUndefinedOrNull } from 'vs/base/common/types';
|
||||
import { CreateInsightAction, CopyAction, SaveImageAction, IChartActionContext } from 'sql/workbench/contrib/charts/browser/actions';
|
||||
import { Taskbar } from 'sql/base/browser/ui/taskbar/taskbar';
|
||||
import { CreateInsightAction, CopyAction, SaveImageAction, IChartActionContext, ConfigureChartAction } from 'sql/workbench/contrib/charts/browser/actions';
|
||||
import { Taskbar, ITaskbarContent } from 'sql/base/browser/ui/taskbar/taskbar';
|
||||
import { Checkbox } from 'sql/base/browser/ui/checkbox/checkbox';
|
||||
import { IInsightOptions, ChartType } from 'sql/workbench/contrib/charts/common/interfaces';
|
||||
import { ChartState } from 'sql/workbench/common/editor/query/chartState';
|
||||
@@ -57,6 +57,7 @@ export class ChartView extends Disposable implements IPanelView {
|
||||
private _createInsightAction: CreateInsightAction;
|
||||
private _copyAction: CopyAction;
|
||||
private _saveAction: SaveImageAction;
|
||||
private _configureChartAction: ConfigureChartAction;
|
||||
|
||||
private _state: ChartState;
|
||||
|
||||
@@ -68,7 +69,7 @@ export class ChartView extends Disposable implements IPanelView {
|
||||
/** parent container */
|
||||
private container: HTMLElement;
|
||||
/** container for the options controls */
|
||||
private optionsControl: HTMLElement;
|
||||
public readonly optionsControl: HTMLElement;
|
||||
/** container for type specific controls */
|
||||
private typeControls: HTMLElement;
|
||||
/** container for the insight */
|
||||
@@ -82,6 +83,7 @@ export class ChartView extends Disposable implements IPanelView {
|
||||
private optionMap: { [x: string]: { element: HTMLElement; set: (val) => void } } = {};
|
||||
|
||||
constructor(
|
||||
private readonly _renderOptionsInline: boolean,
|
||||
@IContextViewService private _contextViewService: IContextViewService,
|
||||
@IThemeService private _themeService: IThemeService,
|
||||
@IInstantiationService private _instantiationService: IInstantiationService,
|
||||
@@ -90,6 +92,7 @@ export class ChartView extends Disposable implements IPanelView {
|
||||
super();
|
||||
this.taskbarContainer = DOM.$('div.taskbar-container');
|
||||
this.taskbar = new Taskbar(this.taskbarContainer);
|
||||
|
||||
this.optionsControl = DOM.$('div.options-container');
|
||||
const generalControls = DOM.$('div.general-controls');
|
||||
this.optionsControl.appendChild(generalControls);
|
||||
@@ -100,7 +103,12 @@ export class ChartView extends Disposable implements IPanelView {
|
||||
this._copyAction = this._instantiationService.createInstance(CopyAction);
|
||||
this._saveAction = this._instantiationService.createInstance(SaveImageAction);
|
||||
|
||||
this.taskbar.setContent([{ action: this._createInsightAction }]);
|
||||
if (this._renderOptionsInline) {
|
||||
this.taskbar.setContent([{ action: this._createInsightAction }]);
|
||||
} else {
|
||||
this._configureChartAction = this._instantiationService.createInstance(ConfigureChartAction, this);
|
||||
this.taskbar.setContent([{ action: this._createInsightAction }, { action: this._configureChartAction }]);
|
||||
}
|
||||
|
||||
const self = this;
|
||||
this.options = new Proxy(this.options, {
|
||||
@@ -165,7 +173,9 @@ export class ChartView extends Disposable implements IPanelView {
|
||||
this.container.appendChild(this.taskbarContainer);
|
||||
this.container.appendChild(this.chartingContainer);
|
||||
this.chartingContainer.appendChild(this.insightContainer);
|
||||
this.chartingContainer.appendChild(this.optionsControl);
|
||||
if (this._renderOptionsInline) {
|
||||
this.chartingContainer.appendChild(this.optionsControl);
|
||||
}
|
||||
this.insight = new Insight(this.insightContainer, this.options, this._instantiationService);
|
||||
}
|
||||
|
||||
@@ -275,16 +285,21 @@ export class ChartView extends Disposable implements IPanelView {
|
||||
}
|
||||
|
||||
private updateActionbar() {
|
||||
let actions: ITaskbarContent[];
|
||||
if (this.insight && this.insight.isCopyable) {
|
||||
this.taskbar.context = { insight: this.insight.insight, options: this.options };
|
||||
this.taskbar.setContent([
|
||||
actions = [
|
||||
{ action: this._createInsightAction },
|
||||
{ action: this._copyAction },
|
||||
{ action: this._saveAction }
|
||||
]);
|
||||
];
|
||||
} else {
|
||||
this.taskbar.setContent([{ action: this._createInsightAction }]);
|
||||
actions = [{ action: this._createInsightAction }];
|
||||
}
|
||||
if (!this._renderOptionsInline) {
|
||||
actions.push({ action: this._configureChartAction });
|
||||
}
|
||||
this.taskbar.setContent(actions);
|
||||
}
|
||||
|
||||
private createOption(option: IChartOption, container: HTMLElement) {
|
||||
@@ -318,6 +333,7 @@ export class ChartView extends Disposable implements IPanelView {
|
||||
case ControlType.combo:
|
||||
//pass options into changeAltNames in order for SelectBox to show user-friendly names.
|
||||
let dropdown = new SelectBox(option.displayableOptions || this.changeToAltNames(option.options), undefined, this._contextViewService);
|
||||
dropdown.setAriaLabel(option.label);
|
||||
dropdown.select(option.options.indexOf(value));
|
||||
dropdown.render(optionInput);
|
||||
dropdown.onDidSelect(e => {
|
||||
@@ -337,6 +353,7 @@ export class ChartView extends Disposable implements IPanelView {
|
||||
break;
|
||||
case ControlType.input:
|
||||
let input = new InputBox(optionInput, this._contextViewService);
|
||||
input.setAriaLabel(option.label);
|
||||
input.value = value || '';
|
||||
input.onDidChange(e => {
|
||||
if (this.options[option.configEntry] !== e) {
|
||||
@@ -355,6 +372,7 @@ export class ChartView extends Disposable implements IPanelView {
|
||||
break;
|
||||
case ControlType.numberInput:
|
||||
let numberInput = new InputBox(optionInput, this._contextViewService, { type: 'number' });
|
||||
numberInput.setAriaLabel(option.label);
|
||||
numberInput.value = value || '';
|
||||
numberInput.onDidChange(e => {
|
||||
if (this.options[option.configEntry] !== Number(e)) {
|
||||
@@ -373,6 +391,7 @@ export class ChartView extends Disposable implements IPanelView {
|
||||
break;
|
||||
case ControlType.dateInput:
|
||||
let dateInput = new InputBox(optionInput, this._contextViewService, { type: 'datetime-local' });
|
||||
dateInput.setAriaLabel(option.label);
|
||||
dateInput.value = value || '';
|
||||
dateInput.onDidChange(e => {
|
||||
if (this.options[option.configEntry] !== e) {
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
import { localize } from 'vs/nls';
|
||||
import { ChartView } from 'sql/workbench/contrib/charts/browser/chartView';
|
||||
import { Modal } from 'sql/workbench/browser/modal/modal';
|
||||
import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService';
|
||||
import { IAdsTelemetryService } from 'sql/platform/telemetry/common/telemetry';
|
||||
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
|
||||
import { ILogService } from 'vs/platform/log/common/log';
|
||||
import { ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfigurationService';
|
||||
import { attachModalDialogStyler } from 'sql/workbench/common/styler';
|
||||
import { attachButtonStyler } from 'vs/platform/theme/common/styler';
|
||||
|
||||
export class ConfigureChartDialog extends Modal {
|
||||
constructor(
|
||||
title: string,
|
||||
name: string,
|
||||
private _chart: ChartView,
|
||||
@IWorkbenchLayoutService layoutService: IWorkbenchLayoutService,
|
||||
@IThemeService themeService: IThemeService,
|
||||
@IAdsTelemetryService telemetryService: IAdsTelemetryService,
|
||||
@IContextKeyService contextKeyService: IContextKeyService,
|
||||
@IClipboardService clipboardService: IClipboardService,
|
||||
@ILogService logService: ILogService,
|
||||
@ITextResourcePropertiesService textResourcePropertiesService: ITextResourcePropertiesService
|
||||
) {
|
||||
super(title, name, telemetryService, layoutService, clipboardService, themeService, logService, textResourcePropertiesService, contextKeyService, undefined);
|
||||
}
|
||||
|
||||
public open() {
|
||||
this.show();
|
||||
}
|
||||
|
||||
public render() {
|
||||
super.render();
|
||||
attachModalDialogStyler(this, this._themeService);
|
||||
|
||||
let closeButton = this.addFooterButton(localize('configureChartDialog.close', "Close"), () => this.close());
|
||||
attachButtonStyler(closeButton, this._themeService);
|
||||
}
|
||||
|
||||
protected renderBody(container: HTMLElement) {
|
||||
container.appendChild(this._chart.optionsControl);
|
||||
}
|
||||
|
||||
protected layout(height?: number): void {
|
||||
}
|
||||
|
||||
public close() {
|
||||
this.hide();
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: scroll;
|
||||
min-height: 400px;
|
||||
}
|
||||
|
||||
.actionbar-container {
|
||||
@@ -26,6 +27,7 @@
|
||||
}
|
||||
|
||||
.options-container {
|
||||
padding: 20px;
|
||||
min-width: 250px;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
@@ -14,22 +14,32 @@ import { TestNotificationService } from 'vs/platform/notification/test/common/te
|
||||
|
||||
suite('Chart View', () => {
|
||||
test('initializes without error', () => {
|
||||
const chartview = createChartView();
|
||||
const chartview = createChartView(true);
|
||||
assert(chartview);
|
||||
});
|
||||
|
||||
test('renders without error', () => {
|
||||
const chartview = createChartView();
|
||||
const chartview = createChartView(true);
|
||||
chartview.render(document.createElement('div'));
|
||||
});
|
||||
|
||||
test('initializes without error - without options', () => {
|
||||
const chartview = createChartView(false);
|
||||
assert(chartview);
|
||||
});
|
||||
|
||||
test('renders without error - without options', () => {
|
||||
const chartview = createChartView(false);
|
||||
chartview.render(document.createElement('div'));
|
||||
});
|
||||
});
|
||||
|
||||
function createChartView(): ChartView {
|
||||
function createChartView(renderOptions: boolean): ChartView {
|
||||
const layoutService = new TestLayoutService();
|
||||
const contextViewService = new ContextViewService(layoutService);
|
||||
const themeService = new TestThemeService();
|
||||
const instantiationService = new TestInstantiationService();
|
||||
const notificationService = new TestNotificationService();
|
||||
instantiationService.stub(IThemeService, themeService);
|
||||
return new ChartView(contextViewService, themeService, instantiationService, notificationService);
|
||||
return new ChartView(renderOptions, contextViewService, themeService, instantiationService, notificationService);
|
||||
}
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
import 'vs/css!sql/media/actionBarLabel';
|
||||
import 'vs/css!./media/dataExplorer.contribution';
|
||||
import { localize } from 'vs/nls';
|
||||
import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet';
|
||||
import { ViewletRegistry, Extensions as ViewletExtensions } from 'vs/workbench/browser/viewlet';
|
||||
import { Registry } from 'vs/platform/registry/common/platform';
|
||||
import { DataExplorerViewlet, DataExplorerViewletViewsContribution, OpenDataExplorerViewletAction, VIEWLET_ID } from 'sql/workbench/contrib/dataExplorer/browser/dataExplorerViewlet';
|
||||
import { DataExplorerViewletViewsContribution, OpenDataExplorerViewletAction, VIEWLET_ID } from 'sql/workbench/contrib/dataExplorer/browser/dataExplorerViewlet';
|
||||
import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions';
|
||||
import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions';
|
||||
import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
|
||||
@@ -17,16 +17,6 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions';
|
||||
import { KeyMod, KeyCode } from 'vs/base/common/keyCodes';
|
||||
import { DataExplorerContainerExtensionHandler } from 'sql/workbench/contrib/dataExplorer/browser/dataExplorerExtensionPoint';
|
||||
|
||||
// Data Explorer Viewlet
|
||||
const viewletDescriptor = ViewletDescriptor.create(
|
||||
DataExplorerViewlet,
|
||||
VIEWLET_ID,
|
||||
localize('workbench.dataExplorer', "Connections"),
|
||||
'dataExplorer',
|
||||
0
|
||||
);
|
||||
|
||||
Registry.as<ViewletRegistry>(ViewletExtensions.Viewlets).registerViewlet(viewletDescriptor);
|
||||
Registry.as<ViewletRegistry>(ViewletExtensions.Viewlets).setDefaultViewletId(VIEWLET_ID);
|
||||
const workbenchRegistry = Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench);
|
||||
workbenchRegistry.registerWorkbenchContribution(DataExplorerViewletViewsContribution, LifecyclePhase.Starting);
|
||||
|
||||
@@ -156,5 +156,6 @@ export const VIEW_CONTAINER = Registry.as<IViewContainersRegistry>(ViewContainer
|
||||
id: VIEWLET_ID,
|
||||
name: localize('dataexplorer.name', "Connections"),
|
||||
ctorDescriptor: new SyncDescriptor(DataExplorerViewPaneContainer),
|
||||
icon: 'dataExplorer'
|
||||
icon: 'dataExplorer',
|
||||
order: 0
|
||||
}, ViewContainerLocation.Sidebar);
|
||||
|
||||
@@ -16,6 +16,7 @@ import * as path from 'vs/base/common/path';
|
||||
|
||||
import { ILanguageAssociationRegistry, Extensions as LanguageAssociationExtensions } from 'sql/workbench/services/languageAssociation/common/languageAssociation';
|
||||
import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput';
|
||||
import { isThenable } from 'vs/base/common/async';
|
||||
|
||||
const languageAssociationRegistry = Registry.as<ILanguageAssociationRegistry>(LanguageAssociationExtensions.LanguageAssociations);
|
||||
|
||||
@@ -63,7 +64,7 @@ export class EditorReplacementContribution implements IWorkbenchContribution {
|
||||
editor.setMode(defaultInputCreator[0]);
|
||||
const newInput = defaultInputCreator[1].convertInput(editor);
|
||||
if (newInput) {
|
||||
return { override: this.editorService.openEditor(newInput, options, group) };
|
||||
return { override: isThenable(newInput) ? newInput.then(input => this.editorService.openEditor(input, options, group)) : this.editorService.openEditor(newInput, options, group) };
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -71,7 +72,7 @@ export class EditorReplacementContribution implements IWorkbenchContribution {
|
||||
if (inputCreator) {
|
||||
const newInput = inputCreator.convertInput(editor);
|
||||
if (newInput) {
|
||||
return { override: this.editorService.openEditor(newInput, options, group) };
|
||||
return { override: isThenable(newInput) ? newInput.then(input => this.editorService.openEditor(input, options, group)) : this.editorService.openEditor(newInput, options, group) };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import { URI } from 'vs/base/common/uri';
|
||||
import { IOpenEditorOverrideHandler, IOpenEditorOverride, IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
import { isUndefinedOrNull } from 'vs/base/common/types';
|
||||
import { IEditorInput, EditorInput } from 'vs/workbench/common/editor';
|
||||
import { IEditorInput, EditorInput, IUntitledTextResourceInput } from 'vs/workbench/common/editor';
|
||||
import { ITextEditorOptions, IEditorOptions } from 'vs/platform/editor/common/editor';
|
||||
import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService';
|
||||
import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput';
|
||||
@@ -29,9 +29,13 @@ import { UntitledQueryEditorInput } from 'sql/workbench/common/editor/query/unti
|
||||
import { INotebookService } from 'sql/workbench/services/notebook/browser/notebookService';
|
||||
import { NotebookServiceStub } from 'sql/workbench/contrib/notebook/test/stubs';
|
||||
import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService';
|
||||
import { IQueryEditorService } from 'sql/workbench/services/queryEditor/common/queryEditorService';
|
||||
import { TestQueryEditorService } from 'sql/workbench/services/queryEditor/test/common/testQueryEditorService';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
|
||||
const languageAssociations = Registry.as<ILanguageAssociationRegistry>(LanguageAssociationExtensions.LanguageAssociations);
|
||||
|
||||
|
||||
suite('Editor Replacer Contribution', () => {
|
||||
let disposables: IDisposable[] = [];
|
||||
|
||||
@@ -40,6 +44,9 @@ suite('Editor Replacer Contribution', () => {
|
||||
disposables.push(languageAssociations.registerLanguageAssociation(NotebookEditorInputAssociation.languages, NotebookEditorInputAssociation));
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
instantiationService.stub(INotebookService, new NotebookServiceStub());
|
||||
const editorService = new MockEditorService(instantiationService);
|
||||
instantiationService.stub(IEditorService, editorService);
|
||||
instantiationService.stub(IQueryEditorService, instantiationService.createInstance(TestQueryEditorService));
|
||||
instantiationService.invokeFunction(accessor => {
|
||||
languageAssociations.start(accessor);
|
||||
});
|
||||
@@ -50,7 +57,8 @@ suite('Editor Replacer Contribution', () => {
|
||||
});
|
||||
|
||||
test('does proper lifecycle', () => {
|
||||
const editorService = new MockEditorService();
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const editorService = new MockEditorService(instantiationService);
|
||||
const modeService = new TestModeService();
|
||||
const contrib = new EditorReplacementContribution(editorService, modeService);
|
||||
assert.equal(editorService.overridenOpens.length, 1);
|
||||
@@ -59,8 +67,8 @@ suite('Editor Replacer Contribution', () => {
|
||||
});
|
||||
|
||||
test('does replace sql file input from uri (no mode service)', async () => {
|
||||
const editorService = new MockEditorService();
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const editorService = new MockEditorService(instantiationService);
|
||||
instantiationService.stub(IEditorService, editorService);
|
||||
const contrib = instantiationService.createInstance(EditorReplacementContribution);
|
||||
const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined);
|
||||
@@ -74,8 +82,8 @@ suite('Editor Replacer Contribution', () => {
|
||||
});
|
||||
|
||||
test('does replace sql file input using input mode', async () => {
|
||||
const editorService = new MockEditorService();
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const editorService = new MockEditorService(instantiationService);
|
||||
instantiationService.stub(IEditorService, editorService);
|
||||
const contrib = instantiationService.createInstance(EditorReplacementContribution);
|
||||
const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.other'), undefined, 'sql');
|
||||
@@ -88,9 +96,9 @@ suite('Editor Replacer Contribution', () => {
|
||||
contrib.dispose();
|
||||
});
|
||||
|
||||
test('does replace notebook file input using input mode', async () => {
|
||||
const editorService = new MockEditorService();
|
||||
test('does replace notebook file input using input extension notebook', async () => {
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const editorService = new MockEditorService(instantiationService);
|
||||
instantiationService.stub(IEditorService, editorService);
|
||||
const contrib = instantiationService.createInstance(EditorReplacementContribution);
|
||||
const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.notebook'), undefined, undefined);
|
||||
@@ -103,9 +111,9 @@ suite('Editor Replacer Contribution', () => {
|
||||
contrib.dispose();
|
||||
});
|
||||
|
||||
test('does replace notebook file input using input mode', async () => {
|
||||
const editorService = new MockEditorService();
|
||||
test('does replace notebook file input using input extension iynb', async () => {
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const editorService = new MockEditorService(instantiationService);
|
||||
instantiationService.stub(IEditorService, editorService);
|
||||
const contrib = instantiationService.createInstance(EditorReplacementContribution);
|
||||
const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.iynb'), undefined, 'notebook');
|
||||
@@ -118,9 +126,9 @@ suite('Editor Replacer Contribution', () => {
|
||||
contrib.dispose();
|
||||
});
|
||||
|
||||
test('does replace notebook file input using input mode', async () => {
|
||||
const editorService = new MockEditorService();
|
||||
test('does replace file input using default mode', async function () {
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const editorService = new MockEditorService(instantiationService);
|
||||
instantiationService.stub(IEditorService, editorService);
|
||||
const contrib = instantiationService.createInstance(EditorReplacementContribution);
|
||||
const accessor = instantiationService.createInstance(ServiceAccessor);
|
||||
@@ -137,8 +145,8 @@ suite('Editor Replacer Contribution', () => {
|
||||
});
|
||||
|
||||
test('does not replace editors that it shouldnt', async () => {
|
||||
const editorService = new MockEditorService();
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const editorService = new MockEditorService(instantiationService);
|
||||
instantiationService.stub(IEditorService, editorService);
|
||||
const contrib = instantiationService.createInstance(EditorReplacementContribution);
|
||||
const accessor = instantiationService.createInstance(ServiceAccessor);
|
||||
@@ -152,8 +160,8 @@ suite('Editor Replacer Contribution', () => {
|
||||
});
|
||||
|
||||
test('does not replace editors if it doesnt have a replacer', async () => {
|
||||
const editorService = new MockEditorService();
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const editorService = new MockEditorService(instantiationService);
|
||||
instantiationService.stub(IEditorService, editorService);
|
||||
const contrib = instantiationService.createInstance(EditorReplacementContribution);
|
||||
const accessor = instantiationService.createInstance(ServiceAccessor);
|
||||
@@ -167,6 +175,10 @@ suite('Editor Replacer Contribution', () => {
|
||||
});
|
||||
|
||||
class MockEditorService extends TestEditorService {
|
||||
|
||||
constructor(private readonly instantiationService: IInstantiationService) {
|
||||
super();
|
||||
}
|
||||
readonly overridenOpens: IOpenEditorOverrideHandler[] = [];
|
||||
|
||||
overrideOpenEditor(_handler: IOpenEditorOverrideHandler): IDisposable {
|
||||
@@ -192,6 +204,12 @@ class MockEditorService extends TestEditorService {
|
||||
openEditor(_editor: any, _options?: any, _group?: any): Promise<any> {
|
||||
return Promise.resolve(_editor);
|
||||
}
|
||||
|
||||
createInput(_input: IUntitledTextResourceInput): EditorInput {
|
||||
const accessor = this.instantiationService.createInstance(ServiceAccessor);
|
||||
const service = accessor.untitledTextEditorService;
|
||||
return this.instantiationService.createInstance(UntitledTextEditorInput, service.create());
|
||||
}
|
||||
}
|
||||
|
||||
class TestModeService implements IModeService {
|
||||
|
||||
@@ -58,7 +58,7 @@ export class LinkHandlerDirective {
|
||||
// ignore
|
||||
}
|
||||
if (uri && this.openerService && this.isSupportedLink(uri)) {
|
||||
if (uri.fragment && uri.fragment.length > 0 && uri.path === this.workbenchFilePath.path) {
|
||||
if (uri.fragment && uri.fragment.length > 0 && uri.fsPath === this.workbenchFilePath.fsPath) {
|
||||
this.notebookService.navigateTo(this.notebookUri, uri.fragment);
|
||||
} else {
|
||||
this.openerService.open(uri).catch(onUnexpectedError);
|
||||
|
||||
@@ -24,7 +24,7 @@ import { AngularDisposable } from 'sql/base/browser/lifecycle';
|
||||
import { IMimeComponent } from 'sql/workbench/contrib/notebook/browser/outputs/mimeRegistry';
|
||||
import { ICellModel } from 'sql/workbench/services/notebook/browser/models/modelInterfaces';
|
||||
import { MimeModel } from 'sql/workbench/services/notebook/browser/outputs/mimemodel';
|
||||
import { GridTableState } from 'sql/workbench/common/editor/query/gridPanelState';
|
||||
import { GridTableState } from 'sql/workbench/common/editor/query/gridTableState';
|
||||
import { GridTableBase } from 'sql/workbench/contrib/query/browser/gridPanel';
|
||||
import { getErrorMessage } from 'vs/base/common/errors';
|
||||
import { ISerializationService, SerializeDataParams } from 'sql/platform/serialization/common/serializationService';
|
||||
@@ -126,7 +126,7 @@ class DataResourceTable extends GridTableBase<any> {
|
||||
) {
|
||||
super(state, createResultSet(source), contextMenuService, instantiationService, editorService, untitledEditorService, configurationService);
|
||||
this._gridDataProvider = this.instantiationService.createInstance(DataResourceDataProvider, source, this.resultSet, this.documentUri);
|
||||
this._chart = this.instantiationService.createInstance(ChartView);
|
||||
this._chart = this.instantiationService.createInstance(ChartView, false);
|
||||
}
|
||||
|
||||
get gridDataProvider(): IGridDataProvider {
|
||||
@@ -389,13 +389,13 @@ export class NotebookChartAction extends ToggleableAction {
|
||||
public static SHOWCHART_LABEL = localize('notebook.showChart', "Show chart");
|
||||
public static SHOWCHART_ICON = 'viewChart';
|
||||
|
||||
public static HIDECHART_LABEL = localize('notebook.hideChart', "Hide chart");
|
||||
public static HIDECHART_ICON = 'close';
|
||||
public static SHOWTABLE_LABEL = localize('notebook.showTable', "Show table");
|
||||
public static SHOWTABLE_ICON = 'table';
|
||||
|
||||
constructor(private resourceTable: DataResourceTable) {
|
||||
super(NotebookChartAction.ID, {
|
||||
toggleOnLabel: NotebookChartAction.HIDECHART_LABEL,
|
||||
toggleOnClass: NotebookChartAction.HIDECHART_ICON,
|
||||
toggleOnLabel: NotebookChartAction.SHOWTABLE_LABEL,
|
||||
toggleOnClass: NotebookChartAction.SHOWTABLE_ICON,
|
||||
toggleOffLabel: NotebookChartAction.SHOWCHART_LABEL,
|
||||
toggleOffClass: NotebookChartAction.SHOWCHART_ICON,
|
||||
isOn: false
|
||||
|
||||
@@ -574,7 +574,11 @@ export class NotebookFindModel extends Disposable implements INotebookFindModel
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
start = searchText.indexOf(exp) + index + 1;
|
||||
start = searchText.indexOf(exp) + index;
|
||||
// Editors aren't 0-based; the first character position in an editor is 1, so adding 1 to the first found index
|
||||
if (index === 0) {
|
||||
start++;
|
||||
}
|
||||
}
|
||||
findResults.push(start);
|
||||
index = start + exp.length;
|
||||
|
||||
@@ -200,6 +200,41 @@ suite('Notebook Find Model', function (): void {
|
||||
assert.equal(notebookFindModel.findMatches.length, 3, 'Find failed');
|
||||
});
|
||||
|
||||
test('Should match find results for multiple results on same line', async function (): Promise<void> {
|
||||
let codeContent: nb.INotebookContents = {
|
||||
cells: [{
|
||||
cell_type: CellTypes.Code,
|
||||
source: ['abc abc abc abc abc abcabc ab a b c'],
|
||||
metadata: { language: 'python' },
|
||||
execution_count: 1
|
||||
}],
|
||||
metadata: {
|
||||
kernelspec: {
|
||||
name: 'python',
|
||||
language: 'python'
|
||||
}
|
||||
},
|
||||
nbformat: 4,
|
||||
nbformat_minor: 5
|
||||
};
|
||||
await initNotebookModel(codeContent);
|
||||
//initialize find
|
||||
let notebookFindModel = new NotebookFindModel(model);
|
||||
// Intentionally not using max_find_count here, as 7 items should be found
|
||||
await notebookFindModel.find('abc', false, false, 10);
|
||||
|
||||
assert.equal(notebookFindModel.findMatches.length, 7, 'Find failed to find number of matches correctly');
|
||||
|
||||
assert.deepEqual(notebookFindModel.findMatches[0].range, new NotebookRange(model.cells[0], 1, 1, 1, 4));
|
||||
assert.deepEqual(notebookFindModel.findMatches[1].range, new NotebookRange(model.cells[0], 1, 5, 1, 8));
|
||||
assert.deepEqual(notebookFindModel.findMatches[2].range, new NotebookRange(model.cells[0], 1, 9, 1, 12));
|
||||
assert.deepEqual(notebookFindModel.findMatches[3].range, new NotebookRange(model.cells[0], 1, 13, 1, 16));
|
||||
assert.deepEqual(notebookFindModel.findMatches[4].range, new NotebookRange(model.cells[0], 1, 17, 1, 20));
|
||||
assert.deepEqual(notebookFindModel.findMatches[5].range, new NotebookRange(model.cells[0], 1, 21, 1, 24));
|
||||
assert.deepEqual(notebookFindModel.findMatches[6].range, new NotebookRange(model.cells[0], 1, 24, 1, 27));
|
||||
});
|
||||
|
||||
|
||||
test('Should find results correctly with & without matching case selection', async function (): Promise<void> {
|
||||
// Need to set rendered text content for 2nd cell
|
||||
setRenderedTextContent(1);
|
||||
|
||||
@@ -17,7 +17,7 @@ import { removeAnsiEscapeCodes } from 'vs/base/common/strings';
|
||||
import { IGridDataProvider } from 'sql/workbench/services/query/common/gridDataProvider';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import QueryRunner from 'sql/workbench/services/query/common/queryRunner';
|
||||
import { GridTableState } from 'sql/workbench/common/editor/query/gridPanelState';
|
||||
import { GridTableState } from 'sql/workbench/common/editor/query/gridTableState';
|
||||
import * as Constants from 'sql/workbench/contrib/extensions/common/constants';
|
||||
import { IAdsTelemetryService } from 'sql/platform/telemetry/common/telemetry';
|
||||
import * as TelemetryKeys from 'sql/platform/telemetry/common/telemetryKeys';
|
||||
|
||||
@@ -44,7 +44,7 @@ import { localize } from 'vs/nls';
|
||||
import { IGridDataProvider } from 'sql/workbench/services/query/common/gridDataProvider';
|
||||
import { formatDocumentWithSelectedProvider, FormattingMode } from 'vs/editor/contrib/format/format';
|
||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
import { GridPanelState, GridTableState } from 'sql/workbench/common/editor/query/gridPanelState';
|
||||
import { GridPanelState, GridTableState } from 'sql/workbench/common/editor/query/gridTableState';
|
||||
import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService';
|
||||
import { SaveFormat } from 'sql/workbench/services/query/common/resultSerializer';
|
||||
import { Progress } from 'vs/platform/progress/common/progress';
|
||||
@@ -582,6 +582,7 @@ export abstract class GridTableBase<T> extends Disposable implements IView {
|
||||
let content = value.displayValue;
|
||||
|
||||
const input = this.untitledEditorService.create({ mode: column.isXml ? 'xml' : 'json', initialValue: content });
|
||||
await input.load();
|
||||
await this.instantiationService.invokeFunction(formatDocumentWithSelectedProvider, input.textEditorModel, FormattingMode.Explicit, Progress.None, CancellationToken.None);
|
||||
return this.editorService.openEditor(input);
|
||||
});
|
||||
|
||||
@@ -21,6 +21,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic
|
||||
import { onUnexpectedError } from 'vs/base/common/errors';
|
||||
import { IFileService } from 'vs/platform/files/common/files';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { IQueryEditorService } from 'sql/workbench/services/queryEditor/common/queryEditorService';
|
||||
|
||||
const editorInputFactoryRegistry = Registry.as<IEditorInputFactoryRegistry>(EditorInputExtensions.EditorInputFactories);
|
||||
|
||||
@@ -31,9 +32,37 @@ export class QueryEditorLanguageAssociation implements ILanguageAssociation {
|
||||
constructor(@IInstantiationService private readonly instantiationService: IInstantiationService,
|
||||
@IObjectExplorerService private readonly objectExplorerService: IObjectExplorerService,
|
||||
@IConnectionManagementService private readonly connectionManagementService: IConnectionManagementService,
|
||||
@IEditorService private readonly editorService: IEditorService) { }
|
||||
@IEditorService private readonly editorService: IEditorService,
|
||||
@IQueryEditorService private readonly queryEditorService: IQueryEditorService) { }
|
||||
|
||||
convertInput(activeEditor: IEditorInput): QueryEditorInput | undefined {
|
||||
async convertInput(activeEditor: IEditorInput): Promise<QueryEditorInput | undefined> {
|
||||
const queryResultsInput = this.instantiationService.createInstance(QueryResultsInput, activeEditor.resource.toString(true));
|
||||
let queryEditorInput: QueryEditorInput;
|
||||
if (activeEditor instanceof FileEditorInput) {
|
||||
queryEditorInput = this.instantiationService.createInstance(FileQueryEditorInput, '', activeEditor, queryResultsInput);
|
||||
} else if (activeEditor instanceof UntitledTextEditorInput) {
|
||||
const content = (await activeEditor.resolve()).textEditorModel.getValue();
|
||||
queryEditorInput = (this.queryEditorService.newSqlEditor(content) as any) as UntitledQueryEditorInput;
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const profile = getCurrentGlobalConnection(this.objectExplorerService, this.connectionManagementService, this.editorService);
|
||||
if (profile) {
|
||||
const options: IConnectionCompletionOptions = {
|
||||
params: { connectionType: ConnectionType.editor, runQueryOnCompletion: undefined, input: queryEditorInput },
|
||||
saveTheConnection: false,
|
||||
showDashboard: false,
|
||||
showConnectionDialogOnError: true,
|
||||
showFirewallRuleOnError: true
|
||||
};
|
||||
this.connectionManagementService.connect(profile, queryEditorInput.uri, options).catch(err => onUnexpectedError(err));
|
||||
}
|
||||
|
||||
return queryEditorInput;
|
||||
}
|
||||
|
||||
syncConvertinput(activeEditor: IEditorInput): QueryEditorInput | undefined {
|
||||
const queryResultsInput = this.instantiationService.createInstance(QueryResultsInput, activeEditor.resource.toString(true));
|
||||
let queryEditorInput: QueryEditorInput;
|
||||
if (activeEditor instanceof FileEditorInput) {
|
||||
|
||||
@@ -14,7 +14,7 @@ import { QueryPlanTab } from 'sql/workbench/contrib/queryPlan/browser/queryPlan'
|
||||
import { TopOperationsTab } from 'sql/workbench/contrib/queryPlan/browser/topOperations';
|
||||
import { QueryModelViewTab } from 'sql/workbench/contrib/query/browser/modelViewTab/queryModelViewTab';
|
||||
import { MessagePanelState } from 'sql/workbench/common/editor/query/messagePanelState';
|
||||
import { GridPanelState } from 'sql/workbench/common/editor/query/gridPanelState';
|
||||
import { GridPanelState } from 'sql/workbench/common/editor/query/gridTableState';
|
||||
|
||||
import * as nls from 'vs/nls';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
|
||||
@@ -21,10 +21,11 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
|
||||
import { UntitledQueryEditorInput } from 'sql/workbench/common/editor/query/untitledQueryEditorInput';
|
||||
import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput';
|
||||
import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService';
|
||||
import { isThenable } from 'vs/base/common/async';
|
||||
|
||||
suite('Query Input Factory', () => {
|
||||
|
||||
test('query editor input is connected if global connection exists (OE)', () => {
|
||||
test('sync query editor input is connected if global connection exists (OE)', () => {
|
||||
const editorService = new MockEditorService();
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const connectionManagementService = new MockConnectionManagementService();
|
||||
@@ -37,7 +38,22 @@ suite('Query Input Factory', () => {
|
||||
assert(connectionManagementService.numberConnects === 1, 'Convert input should have called connect when active OE connection exists');
|
||||
});
|
||||
|
||||
test('query editor input is connected if global connection exists (Editor)', () => {
|
||||
test('query editor input is connected if global connection exists (OE)', async () => {
|
||||
const editorService = new MockEditorService();
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const connectionManagementService = new MockConnectionManagementService();
|
||||
instantiationService.stub(IObjectExplorerService, new MockObjectExplorerService());
|
||||
instantiationService.stub(IConnectionManagementService, connectionManagementService);
|
||||
instantiationService.stub(IEditorService, editorService);
|
||||
const queryEditorLanguageAssociation = instantiationService.createInstance(QueryEditorLanguageAssociation);
|
||||
const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined);
|
||||
const response = queryEditorLanguageAssociation.convertInput(input);
|
||||
assert(isThenable(response));
|
||||
await response;
|
||||
assert(connectionManagementService.numberConnects === 1, 'Convert input should have called connect when active OE connection exists');
|
||||
});
|
||||
|
||||
test('sync query editor input is connected if global connection exists (Editor)', () => {
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const editorService = new MockEditorService(instantiationService);
|
||||
const connectionManagementService = new MockConnectionManagementService();
|
||||
@@ -50,7 +66,22 @@ suite('Query Input Factory', () => {
|
||||
assert(connectionManagementService.numberConnects === 1, 'Convert input should have called connect when active editor connection exists');
|
||||
});
|
||||
|
||||
test('query editor input is not connected if no global connection exists', () => {
|
||||
test('query editor input is connected if global connection exists (Editor)', async () => {
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const editorService = new MockEditorService(instantiationService);
|
||||
const connectionManagementService = new MockConnectionManagementService();
|
||||
instantiationService.stub(IObjectExplorerService, new MockObjectExplorerService());
|
||||
instantiationService.stub(IConnectionManagementService, connectionManagementService);
|
||||
instantiationService.stub(IEditorService, editorService);
|
||||
const queryEditorLanguageAssociation = instantiationService.createInstance(QueryEditorLanguageAssociation);
|
||||
const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined);
|
||||
const response = queryEditorLanguageAssociation.convertInput(input);
|
||||
assert(isThenable(response));
|
||||
await response;
|
||||
assert(connectionManagementService.numberConnects === 1, 'Convert input should have called connect when active editor connection exists');
|
||||
});
|
||||
|
||||
test('sync query editor input is not connected if no global connection exists', () => {
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const editorService = new MockEditorService();
|
||||
const connectionManagementService = new MockConnectionManagementService();
|
||||
@@ -58,7 +89,21 @@ suite('Query Input Factory', () => {
|
||||
instantiationService.stub(IEditorService, editorService);
|
||||
const queryEditorLanguageAssociation = instantiationService.createInstance(QueryEditorLanguageAssociation);
|
||||
const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined);
|
||||
queryEditorLanguageAssociation.convertInput(input);
|
||||
queryEditorLanguageAssociation.syncConvertinput(input);
|
||||
assert(connectionManagementService.numberConnects === 0, 'Convert input should not have been called connect when no global connections exist');
|
||||
});
|
||||
|
||||
test('async query editor input is not connected if no global connection exists', async () => {
|
||||
const instantiationService = workbenchInstantiationService();
|
||||
const editorService = new MockEditorService();
|
||||
const connectionManagementService = new MockConnectionManagementService();
|
||||
instantiationService.stub(IConnectionManagementService, connectionManagementService);
|
||||
instantiationService.stub(IEditorService, editorService);
|
||||
const queryEditorLanguageAssociation = instantiationService.createInstance(QueryEditorLanguageAssociation);
|
||||
const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined);
|
||||
const response = queryEditorLanguageAssociation.convertInput(input);
|
||||
assert(isThenable(response));
|
||||
await response;
|
||||
assert(connectionManagementService.numberConnects === 0, 'Convert input should not have been called connect when no global connections exist');
|
||||
});
|
||||
|
||||
|
||||
@@ -93,13 +93,3 @@
|
||||
.account-view .list-row .actions-container .action-item .action-label.codicon.remove {
|
||||
background-size: 14px !important;
|
||||
}
|
||||
|
||||
.account-view .list-row .actions-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.account-view .monaco-list .monaco-list-row:hover .list-row .actions-container,
|
||||
.account-view .monaco-list .monaco-list-row.selected .list-row .actions-container,
|
||||
.account-view .monaco-list .monaco-list-row.focused .list-row .actions-container{
|
||||
display: block;
|
||||
}
|
||||
|
||||
@@ -11,16 +11,15 @@
|
||||
.list-row.account-picker-list .label {
|
||||
flex: 1 1 auto;
|
||||
margin-left: 15px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.list-row.account-picker-list .label .contextual-display-name {
|
||||
font-size: 15px;
|
||||
line-height: 15px;
|
||||
}
|
||||
|
||||
.list-row.account-picker-list .label .display-name {
|
||||
font-size: 13px;
|
||||
line-height: 13px;
|
||||
}
|
||||
|
||||
.list-row.account-picker-list .label .content {
|
||||
|
||||
@@ -20,8 +20,8 @@ export function doHandleUpgrade(editor?: EditorInput): EditorInput | undefined {
|
||||
editor.getPreferredMode();
|
||||
}
|
||||
const association = languageRegistry.getAssociationForLanguage(language);
|
||||
if (association) {
|
||||
return association.convertInput(editor);
|
||||
if (association && association.syncConvertinput) {
|
||||
return association.syncConvertinput(editor);
|
||||
}
|
||||
}
|
||||
return editor;
|
||||
|
||||
@@ -12,7 +12,12 @@ export type InputCreator = (servicesAccessor: ServicesAccessor, activeEditor: IE
|
||||
export type BaseInputCreator = (activeEditor: IEditorInput) => IEditorInput;
|
||||
|
||||
export interface ILanguageAssociation {
|
||||
convertInput(activeEditor: IEditorInput): EditorInput | undefined;
|
||||
convertInput(activeEditor: IEditorInput): Promise<EditorInput | undefined> | EditorInput | undefined;
|
||||
/**
|
||||
* Used for scenarios when we need to synchrounly create inputs, currently only for handling upgrades
|
||||
* and planned to be removed eventually
|
||||
*/
|
||||
syncConvertinput?(activeEditor: IEditorInput): EditorInput | undefined;
|
||||
createBase(activeEditor: IEditorInput): IEditorInput;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,10 @@
|
||||
|
||||
.vs .icon.table,
|
||||
.vs-dark .icon.table,
|
||||
.hc-black .icon.table {
|
||||
.hc-black .icon.table,
|
||||
.vs .codicon.table,
|
||||
.vs-dark .codicon.table,
|
||||
.hc-black .codicon.table {
|
||||
background: url("Table.svg") center center no-repeat;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { IQueryEditorService } from 'sql/workbench/services/queryEditor/common/queryEditorService';
|
||||
import { IConnectableInput } from 'sql/platform/connection/common/connectionManagement';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { UntitledQueryEditorInput } from 'sql/workbench/common/editor/query/untitledQueryEditorInput';
|
||||
import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput';
|
||||
import { QueryResultsInput } from 'sql/workbench/common/editor/query/queryResultsInput';
|
||||
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
|
||||
export class TestQueryEditorService implements IQueryEditorService {
|
||||
_serviceBrand: undefined;
|
||||
|
||||
constructor(
|
||||
@IInstantiationService private readonly instantiationService: IInstantiationService,
|
||||
@IEditorService private readonly editorService: IEditorService) {
|
||||
|
||||
}
|
||||
|
||||
newSqlEditor(sqlContent?: string, connectionProviderName?: string, isDirty?: boolean, objectName?: string): Promise<IConnectableInput> {
|
||||
const base = this.editorService.createInput({ forceUntitled: true }) as UntitledTextEditorInput;
|
||||
return Promise.resolve(this.instantiationService.createInstance(UntitledQueryEditorInput, '', base, new QueryResultsInput(base.resource.toString(true))));
|
||||
}
|
||||
|
||||
newEditDataEditor(schemaName: string, tableName: string, queryString: string): Promise<IConnectableInput> {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { GridTableState } from 'sql/workbench/common/editor/query/gridTableState';
|
||||
import * as assert from 'assert';
|
||||
import { isUndefined } from 'vs/base/common/types';
|
||||
import { Event } from 'vs/base/common/event';
|
||||
|
||||
suite('Grid Table State', () => {
|
||||
test('inital state is correct', () => {
|
||||
const resultId = 0;
|
||||
const batchId = 0;
|
||||
const state = new GridTableState(resultId, batchId);
|
||||
|
||||
assert.equal(state.resultId, resultId);
|
||||
assert.equal(state.batchId, batchId);
|
||||
assert(isUndefined(state.canBeMaximized));
|
||||
assert(isUndefined(state.maximized));
|
||||
assert.equal(state.scrollPositionX, 0);
|
||||
assert.equal(state.scrollPositionY, 0);
|
||||
assert(isUndefined(state.columnSizes));
|
||||
assert(isUndefined(state.selection));
|
||||
assert(isUndefined(state.activeCell));
|
||||
});
|
||||
|
||||
test('does set properties correctly', async () => {
|
||||
const state = new GridTableState(0, 0);
|
||||
let event = await new Promise<boolean>(resolve => {
|
||||
Event.once(state.onCanBeMaximizedChange)(e => resolve(e));
|
||||
state.canBeMaximized = true;
|
||||
});
|
||||
|
||||
assert.equal(event, true);
|
||||
assert.equal(state.canBeMaximized, true);
|
||||
|
||||
event = await new Promise<boolean>(resolve => {
|
||||
Event.once(state.onCanBeMaximizedChange)(e => resolve(e));
|
||||
state.canBeMaximized = false;
|
||||
});
|
||||
|
||||
assert.equal(event, false);
|
||||
assert.equal(state.canBeMaximized, false);
|
||||
|
||||
event = await new Promise<boolean>(resolve => {
|
||||
Event.once(state.onMaximizedChange)(e => resolve(e));
|
||||
state.maximized = true;
|
||||
});
|
||||
|
||||
assert.equal(event, true);
|
||||
assert.equal(state.maximized, true);
|
||||
|
||||
event = await new Promise<boolean>(resolve => {
|
||||
Event.once(state.onMaximizedChange)(e => resolve(e));
|
||||
state.maximized = false;
|
||||
});
|
||||
|
||||
assert.equal(event, false);
|
||||
assert.equal(state.maximized, false);
|
||||
});
|
||||
});
|
||||
@@ -10,9 +10,12 @@ import { IConnectionManagementService } from 'sql/platform/connection/common/con
|
||||
import { TestConnectionManagementService } from 'sql/platform/connection/test/common/testConnectionManagementService';
|
||||
import { TestObjectExplorerService } from 'sql/workbench/services/objectExplorer/test/browser/testObjectExplorerService';
|
||||
import { IObjectExplorerService } from 'sql/workbench/services/objectExplorer/browser/objectExplorerService';
|
||||
import { IQueryEditorService } from 'sql/workbench/services/queryEditor/common/queryEditorService';
|
||||
import { TestQueryEditorService } from 'sql/workbench/services/queryEditor/test/common/testQueryEditorService';
|
||||
|
||||
export function workbenchInstantiationService(): ITestInstantiationService {
|
||||
const instantiationService = vsworkbenchInstantiationService();
|
||||
instantiationService.stub(IQueryEditorService, instantiationService.createInstance(TestQueryEditorService));
|
||||
instantiationService.stub(IConnectionManagementService, new TestConnectionManagementService());
|
||||
instantiationService.stub(IQueryModelService, new TestQueryModelService());
|
||||
instantiationService.stub(IObjectExplorerService, new TestObjectExplorerService());
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
}
|
||||
|
||||
.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .left > .signature-label {
|
||||
overflow: auto;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
@@ -228,6 +228,7 @@
|
||||
|
||||
.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .left {
|
||||
flex-shrink: 1;
|
||||
flex-grow: 1;
|
||||
overflow: hidden;
|
||||
}
|
||||
.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .left > .monaco-icon-label {
|
||||
|
||||
@@ -144,11 +144,10 @@ class ItemRenderer implements IListRenderer<CompletionItem, ISuggestionTemplateD
|
||||
const text = append(container, $('.contents'));
|
||||
const main = append(text, $('.main'));
|
||||
|
||||
data.iconContainer = append(main, $('.icon-label.codicon'));
|
||||
data.left = append(main, $('span.left'));
|
||||
data.right = append(main, $('span.right'));
|
||||
|
||||
data.iconContainer = append(data.left, $('.icon-label.codicon'));
|
||||
|
||||
data.iconLabel = new IconLabel(data.left, { supportHighlights: true, supportCodicons: true });
|
||||
data.disposables.add(data.iconLabel);
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ import { dirExists } from 'vs/base/node/pfs';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { ITelemetryData, ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { ILogService } from 'vs/platform/log/common/log';
|
||||
|
||||
export interface IElectronMainService extends AddFirstParameterToFunctions<IElectronService, Promise<any> /* only methods, not events */, number | undefined /* window ID */> { }
|
||||
|
||||
@@ -34,7 +35,8 @@ export class ElectronMainService implements IElectronMainService {
|
||||
@IDialogMainService private readonly dialogMainService: IDialogMainService,
|
||||
@ILifecycleMainService private readonly lifecycleMainService: ILifecycleMainService,
|
||||
@IEnvironmentService private readonly environmentService: IEnvironmentService,
|
||||
@ITelemetryService private readonly telemetryService: ITelemetryService
|
||||
@ITelemetryService private readonly telemetryService: ITelemetryService,
|
||||
@ILogService private readonly logService: ILogService
|
||||
) {
|
||||
}
|
||||
|
||||
@@ -392,6 +394,7 @@ export class ElectronMainService implements IElectronMainService {
|
||||
|
||||
async startCrashReporter(windowId: number | undefined, options: CrashReporterStartOptions): Promise<void> {
|
||||
crashReporter.start(options);
|
||||
this.logService.trace('ElectronMainService#crashReporter', JSON.stringify(options));
|
||||
}
|
||||
|
||||
//#endregion
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
import { Event } from 'vs/base/common/event';
|
||||
import { IOpenerService } from 'vs/platform/opener/common/opener';
|
||||
import { $ } from 'vs/base/browser/dom';
|
||||
import { $, EventHelper, EventLike } from 'vs/base/browser/dom';
|
||||
import { domEvent } from 'vs/base/browser/event';
|
||||
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
||||
@@ -46,9 +46,12 @@ export class Link extends Disposable {
|
||||
.map(e => new StandardKeyboardEvent(e))
|
||||
.filter(e => e.keyCode === KeyCode.Enter)
|
||||
.event;
|
||||
const onOpen = Event.any(onClick, onEnterPress);
|
||||
const onOpen = Event.any<EventLike>(onClick, onEnterPress);
|
||||
|
||||
this._register(onOpen(_ => openerService.open(link.href)));
|
||||
this._register(onOpen(e => {
|
||||
EventHelper.stop(e, true);
|
||||
openerService.open(link.href);
|
||||
}));
|
||||
|
||||
this.applyStyles();
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ export interface IProductConfiguration {
|
||||
readonly checksums?: { [path: string]: string; };
|
||||
readonly checksumFailMoreInfoUrl?: string;
|
||||
|
||||
readonly hockeyApp?: {
|
||||
readonly appCenter?: {
|
||||
readonly 'win32-ia32': string;
|
||||
readonly 'win32-x64': string;
|
||||
readonly 'linux-x64': string;
|
||||
|
||||
@@ -12,7 +12,7 @@ import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
import { onUnexpectedError } from 'vs/base/common/errors';
|
||||
import { ILogService } from 'vs/platform/log/common/log';
|
||||
import { generateUuid } from 'vs/base/common/uuid';
|
||||
import { instanceStorageKey, firstSessionDateStorageKey, lastSessionDateStorageKey, currentSessionDateStorageKey } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { instanceStorageKey, firstSessionDateStorageKey, lastSessionDateStorageKey, currentSessionDateStorageKey, crashReporterIdStorageKey } from 'vs/platform/telemetry/common/telemetry';
|
||||
|
||||
type Key = string;
|
||||
type Value = string;
|
||||
@@ -54,6 +54,16 @@ export class GlobalStorageDatabaseChannel extends Disposable implements IServerC
|
||||
this.logService.error(error);
|
||||
}
|
||||
|
||||
// This is unique to the application instance and thereby
|
||||
// should be written from the main process once.
|
||||
//
|
||||
// THIS SHOULD NEVER BE SENT TO TELEMETRY.
|
||||
//
|
||||
const crashReporterId = this.storageMainService.get(crashReporterIdStorageKey, undefined);
|
||||
if (crashReporterId === undefined) {
|
||||
this.storageMainService.store(crashReporterIdStorageKey, generateUuid());
|
||||
}
|
||||
|
||||
// Apply global telemetry values as part of the initialization
|
||||
// These are global across all windows and thereby should be
|
||||
// written from the main process once.
|
||||
|
||||
@@ -45,3 +45,4 @@ export const instanceStorageKey = 'telemetry.instanceId';
|
||||
export const currentSessionDateStorageKey = 'telemetry.currentSessionDate';
|
||||
export const firstSessionDateStorageKey = 'telemetry.firstSessionDate';
|
||||
export const lastSessionDateStorageKey = 'telemetry.lastSessionDate';
|
||||
export const crashReporterIdStorageKey = 'crashReporter.guid';
|
||||
|
||||
@@ -457,8 +457,9 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
|
||||
let foldersToRestore: URI[] = [];
|
||||
let workspacesToRestore: IWorkspacePathToOpen[] = [];
|
||||
if (openConfig.initialStartup && !openConfig.cli.extensionDevelopmentPath && !openConfig.cli['disable-restore-windows']) {
|
||||
let foldersToRestore = this.backupMainService.getFolderBackupPaths();
|
||||
foldersToOpen.push(...foldersToRestore.map(f => ({ folderUri: f, remoteAuhority: getRemoteAuthority(f) })));
|
||||
// don't restore backuped folders, for #92318.
|
||||
// let foldersToRestore = this.backupMainService.getFolderBackupPaths();
|
||||
// foldersToOpen.push(...foldersToRestore.map(f => ({ folderUri: f, remoteAuhority: getRemoteAuthority(f) })));
|
||||
|
||||
// collect from workspaces with hot-exit backups and from previous window session
|
||||
workspacesToRestore = [...this.backupMainService.getWorkspaceBackups(), ...this.workspacesMainService.getUntitledWorkspacesSync()];
|
||||
|
||||
3
src/vs/vscode.d.ts
vendored
3
src/vs/vscode.d.ts
vendored
@@ -8096,6 +8096,9 @@ declare module 'vscode' {
|
||||
* An event signaling when the selected items have changed.
|
||||
*/
|
||||
readonly onDidChangeSelection: Event<T[]>;
|
||||
|
||||
// {SQL CARBON EDIT} Allow setting the behavior of the QuickPick
|
||||
ok: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -261,9 +261,22 @@ class ExtHostQuickInput implements QuickInput {
|
||||
this._onDidChangeValueEmitter
|
||||
];
|
||||
|
||||
|
||||
constructor(protected _proxy: MainThreadQuickOpenShape, protected _extensionId: ExtensionIdentifier, private _onDidDispose: () => void) {
|
||||
}
|
||||
|
||||
// {SQL CARBON EDIT} START ok button visibility
|
||||
private _ok = false;
|
||||
get ok() {
|
||||
return this._ok;
|
||||
}
|
||||
|
||||
set ok(ok: boolean) {
|
||||
this._ok = ok;
|
||||
this.update({ ok });
|
||||
}
|
||||
// {SQL CARBON EDIT} END ok button visibility
|
||||
|
||||
get title() {
|
||||
return this._title;
|
||||
}
|
||||
|
||||
@@ -152,7 +152,10 @@ class NotificationMessageRenderer {
|
||||
const anchor = $('a', { href: node.href, title: title, }, node.label);
|
||||
|
||||
if (actionHandler) {
|
||||
actionHandler.toDispose.add(addDisposableListener(anchor, EventType.CLICK, () => actionHandler.callback(node.href)));
|
||||
actionHandler.toDispose.add(addDisposableListener(anchor, EventType.CLICK, e => {
|
||||
EventHelper.stop(e, true);
|
||||
actionHandler.callback(node.href);
|
||||
}));
|
||||
}
|
||||
|
||||
messageContainer.appendChild(anchor);
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
}
|
||||
|
||||
.monaco-workbench .part.panel > .composite.title > .composite-bar-excess {
|
||||
width: 100%;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar {
|
||||
|
||||
@@ -49,7 +49,7 @@ import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuratio
|
||||
nls.localize('workbench.editor.untitled.labelFormat.content', "The name of the untitled file is derived from the contents of its first line unless it has an associated file path. It will fallback to the name in case the line is empty or contains no word characters."),
|
||||
nls.localize('workbench.editor.untitled.labelFormat.name', "The name of the untitled file is not derived from the contents of the file."),
|
||||
],
|
||||
'default': 'content',
|
||||
'default': 'name', // {{SQL CARBON EDIT}} change default from content to name
|
||||
'description': nls.localize({
|
||||
comment: ['This is the description for a setting. Values surrounded by parenthesis are not to be translated.'],
|
||||
key: 'untitledLabelFormat'
|
||||
|
||||
@@ -687,10 +687,6 @@ export abstract class TextResourceEditorInput extends EditorInput {
|
||||
return false; // untitled is never readonly
|
||||
}
|
||||
|
||||
if (!this.fileService.canHandleResource(this.resource)) {
|
||||
return true; // resources without file support are always readonly
|
||||
}
|
||||
|
||||
return this.fileService.hasCapability(this.resource, FileSystemProviderCapabilities.Readonly);
|
||||
}
|
||||
|
||||
|
||||
@@ -262,7 +262,8 @@ function compareViewContentDescriptors(a: IViewContentDescriptor, b: IViewConten
|
||||
return aPriority - bPriority;
|
||||
}
|
||||
|
||||
return a.content < b.content ? -1 : 1;
|
||||
// No priroity, keep views sorted in the order they got registered
|
||||
return 0;
|
||||
}
|
||||
|
||||
class ViewsRegistry extends Disposable implements IViewsRegistry {
|
||||
@@ -601,4 +602,3 @@ export interface IViewPaneContainer {
|
||||
getView(viewId: string): IView | undefined;
|
||||
saveState(): void;
|
||||
}
|
||||
|
||||
|
||||
@@ -260,6 +260,17 @@ export class BulkFileOperations {
|
||||
}
|
||||
}
|
||||
|
||||
// sort (once) categories atop which have unconfirmed edits
|
||||
this.categories.sort((a, b) => {
|
||||
if (a.metadata.needsConfirmation === b.metadata.needsConfirmation) {
|
||||
return a.metadata.label.localeCompare(b.metadata.label);
|
||||
} else if (a.metadata.needsConfirmation) {
|
||||
return -1;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
});
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@@ -258,19 +258,6 @@ export class BulkEditDataSource implements IAsyncDataSource<BulkFileOperations,
|
||||
export class BulkEditSorter implements ITreeSorter<BulkEditElement> {
|
||||
|
||||
compare(a: BulkEditElement, b: BulkEditElement): number {
|
||||
if (a instanceof CategoryElement && b instanceof CategoryElement) {
|
||||
//
|
||||
const aConfirm = BulkEditSorter._needsConfirmation(a.category);
|
||||
const bConfirm = BulkEditSorter._needsConfirmation(b.category);
|
||||
if (aConfirm === bConfirm) {
|
||||
return a.category.metadata.label.localeCompare(b.category.metadata.label);
|
||||
} else if (aConfirm) {
|
||||
return -1;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (a instanceof FileElement && b instanceof FileElement) {
|
||||
return compare(a.edit.uri.toString(), b.edit.uri.toString());
|
||||
}
|
||||
@@ -281,10 +268,6 @@ export class BulkEditSorter implements ITreeSorter<BulkEditElement> {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private static _needsConfirmation(a: BulkCategory): boolean {
|
||||
return a.fileOperations.some(ops => ops.needsConfirmation());
|
||||
}
|
||||
}
|
||||
|
||||
// --- ACCESSI
|
||||
|
||||
@@ -857,6 +857,6 @@ registerThemingParticipant((theme, collector) => {
|
||||
const linkFg = theme.getColor(textLinkForeground);
|
||||
if (linkFg) {
|
||||
collector.addRule(`.markers-panel .markers-panel-container .tree-container .monaco-tl-contents .details-container a.code-link .marker-code > span:hover { color: ${linkFg}; }`);
|
||||
collector.addRule(`.markers-panel .markers-panel-container .tree-container .monaco-list:focus .monaco-tl-contents .details-container a.code-link .marker-code > span:hover { color: ${linkFg.lighten(.4)}; }`);
|
||||
collector.addRule(`.markers-panel .markers-panel-container .tree-container .monaco-list:focus .monaco-tl-contents .details-container a.code-link .marker-code > span:hover { color: inherit; }`);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -6,14 +6,14 @@
|
||||
import * as nls from 'vs/nls';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
import { equals, deepClone, assign } from 'vs/base/common/objects';
|
||||
import { equals, deepClone } from 'vs/base/common/objects';
|
||||
import * as DOM from 'vs/base/browser/dom';
|
||||
import { Separator } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
import { IAction } from 'vs/base/common/actions';
|
||||
import { IFileService } from 'vs/platform/files/common/files';
|
||||
import { toResource, IUntitledTextResourceInput, SideBySideEditor, pathsToEditors } from 'vs/workbench/common/editor';
|
||||
import { IEditorService, IResourceEditor } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { ITelemetryService, crashReporterIdStorageKey } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { IWindowSettings, IOpenFileRequest, IWindowsConfiguration, IAddFoldersRequest, IRunActionInWindowRequest, IRunKeybindingInWindowRequest, getTitleBarStyle } from 'vs/platform/windows/common/windows';
|
||||
import { ITitleService } from 'vs/workbench/services/title/common/titleService';
|
||||
import { IWorkbenchThemeService, VS_HC_THEME } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||
@@ -46,7 +46,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
|
||||
import { MenubarControl } from '../browser/parts/titlebar/menubarControl';
|
||||
import { ILabelService } from 'vs/platform/label/common/label';
|
||||
import { IUpdateService } from 'vs/platform/update/common/update';
|
||||
import { IStorageService } from 'vs/platform/storage/common/storage';
|
||||
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
|
||||
import { IPreferencesService } from '../services/preferences/common/preferences';
|
||||
import { IMenubarService, IMenubarData, IMenubarMenu, IMenubarKeybinding, IMenubarMenuItemSubmenu, IMenubarMenuItemAction, MenubarMenuItem } from 'vs/platform/menubar/node/menubar';
|
||||
import { withNullAsUndefined, assertIsDefined } from 'vs/base/common/types';
|
||||
@@ -104,7 +104,8 @@ export class ElectronWindow extends Disposable {
|
||||
@IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService,
|
||||
@IElectronEnvironmentService private readonly electronEnvironmentService: IElectronEnvironmentService,
|
||||
@IWorkingCopyService private readonly workingCopyService: IWorkingCopyService,
|
||||
@IFilesConfigurationService private readonly filesConfigurationService: IFilesConfigurationService
|
||||
@IFilesConfigurationService private readonly filesConfigurationService: IFilesConfigurationService,
|
||||
@IStorageService private readonly storageService: IStorageService,
|
||||
) {
|
||||
super();
|
||||
|
||||
@@ -422,8 +423,8 @@ export class ElectronWindow extends Disposable {
|
||||
this.updateTouchbarMenu();
|
||||
|
||||
// Crash reporter (if enabled)
|
||||
if (!this.environmentService.disableCrashReporter && product.crashReporter && product.hockeyApp && this.configurationService.getValue('telemetry.enableCrashReporter')) {
|
||||
this.setupCrashReporter(product.crashReporter.companyName, product.crashReporter.productName, product.hockeyApp);
|
||||
if (!this.environmentService.disableCrashReporter && product.crashReporter && product.appCenter && this.configurationService.getValue('telemetry.enableCrashReporter')) {
|
||||
this.setupCrashReporter(product.crashReporter.companyName, product.crashReporter.productName, product.appCenter);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -536,31 +537,36 @@ export class ElectronWindow extends Disposable {
|
||||
}
|
||||
}
|
||||
|
||||
private async setupCrashReporter(companyName: string, productName: string, hockeyAppConfig: typeof product.hockeyApp): Promise<void> {
|
||||
if (!hockeyAppConfig) {
|
||||
private async setupCrashReporter(companyName: string, productName: string, appCenterConfig: typeof product.appCenter): Promise<void> {
|
||||
if (!appCenterConfig) {
|
||||
return;
|
||||
}
|
||||
|
||||
const appCenterURL = isWindows ? appCenterConfig[process.arch === 'ia32' ? 'win32-ia32' : 'win32-x64']
|
||||
: isLinux ? appCenterConfig[`linux-x64`] : appCenterConfig.darwin;
|
||||
const info = await this.telemetryService.getTelemetryInfo();
|
||||
const crashReporterId = this.storageService.get(crashReporterIdStorageKey, StorageScope.GLOBAL)!;
|
||||
|
||||
// base options with product info
|
||||
const options: CrashReporterStartOptions = {
|
||||
companyName,
|
||||
productName,
|
||||
submitURL: isWindows ? hockeyAppConfig[process.arch === 'ia32' ? 'win32-ia32' : 'win32-x64'] : isLinux ? hockeyAppConfig[`linux-x64`] : hockeyAppConfig.darwin,
|
||||
submitURL: appCenterURL.concat('&uid=', crashReporterId, '&iid=', crashReporterId, '&sid=', info.sessionId),
|
||||
extra: {
|
||||
vscode_version: product.version,
|
||||
vscode_commit: product.commit || ''
|
||||
}
|
||||
};
|
||||
|
||||
// mixin telemetry info
|
||||
const info = await this.telemetryService.getTelemetryInfo();
|
||||
assign(options.extra, { vscode_sessionId: info.sessionId });
|
||||
// start crash reporter in the main process first.
|
||||
// On windows crashpad excepts a name pipe for the client to connect,
|
||||
// this pipe is created by crash reporter initialization from the main process,
|
||||
// changing this order of initialization will cause issues.
|
||||
// For more info: https://chromium.googlesource.com/crashpad/crashpad/+/HEAD/doc/overview_design.md#normal-registration
|
||||
await this.electronService.startCrashReporter(options);
|
||||
|
||||
// start crash reporter right here
|
||||
crashReporter.start(deepClone(options));
|
||||
|
||||
// start crash reporter in the main process
|
||||
return this.electronService.startCrashReporter(options);
|
||||
}
|
||||
|
||||
private onAddFoldersRequest(request: IAddFoldersRequest): void {
|
||||
|
||||
Reference in New Issue
Block a user