From d5fb6a08d41c00347b266b02dcf08990f0730eac Mon Sep 17 00:00:00 2001 From: liuyuqi-dellpc Date: Thu, 1 Sep 2022 01:50:49 +0800 Subject: [PATCH 1/7] remove jupyter-web --- 1.sh | 19 ---- extensions/jupyter-web/LICENSE | 21 ---- extensions/jupyter-web/README.md | 24 ---- .../jupyter-web/extension.webpack.config.js | 41 ------- extensions/jupyter-web/images/jupyter.png | Bin 26597 -> 0 bytes extensions/jupyter-web/images/sample.PNG | Bin 3510874 -> 0 bytes extensions/jupyter-web/jsconfig.json | 12 -- .../jupyter-web/language-configuration.json | 41 ------- extensions/jupyter-web/package.json | 107 ------------------ extensions/jupyter-web/src/extension.js | 53 --------- vscode1.52.0 | 1 + vscode1.70.2 | 1 + 12 files changed, 2 insertions(+), 318 deletions(-) delete mode 100644 1.sh delete mode 100644 extensions/jupyter-web/LICENSE delete mode 100644 extensions/jupyter-web/README.md delete mode 100644 extensions/jupyter-web/extension.webpack.config.js delete mode 100644 extensions/jupyter-web/images/jupyter.png delete mode 100644 extensions/jupyter-web/images/sample.PNG delete mode 100644 extensions/jupyter-web/jsconfig.json delete mode 100644 extensions/jupyter-web/language-configuration.json delete mode 100644 extensions/jupyter-web/package.json delete mode 100644 extensions/jupyter-web/src/extension.js create mode 160000 vscode1.52.0 create mode 160000 vscode1.70.2 diff --git a/1.sh b/1.sh deleted file mode 100644 index 186f73b..0000000 --- a/1.sh +++ /dev/null @@ -1,19 +0,0 @@ -cd D:/liuyuqi/github/git/gogs1s/ - -cp --path vscode-web-gogs1s/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts bak -cp --path vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts bak -cp --path vscode-web-gogs1s/src/vs/workbench/contrib/files/browser/views/explorerView.ts bak -cp --path vscode-web-gogs1s/src/vs/workbench/browser/workbench.contribution.ts bak -cp --path vscode-web-gogs1s/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts bak -cp --path vscode-web-gogs1s/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts bak -cp --path vscode-web-gogs1s/src/vs/workbench/services/themes/common/themeConfiguration.ts bak -cp --path vscode-web-gogs1s/src/vs/code/browser/workbench/workbench.ts bak -cp --path vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts bak -cp --path vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.css bak -cp --path vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.contribution.ts bak -cp --path vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts bak -cp --path vscode-web-gogs1s/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css bak -cp --path vscode-web-gogs1s/src/vs/platform/product/common/product.ts bak -cp --path vscode-web-gogs1s/src/vs/gogs1s/notification.ts bak -cp --path vscode-web-gogs1s/src/vs/gogs1s/notification.css bak -cp --path vscode-web-gogs1s/src/vs/gogs1s/util.ts bak diff --git a/extensions/jupyter-web/LICENSE b/extensions/jupyter-web/LICENSE deleted file mode 100644 index a7d89b6..0000000 --- a/extensions/jupyter-web/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2018 Jithu R Jacob - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/extensions/jupyter-web/README.md b/extensions/jupyter-web/README.md deleted file mode 100644 index 895507f..0000000 --- a/extensions/jupyter-web/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# This extension is a fork from [vscode-nbpreviewer](https://github.com/jithurjacob/vscode-nbpreviewer) for github1s - -# I have deleted some files and only reserved the necessary code - -# vscode-nbpreviewer - -An extension for supercharging your Data Science workflow by previewing Jupyter Notebook within VS Code. View graphs and interact with Plotly visualizations from within VS Code. - -

-

- logo -

- -## Preview - -> ![nbpreviewer demo](https://thumbs.gfycat.com/FarawayTerrificChameleon-max-14mb.gif) - -## Quick Start - -- Install the extension -- Open a Jupyter Notebook -- Click Show Preview menu button from Editor/Title Menu - -> ![nbpreviewer quick start](https://thumbs.gfycat.com/ImaginativeCooperativeDogwoodtwigborer-max-14mb.gif) diff --git a/extensions/jupyter-web/extension.webpack.config.js b/extensions/jupyter-web/extension.webpack.config.js deleted file mode 100644 index c96c3e9..0000000 --- a/extensions/jupyter-web/extension.webpack.config.js +++ /dev/null @@ -1,41 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -//@ts-check -"use strict"; - -//@ts-check -/** @typedef {import('webpack').Configuration} WebpackConfig **/ - -const path = require("path"); - -module.exports = /** @type WebpackConfig */ { - context: __dirname, - mode: "none", // this leaves the source code as close as possible to the original (when packaging we set this to 'production') - target: "webworker", // extensions run in a webworker context - entry: { - extension: "./src/extension.js", - }, - resolve: { - mainFields: ["module", "main"], - extensions: [".ts", ".js"], // support ts-files and js-files - alias: { - https: "https-browserify", - http: "http-browserify", - }, - }, - externals: { - vscode: "commonjs vscode", // ignored because it doesn't exist - }, - performance: { - hints: false, - }, - output: { - filename: "extension.js", - path: path.join(__dirname, "dist"), - libraryTarget: "commonjs", - }, - devtool: "source-map", -}; diff --git a/extensions/jupyter-web/images/jupyter.png b/extensions/jupyter-web/images/jupyter.png deleted file mode 100644 index 169a637b65246fa293d4d97fb13ca48022218f9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26597 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 diff --git a/extensions/jupyter-web/images/sample.PNG b/extensions/jupyter-web/images/sample.PNG deleted file mode 100644 index b6b9d8c0ec60d587ce655d12eefcb4b470b3eb53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3510874 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Ð+GTEeN8ejlh<+Zr$qJ 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ð78Wzw@(ek-E86|Kv;9Y7jbu?lOpg$6?DgID*t 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 diff --git a/extensions/jupyter-web/jsconfig.json b/extensions/jupyter-web/jsconfig.json deleted file mode 100644 index af85b6f..0000000 --- a/extensions/jupyter-web/jsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es6", - "lib": [ - "es6" - ] - }, - "exclude": [ - "node_modules" - ] -} \ No newline at end of file diff --git a/extensions/jupyter-web/language-configuration.json b/extensions/jupyter-web/language-configuration.json deleted file mode 100644 index 1a520dd..0000000 --- a/extensions/jupyter-web/language-configuration.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "comments": { - "lineComment": "//", - "blockComment": ["/*", "*/"] - }, - "brackets": [ - ["{", "}"], - ["[", "]"] - ], - "autoClosingPairs": [{ - "open": "{", - "close": "}", - "notIn": ["string"] - }, - { - "open": "[", - "close": "]", - "notIn": ["string"] - }, - { - "open": "(", - "close": ")", - "notIn": ["string"] - }, - { - "open": "'", - "close": "'", - "notIn": ["string"] - }, - { - "open": "\"", - "close": "\"", - "notIn": ["string", "comment"] - }, - { - "open": "`", - "close": "`", - "notIn": ["string", "comment"] - } - ] -} \ No newline at end of file diff --git a/extensions/jupyter-web/package.json b/extensions/jupyter-web/package.json deleted file mode 100644 index de283a6..0000000 --- a/extensions/jupyter-web/package.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "name": "nbpreviewer", - "displayName": "VS Code Jupyter Notebook Previewer", - "description": "An easy to use extension for previewing Jupyter Notebooks within VS Code", - "version": "1.2.2", - "publisher": "jithurjacob", - "author": { - "name": "jithurjacob" - }, - "keywords": [ - "python", - "jupyter", - "ipython", - "data science", - "kaggle", - "notebook", - "markdown" - ], - "icon": "images/jupyter.png", - "recommendations": [ - "donjayamanne.python" - ], - "galleryBanner": { - "color": "#e46d2e", - "theme": "dark" - }, - "qna": false, - "license": "MIT", - "bugs": { - "url": "https://github.com/jithurjacob/vscode-nbpreviewer/issues", - "email": "jithurjacob@gmail.com" - }, - "repository": { - "type": "git", - "url": "https://github.com/jithurjacob/vscode-nbpreviewer.git" - }, - "homepage": "https://github.com/jithurjacob/vscode-nbpreviewer/blob/master/README.md", - "engines": { - "vscode": "^1.52.0" - }, - "browser": "./dist/extension", - "categories": [ - "Programming Languages", - "Other" - ], - "main": "./src/extension", - "contributes": { - "languages": [ - { - "id": "jupyter", - "aliases": [ - "Jupyter", - "jupyter" - ], - "extensions": [ - ".ipynb" - ], - "configuration": "./language-configuration.json" - } - ], - "commands": [ - { - "command": "jupyter.showPreview", - "title": "Show preview", - "category": "Jupyter" - } - ], - "menus": { - "editor/title": [ - { - "command": "jupyter.showPreview", - "when": "editorLangId == jupyter", - "group": "navigation" - } - ] - } - }, - "activationEvents": [ - "onLanguage:jupyter", - "onCommand:jupyter.showPreview" - ], - "languages": [ - { - "id": "jupyter", - "extensions": [ - ".ipynb" - ], - "aliases": [ - "ipynb", - "Ipynb" - ] - } - ], - "scripts": { - "clean": "rm -rf dist out", - "build": "webpack --config extension.webpack.config.js --mode production", - "compile": "webpack --config extension.webpack.config.js --mode production", - "watch": "echo done", - "dev": "webpack --config extension.webpack.config.js --watch" - }, - "devDependencies": { - "@types/vscode": "^1.52.0", - "eslint": "^4.6.1", - "webpack": "^5.21.2", - "webpack-cli": "^4.5.0" - } -} diff --git a/extensions/jupyter-web/src/extension.js b/extensions/jupyter-web/src/extension.js deleted file mode 100644 index 7a26c83..0000000 --- a/extensions/jupyter-web/src/extension.js +++ /dev/null @@ -1,53 +0,0 @@ -import vscode from "vscode"; - -vscode.commands.registerCommand("jupyter.showPreview", async function (uri) { - try { - const authority = await vscode.commands.executeCommand('gogs1s.get-current-authority'); - // TODO: It may not work fine when there are special characters in `ref` or `path` - const [owner, repo, ref] = (authority || "").split('+').filter(Boolean); - const path = uri.path; - - // const success = await vscode.commands.executeCommand('vscode.previewHtml', previewUri, vscode.ViewColumn.Two, 'IPython Notebook Preview'); - // Create and show panel - const panel = vscode.window.createWebviewPanel( - "nbpreviewer", - "Jupyter Notebook Previewer", - vscode.ViewColumn.Two, - { enableScripts: true, retainContextWhenHidden: true } - ); - panel.webview.html = ` - - - `; - console.log("successfully showed notebook"); - } catch (reason) { - console.error(reason); - vscode.window.showErrorMessage( - "An error occured while rendering the Notebook" - ); - } -}); - -vscode.workspace.onDidOpenTextDocument((e) => { - const currnetFileExtension = e.fileName; - if (currnetFileExtension.substr(-6) === ".ipynb") { - vscode.commands.executeCommand("jupyter.showPreview", e.uri); - } -}); diff --git a/vscode1.52.0 b/vscode1.52.0 new file mode 160000 index 0000000..940b5f4 --- /dev/null +++ b/vscode1.52.0 @@ -0,0 +1 @@ +Subproject commit 940b5f4bb5fa47866a54529ed759d95d09ee80be diff --git a/vscode1.70.2 b/vscode1.70.2 new file mode 160000 index 0000000..e4503b3 --- /dev/null +++ b/vscode1.70.2 @@ -0,0 +1 @@ +Subproject commit e4503b30fc78200f846c62cf8091b76ff5547662 From d8194e196520e61ad5695c46d49b1a56ed660ff4 Mon Sep 17 00:00:00 2001 From: liuyuqi-dellpc Date: Thu, 1 Sep 2022 02:08:19 +0800 Subject: [PATCH 2/7] apply modify --- .../vs/code/browser/workbench/workbench.ts | 497 ++++---- .../src/vs/platform/product/common/product.ts | 85 +- .../parts/activitybar/activitybarActions.ts | 518 -------- .../parts/activitybar/activitybarPart.ts | 1088 ----------------- .../browser/parts/titlebar/titlebarPart.ts | 521 -------- .../browser/parts/titlebar/windowTitle.ts | 252 ++++ .../browser/workbench.contribution.ts | 468 +++++-- .../files/browser/views/explorerView.ts | 381 ++++-- .../files/common/editors/fileEditorInput.ts | 403 ------ .../contrib/url/browser/trustedDomains.ts | 52 +- .../themes/common/themeConfiguration.ts | 351 ------ 11 files changed, 1153 insertions(+), 3463 deletions(-) delete mode 100644 vscode-web-gogs1s/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts delete mode 100644 vscode-web-gogs1s/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts delete mode 100644 vscode-web-gogs1s/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts create mode 100644 vscode-web-gogs1s/src/vs/workbench/browser/parts/titlebar/windowTitle.ts delete mode 100644 vscode-web-gogs1s/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts delete mode 100644 vscode-web-gogs1s/src/vs/workbench/services/themes/common/themeConfiguration.ts diff --git a/vscode-web-gogs1s/src/vs/code/browser/workbench/workbench.ts b/vscode-web-gogs1s/src/vs/code/browser/workbench/workbench.ts index f7a105a..56a29d1 100644 --- a/vscode-web-gogs1s/src/vs/code/browser/workbench/workbench.ts +++ b/vscode-web-gogs1s/src/vs/code/browser/workbench/workbench.ts @@ -3,48 +3,29 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IWorkbenchConstructionOptions, create, ICredentialsProvider, IURLCallbackProvider, IWorkspaceProvider, IWorkspace, IWindowIndicator, IHomeIndicator, IProductQualityChangeHandler, ISettingsSyncOptions } from 'vs/workbench/workbench.web.api'; -import { URI, UriComponents } from 'vs/base/common/uri'; -import { Event, Emitter } from 'vs/base/common/event'; -import { generateUuid } from 'vs/base/common/uuid'; -import { CancellationToken } from 'vs/base/common/cancellation'; -import { streamToBuffer } from 'vs/base/common/buffer'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { request } from 'vs/base/parts/request/browser/request'; -import { isFolderToOpen, isWorkspaceToOpen } from 'vs/platform/windows/common/windows'; -import { isEqual } from 'vs/base/common/resources'; import { isStandalone } from 'vs/base/browser/browser'; -import { localize } from 'vs/nls'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { parse } from 'vs/base/common/marshalling'; +import { Emitter } from 'vs/base/common/event'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; +import { isEqual } from 'vs/base/common/resources'; +import { URI, UriComponents } from 'vs/base/common/uri'; +import { request } from 'vs/base/parts/request/browser/request'; import product from 'vs/platform/product/common/product'; -import { parseLogLevel } from 'vs/platform/log/common/log'; +import { isFolderToOpen, isWorkspaceToOpen } from 'vs/platform/window/common/window'; +import { create, ICredentialsProvider, IURLCallbackProvider, IWorkbenchConstructionOptions, IWorkspace, IWorkspaceProvider } from 'vs/workbench/workbench.web.main'; +import { posix } from 'vs/base/common/path'; +import { ltrim } from 'vs/base/common/strings'; import { getBrowserUrl, replaceBrowserUrl } from 'vs/gogs1s/util'; import { renderNotification } from 'vs/gogs1s/notification'; // custom vs code commands defined by gogs1s -const getGogs1sCustomCommands: () => ({id: string, handler: (...args: any[]) => unknown }[]) = () => [ +const getGogs1sCustomCommands: () => ({ id: string, handler: (...args: any[]) => unknown }[]) = () => [ { id: 'gogs1s.vscode.get-browser-url', handler: getBrowserUrl }, { id: 'gogs1s.vscode.replace-browser-url', handler: replaceBrowserUrl }, ]; -function doCreateUri(path: string, queryValues: Map): URI { - let query: string | undefined = undefined; - - if (queryValues) { - let index = 0; - queryValues.forEach((value, key) => { - if (!query) { - query = ''; - } - - const prefix = (index++ === 0) ? '' : '&'; - query += `${prefix}${key}=${encodeURIComponent(value)}`; - }); - } - - return URI.parse(window.location.href).with({ path, query }); -} - interface ICredential { service: string; account: string; @@ -53,12 +34,12 @@ interface ICredential { class LocalStorageCredentialsProvider implements ICredentialsProvider { - static readonly CREDENTIALS_OPENED_KEY = 'credentials.provider'; + private static readonly CREDENTIALS_STORAGE_KEY = 'credentials.provider'; private readonly authService: string | undefined; constructor() { - let authSessionInfo: { readonly id: string, readonly accessToken: string, readonly providerId: string, readonly canSignOut?: boolean, readonly scopes: string[][] } | undefined; + let authSessionInfo: { readonly id: string; readonly accessToken: string; readonly providerId: string; readonly canSignOut?: boolean; readonly scopes: string[][] } | undefined; const authSessionElement = document.getElementById('vscode-workbench-auth-session'); const authSessionElementAttribute = authSessionElement ? authSessionElement.getAttribute('data-settings') : undefined; if (authSessionElementAttribute) { @@ -85,7 +66,7 @@ class LocalStorageCredentialsProvider implements ICredentialsProvider { private get credentials(): ICredential[] { if (!this._credentials) { try { - const serializedCredentials = window.localStorage.getItem(LocalStorageCredentialsProvider.CREDENTIALS_OPENED_KEY); + const serializedCredentials = window.localStorage.getItem(LocalStorageCredentialsProvider.CREDENTIALS_STORAGE_KEY); if (serializedCredentials) { this._credentials = JSON.parse(serializedCredentials); } @@ -102,7 +83,7 @@ class LocalStorageCredentialsProvider implements ICredentialsProvider { } private save(): void { - window.localStorage.setItem(LocalStorageCredentialsProvider.CREDENTIALS_OPENED_KEY, JSON.stringify(this.credentials)); + window.localStorage.setItem(LocalStorageCredentialsProvider.CREDENTIALS_STORAGE_KEY, JSON.stringify(this.credentials)); } async getPassword(service: string, account: string): Promise { @@ -178,7 +159,7 @@ class LocalStorageCredentialsProvider implements ICredentialsProvider { return this.doGetPassword(service); } - async findCredentials(service: string): Promise> { + async findCredentials(service: string): Promise> { return this.credentials .filter(credential => credential.service === service) .map(({ account, password }) => ({ account, password })); @@ -193,122 +174,231 @@ class LocalStorageCredentialsProvider implements ICredentialsProvider { url: doCreateUri('/auth/logout', queryValues).toString(true) }, CancellationToken.None); } + + async clear(): Promise { + window.localStorage.removeItem(LocalStorageCredentialsProvider.CREDENTIALS_STORAGE_KEY); + } } -class PollingURLCallbackProvider extends Disposable implements IURLCallbackProvider { +class LocalStorageURLCallbackProvider extends Disposable implements IURLCallbackProvider { - static readonly FETCH_INTERVAL = 500; // fetch every 500ms - static readonly FETCH_TIMEOUT = 5 * 60 * 1000; // ...but stop after 5min + private static REQUEST_ID = 0; - static readonly QUERY_KEYS = { - REQUEST_ID: 'vscode-requestId', - SCHEME: 'vscode-scheme', - AUTHORITY: 'vscode-authority', - PATH: 'vscode-path', - QUERY: 'vscode-query', - FRAGMENT: 'vscode-fragment' - }; + private static QUERY_KEYS: ('scheme' | 'authority' | 'path' | 'query' | 'fragment')[] = [ + 'scheme', + 'authority', + 'path', + 'query', + 'fragment' + ]; private readonly _onCallback = this._register(new Emitter()); readonly onCallback = this._onCallback.event; - create(options?: Partial): URI { - const queryValues: Map = new Map(); + private pendingCallbacks = new Set(); + private lastTimeChecked = Date.now(); + private checkCallbacksTimeout: unknown | undefined = undefined; + private onDidChangeLocalStorageDisposable: IDisposable | undefined; - const requestId = generateUuid(); - queryValues.set(PollingURLCallbackProvider.QUERY_KEYS.REQUEST_ID, requestId); + constructor(private readonly _callbackRoute: string) { + super(); + } - const { scheme, authority, path, query, fragment } = options ? options : { scheme: undefined, authority: undefined, path: undefined, query: undefined, fragment: undefined }; + create(options: Partial = {}): URI { + const id = ++LocalStorageURLCallbackProvider.REQUEST_ID; + const queryParams: string[] = [`vscode-reqid=${id}`]; - if (scheme) { - queryValues.set(PollingURLCallbackProvider.QUERY_KEYS.SCHEME, scheme); - } + for (const key of LocalStorageURLCallbackProvider.QUERY_KEYS) { + const value = options[key]; - if (authority) { - queryValues.set(PollingURLCallbackProvider.QUERY_KEYS.AUTHORITY, authority); + if (value) { + queryParams.push(`vscode-${key}=${encodeURIComponent(value)}`); + } } - if (path) { - queryValues.set(PollingURLCallbackProvider.QUERY_KEYS.PATH, path); - } + // TODO@joao remove eventually + // https://github.com/microsoft/vscode-dev/issues/62 + // https://github.com/microsoft/vscode/blob/159479eb5ae451a66b5dac3c12d564f32f454796/extensions/github-authentication/src/githubServer.ts#L50-L50 + if (!(options.authority === 'vscode.github-authentication' && options.path === '/dummy')) { + const key = `vscode-web.url-callbacks[${id}]`; + window.localStorage.removeItem(key); - if (query) { - queryValues.set(PollingURLCallbackProvider.QUERY_KEYS.QUERY, query); + this.pendingCallbacks.add(id); + this.startListening(); } - if (fragment) { - queryValues.set(PollingURLCallbackProvider.QUERY_KEYS.FRAGMENT, fragment); + return URI.parse(window.location.href).with({ path: this._callbackRoute, query: queryParams.join('&') }); + } + + private startListening(): void { + if (this.onDidChangeLocalStorageDisposable) { + return; } - // Start to poll on the callback being fired - this.periodicFetchCallback(requestId, Date.now()); + const fn = () => this.onDidChangeLocalStorage(); + window.addEventListener('storage', fn); + this.onDidChangeLocalStorageDisposable = { dispose: () => window.removeEventListener('storage', fn) }; + } - return doCreateUri('/callback', queryValues); + private stopListening(): void { + this.onDidChangeLocalStorageDisposable?.dispose(); + this.onDidChangeLocalStorageDisposable = undefined; } - private async periodicFetchCallback(requestId: string, startTime: number): Promise { + // this fires every time local storage changes, but we + // don't want to check more often than once a second + private async onDidChangeLocalStorage(): Promise { + const ellapsed = Date.now() - this.lastTimeChecked; + + if (ellapsed > 1000) { + this.checkCallbacks(); + } else if (this.checkCallbacksTimeout === undefined) { + this.checkCallbacksTimeout = setTimeout(() => { + this.checkCallbacksTimeout = undefined; + this.checkCallbacks(); + }, 1000 - ellapsed); + } + } - // Ask server for callback results - const queryValues: Map = new Map(); - queryValues.set(PollingURLCallbackProvider.QUERY_KEYS.REQUEST_ID, requestId); + private checkCallbacks(): void { + let pendingCallbacks: Set | undefined; - const result = await request({ - url: doCreateUri('/fetch-callback', queryValues).toString(true) - }, CancellationToken.None); + for (const id of this.pendingCallbacks) { + const key = `vscode-web.url-callbacks[${id}]`; + const result = window.localStorage.getItem(key); - // Check for callback results - const content = await streamToBuffer(result.stream); - if (content.byteLength > 0) { - try { - this._onCallback.fire(URI.revive(JSON.parse(content.toString()))); - } catch (error) { - console.error(error); - } + if (result !== null) { + try { + this._onCallback.fire(URI.revive(JSON.parse(result))); + } catch (error) { + console.error(error); + } - return; // done + pendingCallbacks = pendingCallbacks ?? new Set(this.pendingCallbacks); + pendingCallbacks.delete(id); + window.localStorage.removeItem(key); + } } - // Continue fetching unless we hit the timeout - if (Date.now() - startTime < PollingURLCallbackProvider.FETCH_TIMEOUT) { - setTimeout(() => this.periodicFetchCallback(requestId, startTime), PollingURLCallbackProvider.FETCH_INTERVAL); + if (pendingCallbacks) { + this.pendingCallbacks = pendingCallbacks; + + if (this.pendingCallbacks.size === 0) { + this.stopListening(); + } } - } + this.lastTimeChecked = Date.now(); + } } class WorkspaceProvider implements IWorkspaceProvider { - static QUERY_PARAM_EMPTY_WINDOW = 'ew'; - static QUERY_PARAM_FOLDER = 'folder'; - static QUERY_PARAM_WORKSPACE = 'workspace'; + private static QUERY_PARAM_EMPTY_WINDOW = 'ew'; + private static QUERY_PARAM_FOLDER = 'folder'; + private static QUERY_PARAM_WORKSPACE = 'workspace'; + + private static QUERY_PARAM_PAYLOAD = 'payload'; + + static create(config: IWorkbenchConstructionOptions & { folderUri?: UriComponents; workspaceUri?: UriComponents }) { + let foundWorkspace = false; + let workspace: IWorkspace; + let payload = Object.create(null); + + const query = new URL(document.location.href).searchParams; + query.forEach((value, key) => { + switch (key) { + + // Folder + case WorkspaceProvider.QUERY_PARAM_FOLDER: + if (config.remoteAuthority && value.startsWith(posix.sep)) { + // when connected to a remote and having a value + // that is a path (begins with a `/`), assume this + // is a vscode-remote resource as simplified URL. + workspace = { folderUri: URI.from({ scheme: Schemas.vscodeRemote, path: value, authority: config.remoteAuthority }) }; + } else { + workspace = { folderUri: URI.parse(value) }; + } + foundWorkspace = true; + break; + + // Workspace + case WorkspaceProvider.QUERY_PARAM_WORKSPACE: + if (config.remoteAuthority && value.startsWith(posix.sep)) { + // when connected to a remote and having a value + // that is a path (begins with a `/`), assume this + // is a vscode-remote resource as simplified URL. + workspace = { workspaceUri: URI.from({ scheme: Schemas.vscodeRemote, path: value, authority: config.remoteAuthority }) }; + } else { + workspace = { workspaceUri: URI.parse(value) }; + } + foundWorkspace = true; + break; + + // Empty + case WorkspaceProvider.QUERY_PARAM_EMPTY_WINDOW: + workspace = undefined; + foundWorkspace = true; + break; + + // Payload + case WorkspaceProvider.QUERY_PARAM_PAYLOAD: + try { + payload = parse(value); // use marshalling#parse() to revive potential URIs + } catch (error) { + console.error(error); // possible invalid JSON + } + break; + } + }); + + // If no workspace is provided through the URL, check for config + // attribute from server + if (!foundWorkspace) { + if (config.folderUri) { + workspace = { folderUri: URI.revive(config.folderUri) }; + } else if (config.workspaceUri) { + workspace = { workspaceUri: URI.revive(config.workspaceUri) }; + } + } + + return new WorkspaceProvider(workspace, payload, config); + } - static QUERY_PARAM_PAYLOAD = 'payload'; + readonly trusted = true; - constructor( - public readonly workspace: IWorkspace, - public readonly payload: object - ) { } + private constructor( + readonly workspace: IWorkspace, + readonly payload: object, + private readonly config: IWorkbenchConstructionOptions + ) { + } - async open(workspace: IWorkspace, options?: { reuse?: boolean, payload?: object }): Promise { + async open(workspace: IWorkspace, options?: { reuse?: boolean; payload?: object }): Promise { if (options?.reuse && !options.payload && this.isSame(this.workspace, workspace)) { - return; // return early if workspace and environment is not changing and we are reusing window + return true; // return early if workspace and environment is not changing and we are reusing window } const targetHref = this.createTargetUrl(workspace, options); if (targetHref) { if (options?.reuse) { window.location.href = targetHref; + return true; } else { - if (isStandalone) { - window.open(targetHref, '_blank', 'toolbar=no'); // ensures to open another 'standalone' window! + let result; + if (isStandalone()) { + result = window.open(targetHref, '_blank', 'toolbar=no'); // ensures to open another 'standalone' window! } else { - window.open(targetHref); + result = window.open(targetHref); } + + return !!result; } } + return false; } - private createTargetUrl(workspace: IWorkspace, options?: { reuse?: boolean, payload?: object }): string | undefined { + private createTargetUrl(workspace: IWorkspace, options?: { reuse?: boolean; payload?: object }): string | undefined { // Empty let targetHref: string | undefined = undefined; @@ -318,12 +408,35 @@ class WorkspaceProvider implements IWorkspaceProvider { // Folder else if (isFolderToOpen(workspace)) { - targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_FOLDER}=${encodeURIComponent(workspace.folderUri.toString())}`; + let queryParamFolder: string; + if (this.config.remoteAuthority && workspace.folderUri.scheme === Schemas.vscodeRemote) { + // when connected to a remote and having a folder + // for that remote, only use the path as query + // value to form shorter, nicer URLs. + // ensure paths are absolute (begin with `/`) + // clipboard: ltrim(workspace.folderUri.path, posix.sep) + queryParamFolder = `${posix.sep}${ltrim(workspace.folderUri.path, posix.sep)}`; + } else { + queryParamFolder = encodeURIComponent(workspace.folderUri.toString(true)); + } + + targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_FOLDER}=${queryParamFolder}`; } // Workspace else if (isWorkspaceToOpen(workspace)) { - targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_WORKSPACE}=${encodeURIComponent(workspace.workspaceUri.toString())}`; + let queryParamWorkspace: string; + if (this.config.remoteAuthority && workspace.workspaceUri.scheme === Schemas.vscodeRemote) { + // when connected to a remote and having a workspace + // for that remote, only use the path as query + // value to form shorter, nicer URLs. + // ensure paths are absolute (begin with `/`) + queryParamWorkspace = `${posix.sep}${ltrim(workspace.workspaceUri.path, posix.sep)}`; + } else { + queryParamWorkspace = encodeURIComponent(workspace.workspaceUri.toString(true)); + } + + targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_WORKSPACE}=${queryParamWorkspace}`; } // Append payload if any @@ -365,43 +478,22 @@ class WorkspaceProvider implements IWorkspaceProvider { } } -class WindowIndicator implements IWindowIndicator { - - readonly onDidChange = Event.None; - - readonly label: string; - readonly tooltip: string; - readonly command: string | undefined; - - constructor(workspace: IWorkspace) { - let repositoryOwner: string | undefined = undefined; - let repositoryName: string | undefined = undefined; - - if (workspace) { - let uri: URI | undefined = undefined; - if (isFolderToOpen(workspace)) { - uri = workspace.folderUri; - } else if (isWorkspaceToOpen(workspace)) { - uri = workspace.workspaceUri; - } +function doCreateUri(path: string, queryValues: Map): URI { + let query: string | undefined = undefined; - if (uri?.scheme === 'gogs1s') { - [repositoryOwner = 'lyq', repositoryName = 'github-host'] = URI.parse(getBrowserUrl()).path.split('/').filter(Boolean); + if (queryValues) { + let index = 0; + queryValues.forEach((value, key) => { + if (!query) { + query = ''; } - } - // Repo - if (repositoryName && repositoryOwner) { - this.label = localize('playgroundLabelRepository', "$(remote) Gogs1s: {0}/{1}", repositoryOwner, repositoryName); - this.tooltip = localize('playgroundRepositoryTooltip', "Gogs1s: {0}/{1}", repositoryOwner, repositoryName); - } - - // No Repo - else { - this.label = localize('playgroundLabel', "$(remote) Gogs1s"); - this.tooltip = localize('playgroundTooltip', "Gogs1s"); - } + const prefix = (index++ === 0) ? '' : '&'; + query += `${prefix}${key}=${encodeURIComponent(value)}`; + }); } + + return URI.parse(window.location.href).with({ path, query }); } (function () { @@ -412,137 +504,22 @@ class WindowIndicator implements IWindowIndicator { if (!configElement || !configElementAttribute) { throw new Error('Missing web configuration element'); } - - const config: IWorkbenchConstructionOptions & { folderUri?: UriComponents, workspaceUri?: UriComponents } = JSON.parse(configElementAttribute); - - // Revive static extension locations - if (Array.isArray(config.staticExtensions)) { - config.staticExtensions.forEach(extension => { - extension.extensionLocation = URI.revive(extension.extensionLocation); - }); - } - - // Find workspace to open and payload - let foundWorkspace = false; - let workspace: IWorkspace; - let payload = Object.create(null); - let logLevel: string | undefined = undefined; - - const query = new URL(document.location.href).searchParams; - query.forEach((value, key) => { - switch (key) { - - // Folder - case WorkspaceProvider.QUERY_PARAM_FOLDER: - workspace = { folderUri: URI.parse(value) }; - foundWorkspace = true; - break; - - // Workspace - case WorkspaceProvider.QUERY_PARAM_WORKSPACE: - workspace = { workspaceUri: URI.parse(value) }; - foundWorkspace = true; - break; - - // Empty - case WorkspaceProvider.QUERY_PARAM_EMPTY_WINDOW: - workspace = undefined; - foundWorkspace = true; - break; - - // Payload - case WorkspaceProvider.QUERY_PARAM_PAYLOAD: - try { - payload = JSON.parse(value); - } catch (error) { - console.error(error); // possible invalid JSON - } - break; - - // Log level - case 'logLevel': - logLevel = value; - break; - } - }); - - // If no workspace is provided through the URL, check for config attribute from server - if (!foundWorkspace) { - if (config.folderUri) { - workspace = { folderUri: URI.revive(config.folderUri) }; - } else if (config.workspaceUri) { - workspace = { workspaceUri: URI.revive(config.workspaceUri) }; - } else { - workspace = undefined; - } - } - - // Workspace Provider - const workspaceProvider = new WorkspaceProvider(workspace, payload); - - // Home Indicator - const [repoOwner = 'lyq', repoName = 'github-host'] = (URI.parse(window.location.href).path || '').split('/').filter(Boolean); - const homeIndicator: IHomeIndicator = { - href: `https://git.yoqi.me/${repoOwner}/${repoName}`, - icon: 'github', - title: localize('home', "Home") - }; - - // Window indicator (unless connected to a remote) - let windowIndicator: WindowIndicator | undefined = undefined; - if (!workspaceProvider.hasRemote()) { - windowIndicator = new WindowIndicator(workspace); - } - - // Product Quality Change Handler - const productQualityChangeHandler: IProductQualityChangeHandler = (quality) => { - let queryString = `quality=${quality}`; - - // Save all other query params we might have - const query = new URL(document.location.href).searchParams; - query.forEach((value, key) => { - if (key !== 'quality') { - queryString += `&${key}=${value}`; - } - }); - - window.location.href = `${window.location.origin}?${queryString}`; - }; - - // settings sync options - const settingsSyncOptions: ISettingsSyncOptions | undefined = config.settingsSyncOptions ? { - enabled: config.settingsSyncOptions.enabled, - enablementHandler: (enablement) => { - let queryString = `settingsSync=${enablement ? 'true' : 'false'}`; - - // Save all other query params we might have - const query = new URL(document.location.href).searchParams; - query.forEach((value, key) => { - if (key !== 'settingsSync') { - queryString += `&${key}=${value}`; - } - }); - - window.location.href = `${window.location.origin}?${queryString}`; - } - } : undefined; + const config: IWorkbenchConstructionOptions & { folderUri?: UriComponents; workspaceUri?: UriComponents; callbackRoute: string } = JSON.parse(configElementAttribute); // Remove the html load spinner document.querySelector('#load-spinner')?.remove(); - // Finally create workbench + // Create workbench create(document.body, { ...config, commands: getGogs1sCustomCommands(), - logLevel: logLevel ? parseLogLevel(logLevel) : undefined, - settingsSyncOptions, - homeIndicator, - windowIndicator, - productQualityChangeHandler, - workspaceProvider, - urlCallbackProvider: new PollingURLCallbackProvider(), - credentialsProvider: new LocalStorageCredentialsProvider() + settingsSyncOptions: config.settingsSyncOptions ? { + enabled: config.settingsSyncOptions.enabled, + } : undefined, + workspaceProvider: WorkspaceProvider.create(config), + urlCallbackProvider: new LocalStorageURLCallbackProvider(config.callbackRoute), + credentialsProvider: config.remoteAuthority ? undefined : new LocalStorageCredentialsProvider() // with a remote, we don't use a local credentials provider }); - + setTimeout(() => renderNotification(), 1000); })(); diff --git a/vscode-web-gogs1s/src/vs/platform/product/common/product.ts b/vscode-web-gogs1s/src/vs/platform/product/common/product.ts index dd9c95e..02ad10f 100644 --- a/vscode-web-gogs1s/src/vs/platform/product/common/product.ts +++ b/vscode-web-gogs1s/src/vs/platform/product/common/product.ts @@ -3,66 +3,44 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IProductConfiguration } from 'vs/platform/product/common/productService'; -import { isWeb } from 'vs/base/common/platform'; -import { env } from 'vs/base/common/process'; import { FileAccess } from 'vs/base/common/network'; +import { globals } from 'vs/base/common/platform'; +import { env } from 'vs/base/common/process'; +import { IProductConfiguration } from 'vs/base/common/product'; import { dirname, joinPath } from 'vs/base/common/resources'; +import { ISandboxConfiguration } from 'vs/base/parts/sandbox/common/sandboxTypes'; +/** + * @deprecated You MUST use `IProductService` if possible. + */ let product: IProductConfiguration; -// Web or Native (sandbox TODO@sandbox need to add all properties of product.json) -if (isWeb || typeof require === 'undefined' || typeof require.__$__nodeRequire !== 'function') { - - // Built time configuration (do NOT modify) - product = { /*BUILD->INSERT_PRODUCT_CONFIGURATION*/ } as IProductConfiguration; - - // Running out of sources - if (Object.keys(product).length === 0) { - Object.assign(product, { - version: '1.52.0-dev', - // modify-by-github1s, change window title - // nameShort: isWeb ? 'Code Web - OSS Dev' : 'Code - OSS Dev', - // nameLong: isWeb ? 'Code Web - OSS Dev' : 'Code - OSS Dev', - nameShort: 'Gogs1s',// web版本时候,显示 Gogs1s 名称 - nameLong: 'Gogs1s', - applicationName: 'code-oss', - dataFolderName: '.vscode-oss', - urlProtocol: 'code-oss', - reportIssueUrl: 'https://github.com/microsoft/vscode/issues/new', - licenseName: 'MIT', - licenseUrl: 'https://github.com/microsoft/vscode/blob/master/LICENSE.txt', - extensionAllowedProposedApi: [ - 'ms-vscode.vscode-js-profile-flame', - 'ms-vscode.vscode-js-profile-table', - 'ms-vscode.github-browser' - ], - extensionsGallery: { - serviceUrl: 'https://marketplace.visualstudio.com/_apis/public/gallery', - cacheUrl: 'https://vscode.blob.core.windows.net/gallery/index', - itemUrl: 'https://marketplace.visualstudio.com/items', - controlUrl: 'https://az764295.vo.msecnd.net/extensions/marketplace.json', - recommendationsUrl: 'https://az764295.vo.msecnd.net/extensions/workspaceRecommendations.json.gz', - } - }); +// Native sandbox environment +if (typeof globals.vscode !== 'undefined' && typeof globals.vscode.context !== 'undefined') { + const configuration: ISandboxConfiguration | undefined = globals.vscode.context.configuration(); + if (configuration) { + product = configuration.product; + } else { + throw new Error('Sandbox: unable to resolve product configuration from preload script.'); } } -// Native (non-sandboxed) -else { +// Native node.js environment +else if (typeof require?.__$__nodeRequire === 'function') { // Obtain values from product.json and package.json const rootPath = dirname(FileAccess.asFileUri('', require)); product = require.__$__nodeRequire(joinPath(rootPath, 'product.json').fsPath); - const pkg = require.__$__nodeRequire(joinPath(rootPath, 'package.json').fsPath) as { version: string; }; + const pkg = require.__$__nodeRequire(joinPath(rootPath, 'package.json').fsPath) as { version: string }; // Running out of sources if (env['VSCODE_DEV']) { Object.assign(product, { nameShort: `${product.nameShort} Dev`, nameLong: `${product.nameLong} Dev`, - dataFolderName: `${product.dataFolderName}-dev` + dataFolderName: `${product.dataFolderName}-dev`, + serverDataFolderName: product.serverDataFolderName ? `${product.serverDataFolderName}-dev` : undefined }); } @@ -71,4 +49,29 @@ else { }); } +// Web environment or unknown +else { + + // Built time configuration (do NOT modify) + product = { /*BUILD->INSERT_PRODUCT_CONFIGURATION*/ } as IProductConfiguration; + + // Running out of sources + if (Object.keys(product).length === 0) { + Object.assign(product, { + version: '1.67.0-dev', + nameShort: 'Gogs1s', + nameLong: 'Gogs1s', + applicationName: 'code-oss', + dataFolderName: '.vscode-oss', + urlProtocol: 'code-oss', + reportIssueUrl: 'https://github.com/microsoft/vscode/issues/new', + licenseName: 'MIT', + licenseUrl: 'https://github.com/microsoft/vscode/blob/main/LICENSE.txt' + }); + } +} + +/** + * @deprecated You MUST use `IProductService` if possible. + */ export default product; diff --git a/vscode-web-gogs1s/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/vscode-web-gogs1s/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts deleted file mode 100644 index b07208a..0000000 --- a/vscode-web-gogs1s/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ /dev/null @@ -1,518 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import 'vs/css!./media/activityaction'; -import * as nls from 'vs/nls'; -import * as DOM from 'vs/base/browser/dom'; -import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { EventType as TouchEventType, GestureEvent } from 'vs/base/browser/touch'; -import { Action, IAction, Separator, SubmenuAction } from 'vs/base/common/actions'; -import { KeyCode } from 'vs/base/common/keyCodes'; -import { DisposableStore } from 'vs/base/common/lifecycle'; -import { IMenuService, MenuId, IMenu, registerAction2, Action2, IAction2Options } from 'vs/platform/actions/common/actions'; -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { activeContrastBorder, focusBorder } from 'vs/platform/theme/common/colorRegistry'; -import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { ActivityAction, ActivityActionViewItem, ICompositeBar, ICompositeBarColors, ToggleCompositePinnedAction } from 'vs/workbench/browser/parts/compositeBarActions'; -import { CATEGORIES } from 'vs/workbench/common/actions'; -import { IActivity } from 'vs/workbench/common/activity'; -import { ACTIVITY_BAR_FOREGROUND, ACTIVITY_BAR_ACTIVE_BORDER, ACTIVITY_BAR_ACTIVE_FOCUS_BORDER, ACTIVITY_BAR_ACTIVE_BACKGROUND, ACTIVITY_BAR_BACKGROUND } from 'vs/workbench/common/theme'; -import { IActivityBarService } from 'vs/workbench/services/activityBar/browser/activityBarService'; -import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; -import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { isMacintosh, isWeb } from 'vs/base/common/platform'; -import { getCurrentAuthenticationSessionInfo, IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; -import { AuthenticationSession } from 'vs/editor/common/modes'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IProductService } from 'vs/platform/product/common/productService'; -import { AnchorAlignment, AnchorAxisAlignment } from 'vs/base/browser/ui/contextview/contextview'; -import { getTitleBarStyle } from 'vs/platform/windows/common/windows'; -import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; - -export class ViewContainerActivityAction extends ActivityAction { - - private static readonly preventDoubleClickDelay = 300; - - private lastRun = 0; - - constructor( - activity: IActivity, - @IViewletService private readonly viewletService: IViewletService, - @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, - @ITelemetryService private readonly telemetryService: ITelemetryService, - @IConfigurationService private readonly configurationService: IConfigurationService - ) { - super(activity); - } - - updateActivity(activity: IActivity): void { - this.activity = activity; - } - - async run(event: unknown): Promise { - if (event instanceof MouseEvent && event.button === 2) { - return; // do not run on right click - } - - // prevent accident trigger on a doubleclick (to help nervous people) - const now = Date.now(); - if (now > this.lastRun /* https://github.com/microsoft/vscode/issues/25830 */ && now - this.lastRun < ViewContainerActivityAction.preventDoubleClickDelay) { - return; - } - this.lastRun = now; - - const sideBarVisible = this.layoutService.isVisible(Parts.SIDEBAR_PART); - const activeViewlet = this.viewletService.getActiveViewlet(); - const focusBehavior = this.configurationService.getValue('workbench.activityBar.iconClickBehavior'); - - if (sideBarVisible && activeViewlet?.getId() === this.activity.id) { - switch (focusBehavior) { - case 'focus': - this.logAction('refocus'); - this.viewletService.openViewlet(this.activity.id, true); - break; - case 'toggle': - default: - // Hide sidebar if selected viewlet already visible - this.logAction('hide'); - this.layoutService.setSideBarHidden(true); - break; - } - - return; - } - - this.logAction('show'); - await this.viewletService.openViewlet(this.activity.id, true); - - return this.activate(); - } - - private logAction(action: string) { - type ActivityBarActionClassification = { - viewletId: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - action: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - }; - this.telemetryService.publicLog2<{ viewletId: String, action: String }, ActivityBarActionClassification>('activityBarAction', { viewletId: this.activity.id, action }); - } -} - -class MenuActivityActionViewItem extends ActivityActionViewItem { - - constructor( - private readonly menuId: MenuId, - action: ActivityAction, - colors: (theme: IColorTheme) => ICompositeBarColors, - @IThemeService themeService: IThemeService, - @IMenuService protected readonly menuService: IMenuService, - @IContextMenuService protected readonly contextMenuService: IContextMenuService, - @IContextKeyService protected readonly contextKeyService: IContextKeyService, - @IConfigurationService protected readonly configurationService: IConfigurationService, - @IWorkbenchEnvironmentService protected readonly environmentService: IWorkbenchEnvironmentService - ) { - super(action, { draggable: false, colors, icon: true }, themeService); - } - - render(container: HTMLElement): void { - super.render(container); - - // Context menus are triggered on mouse down so that an item can be picked - // and executed with releasing the mouse over it - - this._register(DOM.addDisposableListener(this.container, DOM.EventType.MOUSE_DOWN, (e: MouseEvent) => { - DOM.EventHelper.stop(e, true); - this.showContextMenu(e); - })); - - this._register(DOM.addDisposableListener(this.container, DOM.EventType.KEY_UP, (e: KeyboardEvent) => { - let event = new StandardKeyboardEvent(e); - if (event.equals(KeyCode.Enter) || event.equals(KeyCode.Space)) { - DOM.EventHelper.stop(e, true); - this.showContextMenu(); - } - })); - - this._register(DOM.addDisposableListener(this.container, TouchEventType.Tap, (e: GestureEvent) => { - DOM.EventHelper.stop(e, true); - this.showContextMenu(); - })); - } - - protected async showContextMenu(e?: MouseEvent): Promise { - const disposables = new DisposableStore(); - - const menu = disposables.add(this.menuService.createMenu(this.menuId, this.contextKeyService)); - const actions = await this.resolveActions(menu, disposables); - - const isUsingCustomMenu = isWeb || (getTitleBarStyle(this.configurationService) !== 'native' && !isMacintosh); // see #40262 - const position = this.configurationService.getValue('workbench.sideBar.location'); - - this.contextMenuService.showContextMenu({ - getAnchor: () => isUsingCustomMenu ? this.container : e || this.container, - anchorAlignment: isUsingCustomMenu ? (position === 'left' ? AnchorAlignment.RIGHT : AnchorAlignment.LEFT) : undefined, - anchorAxisAlignment: isUsingCustomMenu ? AnchorAxisAlignment.HORIZONTAL : AnchorAxisAlignment.VERTICAL, - getActions: () => actions, - onHide: () => disposables.dispose() - }); - } - - protected async resolveActions(menu: IMenu, disposables: DisposableStore): Promise { - const actions: IAction[] = []; - - disposables.add(createAndFillInActionBarActions(menu, undefined, { primary: [], secondary: actions })); - - return actions; - } -} - -export class HomeActivityActionViewItem extends MenuActivityActionViewItem { - - static readonly HOME_BAR_VISIBILITY_PREFERENCE = 'workbench.activity.showHomeIndicator'; - - constructor( - private readonly goHomeHref: string, - action: ActivityAction, - colors: (theme: IColorTheme) => ICompositeBarColors, - @IThemeService themeService: IThemeService, - @IMenuService menuService: IMenuService, - @IContextMenuService contextMenuService: IContextMenuService, - @IContextKeyService contextKeyService: IContextKeyService, - @IConfigurationService configurationService: IConfigurationService, - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, - // @IStorageService private readonly storageService: IStorageService - ) { - super(MenuId.MenubarHomeMenu, action, colors, themeService, menuService, contextMenuService, contextKeyService, configurationService, environmentService); - } - - // modify-by-github1s, open current github repository in an new Tab directly - render(container: HTMLElement): void { - super.render(container); - - this._register(DOM.addDisposableListener(this.container, DOM.EventType.CLICK, (e: MouseEvent) => { - DOM.EventHelper.stop(e, true); - this.openGitHubRepository(); - })); - - this._register(DOM.addDisposableListener(this.container, DOM.EventType.KEY_UP, (e: KeyboardEvent) => { - let event = new StandardKeyboardEvent(e); - if (event.equals(KeyCode.Enter) || event.equals(KeyCode.Space)) { - DOM.EventHelper.stop(e, true); - this.openGitHubRepository(); - } - })); - - this._register(DOM.addDisposableListener(this.container, TouchEventType.Tap, (e: GestureEvent) => { - DOM.EventHelper.stop(e, true); - this.openGitHubRepository(); - })); - } - - protected openGitHubRepository() { - return this.goHomeHref ? window.open(this.goHomeHref) : undefined; - } -} - -export class AccountsActivityActionViewItem extends MenuActivityActionViewItem { - - static readonly ACCOUNTS_VISIBILITY_PREFERENCE_KEY = 'workbench.activity.showAccounts'; - - constructor( - action: ActivityAction, - colors: (theme: IColorTheme) => ICompositeBarColors, - @IThemeService themeService: IThemeService, - @IContextMenuService contextMenuService: IContextMenuService, - @IMenuService menuService: IMenuService, - @IContextKeyService contextKeyService: IContextKeyService, - @IAuthenticationService private readonly authenticationService: IAuthenticationService, - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, - @IStorageService private readonly storageService: IStorageService, - @IProductService private readonly productService: IProductService, - @IConfigurationService configurationService: IConfigurationService, - ) { - super(MenuId.AccountsContext, action, colors, themeService, menuService, contextMenuService, contextKeyService, configurationService, environmentService); - } - - protected async resolveActions(accountsMenu: IMenu, disposables: DisposableStore): Promise { - await super.resolveActions(accountsMenu, disposables); - - const otherCommands = accountsMenu.getActions(); - const providers = this.authenticationService.getProviderIds(); - const allSessions = providers.map(async providerId => { - try { - const sessions = await this.authenticationService.getSessions(providerId); - - const groupedSessions: { [label: string]: AuthenticationSession[] } = {}; - sessions.forEach(session => { - if (groupedSessions[session.account.label]) { - groupedSessions[session.account.label].push(session); - } else { - groupedSessions[session.account.label] = [session]; - } - }); - - return { providerId, sessions: groupedSessions }; - } catch { - return { providerId }; - } - }); - - const result = await Promise.all(allSessions); - let menus: IAction[] = []; - const authenticationSession = this.environmentService.options?.credentialsProvider ? await getCurrentAuthenticationSessionInfo(this.environmentService, this.productService) : undefined; - result.forEach(sessionInfo => { - const providerDisplayName = this.authenticationService.getLabel(sessionInfo.providerId); - - if (sessionInfo.sessions) { - Object.keys(sessionInfo.sessions).forEach(accountName => { - const manageExtensionsAction = disposables.add(new Action(`configureSessions${accountName}`, nls.localize('manageTrustedExtensions', "Manage Trusted Extensions"), '', true, () => { - return this.authenticationService.manageTrustedExtensionsForAccount(sessionInfo.providerId, accountName); - })); - - const signOutAction = disposables.add(new Action('signOut', nls.localize('signOut', "Sign Out"), '', true, () => { - return this.authenticationService.signOutOfAccount(sessionInfo.providerId, accountName); - })); - - const providerSubMenuActions = [manageExtensionsAction]; - - const hasEmbedderAccountSession = sessionInfo.sessions[accountName].some(session => session.id === (authenticationSession?.id)); - if (!hasEmbedderAccountSession || authenticationSession?.canSignOut) { - providerSubMenuActions.push(signOutAction); - } - - const providerSubMenu = disposables.add(new SubmenuAction('activitybar.submenu', `${accountName} (${providerDisplayName})`, providerSubMenuActions)); - menus.push(providerSubMenu); - }); - } else { - const providerUnavailableAction = disposables.add(new Action('providerUnavailable', nls.localize('authProviderUnavailable', '{0} is currently unavailable', providerDisplayName))); - menus.push(providerUnavailableAction); - } - }); - - if (menus.length && otherCommands.length) { - menus.push(disposables.add(new Separator())); - } - - otherCommands.forEach((group, i) => { - const actions = group[1]; - menus = menus.concat(actions); - if (i !== otherCommands.length - 1) { - menus.push(disposables.add(new Separator())); - } - }); - - if (menus.length) { - menus.push(disposables.add(new Separator())); - } - - menus.push(disposables.add(new Action('hide', nls.localize('hide', "Hide"), undefined, true, async () => { - this.storageService.store(AccountsActivityActionViewItem.ACCOUNTS_VISIBILITY_PREFERENCE_KEY, false, StorageScope.GLOBAL, StorageTarget.USER); - }))); - - return menus; - } -} - -export class GlobalActivityActionViewItem extends MenuActivityActionViewItem { - - constructor( - action: ActivityAction, - colors: (theme: IColorTheme) => ICompositeBarColors, - @IThemeService themeService: IThemeService, - @IMenuService menuService: IMenuService, - @IContextMenuService contextMenuService: IContextMenuService, - @IContextKeyService contextKeyService: IContextKeyService, - @IConfigurationService configurationService: IConfigurationService, - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService - ) { - super(MenuId.GlobalActivity, action, colors, themeService, menuService, contextMenuService, contextKeyService, configurationService, environmentService); - } -} - -export class PlaceHolderViewContainerActivityAction extends ViewContainerActivityAction { } - -export class PlaceHolderToggleCompositePinnedAction extends ToggleCompositePinnedAction { - - constructor(id: string, compositeBar: ICompositeBar) { - super({ id, name: id, cssClass: undefined }, compositeBar); - } - - setActivity(activity: IActivity): void { - this.label = activity.name; - } -} - -class SwitchSideBarViewAction extends Action2 { - - constructor( - desc: Readonly, - private readonly offset: number - ) { - super(desc); - } - - async run(accessor: ServicesAccessor): Promise { - const activityBarService = accessor.get(IActivityBarService); - const viewletService = accessor.get(IViewletService); - - const visibleViewletIds = activityBarService.getVisibleViewContainerIds(); - - const activeViewlet = viewletService.getActiveViewlet(); - if (!activeViewlet) { - return; - } - let targetViewletId: string | undefined; - for (let i = 0; i < visibleViewletIds.length; i++) { - if (visibleViewletIds[i] === activeViewlet.getId()) { - targetViewletId = visibleViewletIds[(i + visibleViewletIds.length + this.offset) % visibleViewletIds.length]; - break; - } - } - - await viewletService.openViewlet(targetViewletId, true); - } -} - -registerAction2( - class PreviousSideBarViewAction extends SwitchSideBarViewAction { - constructor() { - super({ - id: 'workbench.action.previousSideBarView', - title: { value: nls.localize('previousSideBarView', "Previous Side Bar View"), original: 'Previous Side Bar View' }, - category: CATEGORIES.View, - f1: true - }, -1); - } - } -); - -registerAction2( - class NextSideBarViewAction extends SwitchSideBarViewAction { - constructor() { - super({ - id: 'workbench.action.nextSideBarView', - title: { value: nls.localize('nextSideBarView', "Next Side Bar View"), original: 'Next Side Bar View' }, - category: CATEGORIES.View, - f1: true - }, 1); - } - } -); - -registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - const activityBarBackgroundColor = theme.getColor(ACTIVITY_BAR_BACKGROUND); - if (activityBarBackgroundColor) { - collector.addRule(` - .monaco-workbench .activitybar > .content > .home-bar > .home-bar-icon-badge { - background-color: ${activityBarBackgroundColor}; - } - `); - } - - const activityBarForegroundColor = theme.getColor(ACTIVITY_BAR_FOREGROUND); - if (activityBarForegroundColor) { - collector.addRule(` - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.active .action-label:not(.codicon), - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item:focus .action-label:not(.codicon), - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item:hover .action-label:not(.codicon) { - background-color: ${activityBarForegroundColor} !important; - } - .monaco-workbench .activitybar > .content .home-bar > .monaco-action-bar .action-item .action-label.codicon, - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.active .action-label.codicon, - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item:focus .action-label.codicon, - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item:hover .action-label.codicon { - color: ${activityBarForegroundColor} !important; - } - `); - } - - const activityBarActiveBorderColor = theme.getColor(ACTIVITY_BAR_ACTIVE_BORDER); - if (activityBarActiveBorderColor) { - collector.addRule(` - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.checked .active-item-indicator:before { - border-left-color: ${activityBarActiveBorderColor}; - } - `); - } - - const activityBarActiveFocusBorderColor = theme.getColor(ACTIVITY_BAR_ACTIVE_FOCUS_BORDER); - if (activityBarActiveFocusBorderColor) { - collector.addRule(` - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.checked:focus::before { - visibility: hidden; - } - - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.checked:focus .active-item-indicator:before { - visibility: visible; - border-left-color: ${activityBarActiveFocusBorderColor}; - } - `); - } - - const activityBarActiveBackgroundColor = theme.getColor(ACTIVITY_BAR_ACTIVE_BACKGROUND); - if (activityBarActiveBackgroundColor) { - collector.addRule(` - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.checked .active-item-indicator { - z-index: 0; - background-color: ${activityBarActiveBackgroundColor}; - } - `); - } - - // Styling with Outline color (e.g. high contrast theme) - const outline = theme.getColor(activeContrastBorder); - if (outline) { - collector.addRule(` - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item:before { - content: ""; - position: absolute; - top: 9px; - left: 9px; - height: 32px; - width: 32px; - z-index: 1; - } - - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.active:before, - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.active:hover:before, - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.checked:before, - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.checked:hover:before { - outline: 1px solid; - } - - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item:hover:before { - outline: 1px dashed; - } - - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item:focus:before { - border-left-color: ${outline}; - } - - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.active:before, - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.active:hover:before, - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.checked:before, - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.checked:hover:before, - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item:hover:before { - outline-color: ${outline}; - } - `); - } - - // Styling without outline color - else { - const focusBorderColor = theme.getColor(focusBorder); - if (focusBorderColor) { - collector.addRule(` - .monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item:focus:before { - border-left-color: ${focusBorderColor}; - } - `); - } - } -}); diff --git a/vscode-web-gogs1s/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/vscode-web-gogs1s/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts deleted file mode 100644 index d34c06d..0000000 --- a/vscode-web-gogs1s/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ /dev/null @@ -1,1088 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import 'vs/css!./media/activitybarpart'; -import * as nls from 'vs/nls'; -import { ActionsOrientation, ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; -import { GLOBAL_ACTIVITY_ID, IActivity, ACCOUNTS_ACTIVITY_ID } from 'vs/workbench/common/activity'; -import { Part } from 'vs/workbench/browser/part'; -import { GlobalActivityActionViewItem, ViewContainerActivityAction, PlaceHolderToggleCompositePinnedAction, PlaceHolderViewContainerActivityAction, AccountsActivityActionViewItem, HomeActivityActionViewItem } from 'vs/workbench/browser/parts/activitybar/activitybarActions'; -import { IBadge, NumberBadge } from 'vs/workbench/services/activity/common/activity'; -import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; -import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { IDisposable, toDisposable, DisposableStore, Disposable } from 'vs/base/common/lifecycle'; -import { ToggleActivityBarVisibilityAction, ToggleMenuBarAction, ToggleSidebarPositionAction } from 'vs/workbench/browser/actions/layoutActions'; -import { IThemeService, IColorTheme, ThemeIcon } from 'vs/platform/theme/common/themeService'; -import { ACTIVITY_BAR_BACKGROUND, ACTIVITY_BAR_BORDER, ACTIVITY_BAR_FOREGROUND, ACTIVITY_BAR_ACTIVE_BORDER, ACTIVITY_BAR_BADGE_BACKGROUND, ACTIVITY_BAR_BADGE_FOREGROUND, ACTIVITY_BAR_INACTIVE_FOREGROUND, ACTIVITY_BAR_ACTIVE_BACKGROUND, ACTIVITY_BAR_DRAG_AND_DROP_BORDER } from 'vs/workbench/common/theme'; -import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { CompositeBar, ICompositeBarItem, CompositeDragAndDrop } from 'vs/workbench/browser/parts/compositeBar'; -import { Dimension, createCSSRule, asCSSUrl, addDisposableListener, EventType } from 'vs/base/browser/dom'; -import { IStorageService, StorageScope, IStorageValueChangeEvent, StorageTarget } from 'vs/platform/storage/common/storage'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { URI, UriComponents } from 'vs/base/common/uri'; -import { ToggleCompositePinnedAction, ICompositeBarColors, ActivityAction, ICompositeActivity } from 'vs/workbench/browser/parts/compositeBarActions'; -import { IViewDescriptorService, ViewContainer, TEST_VIEW_CONTAINER_ID, IViewContainerModel, ViewContainerLocation, IViewsService } from 'vs/workbench/common/views'; -import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { assertIsDefined } from 'vs/base/common/types'; -import { IActivityBarService } from 'vs/workbench/services/activityBar/browser/activityBarService'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { Schemas } from 'vs/base/common/network'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { CustomMenubarControl } from 'vs/workbench/browser/parts/titlebar/menubarControl'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { getMenuBarVisibility } from 'vs/platform/windows/common/windows'; -import { isWeb } from 'vs/base/common/platform'; -import { Before2D } from 'vs/workbench/browser/dnd'; -import { Codicon, iconRegistry } from 'vs/base/common/codicons'; -import { Action, Separator } from 'vs/base/common/actions'; -import { Event } from 'vs/base/common/event'; -import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { KeyCode } from 'vs/base/common/keyCodes'; -import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; -import { CATEGORIES } from 'vs/workbench/common/actions'; -import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; - -interface IPlaceholderViewContainer { - readonly id: string; - readonly name?: string; - readonly iconUrl?: UriComponents; - readonly themeIcon?: ThemeIcon; - readonly views?: { when?: string }[]; -} - -interface IPinnedViewContainer { - readonly id: string; - readonly pinned: boolean; - readonly order?: number; - readonly visible: boolean; -} - -interface ICachedViewContainer { - readonly id: string; - name?: string; - icon?: URI | ThemeIcon; - readonly pinned: boolean; - readonly order?: number; - visible: boolean; - views?: { when?: string }[]; -} - -const settingsViewBarIcon = registerIcon('settings-view-bar-icon', Codicon.settingsGear, nls.localize('settingsViewBarIcon', 'Settings icon in the view bar.')); -const accountsViewBarIcon = registerIcon('accounts-view-bar-icon', Codicon.account, nls.localize('accountsViewBarIcon', 'Accounts icon in the view bar.')); - -export class ActivitybarPart extends Part implements IActivityBarService { - - declare readonly _serviceBrand: undefined; - - private static readonly PINNED_VIEW_CONTAINERS = 'workbench.activity.pinnedViewlets2'; - private static readonly PLACEHOLDER_VIEW_CONTAINERS = 'workbench.activity.placeholderViewlets'; - private static readonly ACTION_HEIGHT = 48; - private static readonly ACCOUNTS_ACTION_INDEX = 0; - - //#region IView - - readonly minimumWidth: number = 48; - readonly maximumWidth: number = 48; - readonly minimumHeight: number = 0; - readonly maximumHeight: number = Number.POSITIVE_INFINITY; - - //#endregion - - private content: HTMLElement | undefined; - - private homeBar: ActionBar | undefined; - private homeBarContainer: HTMLElement | undefined; - - private menuBar: CustomMenubarControl | undefined; - private menuBarContainer: HTMLElement | undefined; - - private compositeBar: CompositeBar; - private compositeBarContainer: HTMLElement | undefined; - - private globalActivityAction: ActivityAction | undefined; - private globalActivityActionBar: ActionBar | undefined; - private globalActivitiesContainer: HTMLElement | undefined; - private readonly globalActivity: ICompositeActivity[] = []; - - private accountsActivityAction: ActivityAction | undefined; - - private readonly accountsActivity: ICompositeActivity[] = []; - - private readonly compositeActions = new Map(); - private readonly viewContainerDisposables = new Map(); - - private readonly keyboardNavigationDisposables = this._register(new DisposableStore()); - - private readonly location = ViewContainerLocation.Sidebar; - - constructor( - @IInstantiationService private readonly instantiationService: IInstantiationService, - @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, - @IThemeService themeService: IThemeService, - @IStorageService private readonly storageService: IStorageService, - @IExtensionService private readonly extensionService: IExtensionService, - @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService, - @IViewsService private readonly viewsService: IViewsService, - @IContextKeyService private readonly contextKeyService: IContextKeyService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, - ) { - super(Parts.ACTIVITYBAR_PART, { hasTitle: false }, themeService, storageService, layoutService); - - for (const cachedViewContainer of this.cachedViewContainers) { - if ( - environmentService.remoteAuthority || // In remote window, hide activity bar entries until registered - this.shouldBeHidden(cachedViewContainer.id, cachedViewContainer) - ) { - cachedViewContainer.visible = false; - } - } - - this.compositeBar = this.createCompositeBar(); - - this.onDidRegisterViewContainers(this.getViewContainers()); - - this.registerListeners(); - } - - private createCompositeBar() { - const cachedItems = this.cachedViewContainers - .map(container => ({ - id: container.id, - name: container.name, - visible: container.visible, - order: container.order, - pinned: container.pinned - })); - - return this._register(this.instantiationService.createInstance(CompositeBar, cachedItems, { - icon: true, - orientation: ActionsOrientation.VERTICAL, - preventLoopNavigation: true, - openComposite: (compositeId: string) => this.viewsService.openViewContainer(compositeId, true), - getActivityAction: (compositeId: string) => this.getCompositeActions(compositeId).activityAction, - getCompositePinnedAction: (compositeId: string) => this.getCompositeActions(compositeId).pinnedAction, - getOnCompositeClickAction: (compositeId: string) => new Action(compositeId, '', '', true, () => this.viewsService.isViewContainerVisible(compositeId) ? Promise.resolve(this.viewsService.closeViewContainer(compositeId)) : this.viewsService.openViewContainer(compositeId)), - getContextMenuActions: () => { - const actions = []; - - // Home - if (this.homeBarContainer) { - actions.push(new Action( - 'toggleHomeBarAction', - this.homeBarVisibilityPreference ? nls.localize('hideHomeBar', "Hide Home Button") : nls.localize('showHomeBar', "Show Home Button"), - undefined, - true, - async () => { this.homeBarVisibilityPreference = !this.homeBarVisibilityPreference; } - )); - } - - // Menu - const menuBarVisibility = getMenuBarVisibility(this.configurationService); - if (menuBarVisibility === 'compact' || (menuBarVisibility === 'hidden' && isWeb)) { - actions.push(this.instantiationService.createInstance(ToggleMenuBarAction, ToggleMenuBarAction.ID, menuBarVisibility === 'compact' ? nls.localize('hideMenu', "Hide Menu") : nls.localize('showMenu', "Show Menu"))); - } - - // Accounts - actions.push(new Action( - 'toggleAccountsVisibility', - this.accountsVisibilityPreference ? nls.localize('hideAccounts', "Hide Accounts") : nls.localize('showAccounts', "Show Accounts"), - undefined, - true, - async () => { this.accountsVisibilityPreference = !this.accountsVisibilityPreference; } - )); - actions.push(new Separator()); - - // Toggle Sidebar - actions.push(this.instantiationService.createInstance(ToggleSidebarPositionAction, ToggleSidebarPositionAction.ID, ToggleSidebarPositionAction.getLabel(this.layoutService))); - - // Toggle Activity Bar - actions.push(new Action( - ToggleActivityBarVisibilityAction.ID, - nls.localize('hideActivitBar', "Hide Activity Bar"), - undefined, - true, - async () => { this.instantiationService.invokeFunction(accessor => new ToggleActivityBarVisibilityAction().run(accessor)); } - )); - - return actions; - }, - getContextMenuActionsForComposite: compositeId => this.getContextMenuActionsForComposite(compositeId), - getDefaultCompositeId: () => this.viewDescriptorService.getDefaultViewContainer(this.location)!.id, - hidePart: () => this.layoutService.setSideBarHidden(true), - dndHandler: new CompositeDragAndDrop(this.viewDescriptorService, ViewContainerLocation.Sidebar, - (id: string, focus?: boolean) => this.viewsService.openViewContainer(id, focus), - (from: string, to: string, before?: Before2D) => this.compositeBar.move(from, to, before?.verticallyBefore), - () => this.compositeBar.getCompositeBarItems(), - ), - compositeSize: 52, - colors: (theme: IColorTheme) => this.getActivitybarItemColors(theme), - overflowActionSize: ActivitybarPart.ACTION_HEIGHT - })); - } - - private getContextMenuActionsForComposite(compositeId: string): Action[] { - const actions = []; - - const viewContainer = this.viewDescriptorService.getViewContainerById(compositeId)!; - const defaultLocation = this.viewDescriptorService.getDefaultViewContainerLocation(viewContainer)!; - if (defaultLocation !== this.viewDescriptorService.getViewContainerLocation(viewContainer)) { - actions.push(new Action('resetLocationAction', nls.localize('resetLocation', "Reset Location"), undefined, true, async () => { - this.viewDescriptorService.moveViewContainerToLocation(viewContainer, defaultLocation); - })); - } else { - const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer); - if (viewContainerModel.allViewDescriptors.length === 1) { - const viewToReset = viewContainerModel.allViewDescriptors[0]; - const defaultContainer = this.viewDescriptorService.getDefaultContainerById(viewToReset.id)!; - if (defaultContainer !== viewContainer) { - actions.push(new Action('resetLocationAction', nls.localize('resetLocation', "Reset Location"), undefined, true, async () => { - this.viewDescriptorService.moveViewsToContainer([viewToReset], defaultContainer); - })); - } - } - } - - return actions; - } - - private registerListeners(): void { - - // View Container Changes - this._register(this.viewDescriptorService.onDidChangeViewContainers(({ added, removed }) => this.onDidChangeViewContainers(added, removed))); - this._register(this.viewDescriptorService.onDidChangeContainerLocation(({ viewContainer, from, to }) => this.onDidChangeViewContainerLocation(viewContainer, from, to))); - - // View Container Visibility Changes - this._register(Event.filter(this.viewsService.onDidChangeViewContainerVisibility, e => e.location === this.location)(({ id, visible }) => this.onDidChangeViewContainerVisibility(id, visible))); - - // Extension registration - let disposables = this._register(new DisposableStore()); - this._register(this.extensionService.onDidRegisterExtensions(() => { - disposables.clear(); - this.onDidRegisterExtensions(); - this.compositeBar.onDidChange(() => this.saveCachedViewContainers(), this, disposables); - this.storageService.onDidChangeValue(e => this.onDidStorageValueChange(e), this, disposables); - })); - - // Register for configuration changes - this._register(this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration('window.menuBarVisibility')) { - if (getMenuBarVisibility(this.configurationService) === 'compact') { - this.installMenubar(); - } else { - this.uninstallMenubar(); - } - } - })); - } - - private onDidChangeViewContainers(added: ReadonlyArray<{ container: ViewContainer, location: ViewContainerLocation }>, removed: ReadonlyArray<{ container: ViewContainer, location: ViewContainerLocation }>) { - removed.filter(({ location }) => location === ViewContainerLocation.Sidebar).forEach(({ container }) => this.onDidDeregisterViewContainer(container)); - this.onDidRegisterViewContainers(added.filter(({ location }) => location === ViewContainerLocation.Sidebar).map(({ container }) => container)); - } - - private onDidChangeViewContainerLocation(container: ViewContainer, from: ViewContainerLocation, to: ViewContainerLocation) { - if (from === this.location) { - this.onDidDeregisterViewContainer(container); - } - - if (to === this.location) { - this.onDidRegisterViewContainers([container]); - } - } - - private onDidChangeViewContainerVisibility(id: string, visible: boolean) { - if (visible) { - // Activate view container action on opening of a view container - this.onDidViewContainerVisible(id); - } else { - // Deactivate view container action on close - this.compositeBar.deactivateComposite(id); - } - } - - private onDidChangeHomeBarVisibility(): void { - if (this.homeBarContainer) { - this.homeBarContainer.style.display = this.homeBarVisibilityPreference ? '' : 'none'; - } - } - - private onDidRegisterExtensions(): void { - this.removeNotExistingComposites(); - this.saveCachedViewContainers(); - } - - private onDidViewContainerVisible(id: string): void { - const viewContainer = this.getViewContainer(id); - if (viewContainer) { - - // Update the composite bar by adding - this.compositeBar.addComposite(viewContainer); - this.compositeBar.activateComposite(viewContainer.id); - - if (viewContainer.hideIfEmpty) { - const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer); - if (viewContainerModel.activeViewDescriptors.length === 0) { - // Update the composite bar by hiding - this.hideComposite(viewContainer.id); - } - } - } - } - - showActivity(viewContainerOrActionId: string, badge: IBadge, clazz?: string, priority?: number): IDisposable { - if (this.getViewContainer(viewContainerOrActionId)) { - return this.compositeBar.showActivity(viewContainerOrActionId, badge, clazz, priority); - } - - if (viewContainerOrActionId === GLOBAL_ACTIVITY_ID) { - return this.showGlobalActivity(GLOBAL_ACTIVITY_ID, badge, clazz, priority); - } - - if (viewContainerOrActionId === ACCOUNTS_ACTIVITY_ID) { - return this.showGlobalActivity(ACCOUNTS_ACTIVITY_ID, badge, clazz, priority); - } - - return Disposable.None; - } - - private showGlobalActivity(activityId: string, badge: IBadge, clazz?: string, priority?: number): IDisposable { - if (typeof priority !== 'number') { - priority = 0; - } - - const activity: ICompositeActivity = { badge, clazz, priority }; - const activityCache = activityId === GLOBAL_ACTIVITY_ID ? this.globalActivity : this.accountsActivity; - - for (let i = 0; i <= activityCache.length; i++) { - if (i === activityCache.length) { - activityCache.push(activity); - break; - } else if (activityCache[i].priority <= priority) { - activityCache.splice(i, 0, activity); - break; - } - } - this.updateGlobalActivity(activityId); - - return toDisposable(() => this.removeGlobalActivity(activityId, activity)); - } - - private removeGlobalActivity(activityId: string, activity: ICompositeActivity): void { - const activityCache = activityId === GLOBAL_ACTIVITY_ID ? this.globalActivity : this.accountsActivity; - const index = activityCache.indexOf(activity); - if (index !== -1) { - activityCache.splice(index, 1); - this.updateGlobalActivity(activityId); - } - } - - private updateGlobalActivity(activityId: string): void { - const activityAction = activityId === GLOBAL_ACTIVITY_ID ? this.globalActivityAction : this.accountsActivityAction; - if (!activityAction) { - return; - } - - const activityCache = activityId === GLOBAL_ACTIVITY_ID ? this.globalActivity : this.accountsActivity; - if (activityCache.length) { - const [{ badge, clazz, priority }] = activityCache; - if (badge instanceof NumberBadge && activityCache.length > 1) { - const cumulativeNumberBadge = this.getCumulativeNumberBadge(activityCache, priority); - activityAction.setBadge(cumulativeNumberBadge); - } else { - activityAction.setBadge(badge, clazz); - } - } else { - activityAction.setBadge(undefined); - } - } - - private getCumulativeNumberBadge(activityCache: ICompositeActivity[], priority: number): NumberBadge { - const numberActivities = activityCache.filter(activity => activity.badge instanceof NumberBadge && activity.priority === priority); - const number = numberActivities.reduce((result, activity) => { return result + (activity.badge).number; }, 0); - const descriptorFn = (): string => { - return numberActivities.reduce((result, activity, index) => { - result = result + (activity.badge).getDescription(); - if (index < numberActivities.length - 1) { - result = `${result}\n`; - } - - return result; - }, ''); - }; - - return new NumberBadge(number, descriptorFn); - } - - private uninstallMenubar() { - if (this.menuBar) { - this.menuBar.dispose(); - this.menuBar = undefined; - } - - if (this.menuBarContainer) { - this.menuBarContainer.remove(); - this.menuBarContainer = undefined; - this.registerKeyboardNavigationListeners(); - } - } - - private installMenubar() { - if (this.menuBar) { - return; // prevent menu bar from installing twice #110720 - } - - this.menuBarContainer = document.createElement('div'); - this.menuBarContainer.classList.add('menubar'); - - const content = assertIsDefined(this.content); - if (this.homeBarContainer) { - content.insertBefore(this.menuBarContainer, this.homeBarContainer.nextSibling); - } else { - content.prepend(this.menuBarContainer); - } - - // Menubar: install a custom menu bar depending on configuration - this.menuBar = this._register(this.instantiationService.createInstance(CustomMenubarControl)); - this.menuBar.create(this.menuBarContainer); - - this.registerKeyboardNavigationListeners(); - } - - createContentArea(parent: HTMLElement): HTMLElement { - this.element = parent; - - this.content = document.createElement('div'); - this.content.classList.add('content'); - parent.appendChild(this.content); - - // Home action bar - const homeIndicator = this.environmentService.options?.homeIndicator; - if (homeIndicator) { - let codicon = iconRegistry.get(homeIndicator.icon); - if (!codicon) { - codicon = Codicon.code; - } - - this.createHomeBar(homeIndicator.href, codicon); - this.onDidChangeHomeBarVisibility(); - } - - // Install menubar if compact - if (getMenuBarVisibility(this.configurationService) === 'compact') { - this.installMenubar(); - } - - // View Containers action bar - this.compositeBarContainer = this.compositeBar.create(this.content); - - // Global action bar - this.globalActivitiesContainer = document.createElement('div'); - this.content.appendChild(this.globalActivitiesContainer); - - this.createGlobalActivityActionBar(this.globalActivitiesContainer); - - // Keyboard Navigation - this.registerKeyboardNavigationListeners(); - - return this.content; - } - - private registerKeyboardNavigationListeners(): void { - this.keyboardNavigationDisposables.clear(); - - // Down arrow on home indicator - if (this.homeBarContainer) { - this.keyboardNavigationDisposables.add(addDisposableListener(this.homeBarContainer, EventType.KEY_DOWN, e => { - const kbEvent = new StandardKeyboardEvent(e); - if (kbEvent.equals(KeyCode.DownArrow) || kbEvent.equals(KeyCode.RightArrow)) { - if (this.menuBar) { - this.menuBar.toggleFocus(); - } else if (this.compositeBar) { - this.compositeBar.focus(); - } - } - })); - } - - // Up/Down arrow on compact menu - if (this.menuBarContainer) { - this.keyboardNavigationDisposables.add(addDisposableListener(this.menuBarContainer, EventType.KEY_DOWN, e => { - const kbEvent = new StandardKeyboardEvent(e); - if (kbEvent.equals(KeyCode.DownArrow) || kbEvent.equals(KeyCode.RightArrow)) { - if (this.compositeBar) { - this.compositeBar.focus(); - } - } else if (kbEvent.equals(KeyCode.UpArrow) || kbEvent.equals(KeyCode.LeftArrow)) { - if (this.homeBar) { - this.homeBar.focus(); - } - } - })); - } - - // Up/Down on Activity Icons - if (this.compositeBarContainer) { - this.keyboardNavigationDisposables.add(addDisposableListener(this.compositeBarContainer, EventType.KEY_DOWN, e => { - const kbEvent = new StandardKeyboardEvent(e); - if (kbEvent.equals(KeyCode.DownArrow) || kbEvent.equals(KeyCode.RightArrow)) { - if (this.globalActivityActionBar) { - this.globalActivityActionBar.focus(true); - } - } else if (kbEvent.equals(KeyCode.UpArrow) || kbEvent.equals(KeyCode.LeftArrow)) { - if (this.menuBar) { - this.menuBar.toggleFocus(); - } else if (this.homeBar) { - this.homeBar.focus(); - } - } - })); - } - - // Up arrow on global icons - if (this.globalActivitiesContainer) { - this.keyboardNavigationDisposables.add(addDisposableListener(this.globalActivitiesContainer, EventType.KEY_DOWN, e => { - const kbEvent = new StandardKeyboardEvent(e); - if (kbEvent.equals(KeyCode.UpArrow) || kbEvent.equals(KeyCode.LeftArrow)) { - if (this.compositeBar) { - this.compositeBar.focus(this.getVisibleViewContainerIds().length - 1); - } - } - })); - } - } - - private createHomeBar(href: string, icon: Codicon): void { - this.homeBarContainer = document.createElement('div'); - this.homeBarContainer.setAttribute('aria-label', nls.localize('homeIndicator', "Home")); - this.homeBarContainer.setAttribute('role', 'toolbar'); - this.homeBarContainer.classList.add('home-bar'); - - this.homeBar = this._register(new ActionBar(this.homeBarContainer, { - actionViewItemProvider: action => this.instantiationService.createInstance(HomeActivityActionViewItem, href, action as ActivityAction, (theme: IColorTheme) => this.getActivitybarItemColors(theme)), - orientation: ActionsOrientation.VERTICAL, - ariaLabel: nls.localize('home', "Home"), - animated: false, - preventLoopNavigation: true, - ignoreOrientationForPreviousAndNextKey: true - })); - - // modify-by-github1s, hide home-bar-icon-badge - // const homeBarIconBadge = document.createElement('div'); - // homeBarIconBadge.classList.add('home-bar-icon-badge'); - // this.homeBarContainer.appendChild(homeBarIconBadge); - - this.homeBar.push(this._register(new ActivityAction({ - id: 'workbench.actions.home', - name: 'Repository', - cssClass: icon.classNames - }))); - - const content = assertIsDefined(this.content); - content.appendChild(this.homeBarContainer); - } - - private createGlobalActivityActionBar(container: HTMLElement): void { - this.globalActivityActionBar = this._register(new ActionBar(container, { - actionViewItemProvider: action => { - if (action.id === 'workbench.actions.manage') { - return this.instantiationService.createInstance(GlobalActivityActionViewItem, action as ActivityAction, (theme: IColorTheme) => this.getActivitybarItemColors(theme)); - } - - if (action.id === 'workbench.actions.accounts') { - return this.instantiationService.createInstance(AccountsActivityActionViewItem, action as ActivityAction, (theme: IColorTheme) => this.getActivitybarItemColors(theme)); - } - - throw new Error(`No view item for action '${action.id}'`); - }, - orientation: ActionsOrientation.VERTICAL, - ariaLabel: nls.localize('manage', "Manage"), - animated: false, - preventLoopNavigation: true, - ignoreOrientationForPreviousAndNextKey: true - })); - - this.globalActivityAction = this._register(new ActivityAction({ - id: 'workbench.actions.manage', - name: nls.localize('manage', "Manage"), - cssClass: ThemeIcon.asClassName(settingsViewBarIcon) - })); - - if (this.accountsVisibilityPreference) { - this.accountsActivityAction = this._register(new ActivityAction({ - id: 'workbench.actions.accounts', - name: nls.localize('accounts', "Accounts"), - cssClass: ThemeIcon.asClassName(accountsViewBarIcon) - })); - - this.globalActivityActionBar.push(this.accountsActivityAction, { index: ActivitybarPart.ACCOUNTS_ACTION_INDEX }); - } - - this.globalActivityActionBar.push(this.globalActivityAction); - } - - private toggleAccountsActivity() { - if (this.globalActivityActionBar) { - if (this.accountsActivityAction) { - this.globalActivityActionBar.pull(ActivitybarPart.ACCOUNTS_ACTION_INDEX); - this.accountsActivityAction = undefined; - } else { - this.accountsActivityAction = this._register(new ActivityAction({ - id: 'workbench.actions.accounts', - name: nls.localize('accounts', "Accounts"), - cssClass: Codicon.account.classNames - })); - this.globalActivityActionBar.push(this.accountsActivityAction, { index: ActivitybarPart.ACCOUNTS_ACTION_INDEX }); - } - } - - this.updateGlobalActivity(ACCOUNTS_ACTIVITY_ID); - } - - private getCompositeActions(compositeId: string): { activityAction: ViewContainerActivityAction, pinnedAction: ToggleCompositePinnedAction } { - let compositeActions = this.compositeActions.get(compositeId); - if (!compositeActions) { - const viewContainer = this.getViewContainer(compositeId); - if (viewContainer) { - const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer); - compositeActions = { - activityAction: this.instantiationService.createInstance(ViewContainerActivityAction, this.toActivity(viewContainer, viewContainerModel)), - pinnedAction: new ToggleCompositePinnedAction(viewContainer, this.compositeBar) - }; - } else { - const cachedComposite = this.cachedViewContainers.filter(c => c.id === compositeId)[0]; - compositeActions = { - activityAction: this.instantiationService.createInstance(PlaceHolderViewContainerActivityAction, ActivitybarPart.toActivity(compositeId, compositeId, cachedComposite?.icon, undefined)), - pinnedAction: new PlaceHolderToggleCompositePinnedAction(compositeId, this.compositeBar) - }; - } - - this.compositeActions.set(compositeId, compositeActions); - } - - return compositeActions; - } - - private onDidRegisterViewContainers(viewContainers: ReadonlyArray): void { - for (const viewContainer of viewContainers) { - const cachedViewContainer = this.cachedViewContainers.filter(({ id }) => id === viewContainer.id)[0]; - const visibleViewContainer = this.viewsService.getVisibleViewContainer(this.location); - const isActive = visibleViewContainer?.id === viewContainer.id; - - if (isActive || !this.shouldBeHidden(viewContainer.id, cachedViewContainer)) { - this.compositeBar.addComposite(viewContainer); - - // Pin it by default if it is new - if (!cachedViewContainer) { - this.compositeBar.pin(viewContainer.id); - } - - if (isActive) { - this.compositeBar.activateComposite(viewContainer.id); - } - } - } - - for (const viewContainer of viewContainers) { - const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer); - this.updateActivity(viewContainer, viewContainerModel); - this.onDidChangeActiveViews(viewContainer, viewContainerModel); - - const disposables = new DisposableStore(); - disposables.add(viewContainerModel.onDidChangeContainerInfo(() => this.updateActivity(viewContainer, viewContainerModel))); - disposables.add(viewContainerModel.onDidChangeActiveViewDescriptors(() => this.onDidChangeActiveViews(viewContainer, viewContainerModel))); - - this.viewContainerDisposables.set(viewContainer.id, disposables); - } - } - - private onDidDeregisterViewContainer(viewContainer: ViewContainer): void { - const disposable = this.viewContainerDisposables.get(viewContainer.id); - if (disposable) { - disposable.dispose(); - } - - this.viewContainerDisposables.delete(viewContainer.id); - this.removeComposite(viewContainer.id); - } - - private updateActivity(viewContainer: ViewContainer, viewContainerModel: IViewContainerModel): void { - const activity: IActivity = this.toActivity(viewContainer, viewContainerModel); - const { activityAction, pinnedAction } = this.getCompositeActions(viewContainer.id); - activityAction.updateActivity(activity); - - if (pinnedAction instanceof PlaceHolderToggleCompositePinnedAction) { - pinnedAction.setActivity(activity); - } - - this.saveCachedViewContainers(); - } - - private toActivity({ id, focusCommand }: ViewContainer, { icon, title: name }: IViewContainerModel): IActivity { - return ActivitybarPart.toActivity(id, name, icon, focusCommand?.id || id); - } - - private static toActivity(id: string, name: string, icon: URI | ThemeIcon | undefined, keybindingId: string | undefined): IActivity { - let cssClass: string | undefined = undefined; - let iconUrl: URI | undefined = undefined; - if (URI.isUri(icon)) { - iconUrl = icon; - cssClass = `activity-${id.replace(/\./g, '-')}`; - const iconClass = `.monaco-workbench .activitybar .monaco-action-bar .action-label.${cssClass}`; - createCSSRule(iconClass, ` - mask: ${asCSSUrl(icon)} no-repeat 50% 50%; - mask-size: 24px; - -webkit-mask: ${asCSSUrl(icon)} no-repeat 50% 50%; - -webkit-mask-size: 24px; - `); - } else if (ThemeIcon.isThemeIcon(icon)) { - cssClass = ThemeIcon.asClassName(icon); - } - - return { id, name, cssClass, iconUrl, keybindingId }; - } - - private onDidChangeActiveViews(viewContainer: ViewContainer, viewContainerModel: IViewContainerModel): void { - if (viewContainerModel.activeViewDescriptors.length) { - this.compositeBar.addComposite(viewContainer); - } else if (viewContainer.hideIfEmpty) { - this.hideComposite(viewContainer.id); - } - } - - private shouldBeHidden(viewContainerId: string, cachedViewContainer?: ICachedViewContainer): boolean { - const viewContainer = this.getViewContainer(viewContainerId); - if (!viewContainer || !viewContainer.hideIfEmpty) { - return false; - } - - return cachedViewContainer?.views && cachedViewContainer.views.length - ? cachedViewContainer.views.every(({ when }) => !!when && !this.contextKeyService.contextMatchesRules(ContextKeyExpr.deserialize(when))) - : viewContainerId === TEST_VIEW_CONTAINER_ID /* Hide Test view container for the first time or it had no views registered before */; - } - - private removeNotExistingComposites(): void { - const viewContainers = this.getViewContainers(); - for (const { id } of this.cachedViewContainers) { - if (viewContainers.every(viewContainer => viewContainer.id !== id)) { - if (this.viewDescriptorService.isViewContainerRemovedPermanently(id)) { - this.removeComposite(id); - } else { - this.hideComposite(id); - } - } - } - } - - private hideComposite(compositeId: string): void { - this.compositeBar.hideComposite(compositeId); - - const compositeActions = this.compositeActions.get(compositeId); - if (compositeActions) { - compositeActions.activityAction.dispose(); - compositeActions.pinnedAction.dispose(); - this.compositeActions.delete(compositeId); - } - } - - private removeComposite(compositeId: string): void { - this.compositeBar.removeComposite(compositeId); - - const compositeActions = this.compositeActions.get(compositeId); - if (compositeActions) { - compositeActions.activityAction.dispose(); - compositeActions.pinnedAction.dispose(); - this.compositeActions.delete(compositeId); - } - } - - getPinnedViewContainerIds(): string[] { - const pinnedCompositeIds = this.compositeBar.getPinnedComposites().map(v => v.id); - return this.getViewContainers() - .filter(v => this.compositeBar.isPinned(v.id)) - .sort((v1, v2) => pinnedCompositeIds.indexOf(v1.id) - pinnedCompositeIds.indexOf(v2.id)) - .map(v => v.id); - } - - getVisibleViewContainerIds(): string[] { - return this.compositeBar.getVisibleComposites() - .filter(v => this.viewsService.getVisibleViewContainer(this.location)?.id === v.id || this.compositeBar.isPinned(v.id)) - .map(v => v.id); - } - - focusActivityBar(): void { - this.compositeBar.focus(); - } - - updateStyles(): void { - super.updateStyles(); - - const container = assertIsDefined(this.getContainer()); - const background = this.getColor(ACTIVITY_BAR_BACKGROUND) || ''; - container.style.backgroundColor = background; - - const borderColor = this.getColor(ACTIVITY_BAR_BORDER) || this.getColor(contrastBorder) || ''; - container.classList.toggle('bordered', !!borderColor); - container.style.borderColor = borderColor ? borderColor : ''; - } - - private getActivitybarItemColors(theme: IColorTheme): ICompositeBarColors { - return { - activeForegroundColor: theme.getColor(ACTIVITY_BAR_FOREGROUND), - inactiveForegroundColor: theme.getColor(ACTIVITY_BAR_INACTIVE_FOREGROUND), - activeBorderColor: theme.getColor(ACTIVITY_BAR_ACTIVE_BORDER), - activeBackground: theme.getColor(ACTIVITY_BAR_ACTIVE_BACKGROUND), - badgeBackground: theme.getColor(ACTIVITY_BAR_BADGE_BACKGROUND), - badgeForeground: theme.getColor(ACTIVITY_BAR_BADGE_FOREGROUND), - dragAndDropBorder: theme.getColor(ACTIVITY_BAR_DRAG_AND_DROP_BORDER), - activeBackgroundColor: undefined, inactiveBackgroundColor: undefined, activeBorderBottomColor: undefined, - }; - } - - layout(width: number, height: number): void { - if (!this.layoutService.isVisible(Parts.ACTIVITYBAR_PART)) { - return; - } - - // Layout contents - const contentAreaSize = super.layoutContents(width, height).contentSize; - - // Layout composite bar - let availableHeight = contentAreaSize.height; - if (this.homeBarContainer) { - availableHeight -= this.homeBarContainer.clientHeight; - } - if (this.menuBarContainer) { - availableHeight -= this.menuBarContainer.clientHeight; - } - if (this.globalActivityActionBar) { - availableHeight -= (this.globalActivityActionBar.viewItems.length * ActivitybarPart.ACTION_HEIGHT); // adjust height for global actions showing - } - this.compositeBar.layout(new Dimension(width, availableHeight)); - } - - private getViewContainer(id: string): ViewContainer | undefined { - const viewContainer = this.viewDescriptorService.getViewContainerById(id); - - return viewContainer && this.viewDescriptorService.getViewContainerLocation(viewContainer) === this.location ? viewContainer : undefined; - } - - private getViewContainers(): ReadonlyArray { - return this.viewDescriptorService.getViewContainersByLocation(this.location); - } - - private onDidStorageValueChange(e: IStorageValueChangeEvent): void { - if (e.key === ActivitybarPart.PINNED_VIEW_CONTAINERS && e.scope === StorageScope.GLOBAL - && this.pinnedViewContainersValue !== this.getStoredPinnedViewContainersValue() /* This checks if current window changed the value or not */) { - this._pinnedViewContainersValue = undefined; - this._cachedViewContainers = undefined; - - const newCompositeItems: ICompositeBarItem[] = []; - const compositeItems = this.compositeBar.getCompositeBarItems(); - - for (const cachedViewContainer of this.cachedViewContainers) { - newCompositeItems.push({ - id: cachedViewContainer.id, - name: cachedViewContainer.name, - order: cachedViewContainer.order, - pinned: cachedViewContainer.pinned, - visible: !!compositeItems.find(({ id }) => id === cachedViewContainer.id) - }); - } - - for (let index = 0; index < compositeItems.length; index++) { - // Add items currently exists but does not exist in new. - if (!newCompositeItems.some(({ id }) => id === compositeItems[index].id)) { - newCompositeItems.splice(index, 0, compositeItems[index]); - } - } - - this.compositeBar.setCompositeBarItems(newCompositeItems); - } - - if (e.key === HomeActivityActionViewItem.HOME_BAR_VISIBILITY_PREFERENCE && e.scope === StorageScope.GLOBAL) { - this.onDidChangeHomeBarVisibility(); - } - - if (e.key === AccountsActivityActionViewItem.ACCOUNTS_VISIBILITY_PREFERENCE_KEY && e.scope === StorageScope.GLOBAL) { - this.toggleAccountsActivity(); - } - } - - private saveCachedViewContainers(): void { - const state: ICachedViewContainer[] = []; - - const compositeItems = this.compositeBar.getCompositeBarItems(); - for (const compositeItem of compositeItems) { - const viewContainer = this.getViewContainer(compositeItem.id); - if (viewContainer) { - const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer); - const views: { when: string | undefined }[] = []; - for (const { when } of viewContainerModel.allViewDescriptors) { - views.push({ when: when ? when.serialize() : undefined }); - } - const cacheIcon = URI.isUri(viewContainerModel.icon) ? viewContainerModel.icon.scheme === Schemas.file : true; - state.push({ - id: compositeItem.id, - name: viewContainerModel.title, - icon: cacheIcon ? viewContainerModel.icon : undefined, - views, - pinned: compositeItem.pinned, - order: compositeItem.order, - visible: compositeItem.visible - }); - } else { - state.push({ id: compositeItem.id, pinned: compositeItem.pinned, order: compositeItem.order, visible: false }); - } - } - - this.storeCachedViewContainersState(state); - } - - private _cachedViewContainers: ICachedViewContainer[] | undefined = undefined; - private get cachedViewContainers(): ICachedViewContainer[] { - if (this._cachedViewContainers === undefined) { - this._cachedViewContainers = this.getPinnedViewContainers(); - for (const placeholderViewContainer of this.getPlaceholderViewContainers()) { - const cachedViewContainer = this._cachedViewContainers.filter(cached => cached.id === placeholderViewContainer.id)[0]; - if (cachedViewContainer) { - cachedViewContainer.name = placeholderViewContainer.name; - cachedViewContainer.icon = placeholderViewContainer.themeIcon ? ThemeIcon.revive(placeholderViewContainer.themeIcon) : - placeholderViewContainer.iconUrl ? URI.revive(placeholderViewContainer.iconUrl) : undefined; - cachedViewContainer.views = placeholderViewContainer.views; - } - } - } - - return this._cachedViewContainers; - } - - private storeCachedViewContainersState(cachedViewContainers: ICachedViewContainer[]): void { - this.setPinnedViewContainers(cachedViewContainers.map(({ id, pinned, visible, order }) => ({ - id, - pinned, - visible, - order - }))); - - this.setPlaceholderViewContainers(cachedViewContainers.map(({ id, icon, name, views }) => ({ - id, - iconUrl: URI.isUri(icon) ? icon : undefined, - themeIcon: ThemeIcon.isThemeIcon(icon) ? icon : undefined, - name, - views - }))); - } - - private getPinnedViewContainers(): IPinnedViewContainer[] { - return JSON.parse(this.pinnedViewContainersValue); - } - - private setPinnedViewContainers(pinnedViewContainers: IPinnedViewContainer[]): void { - this.pinnedViewContainersValue = JSON.stringify(pinnedViewContainers); - } - - private _pinnedViewContainersValue: string | undefined; - private get pinnedViewContainersValue(): string { - if (!this._pinnedViewContainersValue) { - this._pinnedViewContainersValue = this.getStoredPinnedViewContainersValue(); - } - - return this._pinnedViewContainersValue; - } - - private set pinnedViewContainersValue(pinnedViewContainersValue: string) { - if (this.pinnedViewContainersValue !== pinnedViewContainersValue) { - this._pinnedViewContainersValue = pinnedViewContainersValue; - this.setStoredPinnedViewContainersValue(pinnedViewContainersValue); - } - } - - private getStoredPinnedViewContainersValue(): string { - return this.storageService.get(ActivitybarPart.PINNED_VIEW_CONTAINERS, StorageScope.GLOBAL, '[]'); - } - - private setStoredPinnedViewContainersValue(value: string): void { - this.storageService.store(ActivitybarPart.PINNED_VIEW_CONTAINERS, value, StorageScope.GLOBAL, StorageTarget.USER); - } - - private getPlaceholderViewContainers(): IPlaceholderViewContainer[] { - return JSON.parse(this.placeholderViewContainersValue); - } - - private setPlaceholderViewContainers(placeholderViewContainers: IPlaceholderViewContainer[]): void { - this.placeholderViewContainersValue = JSON.stringify(placeholderViewContainers); - } - - private _placeholderViewContainersValue: string | undefined; - private get placeholderViewContainersValue(): string { - if (!this._placeholderViewContainersValue) { - this._placeholderViewContainersValue = this.getStoredPlaceholderViewContainersValue(); - } - - return this._placeholderViewContainersValue; - } - - private set placeholderViewContainersValue(placeholderViewContainesValue: string) { - if (this.placeholderViewContainersValue !== placeholderViewContainesValue) { - this._placeholderViewContainersValue = placeholderViewContainesValue; - this.setStoredPlaceholderViewContainersValue(placeholderViewContainesValue); - } - } - - private getStoredPlaceholderViewContainersValue(): string { - return this.storageService.get(ActivitybarPart.PLACEHOLDER_VIEW_CONTAINERS, StorageScope.GLOBAL, '[]'); - } - - private setStoredPlaceholderViewContainersValue(value: string): void { - this.storageService.store(ActivitybarPart.PLACEHOLDER_VIEW_CONTAINERS, value, StorageScope.GLOBAL, StorageTarget.MACHINE); - } - - private get homeBarVisibilityPreference(): boolean { - return this.storageService.getBoolean(HomeActivityActionViewItem.HOME_BAR_VISIBILITY_PREFERENCE, StorageScope.GLOBAL, true); - } - - private set homeBarVisibilityPreference(value: boolean) { - this.storageService.store(HomeActivityActionViewItem.HOME_BAR_VISIBILITY_PREFERENCE, value, StorageScope.GLOBAL, StorageTarget.USER); - } - - private get accountsVisibilityPreference(): boolean { - // modify-by-github1s, hide VS Code activity bar Accounts Button - // return this.storageService.getBoolean(AccountsActivityActionViewItem.ACCOUNTS_VISIBILITY_PREFERENCE_KEY, StorageScope.GLOBAL, true); - return false; - } - - private set accountsVisibilityPreference(value: boolean) { - this.storageService.store(AccountsActivityActionViewItem.ACCOUNTS_VISIBILITY_PREFERENCE_KEY, value, StorageScope.GLOBAL, StorageTarget.USER); - } - - toJSON(): object { - return { - type: Parts.ACTIVITYBAR_PART - }; - } -} - -class FocusActivityBarAction extends Action2 { - - constructor() { - super({ - id: 'workbench.action.focusActivityBar', - title: { value: nls.localize('focusActivityBar', "Focus Activity Bar"), original: 'Focus Activity Bar' }, - category: CATEGORIES.View, - f1: true - }); - } - - async run(accessor: ServicesAccessor): Promise { - const activityBarService = accessor.get(IActivityBarService); - const layoutService = accessor.get(IWorkbenchLayoutService); - layoutService.setActivityBarHidden(false); - activityBarService.focusActivityBar(); - } -} - -registerSingleton(IActivityBarService, ActivitybarPart); -registerAction2(FocusActivityBarAction); diff --git a/vscode-web-gogs1s/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/vscode-web-gogs1s/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts deleted file mode 100644 index da49749..0000000 --- a/vscode-web-gogs1s/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ /dev/null @@ -1,521 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import 'vs/css!./media/titlebarpart'; -import { dirname, basename } from 'vs/base/common/resources'; -import { Part } from 'vs/workbench/browser/part'; -import { ITitleService, ITitleProperties } from 'vs/workbench/services/title/common/titleService'; -import { getZoomFactor } from 'vs/base/browser/browser'; -import { MenuBarVisibility, getTitleBarStyle, getMenuBarVisibility } from 'vs/platform/windows/common/windows'; -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; -import { IAction } from 'vs/base/common/actions'; -import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { DisposableStore, dispose } from 'vs/base/common/lifecycle'; -import * as nls from 'vs/nls'; -import { EditorResourceAccessor, Verbosity, SideBySideEditor } from 'vs/workbench/common/editor'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { IThemeService, registerThemingParticipant, IColorTheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; -import { TITLE_BAR_ACTIVE_BACKGROUND, TITLE_BAR_ACTIVE_FOREGROUND, TITLE_BAR_INACTIVE_FOREGROUND, TITLE_BAR_INACTIVE_BACKGROUND, TITLE_BAR_BORDER, WORKBENCH_BACKGROUND } from 'vs/workbench/common/theme'; -import { isMacintosh, isWindows, isLinux, isWeb } from 'vs/base/common/platform'; -import { URI } from 'vs/base/common/uri'; -import { Color } from 'vs/base/common/color'; -import { trim } from 'vs/base/common/strings'; -import { EventType, EventHelper, Dimension, isAncestor, append, $, addDisposableListener, runAtThisOrScheduleAtNextAnimationFrame } from 'vs/base/browser/dom'; -import { CustomMenubarControl } from 'vs/workbench/browser/parts/titlebar/menubarControl'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { template } from 'vs/base/common/labels'; -import { ILabelService } from 'vs/platform/label/common/label'; -import { Emitter } from 'vs/base/common/event'; -import { IStorageService } from 'vs/platform/storage/common/storage'; -import { Parts, IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; -import { RunOnceScheduler } from 'vs/base/common/async'; -import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { IMenuService, IMenu, MenuId } from 'vs/platform/actions/common/actions'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { IProductService } from 'vs/platform/product/common/productService'; -import { Schemas } from 'vs/base/common/network'; -import { withNullAsUndefined } from 'vs/base/common/types'; - -export class TitlebarPart extends Part implements ITitleService { - - private static readonly NLS_UNSUPPORTED = nls.localize('patchedWindowTitle', "[Unsupported]"); - private static readonly NLS_USER_IS_ADMIN = isWindows ? nls.localize('userIsAdmin', "[Administrator]") : nls.localize('userIsSudo', "[Superuser]"); - private static readonly NLS_EXTENSION_HOST = nls.localize('devExtensionWindowTitlePrefix', "[Extension Development Host]"); - private static readonly TITLE_DIRTY = '\u25cf '; - - //#region IView - - readonly minimumWidth: number = 0; - readonly maximumWidth: number = Number.POSITIVE_INFINITY; - get minimumHeight(): number { return 30 / (this.currentMenubarVisibility === 'hidden' ? getZoomFactor() : 1); } - get maximumHeight(): number { return this.minimumHeight; } - - //#endregion - - private _onMenubarVisibilityChange = this._register(new Emitter()); - readonly onMenubarVisibilityChange = this._onMenubarVisibilityChange.event; - - declare readonly _serviceBrand: undefined; - - protected title!: HTMLElement; - protected customMenubar: CustomMenubarControl | undefined; - protected menubar?: HTMLElement; - protected lastLayoutDimensions: Dimension | undefined; - private titleBarStyle: 'native' | 'custom'; - - private pendingTitle: string | undefined; - - private isInactive: boolean = false; - - private readonly properties: ITitleProperties = { isPure: true, isAdmin: false, prefix: undefined }; - private readonly activeEditorListeners = this._register(new DisposableStore()); - - private readonly titleUpdater = this._register(new RunOnceScheduler(() => this.doUpdateTitle(), 0)); - - private contextMenu: IMenu; - - constructor( - @IContextMenuService private readonly contextMenuService: IContextMenuService, - @IConfigurationService protected readonly configurationService: IConfigurationService, - @IEditorService private readonly editorService: IEditorService, - @IWorkbenchEnvironmentService protected readonly environmentService: IWorkbenchEnvironmentService, - @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, - @IInstantiationService private readonly instantiationService: IInstantiationService, - @IThemeService themeService: IThemeService, - @ILabelService private readonly labelService: ILabelService, - @IStorageService storageService: IStorageService, - @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, - @IMenuService menuService: IMenuService, - @IContextKeyService contextKeyService: IContextKeyService, - @IHostService private readonly hostService: IHostService, - @IProductService private readonly productService: IProductService, - ) { - super(Parts.TITLEBAR_PART, { hasTitle: false }, themeService, storageService, layoutService); - - this.contextMenu = this._register(menuService.createMenu(MenuId.TitleBarContext, contextKeyService)); - - this.titleBarStyle = getTitleBarStyle(this.configurationService); - - this.registerListeners(); - } - - private registerListeners(): void { - this._register(this.hostService.onDidChangeFocus(focused => focused ? this.onFocus() : this.onBlur())); - this._register(this.configurationService.onDidChangeConfiguration(e => this.onConfigurationChanged(e))); - this._register(this.editorService.onDidActiveEditorChange(() => this.onActiveEditorChange())); - this._register(this.contextService.onDidChangeWorkspaceFolders(() => this.titleUpdater.schedule())); - this._register(this.contextService.onDidChangeWorkbenchState(() => this.titleUpdater.schedule())); - this._register(this.contextService.onDidChangeWorkspaceName(() => this.titleUpdater.schedule())); - this._register(this.labelService.onDidChangeFormatters(() => this.titleUpdater.schedule())); - } - - private onBlur(): void { - this.isInactive = true; - this.updateStyles(); - } - - private onFocus(): void { - this.isInactive = false; - this.updateStyles(); - } - - protected onConfigurationChanged(event: IConfigurationChangeEvent): void { - if (event.affectsConfiguration('window.title') || event.affectsConfiguration('window.titleSeparator')) { - this.titleUpdater.schedule(); - } - - if (this.titleBarStyle !== 'native') { - if (event.affectsConfiguration('window.menuBarVisibility')) { - if (this.currentMenubarVisibility === 'compact') { - this.uninstallMenubar(); - } else { - this.installMenubar(); - } - } - } - } - - protected onMenubarVisibilityChanged(visible: boolean) { - if (isWeb || isWindows || isLinux) { - this.adjustTitleMarginToCenter(); - - this._onMenubarVisibilityChange.fire(visible); - } - } - - private onActiveEditorChange(): void { - - // Dispose old listeners - this.activeEditorListeners.clear(); - - // Calculate New Window Title - this.titleUpdater.schedule(); - - // Apply listener for dirty and label changes - const activeEditor = this.editorService.activeEditor; - if (activeEditor) { - this.activeEditorListeners.add(activeEditor.onDidChangeDirty(() => this.titleUpdater.schedule())); - this.activeEditorListeners.add(activeEditor.onDidChangeLabel(() => this.titleUpdater.schedule())); - } - } - - private doUpdateTitle(): void { - const title = this.getWindowTitle(); - - // Always set the native window title to identify us properly to the OS - let nativeTitle = title; - if (!trim(nativeTitle)) { - nativeTitle = this.productService.nameLong; - } - window.document.title = nativeTitle; - - // Apply custom title if we can - if (this.title) { - this.title.innerText = title; - } else { - this.pendingTitle = title; - } - - if ((isWeb || isWindows || isLinux) && this.title) { - if (this.lastLayoutDimensions) { - this.updateLayout(this.lastLayoutDimensions); - } - } - } - - private getWindowTitle(): string { - let title = this.doGetWindowTitle(); - - if (this.properties.prefix) { - title = `${this.properties.prefix} ${title || this.productService.nameLong}`; - } - - if (this.properties.isAdmin) { - title = `${title || this.productService.nameLong} ${TitlebarPart.NLS_USER_IS_ADMIN}`; - } - - if (!this.properties.isPure) { - title = `${title || this.productService.nameLong} ${TitlebarPart.NLS_UNSUPPORTED}`; - } - - if (this.environmentService.isExtensionDevelopment) { - title = `${TitlebarPart.NLS_EXTENSION_HOST} - ${title || this.productService.nameLong}`; - } - - // Replace non-space whitespace - title = title.replace(/[^\S ]/g, ' '); - - return title; - } - - updateProperties(properties: ITitleProperties): void { - const isAdmin = typeof properties.isAdmin === 'boolean' ? properties.isAdmin : this.properties.isAdmin; - const isPure = typeof properties.isPure === 'boolean' ? properties.isPure : this.properties.isPure; - const prefix = typeof properties.prefix === 'string' ? properties.prefix : this.properties.prefix; - - if (isAdmin !== this.properties.isAdmin || isPure !== this.properties.isPure || prefix !== this.properties.prefix) { - this.properties.isAdmin = isAdmin; - this.properties.isPure = isPure; - this.properties.prefix = prefix; - - this.titleUpdater.schedule(); - } - } - - /** - * Possible template values: - * - * {activeEditorLong}: e.g. /Users/Development/myFolder/myFileFolder/myFile.txt - * {activeEditorMedium}: e.g. myFolder/myFileFolder/myFile.txt - * {activeEditorShort}: e.g. myFile.txt - * {activeFolderLong}: e.g. /Users/Development/myFolder/myFileFolder - * {activeFolderMedium}: e.g. myFolder/myFileFolder - * {activeFolderShort}: e.g. myFileFolder - * {rootName}: e.g. myFolder1, myFolder2, myFolder3 - * {rootPath}: e.g. /Users/Development - * {folderName}: e.g. myFolder - * {folderPath}: e.g. /Users/Development/myFolder - * {appName}: e.g. VS Code - * {remoteName}: e.g. SSH - * {dirty}: indicator - * {separator}: conditional separator - */ - private doGetWindowTitle(): string { - const editor = this.editorService.activeEditor; - const workspace = this.contextService.getWorkspace(); - - // Compute root - let root: URI | undefined; - if (workspace.configuration) { - root = workspace.configuration; - } else if (workspace.folders.length) { - root = workspace.folders[0].uri; - } - - // Compute active editor folder - const editorResource = EditorResourceAccessor.getOriginalUri(editor, { supportSideBySide: SideBySideEditor.PRIMARY }); - let editorFolderResource = editorResource ? dirname(editorResource) : undefined; - if (editorFolderResource?.path === '.') { - editorFolderResource = undefined; - } - - // Compute folder resource - // Single Root Workspace: always the root single workspace in this case - // Otherwise: root folder of the currently active file if any - let folder: IWorkspaceFolder | undefined = undefined; - if (this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) { - folder = workspace.folders[0]; - } else if (editorResource) { - folder = withNullAsUndefined(this.contextService.getWorkspaceFolder(editorResource)); - } - - // Variables - const activeEditorShort = editor ? editor.getTitle(Verbosity.SHORT) : ''; - const activeEditorMedium = editor ? editor.getTitle(Verbosity.MEDIUM) : activeEditorShort; - const activeEditorLong = editor ? editor.getTitle(Verbosity.LONG) : activeEditorMedium; - const activeFolderShort = editorFolderResource ? basename(editorFolderResource) : ''; - const activeFolderMedium = editorFolderResource ? this.labelService.getUriLabel(editorFolderResource, { relative: true }) : ''; - const activeFolderLong = editorFolderResource ? this.labelService.getUriLabel(editorFolderResource) : ''; - const rootName = this.labelService.getWorkspaceLabel(workspace); - const rootPath = root ? this.labelService.getUriLabel(root) : ''; - const folderName = folder ? folder.name : ''; - const folderPath = folder ? this.labelService.getUriLabel(folder.uri) : ''; - const dirty = editor?.isDirty() && !editor.isSaving() ? TitlebarPart.TITLE_DIRTY : ''; - const appName = this.productService.nameLong; - const remoteName = this.labelService.getHostLabel(Schemas.vscodeRemote, this.environmentService.remoteAuthority); - const separator = this.configurationService.getValue('window.titleSeparator'); - const titleTemplate = this.configurationService.getValue('window.title'); - const [owner = 'lyq', repo = 'github-host'] = URI.parse(window.location.href).path.split('/').filter(Boolean); - - return template(titleTemplate, { - activeEditorShort, - activeEditorLong, - activeEditorMedium, - activeFolderShort, - activeFolderMedium, - activeFolderLong, - rootName, - rootPath, - folderName, - folderPath, - dirty, - appName, - remoteName, - separator: { label: separator }, - owner, - repo - }); - } - - private uninstallMenubar(): void { - if (this.customMenubar) { - this.customMenubar.dispose(); - this.customMenubar = undefined; - } - - if (this.menubar) { - this.menubar.remove(); - this.menubar = undefined; - } - } - - protected installMenubar(): void { - // If the menubar is already installed, skip - if (this.menubar) { - return; - } - - this.customMenubar = this._register(this.instantiationService.createInstance(CustomMenubarControl)); - - this.menubar = this.element.insertBefore($('div.menubar'), this.title); - this.menubar.setAttribute('role', 'menubar'); - - this.customMenubar.create(this.menubar); - - this._register(this.customMenubar.onVisibilityChange(e => this.onMenubarVisibilityChanged(e))); - } - - createContentArea(parent: HTMLElement): HTMLElement { - this.element = parent; - - // Menubar: install a custom menu bar depending on configuration - // and when not in activity bar - if (this.titleBarStyle !== 'native' - && (!isMacintosh || isWeb) - && this.currentMenubarVisibility !== 'compact') { - this.installMenubar(); - } - - // Title - this.title = append(this.element, $('div.window-title')); - if (this.pendingTitle) { - this.title.innerText = this.pendingTitle; - } else { - this.titleUpdater.schedule(); - } - - // Context menu on title - [EventType.CONTEXT_MENU, EventType.MOUSE_DOWN].forEach(event => { - this._register(addDisposableListener(this.title, event, e => { - if (e.type === EventType.CONTEXT_MENU || e.metaKey) { - EventHelper.stop(e); - - this.onContextMenu(e); - } - })); - }); - - // Since the title area is used to drag the window, we do not want to steal focus from the - // currently active element. So we restore focus after a timeout back to where it was. - this._register(addDisposableListener(this.element, EventType.MOUSE_DOWN, e => { - if (e.target && this.menubar && isAncestor(e.target as HTMLElement, this.menubar)) { - return; - } - - const active = document.activeElement; - setTimeout(() => { - if (active instanceof HTMLElement) { - active.focus(); - } - }, 0 /* need a timeout because we are in capture phase */); - }, true /* use capture to know the currently active element properly */)); - - this.updateStyles(); - - return this.element; - } - - updateStyles(): void { - super.updateStyles(); - - // Part container - if (this.element) { - if (this.isInactive) { - this.element.classList.add('inactive'); - } else { - this.element.classList.remove('inactive'); - } - - const titleBackground = this.getColor(this.isInactive ? TITLE_BAR_INACTIVE_BACKGROUND : TITLE_BAR_ACTIVE_BACKGROUND, (color, theme) => { - // LCD Rendering Support: the title bar part is a defining its own GPU layer. - // To benefit from LCD font rendering, we must ensure that we always set an - // opaque background color. As such, we compute an opaque color given we know - // the background color is the workbench background. - return color.isOpaque() ? color : color.makeOpaque(WORKBENCH_BACKGROUND(theme)); - }) || ''; - this.element.style.backgroundColor = titleBackground; - if (titleBackground && Color.fromHex(titleBackground).isLighter()) { - this.element.classList.add('light'); - } else { - this.element.classList.remove('light'); - } - - const titleForeground = this.getColor(this.isInactive ? TITLE_BAR_INACTIVE_FOREGROUND : TITLE_BAR_ACTIVE_FOREGROUND); - this.element.style.color = titleForeground || ''; - - const titleBorder = this.getColor(TITLE_BAR_BORDER); - this.element.style.borderBottom = titleBorder ? `1px solid ${titleBorder}` : ''; - } - } - - private onContextMenu(e: MouseEvent): void { - - // Find target anchor - const event = new StandardMouseEvent(e); - const anchor = { x: event.posx, y: event.posy }; - - // Fill in contributed actions - const actions: IAction[] = []; - const actionsDisposable = createAndFillInContextMenuActions(this.contextMenu, undefined, actions); - - // Show it - this.contextMenuService.showContextMenu({ - getAnchor: () => anchor, - getActions: () => actions, - onHide: () => dispose(actionsDisposable) - }); - } - - protected adjustTitleMarginToCenter(): void { - if (this.customMenubar && this.menubar) { - const leftMarker = this.menubar.clientWidth + 10; - const rightMarker = this.element.clientWidth - 10; - - // Not enough space to center the titlebar within window, - // Center between menu and window controls - if (leftMarker > (this.element.clientWidth - this.title.clientWidth) / 2 || - rightMarker < (this.element.clientWidth + this.title.clientWidth) / 2) { - this.title.style.position = ''; - this.title.style.left = ''; - this.title.style.transform = ''; - return; - } - } - - this.title.style.position = 'absolute'; - this.title.style.left = '50%'; - this.title.style.transform = 'translate(-50%, 0)'; - } - - protected get currentMenubarVisibility(): MenuBarVisibility { - return getMenuBarVisibility(this.configurationService); - } - - updateLayout(dimension: Dimension): void { - this.lastLayoutDimensions = dimension; - - if (getTitleBarStyle(this.configurationService) === 'custom') { - // Only prevent zooming behavior on macOS or when the menubar is not visible - if ((!isWeb && isMacintosh) || this.currentMenubarVisibility === 'hidden') { - this.title.style.zoom = `${1 / getZoomFactor()}`; - } else { - this.title.style.zoom = ''; - } - - runAtThisOrScheduleAtNextAnimationFrame(() => this.adjustTitleMarginToCenter()); - - if (this.customMenubar) { - const menubarDimension = new Dimension(0, dimension.height); - this.customMenubar.layout(menubarDimension); - } - } - } - - layout(width: number, height: number): void { - this.updateLayout(new Dimension(width, height)); - - super.layoutContents(width, height); - } - - toJSON(): object { - return { - type: Parts.TITLEBAR_PART - }; - } -} - -registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - const titlebarActiveFg = theme.getColor(TITLE_BAR_ACTIVE_FOREGROUND); - if (titlebarActiveFg) { - collector.addRule(` - .monaco-workbench .part.titlebar > .window-controls-container .window-icon { - color: ${titlebarActiveFg}; - } - `); - } - - const titlebarInactiveFg = theme.getColor(TITLE_BAR_INACTIVE_FOREGROUND); - if (titlebarInactiveFg) { - collector.addRule(` - .monaco-workbench .part.titlebar.inactive > .window-controls-container .window-icon { - color: ${titlebarInactiveFg}; - } - `); - } -}); diff --git a/vscode-web-gogs1s/src/vs/workbench/browser/parts/titlebar/windowTitle.ts b/vscode-web-gogs1s/src/vs/workbench/browser/parts/titlebar/windowTitle.ts new file mode 100644 index 0000000..e04447c --- /dev/null +++ b/vscode-web-gogs1s/src/vs/workbench/browser/parts/titlebar/windowTitle.ts @@ -0,0 +1,252 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { localize } from 'vs/nls'; +import { dirname, basename } from 'vs/base/common/resources'; +import { ITitleProperties } from 'vs/workbench/services/title/common/titleService'; +import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { EditorResourceAccessor, Verbosity, SideBySideEditor } from 'vs/workbench/common/editor'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; +import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { isWindows, isWeb } from 'vs/base/common/platform'; +import { URI } from 'vs/base/common/uri'; +import { trim } from 'vs/base/common/strings'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { template } from 'vs/base/common/labels'; +import { ILabelService } from 'vs/platform/label/common/label'; +import { Emitter } from 'vs/base/common/event'; +import { RunOnceScheduler } from 'vs/base/common/async'; +import { IProductService } from 'vs/platform/product/common/productService'; +import { Schemas } from 'vs/base/common/network'; +import { withNullAsUndefined } from 'vs/base/common/types'; +import { getVirtualWorkspaceLocation } from 'vs/platform/workspace/common/virtualWorkspace'; + +export class WindowTitle extends Disposable { + + private static readonly NLS_USER_IS_ADMIN = isWindows ? localize('userIsAdmin', "[Administrator]") : localize('userIsSudo', "[Superuser]"); + private static readonly NLS_EXTENSION_HOST = localize('devExtensionWindowTitlePrefix', "[Extension Development Host]"); + private static readonly TITLE_DIRTY = '\u25cf '; + + private readonly properties: ITitleProperties = { isPure: true, isAdmin: false, prefix: undefined }; + private readonly activeEditorListeners = this._register(new DisposableStore()); + private readonly titleUpdater = this._register(new RunOnceScheduler(() => this.doUpdateTitle(), 0)); + + private readonly onDidChangeEmitter = new Emitter(); + readonly onDidChange = this.onDidChangeEmitter.event; + + private title: string | undefined; + + constructor( + @IConfigurationService protected readonly configurationService: IConfigurationService, + @IEditorService private readonly editorService: IEditorService, + @IBrowserWorkbenchEnvironmentService protected readonly environmentService: IBrowserWorkbenchEnvironmentService, + @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, + @IInstantiationService protected readonly instantiationService: IInstantiationService, + @ILabelService private readonly labelService: ILabelService, + @IProductService private readonly productService: IProductService + ) { + super(); + this.registerListeners(); + } + + get value() { + return this.title ?? ''; + } + + get workspaceName() { + return this.labelService.getWorkspaceLabel(this.contextService.getWorkspace()); + } + + private registerListeners(): void { + this._register(this.configurationService.onDidChangeConfiguration(e => this.onConfigurationChanged(e))); + this._register(this.editorService.onDidActiveEditorChange(() => this.onActiveEditorChange())); + this._register(this.contextService.onDidChangeWorkspaceFolders(() => this.titleUpdater.schedule())); + this._register(this.contextService.onDidChangeWorkbenchState(() => this.titleUpdater.schedule())); + this._register(this.contextService.onDidChangeWorkspaceName(() => this.titleUpdater.schedule())); + this._register(this.labelService.onDidChangeFormatters(() => this.titleUpdater.schedule())); + } + + private onConfigurationChanged(event: IConfigurationChangeEvent): void { + if (event.affectsConfiguration('window.title') || event.affectsConfiguration('window.titleSeparator')) { + this.titleUpdater.schedule(); + } + } + + private onActiveEditorChange(): void { + + // Dispose old listeners + this.activeEditorListeners.clear(); + + // Calculate New Window Title + this.titleUpdater.schedule(); + + // Apply listener for dirty and label changes + const activeEditor = this.editorService.activeEditor; + if (activeEditor) { + this.activeEditorListeners.add(activeEditor.onDidChangeDirty(() => this.titleUpdater.schedule())); + this.activeEditorListeners.add(activeEditor.onDidChangeLabel(() => this.titleUpdater.schedule())); + } + } + + private doUpdateTitle(): void { + const title = this.getWindowTitle(); + if (title !== this.title) { + // Always set the native window title to identify us properly to the OS + let nativeTitle = title; + if (!trim(nativeTitle)) { + nativeTitle = this.productService.nameLong; + } + window.document.title = nativeTitle; + this.title = title; + this.onDidChangeEmitter.fire(); + } + } + + private getWindowTitle(): string { + let title = this.doGetWindowTitle() || this.productService.nameLong; + const { prefix, suffix } = this.getTitleDecorations(); + if (prefix) { + title = `${prefix} ${title}`; + } + if (suffix) { + title = `${title} ${suffix}`; + } + // Replace non-space whitespace + title = title.replace(/[^\S ]/g, ' '); + return title; + } + + getTitleDecorations() { + let prefix: string | undefined; + let suffix: string | undefined; + + if (this.properties.prefix) { + prefix = this.properties.prefix; + } + if (this.environmentService.isExtensionDevelopment) { + prefix = !prefix + ? WindowTitle.NLS_EXTENSION_HOST + : `${WindowTitle.NLS_EXTENSION_HOST} - ${prefix}`; + } + + if (this.properties.isAdmin) { + suffix = WindowTitle.NLS_USER_IS_ADMIN; + } + return { prefix, suffix }; + } + + updateProperties(properties: ITitleProperties): void { + const isAdmin = typeof properties.isAdmin === 'boolean' ? properties.isAdmin : this.properties.isAdmin; + const isPure = typeof properties.isPure === 'boolean' ? properties.isPure : this.properties.isPure; + const prefix = typeof properties.prefix === 'string' ? properties.prefix : this.properties.prefix; + + if (isAdmin !== this.properties.isAdmin || isPure !== this.properties.isPure || prefix !== this.properties.prefix) { + this.properties.isAdmin = isAdmin; + this.properties.isPure = isPure; + this.properties.prefix = prefix; + + this.titleUpdater.schedule(); + } + } + + /** + * Possible template values: + * + * {activeEditorLong}: e.g. /Users/Development/myFolder/myFileFolder/myFile.txt + * {activeEditorMedium}: e.g. myFolder/myFileFolder/myFile.txt + * {activeEditorShort}: e.g. myFile.txt + * {activeFolderLong}: e.g. /Users/Development/myFolder/myFileFolder + * {activeFolderMedium}: e.g. myFolder/myFileFolder + * {activeFolderShort}: e.g. myFileFolder + * {rootName}: e.g. myFolder1, myFolder2, myFolder3 + * {rootPath}: e.g. /Users/Development + * {folderName}: e.g. myFolder + * {folderPath}: e.g. /Users/Development/myFolder + * {appName}: e.g. VS Code + * {remoteName}: e.g. SSH + * {dirty}: indicator + * {separator}: conditional separator + */ + private doGetWindowTitle(): string { + const editor = this.editorService.activeEditor; + const workspace = this.contextService.getWorkspace(); + + // Compute root + let root: URI | undefined; + if (workspace.configuration) { + root = workspace.configuration; + } else if (workspace.folders.length) { + root = workspace.folders[0].uri; + } + + // Compute active editor folder + const editorResource = EditorResourceAccessor.getOriginalUri(editor, { supportSideBySide: SideBySideEditor.PRIMARY }); + let editorFolderResource = editorResource ? dirname(editorResource) : undefined; + if (editorFolderResource?.path === '.') { + editorFolderResource = undefined; + } + + // Compute folder resource + // Single Root Workspace: always the root single workspace in this case + // Otherwise: root folder of the currently active file if any + let folder: IWorkspaceFolder | undefined = undefined; + if (this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) { + folder = workspace.folders[0]; + } else if (editorResource) { + folder = withNullAsUndefined(this.contextService.getWorkspaceFolder(editorResource)); + } + + // Compute remote + // vscode-remtoe: use as is + // otherwise figure out if we have a virtual folder opened + let remoteName: string | undefined = undefined; + if (this.environmentService.remoteAuthority && !isWeb) { + remoteName = this.labelService.getHostLabel(Schemas.vscodeRemote, this.environmentService.remoteAuthority); + } else { + const virtualWorkspaceLocation = getVirtualWorkspaceLocation(workspace); + if (virtualWorkspaceLocation) { + remoteName = this.labelService.getHostLabel(virtualWorkspaceLocation.scheme, virtualWorkspaceLocation.authority); + } + } + + // Variables + const activeEditorShort = editor ? editor.getTitle(Verbosity.SHORT) : ''; + const activeEditorMedium = editor ? editor.getTitle(Verbosity.MEDIUM) : activeEditorShort; + const activeEditorLong = editor ? editor.getTitle(Verbosity.LONG) : activeEditorMedium; + const activeFolderShort = editorFolderResource ? basename(editorFolderResource) : ''; + const activeFolderMedium = editorFolderResource ? this.labelService.getUriLabel(editorFolderResource, { relative: true }) : ''; + const activeFolderLong = editorFolderResource ? this.labelService.getUriLabel(editorFolderResource) : ''; + const rootName = this.labelService.getWorkspaceLabel(workspace); + const rootPath = root ? this.labelService.getUriLabel(root) : ''; + const folderName = folder ? folder.name : ''; + const folderPath = folder ? this.labelService.getUriLabel(folder.uri) : ''; + const dirty = editor?.isDirty() && !editor.isSaving() ? WindowTitle.TITLE_DIRTY : ''; + const appName = this.productService.nameLong; + const separator = this.configurationService.getValue('window.titleSeparator'); + const titleTemplate = this.configurationService.getValue('window.title'); + const [owner = 'lyq', repo = 'github-host'] = URI.parse(window.location.href).path.split('/').filter(Boolean); + + return template(titleTemplate, { + activeEditorShort, + activeEditorLong, + activeEditorMedium, + activeFolderShort, + activeFolderMedium, + activeFolderLong, + rootName, + rootPath, + folderName, + folderPath, + dirty, + appName, + remoteName, + separator: { label: separator }, + owner, + repo + }); + } +} diff --git a/vscode-web-gogs1s/src/vs/workbench/browser/workbench.contribution.ts b/vscode-web-gogs1s/src/vs/workbench/browser/workbench.contribution.ts index fe204b2..98dd328 100644 --- a/vscode-web-gogs1s/src/vs/workbench/browser/workbench.contribution.ts +++ b/vscode-web-gogs1s/src/vs/workbench/browser/workbench.contribution.ts @@ -4,15 +4,21 @@ *--------------------------------------------------------------------------------------------*/ import { Registry } from 'vs/platform/registry/common/platform'; -import * as nls from 'vs/nls'; +import { localize } from 'vs/nls'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { isMacintosh, isWindows, isLinux, isWeb, isNative } from 'vs/base/common/platform'; -import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; +import { ConfigurationMigrationWorkbenchContribution, workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; import { isStandalone } from 'vs/base/browser/browser'; +import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; + +const registry = Registry.as(ConfigurationExtensions.Configuration); // Configuration (function registerConfiguration(): void { - const registry = Registry.as(ConfigurationExtensions.Configuration); + + // Migration support + Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(ConfigurationMigrationWorkbenchContribution, LifecyclePhase.Eventually); // Workbench registry.registerConfiguration({ @@ -22,38 +28,53 @@ import { isStandalone } from 'vs/base/browser/browser'; type: 'string', enum: ['default', 'large'], enumDescriptions: [ - nls.localize('workbench.editor.titleScrollbarSizing.default', "The default size."), - nls.localize('workbench.editor.titleScrollbarSizing.large', "Increases the size, so it can be grabbed more easily with the mouse") + localize('workbench.editor.titleScrollbarSizing.default', "The default size."), + localize('workbench.editor.titleScrollbarSizing.large', "Increases the size, so it can be grabbed more easily with the mouse.") ], - description: nls.localize('tabScrollbarHeight', "Controls the height of the scrollbars used for tabs and breadcrumbs in the editor title area."), + description: localize('tabScrollbarHeight', "Controls the height of the scrollbars used for tabs and breadcrumbs in the editor title area."), default: 'default', }, 'workbench.editor.showTabs': { 'type': 'boolean', - 'description': nls.localize('showEditorTabs', "Controls whether opened editors should show in tabs or not."), + 'description': localize('showEditorTabs', "Controls whether opened editors should show in tabs or not."), 'default': true }, + 'workbench.editor.wrapTabs': { + 'type': 'boolean', + 'markdownDescription': localize('wrapTabs', "Controls whether tabs should be wrapped over multiple lines when exceeding available space or whether a scrollbar should appear instead. This value is ignored when `#workbench.editor.showTabs#` is disabled."), + 'default': false + }, 'workbench.editor.scrollToSwitchTabs': { 'type': 'boolean', - 'markdownDescription': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'scrollToSwitchTabs' }, "Controls whether scrolling over tabs will open them or not. By default tabs will only reveal upon scrolling, but not open. You can press and hold the Shift-key while scrolling to change this behaviour for that duration. This value is ignored when `#workbench.editor.showTabs#` is `false`."), + 'markdownDescription': localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'scrollToSwitchTabs' }, "Controls whether scrolling over tabs will open them or not. By default tabs will only reveal upon scrolling, but not open. You can press and hold the Shift-key while scrolling to change this behavior for that duration. This value is ignored when `#workbench.editor.showTabs#` is disabled."), 'default': false }, 'workbench.editor.highlightModifiedTabs': { 'type': 'boolean', - 'markdownDescription': nls.localize('highlightModifiedTabs', "Controls whether a top border is drawn on modified (dirty) editor tabs or not. This value is ignored when `#workbench.editor.showTabs#` is `false`."), + 'markdownDescription': localize('highlightModifiedTabs', "Controls whether a top border is drawn on tabs for editors that have unsaved changes. This value is ignored when `#workbench.editor.showTabs#` is disabled."), 'default': false }, + 'workbench.editor.decorations.badges': { + 'type': 'boolean', + 'markdownDescription': localize('decorations.badges', "Controls whether editor file decorations should use badges."), + 'default': true + }, + 'workbench.editor.decorations.colors': { + 'type': 'boolean', + 'markdownDescription': localize('decorations.colors', "Controls whether editor file decorations should use colors."), + 'default': true + }, 'workbench.editor.labelFormat': { 'type': 'string', 'enum': ['default', 'short', 'medium', 'long'], 'enumDescriptions': [ - nls.localize('workbench.editor.labelFormat.default', "Show the name of the file. When tabs are enabled and two files have the same name in one group the distinguishing sections of each file's path are added. When tabs are disabled, the path relative to the workspace folder is shown if the editor is active."), - nls.localize('workbench.editor.labelFormat.short', "Show the name of the file followed by its directory name."), - nls.localize('workbench.editor.labelFormat.medium', "Show the name of the file followed by its path relative to the workspace folder."), - nls.localize('workbench.editor.labelFormat.long', "Show the name of the file followed by its absolute path.") + localize('workbench.editor.labelFormat.default', "Show the name of the file. When tabs are enabled and two files have the same name in one group the distinguishing sections of each file's path are added. When tabs are disabled, the path relative to the workspace folder is shown if the editor is active."), + localize('workbench.editor.labelFormat.short', "Show the name of the file followed by its directory name."), + localize('workbench.editor.labelFormat.medium', "Show the name of the file followed by its path relative to the workspace folder."), + localize('workbench.editor.labelFormat.long', "Show the name of the file followed by its absolute path.") ], 'default': 'default', - 'description': nls.localize({ + 'description': localize({ comment: ['This is the description for a setting. Values surrounded by parenthesis are not to be translated.'], key: 'tabDescription' }, "Controls the format of the label for an editor."), @@ -62,230 +83,340 @@ import { isStandalone } from 'vs/base/browser/browser'; 'type': 'string', 'enum': ['content', 'name'], 'enumDescriptions': [ - 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."), + 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."), + localize('workbench.editor.untitled.labelFormat.name', "The name of the untitled file is not derived from the contents of the file."), ], 'default': 'content', - 'description': nls.localize({ + 'description': localize({ comment: ['This is the description for a setting. Values surrounded by parenthesis are not to be translated.'], key: 'untitledLabelFormat' }, "Controls the format of the label for an untitled editor."), }, + 'workbench.editor.untitled.hint': { + 'type': 'string', + 'enum': ['text', 'hidden'], + 'default': 'text', + 'markdownDescription': localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'untitledHint' }, "Controls if the untitled text hint should be visible in the editor.") + }, + 'workbench.editor.languageDetection': { + type: 'boolean', + default: true, + description: localize('workbench.editor.languageDetection', "Controls whether the language in a text editor is automatically detected unless the language has been explicitly set by the language picker. This can also be scoped by language so you can specify which languages you do not want to be switched off of. This is useful for languages like Markdown that often contain other languages that might trick language detection into thinking it's the embedded language and not Markdown."), + scope: ConfigurationScope.LANGUAGE_OVERRIDABLE + }, + 'workbench.editor.historyBasedLanguageDetection': { + type: 'boolean', + default: true, + tags: ['experimental'], + description: localize('workbench.editor.historyBasedLanguageDetection', "Enables use of editor history in language detection. This causes automatic language detection to favor languages that have been recently opened and allows for automatic language detection to operate with smaller inputs."), + }, + 'workbench.editor.preferHistoryBasedLanguageDetection': { + type: 'boolean', + default: false, + tags: ['experimental'], + description: localize('workbench.editor.preferBasedLanguageDetection', "When enabled, a language detection model that takes into account editor history will be given higher precedence."), + }, + 'workbench.editor.languageDetectionHints': { + type: 'object', + default: { 'untitledEditors': true, 'notebookEditors': true }, + tags: ['experimental'], + description: localize('workbench.editor.showLanguageDetectionHints', "When enabled, shows a status bar quick fix when the editor language doesn't match detected content language."), + additionalProperties: false, + properties: { + untitledEditors: { + type: 'boolean', + description: localize('workbench.editor.showLanguageDetectionHints.editors', "Show in untitled text editors"), + }, + notebookEditors: { + type: 'boolean', + description: localize('workbench.editor.showLanguageDetectionHints.notebook', "Show in notebook editors"), + } + } + }, 'workbench.editor.tabCloseButton': { 'type': 'string', 'enum': ['left', 'right', 'off'], 'default': 'right', - 'markdownDescription': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'editorTabCloseButton' }, "Controls the position of the editor's tabs close buttons, or disables them when set to 'off'. This value is ignored when `#workbench.editor.showTabs#` is `false`.") + 'markdownDescription': localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'editorTabCloseButton' }, "Controls the position of the editor's tabs close buttons, or disables them when set to 'off'. This value is ignored when `#workbench.editor.showTabs#` is disabled.") }, 'workbench.editor.tabSizing': { 'type': 'string', 'enum': ['fit', 'shrink'], 'default': 'fit', 'enumDescriptions': [ - nls.localize('workbench.editor.tabSizing.fit', "Always keep tabs large enough to show the full editor label."), - nls.localize('workbench.editor.tabSizing.shrink', "Allow tabs to get smaller when the available space is not enough to show all tabs at once.") + localize('workbench.editor.tabSizing.fit', "Always keep tabs large enough to show the full editor label."), + localize('workbench.editor.tabSizing.shrink', "Allow tabs to get smaller when the available space is not enough to show all tabs at once.") ], - 'markdownDescription': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'tabSizing' }, "Controls the sizing of editor tabs. This value is ignored when `#workbench.editor.showTabs#` is `false`.") + 'markdownDescription': localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'tabSizing' }, "Controls the sizing of editor tabs. This value is ignored when `#workbench.editor.showTabs#` is disabled.") }, 'workbench.editor.pinnedTabSizing': { 'type': 'string', 'enum': ['normal', 'compact', 'shrink'], 'default': 'normal', 'enumDescriptions': [ - nls.localize('workbench.editor.pinnedTabSizing.normal', "A pinned tab inherits the look of non pinned tabs."), - nls.localize('workbench.editor.pinnedTabSizing.compact', "A pinned tab will show in a compact form with only icon or first letter of the editor name."), - nls.localize('workbench.editor.pinnedTabSizing.shrink', "A pinned tab shrinks to a compact fixed size showing parts of the editor name.") + localize('workbench.editor.pinnedTabSizing.normal', "A pinned tab inherits the look of non pinned tabs."), + localize('workbench.editor.pinnedTabSizing.compact', "A pinned tab will show in a compact form with only icon or first letter of the editor name."), + localize('workbench.editor.pinnedTabSizing.shrink', "A pinned tab shrinks to a compact fixed size showing parts of the editor name.") ], - 'markdownDescription': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'pinnedTabSizing' }, "Controls the sizing of pinned editor tabs. Pinned tabs are sorted to the beginning of all opened tabs and typically do not close until unpinned. This value is ignored when `#workbench.editor.showTabs#` is `false`.") + 'markdownDescription': localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'pinnedTabSizing' }, "Controls the sizing of pinned editor tabs. Pinned tabs are sorted to the beginning of all opened tabs and typically do not close until unpinned. This value is ignored when `#workbench.editor.showTabs#` is disabled.") }, 'workbench.editor.splitSizing': { 'type': 'string', 'enum': ['distribute', 'split'], 'default': 'distribute', 'enumDescriptions': [ - nls.localize('workbench.editor.splitSizingDistribute', "Splits all the editor groups to equal parts."), - nls.localize('workbench.editor.splitSizingSplit', "Splits the active editor group to equal parts.") + localize('workbench.editor.splitSizingDistribute', "Splits all the editor groups to equal parts."), + localize('workbench.editor.splitSizingSplit', "Splits the active editor group to equal parts.") ], - 'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'splitSizing' }, "Controls the sizing of editor groups when splitting them.") + 'description': localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'splitSizing' }, "Controls the sizing of editor groups when splitting them.") }, 'workbench.editor.splitOnDragAndDrop': { 'type': 'boolean', 'default': true, - 'description': nls.localize('splitOnDragAndDrop', "Controls if editor groups can be split from drag and drop operations by dropping an editor or file on the edges of the editor area.") + 'description': localize('splitOnDragAndDrop', "Controls if editor groups can be split from drag and drop operations by dropping an editor or file on the edges of the editor area.") }, 'workbench.editor.focusRecentEditorAfterClose': { 'type': 'boolean', - 'description': nls.localize('focusRecentEditorAfterClose', "Controls whether tabs are closed in most recently used order or from left to right."), + 'description': localize('focusRecentEditorAfterClose', "Controls whether tabs are closed in most recently used order or from left to right."), 'default': true }, 'workbench.editor.showIcons': { 'type': 'boolean', - 'description': nls.localize('showIcons', "Controls whether opened editors should show with an icon or not. This requires a file icon theme to be enabled as well."), + 'description': localize('showIcons', "Controls whether opened editors should show with an icon or not. This requires a file icon theme to be enabled as well."), 'default': true }, 'workbench.editor.enablePreview': { 'type': 'boolean', - 'description': nls.localize('enablePreview', "Controls whether opened editors show as preview. Preview editors do not keep open and are reused until explicitly set to be kept open (e.g. via double click or editing) and show up with an italic font style."), + 'description': localize('enablePreview', "Controls whether opened editors show as preview editors. Preview editors do not stay open, are reused until explicitly set to be kept open (e.g. via double click or editing), and show file names in italics."), 'default': true }, 'workbench.editor.enablePreviewFromQuickOpen': { 'type': 'boolean', - 'description': nls.localize('enablePreviewFromQuickOpen', "Controls whether editors opened from Quick Open show as preview. Preview editors do not keep open and are reused until explicitly set to be kept open (e.g. via double click or editing)."), + 'markdownDescription': localize('enablePreviewFromQuickOpen', "Controls whether editors opened from Quick Open show as preview editors. Preview editors do not stay open, and are reused until explicitly set to be kept open (e.g. via double click or editing). This value is ignored when `#workbench.editor.enablePreview#` is disabled."), + 'default': false + }, + 'workbench.editor.enablePreviewFromCodeNavigation': { + 'type': 'boolean', + 'markdownDescription': localize('enablePreviewFromCodeNavigation', "Controls whether editors remain in preview when a code navigation is started from them. Preview editors do not stay open, and are reused until explicitly set to be kept open (e.g. via double click or editing). This value is ignored when `#workbench.editor.enablePreview#` is disabled."), 'default': false }, 'workbench.editor.closeOnFileDelete': { 'type': 'boolean', - 'description': nls.localize('closeOnFileDelete', "Controls whether editors showing a file that was opened during the session should close automatically when getting deleted or renamed by some other process. Disabling this will keep the editor open on such an event. Note that deleting from within the application will always close the editor and that dirty files will never close to preserve your data."), + 'description': localize('closeOnFileDelete', "Controls whether editors showing a file that was opened during the session should close automatically when getting deleted or renamed by some other process. Disabling this will keep the editor open on such an event. Note that deleting from within the application will always close the editor and that editors with unsaved changes will never close to preserve your data."), 'default': false }, 'workbench.editor.openPositioning': { 'type': 'string', 'enum': ['left', 'right', 'first', 'last'], 'default': 'right', - 'markdownDescription': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'editorOpenPositioning' }, "Controls where editors open. Select `left` or `right` to open editors to the left or right of the currently active one. Select `first` or `last` to open editors independently from the currently active one.") + 'markdownDescription': localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'editorOpenPositioning' }, "Controls where editors open. Select `left` or `right` to open editors to the left or right of the currently active one. Select `first` or `last` to open editors independently from the currently active one.") }, 'workbench.editor.openSideBySideDirection': { 'type': 'string', 'enum': ['right', 'down'], 'default': 'right', - 'markdownDescription': nls.localize('sideBySideDirection', "Controls the default direction of editors that are opened side by side (e.g. from the explorer). By default, editors will open on the right hand side of the currently active one. If changed to `down`, the editors will open below the currently active one.") + 'markdownDescription': localize('sideBySideDirection', "Controls the default direction of editors that are opened side by side (for example, from the Explorer). By default, editors will open on the right hand side of the currently active one. If changed to `down`, the editors will open below the currently active one.") }, 'workbench.editor.closeEmptyGroups': { 'type': 'boolean', - 'description': nls.localize('closeEmptyGroups', "Controls the behavior of empty editor groups when the last tab in the group is closed. When enabled, empty groups will automatically close. When disabled, empty groups will remain part of the grid."), + 'description': localize('closeEmptyGroups', "Controls the behavior of empty editor groups when the last tab in the group is closed. When enabled, empty groups will automatically close. When disabled, empty groups will remain part of the grid."), 'default': true }, 'workbench.editor.revealIfOpen': { 'type': 'boolean', - 'description': nls.localize('revealIfOpen', "Controls whether an editor is revealed in any of the visible groups if opened. If disabled, an editor will prefer to open in the currently active editor group. If enabled, an already opened editor will be revealed instead of opened again in the currently active editor group. Note that there are some cases where this setting is ignored, e.g. when forcing an editor to open in a specific group or to the side of the currently active group."), + 'description': localize('revealIfOpen', "Controls whether an editor is revealed in any of the visible groups if opened. If disabled, an editor will prefer to open in the currently active editor group. If enabled, an already opened editor will be revealed instead of opened again in the currently active editor group. Note that there are some cases where this setting is ignored, e.g. when forcing an editor to open in a specific group or to the side of the currently active group."), 'default': false }, 'workbench.editor.mouseBackForwardToNavigate': { 'type': 'boolean', - 'description': nls.localize('mouseBackForwardToNavigate', "Navigate between open files using mouse buttons four and five if provided."), + 'description': localize('mouseBackForwardToNavigate', "Enables the use of mouse buttons four and five for commands 'Go Back' and 'Go Forward'."), 'default': true }, + 'workbench.editor.navigationScope': { + 'type': 'string', + 'enum': ['default', 'editorGroup', 'editor'], + 'default': 'default', + 'markdownDescription': localize('navigationScope', "Controls the scope of history navigation in editors for commands such as 'Go Back' and 'Go Forward'."), + 'enumDescriptions': [ + localize('workbench.editor.navigationScopeDefault', "Navigate across all opened editors and editor groups."), + localize('workbench.editor.navigationScopeEditorGroup', "Navigate only in editors of the active editor group."), + localize('workbench.editor.navigationScopeEditor', "Navigate only in the active editor.") + ], + }, 'workbench.editor.restoreViewState': { 'type': 'boolean', - 'description': nls.localize('restoreViewState', "Restores the last view state (e.g. scroll position) when re-opening textual editors after they have been closed."), + 'markdownDescription': localize('restoreViewState', "Restores the last editor view state (e.g. scroll position) when re-opening editors after they have been closed. Editor view state is stored per editor group and discarded when a group closes. Use the {0} setting to use the last known view state across all editor groups in case no previous view state was found for a editor group.", '`#workbench.editor.sharedViewState#`'), 'default': true, 'scope': ConfigurationScope.LANGUAGE_OVERRIDABLE }, + 'workbench.editor.sharedViewState': { + 'type': 'boolean', + 'description': localize('sharedViewState', "Preserves the most recent editor view state (e.g. scroll position) across all editor groups and restores that if no specific editor view state is found for the editor group."), + 'default': false + }, + 'workbench.editor.splitInGroupLayout': { + 'type': 'string', + 'enum': ['vertical', 'horizontal'], + 'default': 'horizontal', + 'markdownDescription': localize('splitInGroupLayout', "Controls the layout for when an editor is split in an editor group to be either vertical or horizontal."), + 'enumDescriptions': [ + localize('workbench.editor.splitInGroupLayoutVertical', "Editors are positioned from top to bottom."), + localize('workbench.editor.splitInGroupLayoutHorizontal', "Editors are positioned from left to right.") + ] + }, 'workbench.editor.centeredLayoutAutoResize': { 'type': 'boolean', 'default': true, - 'description': nls.localize('centeredLayoutAutoResize', "Controls if the centered layout should automatically resize to maximum width when more than one group is open. Once only one group is open it will resize back to the original centered width.") + 'description': localize('centeredLayoutAutoResize', "Controls if the centered layout should automatically resize to maximum width when more than one group is open. Once only one group is open it will resize back to the original centered width.") }, 'workbench.editor.limit.enabled': { 'type': 'boolean', 'default': false, - 'description': nls.localize('limitEditorsEnablement', "Controls if the number of opened editors should be limited or not. When enabled, less recently used editors that are not dirty will close to make space for newly opening editors.") + 'description': localize('limitEditorsEnablement', "Controls if the number of opened editors should be limited or not. When enabled, less recently used editors will close to make space for newly opening editors.") }, 'workbench.editor.limit.value': { 'type': 'number', 'default': 10, 'exclusiveMinimum': 0, - 'markdownDescription': nls.localize('limitEditorsMaximum', "Controls the maximum number of opened editors. Use the `#workbench.editor.limit.perEditorGroup#` setting to control this limit per editor group or across all groups.") + 'markdownDescription': localize('limitEditorsMaximum', "Controls the maximum number of opened editors. Use the {0} setting to control this limit per editor group or across all groups.", '`#workbench.editor.limit.perEditorGroup#`') + }, + 'workbench.editor.limit.excludeDirty': { + 'type': 'boolean', + 'default': false, + 'description': localize('limitEditorsExcludeDirty', "Controls if the maximum number of opened editors should exclude dirty editors for counting towards the configured limit.") }, 'workbench.editor.limit.perEditorGroup': { 'type': 'boolean', 'default': false, - 'description': nls.localize('perEditorGroup', "Controls if the limit of maximum opened editors should apply per editor group or across all editor groups.") + 'description': localize('perEditorGroup', "Controls if the limit of maximum opened editors should apply per editor group or across all editor groups.") + }, + 'workbench.localHistory.enabled': { + 'type': 'boolean', + 'default': true, + 'description': localize('localHistoryEnabled', "Controls whether local file history is enabled. When enabled, the file contents of an editor that is saved will be stored to a backup location to be able to restore or review the contents later. Changing this setting has no effect on existing local file history entries."), + 'scope': ConfigurationScope.RESOURCE + }, + 'workbench.localHistory.maxFileSize': { + 'type': 'number', + 'default': 256, + 'minimum': 1, + 'description': localize('localHistoryMaxFileSize', "Controls the maximum size of a file (in KB) to be considered for local file history. Files that are larger will not be added to the local file history. Changing this setting has no effect on existing local file history entries."), + 'scope': ConfigurationScope.RESOURCE + }, + 'workbench.localHistory.maxFileEntries': { + 'type': 'number', + 'default': 50, + 'minimum': 0, + 'description': localize('localHistoryMaxFileEntries', "Controls the maximum number of local file history entries per file. When the number of local file history entries exceeds this number for a file, the oldest entries will be discarded."), + 'scope': ConfigurationScope.RESOURCE + }, + 'workbench.localHistory.exclude': { + 'type': 'object', + 'markdownDescription': localize('exclude', "Configure [glob patterns](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options) for excluding files from the local file history. Changing this setting has no effect on existing local file history entries."), + 'scope': ConfigurationScope.RESOURCE + }, + 'workbench.localHistory.mergeWindow': { + 'type': 'number', + 'default': 10, + 'minimum': 1, + 'markdownDescription': localize('mergeWindow', "Configure an interval in seconds during which the last entry in local file history is replaced with the entry that is being added. This helps reduce the overall number of entries that are added, for example when auto save is enabled. This setting is only applied to entries that have the same source of origin. Changing this setting has no effect on existing local file history entries."), + 'scope': ConfigurationScope.RESOURCE }, 'workbench.commandPalette.history': { 'type': 'number', - 'description': nls.localize('commandHistory', "Controls the number of recently used commands to keep in history for the command palette. Set to 0 to disable command history."), - 'default': 50 + 'description': localize('commandHistory', "Controls the number of recently used commands to keep in history for the command palette. Set to 0 to disable command history."), + 'default': 50, + 'minimum': 0 }, 'workbench.commandPalette.preserveInput': { 'type': 'boolean', - 'description': nls.localize('preserveInput', "Controls whether the last typed input to the command palette should be restored when opening it the next time."), + 'description': localize('preserveInput', "Controls whether the last typed input to the command palette should be restored when opening it the next time."), 'default': false }, 'workbench.quickOpen.closeOnFocusLost': { 'type': 'boolean', - 'description': nls.localize('closeOnFocusLost', "Controls whether Quick Open should close automatically once it loses focus."), + 'description': localize('closeOnFocusLost', "Controls whether Quick Open should close automatically once it loses focus."), 'default': true }, 'workbench.quickOpen.preserveInput': { 'type': 'boolean', - 'description': nls.localize('workbench.quickOpen.preserveInput', "Controls whether the last typed input to Quick Open should be restored when opening it the next time."), + 'description': localize('workbench.quickOpen.preserveInput', "Controls whether the last typed input to Quick Open should be restored when opening it the next time."), 'default': false }, 'workbench.settings.openDefaultSettings': { 'type': 'boolean', - 'description': nls.localize('openDefaultSettings', "Controls whether opening settings also opens an editor showing all default settings."), + 'description': localize('openDefaultSettings', "Controls whether opening settings also opens an editor showing all default settings."), 'default': false }, 'workbench.settings.useSplitJSON': { 'type': 'boolean', - 'markdownDescription': nls.localize('useSplitJSON', "Controls whether to use the split JSON editor when editing settings as JSON."), + 'markdownDescription': localize('useSplitJSON', "Controls whether to use the split JSON editor when editing settings as JSON."), 'default': false }, 'workbench.settings.openDefaultKeybindings': { 'type': 'boolean', - 'description': nls.localize('openDefaultKeybindings', "Controls whether opening keybinding settings also opens an editor showing all default keybindings."), + 'description': localize('openDefaultKeybindings', "Controls whether opening keybinding settings also opens an editor showing all default keybindings."), 'default': false }, 'workbench.sideBar.location': { 'type': 'string', 'enum': ['left', 'right'], 'default': 'left', - 'description': nls.localize('sideBarLocation', "Controls the location of the sidebar and activity bar. They can either show on the left or right of the workbench.") + 'description': localize('sideBarLocation', "Controls the location of the primary side bar and activity bar. They can either show on the left or right of the workbench. The secondary side bar will show on the opposite side of the workbench.") }, 'workbench.panel.defaultLocation': { 'type': 'string', 'enum': ['left', 'bottom', 'right'], 'default': 'bottom', - 'description': nls.localize('panelDefaultLocation', "Controls the default location of the panel (terminal, debug console, output, problems). It can either show at the bottom, right, or left of the workbench.") + 'description': localize('panelDefaultLocation', "Controls the default location of the panel (terminal, debug console, output, problems) in a new workspace. It can either show at the bottom, right, or left of the editor area."), }, 'workbench.panel.opensMaximized': { 'type': 'string', 'enum': ['always', 'never', 'preserve'], 'default': 'preserve', - 'description': nls.localize('panelOpensMaximized', "Controls whether the panel opens maximized. It can either always open maximized, never open maximized, or open to the last state it was in before being closed."), + 'description': localize('panelOpensMaximized', "Controls whether the panel opens maximized. It can either always open maximized, never open maximized, or open to the last state it was in before being closed."), 'enumDescriptions': [ - nls.localize('workbench.panel.opensMaximized.always', "Always maximize the panel when opening it."), - nls.localize('workbench.panel.opensMaximized.never', "Never maximize the panel when opening it. The panel will open un-maximized."), - nls.localize('workbench.panel.opensMaximized.preserve', "Open the panel to the state that it was in, before it was closed.") + localize('workbench.panel.opensMaximized.always', "Always maximize the panel when opening it."), + localize('workbench.panel.opensMaximized.never', "Never maximize the panel when opening it. The panel will open un-maximized."), + localize('workbench.panel.opensMaximized.preserve', "Open the panel to the state that it was in, before it was closed.") ] }, 'workbench.statusBar.visible': { 'type': 'boolean', 'default': true, - 'description': nls.localize('statusBarVisibility', "Controls the visibility of the status bar at the bottom of the workbench.") + 'description': localize('statusBarVisibility', "Controls the visibility of the status bar at the bottom of the workbench.") }, 'workbench.activityBar.visible': { 'type': 'boolean', 'default': true, - 'description': nls.localize('activityBarVisibility', "Controls the visibility of the activity bar in the workbench.") + 'description': localize('activityBarVisibility', "Controls the visibility of the activity bar in the workbench.") }, 'workbench.activityBar.iconClickBehavior': { 'type': 'string', 'enum': ['toggle', 'focus'], 'default': 'toggle', - 'description': nls.localize('activityBarIconClickBehavior', "Controls the behavior of clicking an activity bar icon in the workbench."), + 'description': localize('activityBarIconClickBehavior', "Controls the behavior of clicking an activity bar icon in the workbench."), 'enumDescriptions': [ - nls.localize('workbench.activityBar.iconClickBehavior.toggle', "Hide the side bar if the clicked item is already visible."), - nls.localize('workbench.activityBar.iconClickBehavior.focus', "Focus side bar if the clicked item is already visible.") + localize('workbench.activityBar.iconClickBehavior.toggle', "Hide the side bar if the clicked item is already visible."), + localize('workbench.activityBar.iconClickBehavior.focus', "Focus side bar if the clicked item is already visible.") ] }, 'workbench.view.alwaysShowHeaderActions': { 'type': 'boolean', 'default': false, - 'description': nls.localize('viewVisibility', "Controls the visibility of view header actions. View header actions may either be always visible, or only visible when that view is focused or hovered over.") + 'description': localize('viewVisibility', "Controls the visibility of view header actions. View header actions may either be always visible, or only visible when that view is focused or hovered over.") }, 'workbench.fontAliasing': { 'type': 'string', 'enum': ['default', 'antialiased', 'none', 'auto'], 'default': 'default', 'description': - nls.localize('fontAliasing', "Controls font aliasing method in the workbench."), + localize('fontAliasing', "Controls font aliasing method in the workbench."), 'enumDescriptions': [ - nls.localize('workbench.fontAliasing.default', "Sub-pixel font smoothing. On most non-retina displays this will give the sharpest text."), - nls.localize('workbench.fontAliasing.antialiased', "Smooth the font on the level of the pixel, as opposed to the subpixel. Can make the font appear lighter overall."), - nls.localize('workbench.fontAliasing.none', "Disables font smoothing. Text will show with jagged sharp edges."), - nls.localize('workbench.fontAliasing.auto', "Applies `default` or `antialiased` automatically based on the DPI of displays.") + localize('workbench.fontAliasing.default', "Sub-pixel font smoothing. On most non-retina displays this will give the sharpest text."), + localize('workbench.fontAliasing.antialiased', "Smooth the font on the level of the pixel, as opposed to the subpixel. Can make the font appear lighter overall."), + localize('workbench.fontAliasing.none', "Disables font smoothing. Text will show with jagged sharp edges."), + localize('workbench.fontAliasing.auto', "Applies `default` or `antialiased` automatically based on the DPI of displays.") ], 'included': isMacintosh }, @@ -293,40 +424,95 @@ import { isStandalone } from 'vs/base/browser/browser'; 'type': 'string', 'enum': ['ui', 'json'], 'enumDescriptions': [ - nls.localize('settings.editor.ui', "Use the settings UI editor."), - nls.localize('settings.editor.json', "Use the JSON file editor."), + localize('settings.editor.ui', "Use the settings UI editor."), + localize('settings.editor.json', "Use the JSON file editor."), ], - 'description': nls.localize('settings.editor.desc', "Determines which settings editor to use by default."), + 'description': localize('settings.editor.desc', "Determines which settings editor to use by default."), 'default': 'ui', 'scope': ConfigurationScope.WINDOW - } + }, + 'workbench.hover.delay': { + 'type': 'number', + 'description': localize('workbench.hover.delay', "Controls the delay in milliseconds after which the hover is shown for workbench items (ex. some extension provided tree view items). Already visible items may require a refresh before reflecting this setting change."), + // Testing has indicated that on Windows and Linux 500 ms matches the native hovers most closely. + // On Mac, the delay is 1500. + 'default': isMacintosh ? 1500 : 500, + 'minimum': 0 + }, + 'workbench.reduceMotion': { + type: 'string', + description: localize('workbench.reduceMotion', "Controls whether the workbench should render with fewer animations."), + 'enumDescriptions': [ + localize('workbench.reduceMotion.on', "Always render with reduced motion."), + localize('workbench.reduceMotion.off', "Do not render with reduced motion"), + localize('workbench.reduceMotion.auto', "Render with reduced motion based on OS configuration."), + ], + default: 'auto', + enum: ['on', 'off', 'auto'] + }, + 'workbench.layoutControl.enabled': { + 'type': 'boolean', + 'default': true, + 'markdownDescription': localize({ key: 'layoutControlEnabled', comment: ['{0} is a placeholder for a setting identifier.'] }, "Controls whether the layout controls in the custom title bar is enabled via {0}.", '`#window.titleBarStyle#`'), + }, + 'workbench.layoutControl.type': { + 'type': 'string', + 'enum': ['menu', 'toggles', 'both'], + 'enumDescriptions': [ + localize('layoutcontrol.type.menu', "Shows a single button with a dropdown of layout options."), + localize('layoutcontrol.type.toggles', "Shows several buttons for toggling the visibility of the panels and side bar."), + localize('layoutcontrol.type.both', "Shows both the dropdown and toggle buttons."), + ], + 'default': 'both', + 'description': localize('layoutControlType', "Controls whether the layout control in the custom title bar is displayed as a single menu button or with multiple UI toggles."), + }, + 'workbench.experimental.layoutControl.enabled': { + 'type': 'boolean', + 'tags': ['experimental'], + 'default': false, + 'markdownDescription': localize({ key: 'layoutControlEnabled', comment: ['{0} is a placeholder for a setting identifier.'] }, "Controls whether the layout controls in the custom title bar is enabled via {0}.", '`#window.titleBarStyle#`'), + 'markdownDeprecationMessage': localize({ key: 'layoutControlEnabledDeprecation', comment: ['{0} is a placeholder for a setting identifier.'] }, "This setting has been deprecated in favor of {0}", '`#workbench.layoutControl.enabled#`') + }, + 'workbench.experimental.layoutControl.type': { + 'type': 'string', + 'enum': ['menu', 'toggles', 'both'], + 'enumDescriptions': [ + localize('layoutcontrol.type.menu', "Shows a single button with a dropdown of layout options."), + localize('layoutcontrol.type.toggles', "Shows several buttons for toggling the visibility of the panels and side bar."), + localize('layoutcontrol.type.both', "Shows both the dropdown and toggle buttons."), + ], + 'tags': ['experimental'], + 'default': 'both', + 'description': localize('layoutControlType', "Controls whether the layout control in the custom title bar is displayed as a single menu button or with multiple UI toggles."), + 'markdownDeprecationMessage': localize({ key: 'layoutControlTypeDeprecation', comment: ['{0} is a placeholder for a setting identifier.'] }, "This setting has been deprecated in favor of {0}", '`#workbench.layoutControl.type#`') + }, } }); // Window - let windowTitleDescription = nls.localize('windowTitle', "Controls the window title based on the active editor. Variables are substituted based on the context:"); + let windowTitleDescription = localize('windowTitle', "Controls the window title based on the active editor. Variables are substituted based on the context:"); windowTitleDescription += '\n- ' + [ - nls.localize('activeEditorShort', "`\${activeEditorShort}`: the file name (e.g. myFile.txt)."), - nls.localize('activeEditorMedium', "`\${activeEditorMedium}`: the path of the file relative to the workspace folder (e.g. myFolder/myFileFolder/myFile.txt)."), - nls.localize('activeEditorLong', "`\${activeEditorLong}`: the full path of the file (e.g. /Users/Development/myFolder/myFileFolder/myFile.txt)."), - nls.localize('activeFolderShort', "`\${activeFolderShort}`: the name of the folder the file is contained in (e.g. myFileFolder)."), - nls.localize('activeFolderMedium', "`\${activeFolderMedium}`: the path of the folder the file is contained in, relative to the workspace folder (e.g. myFolder/myFileFolder)."), - nls.localize('activeFolderLong', "`\${activeFolderLong}`: the full path of the folder the file is contained in (e.g. /Users/Development/myFolder/myFileFolder)."), - nls.localize('folderName', "`\${folderName}`: name of the workspace folder the file is contained in (e.g. myFolder)."), - nls.localize('folderPath', "`\${folderPath}`: file path of the workspace folder the file is contained in (e.g. /Users/Development/myFolder)."), - nls.localize('rootName', "`\${rootName}`: name of the workspace (e.g. myFolder or myWorkspace)."), - nls.localize('rootPath', "`\${rootPath}`: file path of the workspace (e.g. /Users/Development/myWorkspace)."), - nls.localize('appName', "`\${appName}`: e.g. VS Code."), - nls.localize('remoteName', "`\${remoteName}`: e.g. SSH"), - nls.localize('dirty', "`\${dirty}`: a dirty indicator if the active editor is dirty."), - nls.localize('separator', "`\${separator}`: a conditional separator (\" - \") that only shows when surrounded by variables with values or static text.") + localize('activeEditorShort', "`${activeEditorShort}`: the file name (e.g. myFile.txt)."), + localize('activeEditorMedium', "`${activeEditorMedium}`: the path of the file relative to the workspace folder (e.g. myFolder/myFileFolder/myFile.txt)."), + localize('activeEditorLong', "`${activeEditorLong}`: the full path of the file (e.g. /Users/Development/myFolder/myFileFolder/myFile.txt)."), + localize('activeFolderShort', "`${activeFolderShort}`: the name of the folder the file is contained in (e.g. myFileFolder)."), + localize('activeFolderMedium', "`${activeFolderMedium}`: the path of the folder the file is contained in, relative to the workspace folder (e.g. myFolder/myFileFolder)."), + localize('activeFolderLong', "`${activeFolderLong}`: the full path of the folder the file is contained in (e.g. /Users/Development/myFolder/myFileFolder)."), + localize('folderName', "`${folderName}`: name of the workspace folder the file is contained in (e.g. myFolder)."), + localize('folderPath', "`${folderPath}`: file path of the workspace folder the file is contained in (e.g. /Users/Development/myFolder)."), + localize('rootName', "`${rootName}`: name of the opened workspace or folder (e.g. myFolder or myWorkspace)."), + localize('rootPath', "`${rootPath}`: file path of the opened workspace or folder (e.g. /Users/Development/myWorkspace)."), + localize('appName', "`${appName}`: e.g. VS Code."), + localize('remoteName', "`${remoteName}`: e.g. SSH"), + localize('dirty', "`${dirty}`: an indicator for when the active editor has unsaved changes."), + localize('separator', "`${separator}`: a conditional separator (\" - \") that only shows when surrounded by variables with values or static text.") ].join('\n- '); // intentionally concatenated to not produce a string that is too long for translations registry.registerConfiguration({ 'id': 'window', 'order': 8, - 'title': nls.localize('windowConfigurationTitle', "Window"), + 'title': localize('windowConfigurationTitle', "Window"), 'type': 'object', 'properties': { 'window.title': { @@ -348,79 +534,95 @@ import { isStandalone } from 'vs/base/browser/browser'; }, 'window.titleSeparator': { 'type': 'string', - 'default': isMacintosh ? ' — ' : ' - ', - 'markdownDescription': nls.localize("window.titleSeparator", "Separator used by `window.title`.") + 'default': isMacintosh ? ' \u2014 ' : ' - ', + 'markdownDescription': localize("window.titleSeparator", "Separator used by {0}.", '`#window.title#`') + }, + 'window.commandCenter': { + type: 'boolean', + default: false, + markdownDescription: localize('window.commandCenter', "Show command launcher together with the window title. This setting only has an effect when {0} is set to {1}.", '`#window.titleBarStyle#`', '`custom`') }, 'window.menuBarVisibility': { 'type': 'string', - 'enum': ['default', 'visible', 'toggle', 'hidden', 'compact'], - 'enumDescriptions': [ - nls.localize('window.menuBarVisibility.default', "Menu is only hidden in full screen mode."), - nls.localize('window.menuBarVisibility.visible', "Menu is always visible even in full screen mode."), - nls.localize('window.menuBarVisibility.toggle', "Menu is hidden but can be displayed via Alt key."), - nls.localize('window.menuBarVisibility.hidden', "Menu is always hidden."), - nls.localize('window.menuBarVisibility.compact', "Menu is displayed as a compact button in the sidebar. This value is ignored when `#window.titleBarStyle#` is `native`.") + 'enum': ['classic', 'visible', 'toggle', 'hidden', 'compact'], + 'markdownEnumDescriptions': [ + localize('window.menuBarVisibility.classic', "Menu is displayed at the top of the window and only hidden in full screen mode."), + localize('window.menuBarVisibility.visible', "Menu is always visible at the top of the window even in full screen mode."), + isMacintosh ? + localize('window.menuBarVisibility.toggle.mac', "Menu is hidden but can be displayed at the top of the window by executing the `Focus Application Menu` command.") : + localize('window.menuBarVisibility.toggle', "Menu is hidden but can be displayed at the top of the window via the Alt key."), + localize('window.menuBarVisibility.hidden', "Menu is always hidden."), + localize('window.menuBarVisibility.compact', "Menu is displayed as a compact button in the side bar. This value is ignored when {0} is {1}.", '`#window.titleBarStyle#`', '`native`') ], - 'default': isWeb ? 'compact' : 'default', + 'default': isWeb ? 'compact' : 'classic', 'scope': ConfigurationScope.APPLICATION, - 'description': nls.localize('menuBarVisibility', "Control the visibility of the menu bar. A setting of 'toggle' means that the menu bar is hidden and a single press of the Alt key will show it. By default, the menu bar will be visible, unless the window is full screen."), + 'markdownDescription': isMacintosh ? + localize('menuBarVisibility.mac', "Control the visibility of the menu bar. A setting of 'toggle' means that the menu bar is hidden and executing `Focus Application Menu` will show it. A setting of 'compact' will move the menu into the side bar.") : + localize('menuBarVisibility', "Control the visibility of the menu bar. A setting of 'toggle' means that the menu bar is hidden and a single press of the Alt key will show it. A setting of 'compact' will move the menu into the side bar."), 'included': isWindows || isLinux || isWeb }, 'window.enableMenuBarMnemonics': { 'type': 'boolean', - 'default': !isMacintosh, + 'default': true, 'scope': ConfigurationScope.APPLICATION, - 'description': nls.localize('enableMenuBarMnemonics', "Controls whether the main menus can be opened via Alt-key shortcuts. Disabling mnemonics allows to bind these Alt-key shortcuts to editor commands instead."), - 'included': isWindows || isLinux || isWeb + 'description': localize('enableMenuBarMnemonics', "Controls whether the main menus can be opened via Alt-key shortcuts. Disabling mnemonics allows to bind these Alt-key shortcuts to editor commands instead."), + 'included': isWindows || isLinux }, 'window.customMenuBarAltFocus': { 'type': 'boolean', - 'default': !isMacintosh, + 'default': true, 'scope': ConfigurationScope.APPLICATION, - 'markdownDescription': nls.localize('customMenuBarAltFocus', "Controls whether the menu bar will be focused by pressing the Alt-key. This setting has no effect on toggling the menu bar with the Alt-key."), - 'included': isWindows || isLinux || isWeb + 'markdownDescription': localize('customMenuBarAltFocus', "Controls whether the menu bar will be focused by pressing the Alt-key. This setting has no effect on toggling the menu bar with the Alt-key."), + 'included': isWindows || isLinux }, 'window.openFilesInNewWindow': { 'type': 'string', 'enum': ['on', 'off', 'default'], 'enumDescriptions': [ - nls.localize('window.openFilesInNewWindow.on', "Files will open in a new window."), - nls.localize('window.openFilesInNewWindow.off', "Files will open in the window with the files' folder open or the last active window."), + localize('window.openFilesInNewWindow.on', "Files will open in a new window."), + localize('window.openFilesInNewWindow.off', "Files will open in the window with the files' folder open or the last active window."), isMacintosh ? - nls.localize('window.openFilesInNewWindow.defaultMac', "Files will open in the window with the files' folder open or the last active window unless opened via the Dock or from Finder.") : - nls.localize('window.openFilesInNewWindow.default', "Files will open in a new window unless picked from within the application (e.g. via the File menu).") + localize('window.openFilesInNewWindow.defaultMac', "Files will open in the window with the files' folder open or the last active window unless opened via the Dock or from Finder.") : + localize('window.openFilesInNewWindow.default', "Files will open in a new window unless picked from within the application (e.g. via the File menu).") ], 'default': 'off', 'scope': ConfigurationScope.APPLICATION, 'markdownDescription': isMacintosh ? - nls.localize('openFilesInNewWindowMac', "Controls whether files should open in a new window. \nNote that there can still be cases where this setting is ignored (e.g. when using the `--new-window` or `--reuse-window` command line option).") : - nls.localize('openFilesInNewWindow', "Controls whether files should open in a new window.\nNote that there can still be cases where this setting is ignored (e.g. when using the `--new-window` or `--reuse-window` command line option).") + localize('openFilesInNewWindowMac', "Controls whether files should open in a new window when using a command line or file dialog.\nNote that there can still be cases where this setting is ignored (e.g. when using the `--new-window` or `--reuse-window` command line option).") : + localize('openFilesInNewWindow', "Controls whether files should open in a new window when using a command line or file dialog.\nNote that there can still be cases where this setting is ignored (e.g. when using the `--new-window` or `--reuse-window` command line option).") }, 'window.openFoldersInNewWindow': { 'type': 'string', 'enum': ['on', 'off', 'default'], 'enumDescriptions': [ - nls.localize('window.openFoldersInNewWindow.on', "Folders will open in a new window."), - nls.localize('window.openFoldersInNewWindow.off', "Folders will replace the last active window."), - nls.localize('window.openFoldersInNewWindow.default', "Folders will open in a new window unless a folder is picked from within the application (e.g. via the File menu).") + localize('window.openFoldersInNewWindow.on', "Folders will open in a new window."), + localize('window.openFoldersInNewWindow.off', "Folders will replace the last active window."), + localize('window.openFoldersInNewWindow.default', "Folders will open in a new window unless a folder is picked from within the application (e.g. via the File menu).") ], 'default': 'default', 'scope': ConfigurationScope.APPLICATION, - 'markdownDescription': nls.localize('openFoldersInNewWindow', "Controls whether folders should open in a new window or replace the last active window.\nNote that there can still be cases where this setting is ignored (e.g. when using the `--new-window` or `--reuse-window` command line option).") + 'markdownDescription': localize('openFoldersInNewWindow', "Controls whether folders should open in a new window or replace the last active window.\nNote that there can still be cases where this setting is ignored (e.g. when using the `--new-window` or `--reuse-window` command line option).") }, 'window.confirmBeforeClose': { 'type': 'string', 'enum': ['always', 'keyboardOnly', 'never'], 'enumDescriptions': [ - nls.localize('window.confirmBeforeClose.always', "Always try to ask for confirmation. Note that browsers may still decide to close a tab or window without confirmation."), - nls.localize('window.confirmBeforeClose.keyboardOnly', "Only ask for confirmation if a keybinding was detected. Note that detection may not be possible in some cases."), - nls.localize('window.confirmBeforeClose.never', "Never explicitly ask for confirmation unless data loss is imminent.") + isWeb ? + localize('window.confirmBeforeClose.always.web', "Always try to ask for confirmation. Note that browsers may still decide to close a tab or window without confirmation.") : + localize('window.confirmBeforeClose.always', "Always ask for confirmation."), + isWeb ? + localize('window.confirmBeforeClose.keyboardOnly.web', "Only ask for confirmation if a keybinding was used to close the window. Note that detection may not be possible in some cases.") : + localize('window.confirmBeforeClose.keyboardOnly', "Only ask for confirmation if a keybinding was used."), + isWeb ? + localize('window.confirmBeforeClose.never.web', "Never explicitly ask for confirmation unless data loss is imminent.") : + localize('window.confirmBeforeClose.never', "Never explicitly ask for confirmation.") ], - 'default': isWeb && !isStandalone ? 'keyboardOnly' : 'never', // on by default in web, unless PWA - 'description': nls.localize('confirmBeforeCloseWeb', "Controls whether to show a confirmation dialog before closing the browser tab or window. Note that even if enabled, browsers may still decide to close a tab or window without confirmation and that this setting is only a hint that may not work in all cases."), - 'scope': ConfigurationScope.APPLICATION, - 'included': isWeb + 'default': (isWeb && !isStandalone()) ? 'keyboardOnly' : 'never', // on by default in web, unless PWA, never on desktop + 'markdownDescription': isWeb ? + localize('confirmBeforeCloseWeb', "Controls whether to show a confirmation dialog before closing the browser tab or window. Note that even if enabled, browsers may still decide to close a tab or window without confirmation and that this setting is only a hint that may not work in all cases.") : + localize('confirmBeforeClose', "Controls whether to show a confirmation dialog before closing the window or quitting the application."), + 'scope': ConfigurationScope.APPLICATION } } }); @@ -429,48 +631,48 @@ import { isStandalone } from 'vs/base/browser/browser'; registry.registerConfiguration({ 'id': 'zenMode', 'order': 9, - 'title': nls.localize('zenModeConfigurationTitle', "Zen Mode"), + 'title': localize('zenModeConfigurationTitle', "Zen Mode"), 'type': 'object', 'properties': { 'zenMode.fullScreen': { 'type': 'boolean', 'default': true, - 'description': nls.localize('zenMode.fullScreen', "Controls whether turning on Zen Mode also puts the workbench into full screen mode.") + 'description': localize('zenMode.fullScreen', "Controls whether turning on Zen Mode also puts the workbench into full screen mode.") }, 'zenMode.centerLayout': { 'type': 'boolean', 'default': true, - 'description': nls.localize('zenMode.centerLayout', "Controls whether turning on Zen Mode also centers the layout.") + 'description': localize('zenMode.centerLayout', "Controls whether turning on Zen Mode also centers the layout.") }, 'zenMode.hideTabs': { 'type': 'boolean', 'default': true, - 'description': nls.localize('zenMode.hideTabs', "Controls whether turning on Zen Mode also hides workbench tabs.") + 'description': localize('zenMode.hideTabs', "Controls whether turning on Zen Mode also hides workbench tabs.") }, 'zenMode.hideStatusBar': { 'type': 'boolean', 'default': true, - 'description': nls.localize('zenMode.hideStatusBar', "Controls whether turning on Zen Mode also hides the status bar at the bottom of the workbench.") + 'description': localize('zenMode.hideStatusBar', "Controls whether turning on Zen Mode also hides the status bar at the bottom of the workbench.") }, 'zenMode.hideActivityBar': { 'type': 'boolean', 'default': true, - 'description': nls.localize('zenMode.hideActivityBar', "Controls whether turning on Zen Mode also hides the activity bar either at the left or right of the workbench.") + 'description': localize('zenMode.hideActivityBar', "Controls whether turning on Zen Mode also hides the activity bar either at the left or right of the workbench.") }, 'zenMode.hideLineNumbers': { 'type': 'boolean', 'default': true, - 'description': nls.localize('zenMode.hideLineNumbers', "Controls whether turning on Zen Mode also hides the editor line numbers.") + 'description': localize('zenMode.hideLineNumbers', "Controls whether turning on Zen Mode also hides the editor line numbers.") }, 'zenMode.restore': { 'type': 'boolean', - 'default': false, - 'description': nls.localize('zenMode.restore', "Controls whether a window should restore to zen mode if it was exited in zen mode.") + 'default': true, + 'description': localize('zenMode.restore', "Controls whether a window should restore to zen mode if it was exited in zen mode.") }, 'zenMode.silentNotifications': { 'type': 'boolean', 'default': true, - 'description': nls.localize('zenMode.silentNotifications', "Controls whether notifications are shown while in zen mode. If true, only error notifications will pop out.") + 'description': localize('zenMode.silentNotifications', "Controls whether notifications do not disturb mode should be enabled while in zen mode. If true, only error notifications will pop out.") } } }); diff --git a/vscode-web-gogs1s/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/vscode-web-gogs1s/src/vs/workbench/contrib/files/browser/views/explorerView.ts index e70cba0..bb7706f 100644 --- a/vscode-web-gogs1s/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/vscode-web-gogs1s/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -8,30 +8,30 @@ import { URI } from 'vs/base/common/uri'; import * as perf from 'vs/base/common/performance'; import { IAction, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { memoize } from 'vs/base/common/decorators'; -import { IFilesConfiguration, ExplorerFolderContext, FilesExplorerFocusedContext, ExplorerFocusedContext, ExplorerRootContext, ExplorerResourceReadonlyContext, ExplorerResourceCut, ExplorerResourceMoveableToTrash, ExplorerCompressedFocusContext, ExplorerCompressedFirstFocusContext, ExplorerCompressedLastFocusContext, ExplorerResourceAvailableEditorIdsContext } from 'vs/workbench/contrib/files/common/files'; -import { NewFolderAction, NewFileAction, FileCopiedContext, RefreshExplorerView, CollapseExplorerView } from 'vs/workbench/contrib/files/browser/fileActions'; +import { IFilesConfiguration, ExplorerFolderContext, FilesExplorerFocusedContext, ExplorerFocusedContext, ExplorerRootContext, ExplorerResourceReadonlyContext, ExplorerResourceCut, ExplorerResourceMoveableToTrash, ExplorerCompressedFocusContext, ExplorerCompressedFirstFocusContext, ExplorerCompressedLastFocusContext, ExplorerResourceAvailableEditorIdsContext, VIEW_ID, VIEWLET_ID, ExplorerResourceNotReadonlyContext, ViewHasSomeCollapsibleRootItemContext } from 'vs/workbench/contrib/files/common/files'; +import { FileCopiedContext, NEW_FILE_COMMAND_ID, NEW_FOLDER_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileActions'; import * as DOM from 'vs/base/browser/dom'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { ExplorerDecorationsProvider } from 'vs/workbench/contrib/files/browser/views/explorerDecorationsProvider'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; -import { IDecorationsService } from 'vs/workbench/services/decorations/browser/decorations'; +import { IContextKeyService, IContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { ResourceContextKey } from 'vs/workbench/common/contextkeys'; +import { IDecorationsService } from 'vs/workbench/services/decorations/common/decorations'; import { WorkbenchCompressibleAsyncDataTree } from 'vs/platform/list/browser/listService'; import { DelayedDragHandler } from 'vs/base/browser/dnd'; import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; -import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer'; +import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPane'; import { ILabelService } from 'vs/platform/label/common/label'; import { ExplorerDelegate, ExplorerDataSource, FilesRenderer, ICompressedNavigationController, FilesFilter, FileSorter, FileDragAndDrop, ExplorerCompressionDelegate, isCompressedFolderName } from 'vs/workbench/contrib/files/browser/views/explorerViewer'; import { IThemeService, IFileIconTheme } from 'vs/platform/theme/common/themeService'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { ITreeContextMenuEvent, TreeVisibility } from 'vs/base/browser/ui/tree/tree'; -import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; +import { IMenuService, MenuId, IMenu, Action2, registerAction2 } from 'vs/platform/actions/common/actions'; import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ExplorerItem, NewExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; @@ -47,11 +47,17 @@ import { attachStyler, IColorMapping } from 'vs/platform/theme/common/styler'; import { ColorValue, listDropBackground } from 'vs/platform/theme/common/colorRegistry'; import { Color } from 'vs/base/common/color'; import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; -import { IViewDescriptorService } from 'vs/workbench/common/views'; +import { IViewDescriptorService, IViewsService, ViewContainerLocation } from 'vs/workbench/common/views'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor'; -import { IExplorerService } from 'vs/workbench/contrib/files/browser/files'; +import { IExplorerService, IExplorerView } from 'vs/workbench/contrib/files/browser/files'; +import { Codicon } from 'vs/base/common/codicons'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IEditorResolverService } from 'vs/workbench/services/editor/common/editorResolverService'; +import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; +import { EditorOpenSource } from 'vs/platform/editor/common/editor'; +import { ResourceMap } from 'vs/base/common/map'; interface IExplorerViewColors extends IColorMapping { listDropBackground?: ColorValue | undefined; @@ -71,10 +77,31 @@ function hasExpandedRootChild(tree: WorkbenchCompressibleAsyncDataTree, treeInput: ExplorerItem[]): boolean { + for (const folder of treeInput) { + if (tree.hasNode(folder) && !tree.isCollapsed(folder)) { + return true; + } + } return false; } +const identityProvider = { + getId: (stat: ExplorerItem) => { + if (stat instanceof NewExplorerItem) { + return `new:${stat.getId()}`; + } + + return stat.getId(); + } +}; + export function getContext(focus: ExplorerItem[], selection: ExplorerItem[], respectMultiSelection: boolean, compressedNavigationControllerProvider: { getCompressedNavigationController(stat: ExplorerItem): ICompressedNavigationController | undefined }): ExplorerItem[] { @@ -117,7 +144,12 @@ export function getContext(focus: ExplorerItem[], selection: ExplorerItem[], res return [focusedStat]; } -export class ExplorerView extends ViewPane { +export interface IExplorerViewContainerDelegate { + willOpenElement(event?: UIEvent): void; + didOpenElement(event?: UIEvent): void; +} + +export class ExplorerView extends ViewPane implements IExplorerView { static readonly TREE_VIEW_STATE_STORAGE_KEY: string = 'workbench.explorer.treeViewState'; private tree!: WorkbenchCompressibleAsyncDataTree; @@ -140,30 +172,31 @@ export class ExplorerView extends ViewPane { private compressedFocusFirstContext: IContextKey; private compressedFocusLastContext: IContextKey; + private viewHasSomeCollapsibleRootItem: IContextKey; + private horizontalScrolling: boolean | undefined; - // Refresh is needed on the initial explorer open - private shouldRefresh = true; private dragHandler!: DelayedDragHandler; private autoReveal: boolean | 'focusNoScroll' = false; - private actions: IAction[] | undefined; private decorationsProvider: ExplorerDecorationsProvider | undefined; constructor( options: IViewPaneOptions, + private readonly delegate: IExplorerViewContainerDelegate, @IContextMenuService contextMenuService: IContextMenuService, @IViewDescriptorService viewDescriptorService: IViewDescriptorService, @IInstantiationService instantiationService: IInstantiationService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @IProgressService private readonly progressService: IProgressService, @IEditorService private readonly editorService: IEditorService, + @IEditorResolverService private readonly editorResolverService: IEditorResolverService, @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, @IKeybindingService keybindingService: IKeybindingService, @IContextKeyService contextKeyService: IContextKeyService, @IConfigurationService configurationService: IConfigurationService, @IDecorationsService private readonly decorationService: IDecorationsService, @ILabelService private readonly labelService: ILabelService, - @IThemeService protected themeService: IWorkbenchThemeService, + @IThemeService themeService: IWorkbenchThemeService, @IMenuService private readonly menuService: IMenuService, @ITelemetryService telemetryService: ITelemetryService, @IExplorerService private readonly explorerService: IExplorerService, @@ -171,7 +204,8 @@ export class ExplorerView extends ViewPane { @IClipboardService private clipboardService: IClipboardService, @IFileService private readonly fileService: IFileService, @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, - @IOpenerService openerService: IOpenerService, + @ICommandService private readonly commandService: ICommandService, + @IOpenerService openerService: IOpenerService ) { super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService); @@ -186,6 +220,7 @@ export class ExplorerView extends ViewPane { this.compressedFocusContext = ExplorerCompressedFocusContext.bindTo(contextKeyService); this.compressedFocusFirstContext = ExplorerCompressedFirstFocusContext.bindTo(contextKeyService); this.compressedFocusLastContext = ExplorerCompressedLastFocusContext.bindTo(contextKeyService); + this.viewHasSomeCollapsibleRootItem = ViewHasSomeCollapsibleRootItemContext.bindTo(contextKeyService); this.explorerService.registerView(this); } @@ -194,11 +229,11 @@ export class ExplorerView extends ViewPane { return this.labelService.getWorkspaceLabel(this.contextService.getWorkspace()); } - get title(): string { + override get title(): string { return this.name; } - set title(_: string) { + override set title(_: string) { // noop } @@ -219,7 +254,7 @@ export class ExplorerView extends ViewPane { // Split view methods - protected renderHeader(container: HTMLElement): void { + protected override renderHeader(container: HTMLElement): void { super.renderHeader(container); // Expand on drag over @@ -244,12 +279,12 @@ export class ExplorerView extends ViewPane { setHeader(); } - protected layoutBody(height: number, width: number): void { + protected override layoutBody(height: number, width: number): void { super.layoutBody(height, width); this.tree.layout(height, width); } - renderBody(container: HTMLElement): void { + override renderBody(container: HTMLElement): void { super.renderBody(container); this.container = container; @@ -278,31 +313,17 @@ export class ExplorerView extends ViewPane { this._register(this.onDidChangeBodyVisibility(async visible => { if (visible) { - // If a refresh was requested and we are now visible, run it - if (this.shouldRefresh) { - this.shouldRefresh = false; - await this.setTreeInput(); - } + // Always refresh explorer when it becomes visible to compensate for missing file events #126817 + await this.setTreeInput(); + // Update the collapse / expand button state + this.updateAnyCollapsedContext(); // Find resource to focus from active editor input if set this.selectActiveFile(true); } })); } - getActions(): IAction[] { - if (!this.actions) { - this.actions = [ - this.instantiationService.createInstance(NewFileAction), - this.instantiationService.createInstance(NewFolderAction), - this.instantiationService.createInstance(RefreshExplorerView, RefreshExplorerView.ID, RefreshExplorerView.LABEL), - this.instantiationService.createInstance(CollapseExplorerView, CollapseExplorerView.ID, CollapseExplorerView.LABEL) - ]; - this.actions.forEach(a => this._register(a)); - } - return this.actions; - } - - focus(): void { + override focus(): void { this.tree.domFocus(); const focused = this.tree.getFocus(); @@ -323,6 +344,10 @@ export class ExplorerView extends ViewPane { return this.filter.filter(item, TreeVisibility.Visible); } + isItemCollapsed(item: ExplorerItem): boolean { + return this.tree.isCollapsed(item); + } + async setEditable(stat: ExplorerItem, isEditing: boolean): Promise { if (isEditing) { this.horizontalScrolling = this.tree.options.horizontalScrolling; @@ -382,19 +407,13 @@ export class ExplorerView extends ViewPane { const isCompressionEnabled = () => this.configurationService.getValue('explorer.compactFolders'); + const getFileNestingSettings = (item?: ExplorerItem) => this.configurationService.getValue({ resource: item?.root.resource }).explorer.fileNesting; + this.tree = >this.instantiationService.createInstance(WorkbenchCompressibleAsyncDataTree, 'FileExplorer', container, new ExplorerDelegate(), new ExplorerCompressionDelegate(), [this.renderer], - this.instantiationService.createInstance(ExplorerDataSource), { + this.instantiationService.createInstance(ExplorerDataSource, this.filter), { compressionEnabled: isCompressionEnabled(), accessibilityProvider: this.renderer, - identityProvider: { - getId: (stat: ExplorerItem) => { - if (stat instanceof NewExplorerItem) { - return `new:${stat.resource}`; - } - - return stat.resource; - } - }, + identityProvider, keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: (stat: ExplorerItem) => { if (this.explorerService.isEditable(stat)) { @@ -414,8 +433,27 @@ export class ExplorerView extends ViewPane { multipleSelectionSupport: true, filter: this.filter, sorter: this.instantiationService.createInstance(FileSorter), - dnd: this.instantiationService.createInstance(FileDragAndDrop), + dnd: this.instantiationService.createInstance(FileDragAndDrop, (item) => this.isItemCollapsed(item)), + collapseByDefault: (e) => { + if (e instanceof ExplorerItem) { + if (e.hasNests && getFileNestingSettings(e).expand) { + return false; + } + } + return true; + }, autoExpandSingleChildren: true, + expandOnlyOnTwistieClick: (e: unknown) => { + if (e instanceof ExplorerItem) { + if (e.hasNests) { + return true; + } + else if (this.configurationService.getValue<'singleClick' | 'doubleClick'>('workbench.tree.expandMode') === 'doubleClick') { + return true; + } + } + return false; + }, additionalScrollHeight: ExplorerDelegate.ITEM_HEIGHT, overrideStyles: { listBackground: SIDE_BAR_BACKGROUND @@ -450,14 +488,19 @@ export class ExplorerView extends ViewPane { return; } this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'explorer' }); - await this.editorService.openEditor({ resource: element.resource, options: { preserveFocus: e.editorOptions.preserveFocus, pinned: e.editorOptions.pinned } }, e.sideBySide ? SIDE_GROUP : ACTIVE_GROUP); + try { + this.delegate.willOpenElement(e.browserEvent); + await this.editorService.openEditor({ resource: element.resource, options: { preserveFocus: e.editorOptions.preserveFocus, pinned: e.editorOptions.pinned, source: EditorOpenSource.USER } }, e.sideBySide ? SIDE_GROUP : ACTIVE_GROUP); + } finally { + this.delegate.didOpenElement(); + } } })); this._register(this.tree.onContextMenu(e => this.onContextMenu(e))); this._register(this.tree.onDidScroll(async e => { - let editable = this.explorerService.getEditable(); + const editable = this.explorerService.getEditable(); if (e.scrollTopChanged && editable && this.tree.getRelativeTop(editable.stat) === null) { await editable.data.onFinish('', false); } @@ -467,9 +510,18 @@ export class ExplorerView extends ViewPane { const element = e.node.element?.element; if (element) { const navigationController = this.renderer.getCompressedNavigationController(element instanceof Array ? element[0] : element); - if (navigationController) { - navigationController.updateCollapsed(e.node.collapsed); - } + navigationController?.updateCollapsed(e.node.collapsed); + } + // Update showing expand / collapse button + this.updateAnyCollapsedContext(); + })); + + this.updateAnyCollapsedContext(); + + this._register(this.tree.onMouseDblClick(e => { + if (e.element === null) { + // click in empty area -> create a new file #116676 + this.commandService.executeCommand(NEW_FILE_COMMAND_ID); } })); @@ -491,16 +543,17 @@ export class ExplorerView extends ViewPane { } private setContextKeys(stat: ExplorerItem | null | undefined): void { - const isSingleFolder = this.contextService.getWorkbenchState() === WorkbenchState.FOLDER; - const resource = stat ? stat.resource : isSingleFolder ? this.contextService.getWorkspace().folders[0].uri : null; + const folders = this.contextService.getWorkspace().folders; + const resource = stat ? stat.resource : folders[folders.length - 1].uri; + stat = stat || this.explorerService.findClosest(resource); this.resourceContext.set(resource); - this.folderContext.set((isSingleFolder && !stat) || !!stat && stat.isDirectory); + this.folderContext.set(!!stat && stat.isDirectory); this.readonlyContext.set(!!stat && stat.isReadonly); - this.rootContext.set(!stat || (stat && stat.isRoot)); + this.rootContext.set(!!stat && stat.isRoot); if (resource) { - const overrides = resource ? this.editorService.getEditorOverrides(resource, undefined, undefined) : []; - this.availableEditorIdsContext.set(overrides.map(([, entry]) => entry.id).join(',')); + const overrides = resource ? this.editorResolverService.getEditors(resource).map(editor => editor.id) : []; + this.availableEditorIdsContext.set(overrides.join(',')); } else { this.availableEditorIdsContext.reset(); } @@ -508,7 +561,7 @@ export class ExplorerView extends ViewPane { private async onContextMenu(e: ITreeContextMenuEvent): Promise { const disposables = new DisposableStore(); - let stat = e.element; + const stat = e.element; let anchor = e.anchor; // Compressed folders @@ -583,13 +636,12 @@ export class ExplorerView extends ViewPane { // General methods /** - * Refresh the contents of the explorer to get up to date data from the disk about the file structure. - * If the item is passed we refresh only that level of the tree, otherwise we do a full refresh. - */ + * Refresh the contents of the explorer to get up to date data from the disk about the file structure. + * If the item is passed we refresh only that level of the tree, otherwise we do a full refresh. + */ refresh(recursive: boolean, item?: ExplorerItem, cancelEditing: boolean = true): Promise { if (!this.tree || !this.isBodyVisible() || (item && !this.tree.hasNode(item))) { - // Tree node doesn't exist yet - this.shouldRefresh = true; + // Tree node doesn't exist yet, when it becomes visible we will refresh return Promise.resolve(undefined); } @@ -598,34 +650,12 @@ export class ExplorerView extends ViewPane { } const toRefresh = item || this.tree.getInput(); - return this.tree.updateChildren(toRefresh, recursive); - } - - focusNeighbourIfItemFocused(item: ExplorerItem): void { - const focus = this.tree.getFocus(); - if (focus.length !== 1) { - return; - } - const compressedController = this.renderer.getCompressedNavigationController(focus[0]) || this.renderer.getCompressedNavigationController(item); - const indexOfItem = compressedController?.items.indexOf(item) || -1; - const itemsCompressedTogether = compressedController && (compressedController.items.indexOf(focus[0]) >= 0) && (indexOfItem >= 0); - - if (focus[0] === item || itemsCompressedTogether) { - if (itemsCompressedTogether && indexOfItem > 0 && item.parent) { - // In case of compact items just focus the parent if it is part of the compact item. So the focus stays - this.tree.setFocus([item.parent]); - } else { - this.tree.focusNext(); - const newFocus = this.tree.getFocus(); - if (newFocus.length === 1 && newFocus[0] === item) { - // There was no next item to focus, focus the previous one - this.tree.focusPrevious(); - } - } - } + return this.tree.updateChildren(toRefresh, recursive, false, { + diffIdentityProvider: identityProvider + }); } - getOptimalWidth(): number { + override getOptimalWidth(): number { const parentNode = this.tree.getHTMLElement(); const childNodes = ([] as HTMLElement[]).slice.call(parentNode.querySelectorAll('.explorer-item .label-name')); // select all file labels @@ -634,13 +664,12 @@ export class ExplorerView extends ViewPane { async setTreeInput(): Promise { if (!this.isBodyVisible()) { - this.shouldRefresh = true; return Promise.resolve(undefined); } const initialInputSetup = !this.tree.getInput(); if (initialInputSetup) { - perf.mark('willResolveExplorer'); + perf.mark('code/willResolveExplorer'); } const roots = this.explorerService.roots; let input: ExplorerItem | ExplorerItem[] = roots[0]; @@ -660,33 +689,42 @@ export class ExplorerView extends ViewPane { } const previousInput = this.tree.getInput(); - const promise = this.tree.setInput(input, viewState).then(() => { + const promise = this.tree.setInput(input, viewState).then(async () => { if (Array.isArray(input)) { if (!viewState || previousInput instanceof ExplorerItem) { - // There is no view state for this workspace, expand all roots. Or we transitioned from a folder workspace. - input.forEach(async item => { + // There is no view state for this workspace (we transitioned from a folder workspace?), expand all roots. + await Promise.all(input.map(async item => { try { await this.tree.expand(item); } catch (e) { } - }); + })); } - if (Array.isArray(previousInput) && previousInput.length < input.length) { + // Reloaded or transitioned from an empty workspace, but only have a single folder in the workspace. + if (!previousInput && input.length === 1 && this.configurationService.getValue().explorer.expandSingleFolderWorkspaces) { + await this.tree.expand(input[0]).catch(() => { }); + } + if (Array.isArray(previousInput)) { + const previousRoots = new ResourceMap(); + previousInput.forEach(previousRoot => previousRoots.set(previousRoot.resource, true)); + // Roots added to the explorer -> expand them. - input.slice(previousInput.length).forEach(async item => { - try { - await this.tree.expand(item); - } catch (e) { } - }); + await Promise.all(input.map(async item => { + if (!previousRoots.has(item.resource)) { + try { + await this.tree.expand(item); + } catch (e) { } + } + })); } } if (initialInputSetup) { - perf.mark('didResolveExplorer'); + perf.mark('code/didResolveExplorer'); } }); this.progressService.withProgress({ location: ProgressLocation.Explorer, - delay: this.layoutService.isRestored() ? 800 : 1200 // less ugly initial startup + delay: this.layoutService.isRestored() ? 800 : 1500 // reduce progress visibility when still restoring }, _progress => promise); await promise; @@ -707,9 +745,7 @@ export class ExplorerView extends ViewPane { } // Expand all stats in the parent chain. - let item: ExplorerItem | undefined = this.explorerService.roots.filter(i => this.uriIdentityService.extUri.isEqualOrParent(resource, i.resource)) - // Take the root that is the closest to the stat #72299 - .sort((first, second) => second.resource.path.length - first.resource.path.length)[0]; + let item: ExplorerItem | null = this.explorerService.findClosestRoot(resource); while (item && item.resource.toString() !== resource.toString()) { try { @@ -718,12 +754,12 @@ export class ExplorerView extends ViewPane { return this.selectResource(resource, reveal, retry + 1); } - for (let child of item.children.values()) { + for (const child of item.children.values()) { if (this.uriIdentityService.extUri.isEqualOrParent(resource, child.resource)) { item = child; break; } - item = undefined; + item = null; } } @@ -752,14 +788,20 @@ export class ExplorerView extends ViewPane { itemsCopied(stats: ExplorerItem[], cut: boolean, previousCut: ExplorerItem[] | undefined): void { this.fileCopiedContextKey.set(stats.length > 0); this.resourceCutContextKey.set(cut && stats.length > 0); - if (previousCut) { - previousCut.forEach(item => this.tree.rerender(item)); - } + previousCut?.forEach(item => this.tree.rerender(item)); if (cut) { stats.forEach(s => this.tree.rerender(s)); } } + expandAll(): void { + if (this.explorerService.isEditable(undefined)) { + this.tree.domFocus(); + } + + this.tree.expandAll(); + } + collapseAll(): void { if (this.explorerService.isEditable(undefined)) { this.tree.domFocus(); @@ -828,6 +870,16 @@ export class ExplorerView extends ViewPane { this.compressedFocusLastContext.set(controller.index === controller.count - 1); } + private updateAnyCollapsedContext(): void { + const treeInput = this.tree.getInput(); + if (treeInput === undefined) { + return; + } + const treeInputArray = Array.isArray(treeInput) ? treeInput : Array.from(treeInput.children.values()); + // Has collapsible root when anything is expanded + this.viewHasSomeCollapsibleRootItem.set(hasExpandedNode(this.tree, treeInputArray)); + } + styleListDropBackground(styles: IExplorerViewStyles): void { const content: string[] = []; @@ -841,7 +893,7 @@ export class ExplorerView extends ViewPane { } } - dispose(): void { + override dispose(): void { if (this.dragHandler) { this.dragHandler.dispose(); } @@ -861,3 +913,96 @@ function createFileIconThemableTreeContainerScope(container: HTMLElement, themeS onDidChangeFileIconTheme(themeService.getFileIconTheme()); return themeService.onDidFileIconThemeChange(onDidChangeFileIconTheme); } + +registerAction2(class extends Action2 { + constructor() { + super({ + id: 'workbench.files.action.createFileFromExplorer', + title: nls.localize('createNewFile', "New File"), + f1: false, + icon: Codicon.newFile, + precondition: ExplorerResourceNotReadonlyContext, + menu: { + id: MenuId.ViewTitle, + group: 'navigation', + when: ContextKeyExpr.equals('view', VIEW_ID), + order: 10 + } + }); + } + + run(accessor: ServicesAccessor): void { + const commandService = accessor.get(ICommandService); + commandService.executeCommand(NEW_FILE_COMMAND_ID); + } +}); + +registerAction2(class extends Action2 { + constructor() { + super({ + id: 'workbench.files.action.createFolderFromExplorer', + title: nls.localize('createNewFolder', "New Folder"), + f1: false, + icon: Codicon.newFolder, + precondition: ExplorerResourceNotReadonlyContext, + menu: { + id: MenuId.ViewTitle, + group: 'navigation', + when: ContextKeyExpr.equals('view', VIEW_ID), + order: 20 + } + }); + } + + run(accessor: ServicesAccessor): void { + const commandService = accessor.get(ICommandService); + commandService.executeCommand(NEW_FOLDER_COMMAND_ID); + } +}); + +registerAction2(class extends Action2 { + constructor() { + super({ + id: 'workbench.files.action.refreshFilesExplorer', + title: { value: nls.localize('refreshExplorer', "Refresh Explorer"), original: 'Refresh Explorer' }, + f1: true, + icon: Codicon.refresh, + menu: { + id: MenuId.ViewTitle, + group: 'navigation', + when: ContextKeyExpr.equals('view', VIEW_ID), + order: 30 + } + }); + } + + async run(accessor: ServicesAccessor): Promise { + const paneCompositeService = accessor.get(IPaneCompositePartService); + const explorerService = accessor.get(IExplorerService); + await paneCompositeService.openPaneComposite(VIEWLET_ID, ViewContainerLocation.Sidebar); + await explorerService.refresh(); + } +}); + +registerAction2(class extends Action2 { + constructor() { + super({ + id: 'workbench.files.action.collapseExplorerFolders', + title: { value: nls.localize('collapseExplorerFolders', "Collapse Folders in Explorer"), original: 'Collapse Folders in Explorer' }, + f1: true, + icon: Codicon.collapseAll, + menu: { + id: MenuId.ViewTitle, + group: 'navigation', + when: ContextKeyExpr.equals('view', VIEW_ID), + order: 40 + } + }); + } + + run(accessor: ServicesAccessor) { + const viewsService = accessor.get(IViewsService); + const explorerView = viewsService.getViewWithId(VIEW_ID) as ExplorerView; + explorerView.collapseAll(); + } +}); diff --git a/vscode-web-gogs1s/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts b/vscode-web-gogs1s/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts deleted file mode 100644 index 8bbce2d..0000000 --- a/vscode-web-gogs1s/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts +++ /dev/null @@ -1,403 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -// import { localize } from 'vs/nls'; -import { URI } from 'vs/base/common/uri'; -import { EncodingMode, IFileEditorInput, Verbosity, GroupIdentifier, IMoveResult, isTextEditorPane } from 'vs/workbench/common/editor'; -import { AbstractTextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput'; -import { BinaryEditorModel } from 'vs/workbench/common/editor/binaryEditorModel'; -import { FileOperationError, FileOperationResult, IFileService } from 'vs/platform/files/common/files'; -import { ITextFileService, TextFileEditorModelState, TextFileLoadReason, TextFileOperationError, TextFileOperationResult, ITextFileEditorModel } from 'vs/workbench/services/textfile/common/textfiles'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IReference, dispose, DisposableStore } from 'vs/base/common/lifecycle'; -import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { FILE_EDITOR_INPUT_ID, TEXT_FILE_EDITOR_ID, BINARY_FILE_EDITOR_ID } from 'vs/workbench/contrib/files/common/files'; -import { ILabelService } from 'vs/platform/label/common/label'; -import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { isEqual } from 'vs/base/common/resources'; -import { Event } from 'vs/base/common/event'; -import { IEditorViewState } from 'vs/editor/common/editorCommon'; -import { Schemas } from 'vs/base/common/network'; - -const enum ForceOpenAs { - None, - Text, - Binary -} - -/** - * A file editor input is the input type for the file editor of file system resources. - */ -export class FileEditorInput extends AbstractTextResourceEditorInput implements IFileEditorInput { - - private preferredName: string | undefined; - private preferredDescription: string | undefined; - private preferredEncoding: string | undefined; - private preferredMode: string | undefined; - - private forceOpenAs: ForceOpenAs = ForceOpenAs.None; - - private model: ITextFileEditorModel | undefined = undefined; - private cachedTextFileModelReference: IReference | undefined = undefined; - - private readonly modelListeners: DisposableStore = this._register(new DisposableStore()); - - constructor( - resource: URI, - preferredResource: URI | undefined, - preferredName: string | undefined, - preferredDescription: string | undefined, - preferredEncoding: string | undefined, - preferredMode: string | undefined, - @IInstantiationService private readonly instantiationService: IInstantiationService, - @ITextFileService textFileService: ITextFileService, - @ITextModelService private readonly textModelResolverService: ITextModelService, - @ILabelService labelService: ILabelService, - @IFileService fileService: IFileService, - @IFilesConfigurationService filesConfigurationService: IFilesConfigurationService, - @IEditorService editorService: IEditorService, - @IEditorGroupsService editorGroupService: IEditorGroupsService - ) { - super(resource, preferredResource, editorService, editorGroupService, textFileService, labelService, fileService, filesConfigurationService); - - this.model = this.textFileService.files.get(resource); - - if (preferredName) { - this.setPreferredName(preferredName); - } - - if (preferredDescription) { - this.setPreferredDescription(preferredDescription); - } - - if (preferredEncoding) { - this.setPreferredEncoding(preferredEncoding); - } - - if (preferredMode) { - this.setPreferredMode(preferredMode); - } - - // If a file model already exists, make sure to wire it in - if (this.model) { - this.registerModelListeners(this.model); - } - } - - protected registerListeners(): void { - super.registerListeners(); - - // Attach to model that matches our resource once created - this._register(this.textFileService.files.onDidCreate(model => this.onDidCreateTextFileModel(model))); - } - - private onDidCreateTextFileModel(model: ITextFileEditorModel): void { - - // Once the text file model is created, we keep it inside - // the input to be able to implement some methods properly - if (isEqual(model.resource, this.resource)) { - this.model = model; - - this.registerModelListeners(model); - } - } - - private registerModelListeners(model: ITextFileEditorModel): void { - - // Clear any old - this.modelListeners.clear(); - - // re-emit some events from the model - this.modelListeners.add(model.onDidChangeDirty(() => this._onDidChangeDirty.fire())); - this.modelListeners.add(model.onDidChangeOrphaned(() => this._onDidChangeLabel.fire())); - - // important: treat save errors as potential dirty change because - // a file that is in save conflict or error will report dirty even - // if auto save is turned on. - this.modelListeners.add(model.onDidSaveError(() => this._onDidChangeDirty.fire())); - - // remove model association once it gets disposed - this.modelListeners.add(Event.once(model.onDispose)(() => { - this.modelListeners.clear(); - this.model = undefined; - })); - } - - getTypeId(): string { - return FILE_EDITOR_INPUT_ID; - } - - getName(): string { - return this.preferredName || this.decorateLabel(super.getName()); - } - - setPreferredName(name: string): void { - if (!this.allowLabelOverride()) { - return; // block for specific schemes we own - } - - if (this.preferredName !== name) { - this.preferredName = name; - - this._onDidChangeLabel.fire(); - } - } - - private allowLabelOverride(): boolean { - return this.resource.scheme !== Schemas.file && this.resource.scheme !== Schemas.vscodeRemote && this.resource.scheme !== Schemas.userData; - } - - getPreferredName(): string | undefined { - return this.preferredName; - } - - getDescription(verbosity?: Verbosity): string | undefined { - return this.preferredDescription || super.getDescription(verbosity); - } - - setPreferredDescription(description: string): void { - if (!this.allowLabelOverride()) { - return; // block for specific schemes we own - } - - if (this.preferredDescription !== description) { - this.preferredDescription = description; - - this._onDidChangeLabel.fire(); - } - } - - getPreferredDescription(): string | undefined { - return this.preferredDescription; - } - - getTitle(verbosity: Verbosity): string { - switch (verbosity) { - case Verbosity.SHORT: - return this.decorateLabel(super.getName()); - case Verbosity.MEDIUM: - case Verbosity.LONG: - return this.decorateLabel(super.getTitle(verbosity)); - } - } - - private decorateLabel(label: string): string { - // modify-by-github1s, remove read-only tips - // const orphaned = this.model?.hasState(TextFileEditorModelState.ORPHAN); - // const readonly = this.isReadonly(); - - // if (orphaned && readonly) { - // return localize('orphanedReadonlyFile', "{0} (deleted, read-only)", label); - // } - - // if (orphaned) { - // return localize('orphanedFile', "{0} (deleted)", label); - // } - - // if (readonly) { - // return localize('readonlyFile', "{0} (read-only)", label); - // } - - return label; - } - - getEncoding(): string | undefined { - if (this.model) { - return this.model.getEncoding(); - } - - return this.preferredEncoding; - } - - getPreferredEncoding(): string | undefined { - return this.preferredEncoding; - } - - setEncoding(encoding: string, mode: EncodingMode): void { - this.setPreferredEncoding(encoding); - - this.model?.setEncoding(encoding, mode); - } - - setPreferredEncoding(encoding: string): void { - this.preferredEncoding = encoding; - - // encoding is a good hint to open the file as text - this.setForceOpenAsText(); - } - - getPreferredMode(): string | undefined { - return this.preferredMode; - } - - setMode(mode: string): void { - this.setPreferredMode(mode); - - this.model?.setMode(mode); - } - - setPreferredMode(mode: string): void { - this.preferredMode = mode; - - // mode is a good hint to open the file as text - this.setForceOpenAsText(); - } - - setForceOpenAsText(): void { - this.forceOpenAs = ForceOpenAs.Text; - } - - setForceOpenAsBinary(): void { - this.forceOpenAs = ForceOpenAs.Binary; - } - - isDirty(): boolean { - return !!(this.model?.isDirty()); - } - - isReadonly(): boolean { - if (this.model) { - return this.model.isReadonly(); - } - - return super.isReadonly(); - } - - isSaving(): boolean { - if (this.model?.hasState(TextFileEditorModelState.SAVED) || this.model?.hasState(TextFileEditorModelState.CONFLICT) || this.model?.hasState(TextFileEditorModelState.ERROR)) { - return false; // require the model to be dirty and not in conflict or error state - } - - // Note: currently not checking for ModelState.PENDING_SAVE for a reason - // because we currently miss an event for this state change on editors - // and it could result in bad UX where an editor can be closed even though - // it shows up as dirty and has not finished saving yet. - - return super.isSaving(); - } - - getPreferredEditorId(candidates: string[]): string { - return this.forceOpenAs === ForceOpenAs.Binary ? BINARY_FILE_EDITOR_ID : TEXT_FILE_EDITOR_ID; - } - - resolve(): Promise { - - // Resolve as binary - if (this.forceOpenAs === ForceOpenAs.Binary) { - return this.doResolveAsBinary(); - } - - // Resolve as text - return this.doResolveAsText(); - } - - private async doResolveAsText(): Promise { - try { - - // Resolve resource via text file service and only allow - // to open binary files if we are instructed so - await this.textFileService.files.resolve(this.resource, { - mode: this.preferredMode, - encoding: this.preferredEncoding, - reload: { async: true }, // trigger a reload of the model if it exists already but do not wait to show the model - allowBinary: this.forceOpenAs === ForceOpenAs.Text, - reason: TextFileLoadReason.EDITOR - }); - - // This is a bit ugly, because we first resolve the model and then resolve a model reference. the reason being that binary - // or very large files do not resolve to a text file model but should be opened as binary files without text. First calling into - // resolve() ensures we are not creating model references for these kind of resources. - // In addition we have a bit of payload to take into account (encoding, reload) that the text resolver does not handle yet. - if (!this.cachedTextFileModelReference) { - this.cachedTextFileModelReference = await this.textModelResolverService.createModelReference(this.resource) as IReference; - } - - const model = this.cachedTextFileModelReference.object; - - // It is possible that this input was disposed before the model - // finished resolving. As such, we need to make sure to dispose - // the model reference to not leak it. - if (this.isDisposed()) { - this.disposeModelReference(); - } - - return model; - } catch (error) { - - // In case of an error that indicates that the file is binary or too large, just return with the binary editor model - if ( - (error).textFileOperationResult === TextFileOperationResult.FILE_IS_BINARY || - (error).fileOperationResult === FileOperationResult.FILE_TOO_LARGE - ) { - return this.doResolveAsBinary(); - } - - // Bubble any other error up - throw error; - } - } - - private async doResolveAsBinary(): Promise { - return this.instantiationService.createInstance(BinaryEditorModel, this.preferredResource, this.getName()).load(); - } - - isResolved(): boolean { - return !!this.model; - } - - rename(group: GroupIdentifier, target: URI): IMoveResult { - return { - editor: { - resource: target, - encoding: this.getEncoding(), - options: { - viewState: this.getViewStateFor(group) - } - } - }; - } - - private getViewStateFor(group: GroupIdentifier): IEditorViewState | undefined { - for (const editorPane of this.editorService.visibleEditorPanes) { - if (editorPane.group.id === group && isEqual(editorPane.input.resource, this.resource)) { - if (isTextEditorPane(editorPane)) { - return editorPane.getViewState(); - } - } - } - - return undefined; - } - - matches(otherInput: unknown): boolean { - if (otherInput === this) { - return true; - } - - if (otherInput instanceof FileEditorInput) { - return isEqual(otherInput.resource, this.resource); - } - - return false; - } - - dispose(): void { - - // Model - this.model = undefined; - - // Model reference - this.disposeModelReference(); - - super.dispose(); - } - - private disposeModelReference(): void { - dispose(this.cachedTextFileModelReference); - this.cachedTextFileModelReference = undefined; - } -} diff --git a/vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts b/vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts index 0f5d88f..a9b2112 100644 --- a/vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts +++ b/vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts @@ -11,12 +11,11 @@ import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/commo import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; import { IFileService } from 'vs/platform/files/common/files'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; -import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; const TRUSTED_DOMAINS_URI = URI.parse('trustedDomains:/Trusted Domains'); @@ -31,16 +30,12 @@ export const manageTrustedDomainSettingsCommand = { }, handler: async (accessor: ServicesAccessor) => { const editorService = accessor.get(IEditorService); - editorService.openEditor({ resource: TRUSTED_DOMAINS_URI, mode: 'jsonc', options: { pinned: true } }); + editorService.openEditor({ resource: TRUSTED_DOMAINS_URI, languageId: 'jsonc', options: { pinned: true } }); return; } }; -type ConfigureTrustedDomainsQuickPickItem = IQuickPickItem & ({ id: 'manage'; } | { id: 'trust'; toTrust: string }); - -type ConfigureTrustedDomainsChoiceClassification = { - choice: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; -}; +type ConfigureTrustedDomainsQuickPickItem = IQuickPickItem & ({ id: 'manage' } | { id: 'trust'; toTrust: string }); export async function configureOpenerTrustedDomainsHandler( trustedDomains: string[], @@ -50,8 +45,6 @@ export async function configureOpenerTrustedDomainsHandler( storageService: IStorageService, editorService: IEditorService, telemetryService: ITelemetryService, - notificationService: INotificationService, - clipboardService: IClipboardService, ) { const parsedDomainToConfigure = URI.parse(domainToConfigure); const toplevelDomainSegements = parsedDomainToConfigure.authority.split('.'); @@ -108,34 +101,28 @@ export async function configureOpenerTrustedDomainsHandler( ); if (pickedResult && pickedResult.id) { - telemetryService.publicLog2<{ choice: string }, ConfigureTrustedDomainsChoiceClassification>( - 'trustedDomains.configureTrustedDomainsQuickPickChoice', - { choice: pickedResult.id } - ); - switch (pickedResult.id) { case 'manage': await editorService.openEditor({ - resource: TRUSTED_DOMAINS_URI, - mode: 'jsonc', + resource: TRUSTED_DOMAINS_URI.with({ fragment: resource.toString() }), + languageId: 'jsonc', options: { pinned: true } }); - notificationService.prompt(Severity.Info, localize('configuringURL', "Configuring trust for: {0}", resource.toString()), - [{ label: 'Copy', run: () => clipboardService.writeText(resource.toString()) }]); return trustedDomains; - case 'trust': + case 'trust': { const itemToTrust = pickedResult.toTrust; if (trustedDomains.indexOf(itemToTrust) === -1) { - storageService.remove(TRUSTED_DOMAINS_CONTENT_STORAGE_KEY, StorageScope.GLOBAL); + storageService.remove(TRUSTED_DOMAINS_CONTENT_STORAGE_KEY, StorageScope.APPLICATION); storageService.store( TRUSTED_DOMAINS_STORAGE_KEY, JSON.stringify([...trustedDomains, itemToTrust]), - StorageScope.GLOBAL, + StorageScope.APPLICATION, StorageTarget.USER ); return [...trustedDomains, itemToTrust]; } + } } } @@ -162,14 +149,18 @@ async function getRemotes(fileService: IFileService, textFileService: ITextFileS const domains = await Promise.race([ new Promise(resolve => setTimeout(() => resolve([]), 2000)), Promise.all(workspaceUris.map(async workspaceUri => { - const path = workspaceUri.path; - const uri = workspaceUri.with({ path: `${path !== '/' ? path : ''}/.git/config` }); - const exists = await fileService.exists(uri); - if (!exists) { + try { + const path = workspaceUri.path; + const uri = workspaceUri.with({ path: `${path !== '/' ? path : ''}/.git/config` }); + const exists = await fileService.exists(uri); + if (!exists) { + return []; + } + const gitConfig = (await (textFileService.read(uri, { acceptTextOnly: true }).catch(() => ({ value: '' })))).value; + return extractGitHubRemotesFromGitConfig(gitConfig); + } catch { return []; } - const gitConfig = (await (textFileService.read(uri, { acceptTextOnly: true }).catch(() => ({ value: '' })))).value; - return extractGitHubRemotesFromGitConfig(gitConfig); }))]); const set = domains.reduce((set, list) => list.reduce((set, item) => set.add(item), set), new Set()); @@ -222,6 +213,7 @@ const gogs1sDefaultTrustedDomains = [ export function readStaticTrustedDomains(accessor: ServicesAccessor): IStaticTrustedDomains { const storageService = accessor.get(IStorageService); const productService = accessor.get(IProductService); + const environmentService = accessor.get(IBrowserWorkbenchEnvironmentService); const defaultTrustedDomains: string[] = productService.linkProtectionTrustedDomains ? [...productService.linkProtectionTrustedDomains, ...gogs1sDefaultTrustedDomains] @@ -229,7 +221,7 @@ export function readStaticTrustedDomains(accessor: ServicesAccessor): IStaticTru let trustedDomains: string[] = []; try { - const trustedDomainsSrc = storageService.get(TRUSTED_DOMAINS_STORAGE_KEY, StorageScope.GLOBAL); + const trustedDomainsSrc = storageService.get(TRUSTED_DOMAINS_STORAGE_KEY, StorageScope.APPLICATION); if (trustedDomainsSrc) { trustedDomains = JSON.parse(trustedDomainsSrc); } diff --git a/vscode-web-gogs1s/src/vs/workbench/services/themes/common/themeConfiguration.ts b/vscode-web-gogs1s/src/vs/workbench/services/themes/common/themeConfiguration.ts deleted file mode 100644 index f681f76..0000000 --- a/vscode-web-gogs1s/src/vs/workbench/services/themes/common/themeConfiguration.ts +++ /dev/null @@ -1,351 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as nls from 'vs/nls'; -import * as types from 'vs/base/common/types'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { IConfigurationRegistry, Extensions as ConfigurationExtensions, IConfigurationPropertySchema, IConfigurationNode, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; - -import { IJSONSchema } from 'vs/base/common/jsonSchema'; -import { textmateColorsSchemaId, textmateColorGroupSchemaId } from 'vs/workbench/services/themes/common/colorThemeSchema'; -import { workbenchColorsSchemaId } from 'vs/platform/theme/common/colorRegistry'; -import { tokenStylingSchemaId } from 'vs/platform/theme/common/tokenClassificationRegistry'; -import { ThemeSettings, IWorkbenchColorTheme, IWorkbenchFileIconTheme, IColorCustomizations, ITokenColorCustomizations, IWorkbenchProductIconTheme, ISemanticTokenColorCustomizations, IExperimentalSemanticTokenColorCustomizations } from 'vs/workbench/services/themes/common/workbenchThemeService'; -import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; -// modify-by-github1s, default dark theme -import { isMacintosh, isWindows } from 'vs/base/common/platform'; - -const DEFAULT_THEME_DARK_SETTING_VALUE = 'Default Dark+'; -const DEFAULT_THEME_LIGHT_SETTING_VALUE = 'Default Light+'; -const DEFAULT_THEME_HC_SETTING_VALUE = 'Default High Contrast'; - -const DEFAULT_FILE_ICON_THEME_SETTING_VALUE = 'vs-seti'; - -export const DEFAULT_PRODUCT_ICON_THEME_SETTING_VALUE = 'Default'; - -// Configuration: Themes -const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); - -const colorThemeSettingEnum: string[] = []; -const colorThemeSettingEnumItemLabels: string[] = []; -const colorThemeSettingEnumDescriptions: string[] = []; - -const colorThemeSettingSchema: IConfigurationPropertySchema = { - type: 'string', - description: nls.localize('colorTheme', "Specifies the color theme used in the workbench."), - // modify-by-github1s, default dark theme - default: DEFAULT_THEME_DARK_SETTING_VALUE, - enum: colorThemeSettingEnum, - enumDescriptions: colorThemeSettingEnumDescriptions, - enumItemLabels: colorThemeSettingEnumItemLabels, - errorMessage: nls.localize('colorThemeError', "Theme is unknown or not installed."), -}; -const preferredDarkThemeSettingSchema: IConfigurationPropertySchema = { - type: 'string', // - markdownDescription: nls.localize({ key: 'preferredDarkColorTheme', comment: ['`#{0}#` will become a link to an other setting. Do not remove backtick or #'] }, 'Specifies the preferred color theme for dark OS appearance when `#{0}#` is enabled.', ThemeSettings.DETECT_COLOR_SCHEME), - default: DEFAULT_THEME_DARK_SETTING_VALUE, - enum: colorThemeSettingEnum, - enumDescriptions: colorThemeSettingEnumDescriptions, - enumItemLabels: colorThemeSettingEnumItemLabels, - errorMessage: nls.localize('colorThemeError', "Theme is unknown or not installed."), -}; -const preferredLightThemeSettingSchema: IConfigurationPropertySchema = { - type: 'string', - markdownDescription: nls.localize({ key: 'preferredLightColorTheme', comment: ['`#{0}#` will become a link to an other setting. Do not remove backtick or #'] }, 'Specifies the preferred color theme for light OS appearance when `#{0}#` is enabled.', ThemeSettings.DETECT_COLOR_SCHEME), - default: DEFAULT_THEME_LIGHT_SETTING_VALUE, - enum: colorThemeSettingEnum, - enumDescriptions: colorThemeSettingEnumDescriptions, - enumItemLabels: colorThemeSettingEnumItemLabels, - errorMessage: nls.localize('colorThemeError', "Theme is unknown or not installed."), -}; -const preferredHCThemeSettingSchema: IConfigurationPropertySchema = { - type: 'string', - markdownDescription: nls.localize({ key: 'preferredHCColorTheme', comment: ['`#{0}#` will become a link to an other setting. Do not remove backtick or #'] }, 'Specifies the preferred color theme used in high contrast mode when `#{0}#` is enabled.', ThemeSettings.DETECT_HC), - default: DEFAULT_THEME_HC_SETTING_VALUE, - enum: colorThemeSettingEnum, - enumDescriptions: colorThemeSettingEnumDescriptions, - enumItemLabels: colorThemeSettingEnumItemLabels, - included: isWindows || isMacintosh, - errorMessage: nls.localize('colorThemeError', "Theme is unknown or not installed."), -}; -const detectColorSchemeSettingSchema: IConfigurationPropertySchema = { - type: 'boolean', - description: nls.localize('detectColorScheme', 'If set, automatically switch to the preferred color theme based on the OS appearance.'), - default: false -}; - -const colorCustomizationsSchema: IConfigurationPropertySchema = { - type: 'object', - description: nls.localize('workbenchColors', "Overrides colors from the currently selected color theme."), - allOf: [{ $ref: workbenchColorsSchemaId }], - default: {}, - defaultSnippets: [{ - body: { - } - }] -}; -const fileIconThemeSettingSchema: IConfigurationPropertySchema = { - type: ['string', 'null'], - default: DEFAULT_FILE_ICON_THEME_SETTING_VALUE, - description: nls.localize('iconTheme', "Specifies the file icon theme used in the workbench or 'null' to not show any file icons."), - enum: [null], - enumItemLabels: [nls.localize('noIconThemeLabel', 'None')], - enumDescriptions: [nls.localize('noIconThemeDesc', 'No file icons')], - errorMessage: nls.localize('iconThemeError', "File icon theme is unknown or not installed.") -}; -const productIconThemeSettingSchema: IConfigurationPropertySchema = { - type: ['string', 'null'], - default: DEFAULT_PRODUCT_ICON_THEME_SETTING_VALUE, - description: nls.localize('productIconTheme', "Specifies the product icon theme used."), - enum: [DEFAULT_PRODUCT_ICON_THEME_SETTING_VALUE], - enumItemLabels: [nls.localize('defaultProductIconThemeLabel', 'Default')], - enumDescriptions: [nls.localize('defaultProductIconThemeDesc', 'Default')], - errorMessage: nls.localize('productIconThemeError', "Product icon theme is unknown or not installed.") -}; - -const detectHCSchemeSettingSchema: IConfigurationPropertySchema = { - type: 'boolean', - default: true, - description: nls.localize('autoDetectHighContrast', "If enabled, will automatically change to high contrast theme if the OS is using a high contrast theme."), - scope: ConfigurationScope.APPLICATION -}; - -const themeSettingsConfiguration: IConfigurationNode = { - id: 'workbench', - order: 7.1, - type: 'object', - properties: { - [ThemeSettings.COLOR_THEME]: colorThemeSettingSchema, - [ThemeSettings.PREFERRED_DARK_THEME]: preferredDarkThemeSettingSchema, - [ThemeSettings.PREFERRED_LIGHT_THEME]: preferredLightThemeSettingSchema, - [ThemeSettings.PREFERRED_HC_THEME]: preferredHCThemeSettingSchema, - [ThemeSettings.FILE_ICON_THEME]: fileIconThemeSettingSchema, - [ThemeSettings.COLOR_CUSTOMIZATIONS]: colorCustomizationsSchema, - [ThemeSettings.PRODUCT_ICON_THEME]: productIconThemeSettingSchema - } -}; -configurationRegistry.registerConfiguration(themeSettingsConfiguration); - -const themeSettingsWindowConfiguration: IConfigurationNode = { - id: 'window', - order: 8.1, - type: 'object', - properties: { - [ThemeSettings.DETECT_HC]: detectHCSchemeSettingSchema, - [ThemeSettings.DETECT_COLOR_SCHEME]: detectColorSchemeSettingSchema, - } -}; -configurationRegistry.registerConfiguration(themeSettingsWindowConfiguration); - -function tokenGroupSettings(description: string): IJSONSchema { - return { - description, - $ref: textmateColorGroupSchemaId - }; -} - -const tokenColorSchema: IJSONSchema = { - properties: { - comments: tokenGroupSettings(nls.localize('editorColors.comments', "Sets the colors and styles for comments")), - strings: tokenGroupSettings(nls.localize('editorColors.strings', "Sets the colors and styles for strings literals.")), - keywords: tokenGroupSettings(nls.localize('editorColors.keywords', "Sets the colors and styles for keywords.")), - numbers: tokenGroupSettings(nls.localize('editorColors.numbers', "Sets the colors and styles for number literals.")), - types: tokenGroupSettings(nls.localize('editorColors.types', "Sets the colors and styles for type declarations and references.")), - functions: tokenGroupSettings(nls.localize('editorColors.functions', "Sets the colors and styles for functions declarations and references.")), - variables: tokenGroupSettings(nls.localize('editorColors.variables', "Sets the colors and styles for variables declarations and references.")), - textMateRules: { - description: nls.localize('editorColors.textMateRules', 'Sets colors and styles using textmate theming rules (advanced).'), - $ref: textmateColorsSchemaId - }, - semanticHighlighting: { - description: nls.localize('editorColors.semanticHighlighting', 'Whether semantic highlighting should be enabled for this theme.'), - deprecationMessage: nls.localize('editorColors.semanticHighlighting.deprecationMessage', 'Use `enabled` in `editor.semanticTokenColorCustomizations` setting instead.'), - markdownDeprecationMessage: nls.localize('editorColors.semanticHighlighting.deprecationMessageMarkdown', 'Use `enabled` in `#editor.semanticTokenColorCustomizations#` setting instead.'), - type: 'boolean' - } - } -}; - -const tokenColorCustomizationSchema: IConfigurationPropertySchema = { - description: nls.localize('editorColors', "Overrides editor syntax colors and font style from the currently selected color theme."), - default: {}, - allOf: [tokenColorSchema] -}; - -const semanticTokenColorSchema: IJSONSchema = { - type: 'object', - properties: { - enabled: { - type: 'boolean', - description: nls.localize('editorColors.semanticHighlighting.enabled', 'Whether semantic highlighting is enabled or disabled for this theme'), - suggestSortText: '0_enabled' - }, - rules: { - $ref: tokenStylingSchemaId, - description: nls.localize('editorColors.semanticHighlighting.rules', 'Semantic token styling rules for this theme.'), - suggestSortText: '0_rules' - } - }, - additionalProperties: false -}; - -const semanticTokenColorCustomizationSchema: IConfigurationPropertySchema = { - description: nls.localize('semanticTokenColors', "Overrides editor semantic token color and styles from the currently selected color theme."), - default: {}, - allOf: [{ ...semanticTokenColorSchema, patternProperties: { '^\\[': {} } }] -}; - -const experimentalTokenStylingCustomizationSchema: IConfigurationPropertySchema = { - deprecationMessage: nls.localize('editorColors.experimentalTokenStyling.deprecationMessage', 'Use `editor.semanticTokenColorCustomizations` instead.'), - markdownDeprecationMessage: nls.localize('editorColors.experimentalTokenStyling.deprecationMessageMarkdown', 'Use `#editor.semanticTokenColorCustomizations#` instead.'), - default: {}, - allOf: [{ $ref: tokenStylingSchemaId }], -}; -const tokenColorCustomizationConfiguration: IConfigurationNode = { - id: 'editor', - order: 7.2, - type: 'object', - properties: { - [ThemeSettings.TOKEN_COLOR_CUSTOMIZATIONS]: tokenColorCustomizationSchema, - [ThemeSettings.SEMANTIC_TOKEN_COLOR_CUSTOMIZATIONS]: semanticTokenColorCustomizationSchema, - [ThemeSettings.TOKEN_COLOR_CUSTOMIZATIONS_EXPERIMENTAL]: experimentalTokenStylingCustomizationSchema - } -}; - -configurationRegistry.registerConfiguration(tokenColorCustomizationConfiguration); - -export function updateColorThemeConfigurationSchemas(themes: IWorkbenchColorTheme[]) { - // updates enum for the 'workbench.colorTheme` setting - colorThemeSettingEnum.splice(0, colorThemeSettingEnum.length, ...themes.map(t => t.settingsId)); - colorThemeSettingEnumDescriptions.splice(0, colorThemeSettingEnumDescriptions.length, ...themes.map(t => t.description || '')); - colorThemeSettingEnumItemLabels.splice(0, colorThemeSettingEnumItemLabels.length, ...themes.map(t => t.label || '')); - - const themeSpecificWorkbenchColors: IJSONSchema = { properties: {} }; - const themeSpecificTokenColors: IJSONSchema = { properties: {} }; - const themeSpecificSemanticTokenColors: IJSONSchema = { properties: {} }; - const experimentalThemeSpecificSemanticTokenColors: IJSONSchema = { properties: {} }; - - const workbenchColors = { $ref: workbenchColorsSchemaId, additionalProperties: false }; - const tokenColors = { properties: tokenColorSchema.properties, additionalProperties: false }; - for (let t of themes) { - // add theme specific color customization ("[Abyss]":{ ... }) - const themeId = `[${t.settingsId}]`; - themeSpecificWorkbenchColors.properties![themeId] = workbenchColors; - themeSpecificTokenColors.properties![themeId] = tokenColors; - themeSpecificSemanticTokenColors.properties![themeId] = semanticTokenColorSchema; - experimentalThemeSpecificSemanticTokenColors.properties![themeId] = { $ref: tokenStylingSchemaId, additionalProperties: false }; - } - - colorCustomizationsSchema.allOf![1] = themeSpecificWorkbenchColors; - tokenColorCustomizationSchema.allOf![1] = themeSpecificTokenColors; - semanticTokenColorCustomizationSchema.allOf![1] = themeSpecificSemanticTokenColors; - experimentalTokenStylingCustomizationSchema.allOf![1] = experimentalThemeSpecificSemanticTokenColors; - - configurationRegistry.notifyConfigurationSchemaUpdated(themeSettingsConfiguration, tokenColorCustomizationConfiguration); -} - -export function updateFileIconThemeConfigurationSchemas(themes: IWorkbenchFileIconTheme[]) { - fileIconThemeSettingSchema.enum!.splice(1, Number.MAX_VALUE, ...themes.map(t => t.settingsId)); - fileIconThemeSettingSchema.enumItemLabels!.splice(1, Number.MAX_VALUE, ...themes.map(t => t.label)); - fileIconThemeSettingSchema.enumDescriptions!.splice(1, Number.MAX_VALUE, ...themes.map(t => t.description || '')); - - configurationRegistry.notifyConfigurationSchemaUpdated(themeSettingsConfiguration); -} - -export function updateProductIconThemeConfigurationSchemas(themes: IWorkbenchProductIconTheme[]) { - productIconThemeSettingSchema.enum!.splice(1, Number.MAX_VALUE, ...themes.map(t => t.settingsId)); - productIconThemeSettingSchema.enumItemLabels!.splice(1, Number.MAX_VALUE, ...themes.map(t => t.label)); - productIconThemeSettingSchema.enumDescriptions!.splice(1, Number.MAX_VALUE, ...themes.map(t => t.description || '')); - - configurationRegistry.notifyConfigurationSchemaUpdated(themeSettingsConfiguration); -} - - -export class ThemeConfiguration { - constructor(private configurationService: IConfigurationService) { - } - - public get colorTheme(): string { - return this.configurationService.getValue(ThemeSettings.COLOR_THEME); - } - - public get fileIconTheme(): string | null { - return this.configurationService.getValue(ThemeSettings.FILE_ICON_THEME); - } - - public get productIconTheme(): string { - return this.configurationService.getValue(ThemeSettings.PRODUCT_ICON_THEME); - } - - public get colorCustomizations(): IColorCustomizations { - return this.configurationService.getValue(ThemeSettings.COLOR_CUSTOMIZATIONS) || {}; - } - - public get tokenColorCustomizations(): ITokenColorCustomizations { - return this.configurationService.getValue(ThemeSettings.TOKEN_COLOR_CUSTOMIZATIONS) || {}; - } - - public get semanticTokenColorCustomizations(): ISemanticTokenColorCustomizations | undefined { - return this.configurationService.getValue(ThemeSettings.SEMANTIC_TOKEN_COLOR_CUSTOMIZATIONS); - } - - public get experimentalSemanticTokenColorCustomizations(): IExperimentalSemanticTokenColorCustomizations | undefined { - return this.configurationService.getValue(ThemeSettings.TOKEN_COLOR_CUSTOMIZATIONS_EXPERIMENTAL); - } - - public async setColorTheme(theme: IWorkbenchColorTheme, settingsTarget: ConfigurationTarget | undefined | 'auto'): Promise { - await this.writeConfiguration(ThemeSettings.COLOR_THEME, theme.settingsId, settingsTarget); - return theme; - } - - public async setFileIconTheme(theme: IWorkbenchFileIconTheme, settingsTarget: ConfigurationTarget | undefined | 'auto'): Promise { - await this.writeConfiguration(ThemeSettings.FILE_ICON_THEME, theme.settingsId, settingsTarget); - return theme; - } - - public async setProductIconTheme(theme: IWorkbenchProductIconTheme, settingsTarget: ConfigurationTarget | undefined | 'auto'): Promise { - await this.writeConfiguration(ThemeSettings.PRODUCT_ICON_THEME, theme.settingsId, settingsTarget); - return theme; - } - - public findAutoConfigurationTarget(key: string) { - let settings = this.configurationService.inspect(key); - if (!types.isUndefined(settings.workspaceFolderValue)) { - return ConfigurationTarget.WORKSPACE_FOLDER; - } else if (!types.isUndefined(settings.workspaceValue)) { - return ConfigurationTarget.WORKSPACE; - } else if (!types.isUndefined(settings.userRemote)) { - return ConfigurationTarget.USER_REMOTE; - } - return ConfigurationTarget.USER; - } - - private async writeConfiguration(key: string, value: any, settingsTarget: ConfigurationTarget | 'auto' | undefined): Promise { - if (settingsTarget === undefined) { - return; - } - - let settings = this.configurationService.inspect(key); - if (settingsTarget === 'auto') { - return this.configurationService.updateValue(key, value); - } - - if (settingsTarget === ConfigurationTarget.USER) { - if (value === settings.userValue) { - return Promise.resolve(undefined); // nothing to do - } else if (value === settings.defaultValue) { - if (types.isUndefined(settings.userValue)) { - return Promise.resolve(undefined); // nothing to do - } - value = undefined; // remove configuration from user settings - } - } else if (settingsTarget === ConfigurationTarget.WORKSPACE || settingsTarget === ConfigurationTarget.WORKSPACE_FOLDER || settingsTarget === ConfigurationTarget.USER_REMOTE) { - if (value === settings.value) { - return Promise.resolve(undefined); // nothing to do - } - } - return this.configurationService.updateValue(key, value, settingsTarget); - } -} From 8f83ef2dbd463241249523b7acfa4df3e78e1237 Mon Sep 17 00:00:00 2001 From: liuyuqi-dellpc Date: Thu, 1 Sep 2022 02:14:53 +0800 Subject: [PATCH 3/7] update version --- vscode-web-gogs1s/scripts/clone.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vscode-web-gogs1s/scripts/clone.sh b/vscode-web-gogs1s/scripts/clone.sh index 72ef4bb..e83f164 100755 --- a/vscode-web-gogs1s/scripts/clone.sh +++ b/vscode-web-gogs1s/scripts/clone.sh @@ -13,7 +13,7 @@ function main() { fi mkdir -p lib cd lib - git clone --depth 1 -b 1.52.1 https://github.com/microsoft/vscode.git vscode + git clone --depth 1 -b 1.70.2 https://github.com/microsoft/vscode.git vscode cd vscode yarn --frozen-lockfile } From 9fd4a9f3c311baa80f9314bbcee0e8631e0c1c97 Mon Sep 17 00:00:00 2001 From: jianboy Date: Wed, 31 Aug 2022 19:05:35 +0000 Subject: [PATCH 4/7] add devcontainer and update version --- .devcontainer/cache/before-cache.sh | 15 +++++++++ .devcontainer/cache/build-cache-image.sh | 28 +++++++++++++++++ .devcontainer/cache/cache-diff.sh | 23 ++++++++++++++ .devcontainer/cache/cache.Dockerfile | 24 ++++++++++++++ .devcontainer/cache/restore-diff.sh | 29 +++++++++++++++++ .devcontainer/devcontainer.json | 40 ++++++++++++++++++++++++ .devcontainer/prepare.sh | 9 ++++++ package.json | 2 +- vscode-web-gogs1s/package.json | 3 +- vscode1.52.0 | 1 - vscode1.70.2 | 1 - 11 files changed, 171 insertions(+), 4 deletions(-) create mode 100644 .devcontainer/cache/before-cache.sh create mode 100644 .devcontainer/cache/build-cache-image.sh create mode 100644 .devcontainer/cache/cache-diff.sh create mode 100644 .devcontainer/cache/cache.Dockerfile create mode 100644 .devcontainer/cache/restore-diff.sh create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/prepare.sh delete mode 160000 vscode1.52.0 delete mode 160000 vscode1.70.2 diff --git a/.devcontainer/cache/before-cache.sh b/.devcontainer/cache/before-cache.sh new file mode 100644 index 0000000..78511d2 --- /dev/null +++ b/.devcontainer/cache/before-cache.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +# This file establishes a basline for the repository before any steps in the "prepare.sh" +# are run. Its just a find command that filters out a few things we don't need to watch. + +set -e +SOURCE_FOLDER="${1:-"."}" +CACHE_FOLDER="${2:-"$HOME/.devcontainer-cache"}" + +cd "${SOURCE_FOLDER}" +echo "[$(date)] Generating ""before"" manifest..." +mkdir -p "${CACHE_FOLDER}" +find -L . -not -path "*/.git/*" -and -not -path "${CACHE_FOLDER}/*.manifest" -type f > "${CACHE_FOLDER}/before.manifest" +echo "[$(date)] Done!" + diff --git a/.devcontainer/cache/build-cache-image.sh b/.devcontainer/cache/build-cache-image.sh new file mode 100644 index 0000000..451d1ab --- /dev/null +++ b/.devcontainer/cache/build-cache-image.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# This file simply wraps the docker build command to build an image that includes +# a cache.tar file with the result of "prepare.sh" inside of it. See cache.Dockerfile +# for the steps that are actually taken to do this. + +set -e + +SCRIPT_PATH="$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)" +CONTAINER_IMAGE_REPOSITORY="$1" +BRANCH="${2:-"main"}" + +if [ "${CONTAINER_IMAGE_REPOSITORY}" = "" ]; then + echo "Container repository not specified!" + exit 1 +fi + +TAG="branch-${BRANCH//\//-}" +echo "[$(date)] ${BRANCH} => ${TAG}" +cd "${SCRIPT_PATH}/../.." + +echo "[$(date)] Starting image build and push..." +export DOCKER_BUILDKIT=1 +docker buildx create --use --name vscode-dev-containers +docker run --privileged --rm tonistiigi/binfmt --install all +docker buildx build --push --platform linux/amd64,linux/arm64 -t ${CONTAINER_IMAGE_REPOSITORY}:"${TAG}" -f "${SCRIPT_PATH}/cache.Dockerfile" . + +echo "[$(date)] Done!" diff --git a/.devcontainer/cache/cache-diff.sh b/.devcontainer/cache/cache-diff.sh new file mode 100644 index 0000000..c2444b8 --- /dev/null +++ b/.devcontainer/cache/cache-diff.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +# This file is used to archive off a copy of any differences in the source tree into another location +# in the image. Once the codespace / container is up, this will be restored into its proper location. + +set -e + +SOURCE_FOLDER="${1:-"."}" +CACHE_FOLDER="${2:-"$HOME/.devcontainer-cache"}" + +if [ ! -d "${CACHE_FOLDER}" ]; then + echo "No cache folder found. Be sure to run before-cache.sh to set one up." + exit 1 +fi + +echo "[$(date)] Starting cache operation..." +cd "${SOURCE_FOLDER}" +echo "[$(date)] Determining diffs..." +find -L . -not -path "*/.git/*" -and -not -path "${CACHE_FOLDER}/*.manifest" -type f > "${CACHE_FOLDER}/after.manifest" +grep -Fxvf "${CACHE_FOLDER}/before.manifest" "${CACHE_FOLDER}/after.manifest" > "${CACHE_FOLDER}/cache.manifest" +echo "[$(date)] Archiving diffs..." +tar -cf "${CACHE_FOLDER}/cache.tar" --totals --files-from "${CACHE_FOLDER}/cache.manifest" +echo "[$(date)] Done! $(du -h "${CACHE_FOLDER}/cache.tar")" diff --git a/.devcontainer/cache/cache.Dockerfile b/.devcontainer/cache/cache.Dockerfile new file mode 100644 index 0000000..217122a --- /dev/null +++ b/.devcontainer/cache/cache.Dockerfile @@ -0,0 +1,24 @@ +# This dockerfile is used to build up from a base image to create an image a cache.tar file containing the results of running "prepare.sh". +# Other image contents: https://github.com/microsoft/vscode-dev-containers/blob/master/repository-containers/images/github.com/microsoft/vscode/.devcontainer/base.Dockerfile + +# This first stage generates cache.tar +FROM mcr.microsoft.com/vscode/devcontainers/repos/microsoft/vscode:dev as cache +ARG USERNAME=node +ARG CACHE_FOLDER="/home/${USERNAME}/.devcontainer-cache" +COPY --chown=${USERNAME}:${USERNAME} . /repo-source-tmp/ +RUN mkdir -p ${CACHE_FOLDER} && chown ${USERNAME} ${CACHE_FOLDER} /repo-source-tmp \ + && su ${USERNAME} -c "\ + cd /repo-source-tmp \ + && .devcontainer/cache/before-cache.sh . ${CACHE_FOLDER} \ + && .devcontainer/prepare.sh . ${CACHE_FOLDER} \ + && .devcontainer/cache/cache-diff.sh . ${CACHE_FOLDER}" + +# This second stage starts fresh and just copies in cache.tar from the previous stage. The related +# devcontainer.json file is then setup to have postCreateCommand fire restore-diff.sh to expand it. +FROM mcr.microsoft.com/vscode/devcontainers/repos/microsoft/vscode:dev as dev-container +ARG USERNAME=node +ARG CACHE_FOLDER="/home/${USERNAME}/.devcontainer-cache" +RUN mkdir -p "${CACHE_FOLDER}" \ + && chown "${USERNAME}:${USERNAME}" "${CACHE_FOLDER}" \ + && su ${USERNAME} -c "git config --global codespaces-theme.hide-status 1" +COPY --from=cache ${CACHE_FOLDER}/cache.tar ${CACHE_FOLDER}/ diff --git a/.devcontainer/cache/restore-diff.sh b/.devcontainer/cache/restore-diff.sh new file mode 100644 index 0000000..e8ea93f --- /dev/null +++ b/.devcontainer/cache/restore-diff.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +# This file expands the cache.tar file in the image that contains the results of "prepare.sh" +# on top of the source tree. It runs as a postCreateCommand which runs after the container/codespace +# is already up where you would typically run a command like "yarn install". + +set -e +SOURCE_FOLDER="$(cd "${1:-"."}" && pwd)" +CACHE_FOLDER="${2:-"$HOME/.devcontainer-cache"}" + +if [ ! -d "${CACHE_FOLDER}" ]; then + echo "No cache folder found." + exit 0 +fi + +echo "[$(date)] Expanding $(du -h "${CACHE_FOLDER}/cache.tar") file to ${SOURCE_FOLDER}..." +cd "${SOURCE_FOLDER}" +# Ensure user/group is correct if the UID/GID was changed for some reason +echo "+1000 +$(id -u)" > "${CACHE_FOLDER}/cache-owner-map" +echo "+1000 +$(id -g)" > "${CACHE_FOLDER}/cache-group-map" +# Untar to workspace folder, preserving permissions and order, but mapping GID/UID if required +tar --owner-map="${CACHE_FOLDER}/cache-owner-map" --group-map="${CACHE_FOLDER}/cache-group-map" -xpsf "${CACHE_FOLDER}/cache.tar" +rm -rf "${CACHE_FOLDER}" +echo "[$(date)] Done!" + +# Change ownership of chrome-sandbox +sudo chown root .build/electron/chrome-sandbox +sudo chmod 4755 .build/electron/chrome-sandbox + diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..3e40ce6 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,40 @@ +{ + "name": "Code - OSS", + + // Image contents: https://github.com/microsoft/vscode-dev-containers/blob/master/repository-containers/images/github.com/microsoft/vscode/.devcontainer/base.Dockerfile + "image": "mcr.microsoft.com/vscode/devcontainers/repos/microsoft/vscode:branch-main", + "overrideCommand": false, + "runArgs": [ "--init", "--security-opt", "seccomp=unconfined", "--shm-size=1g"], + + "settings": { + "resmon.show.battery": false, + "resmon.show.cpufreq": false + }, + + // noVNC, VNC + "forwardPorts": [6080, 5901], + "portsAttributes": { + "6080": { + "label": "VNC web client (noVNC)", + "onAutoForward": "silent" + }, + "5901": { + "label": "VNC TCP port", + "onAutoForward": "silent" + } + }, + + "extensions": [ + "dbaeumer.vscode-eslint", + "mutantdino.resourcemonitor" + ], + + // Optionally loads a cached yarn install for the repo + "postCreateCommand": ".devcontainer/cache/restore-diff.sh", + + "remoteUser": "node", + + "hostRequirements": { + "memory": "8gb" + } +} diff --git a/.devcontainer/prepare.sh b/.devcontainer/prepare.sh new file mode 100644 index 0000000..9b5c81f --- /dev/null +++ b/.devcontainer/prepare.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +# This file contains the steps that should be run when building a "cache" image with contents that should be +# layered directly **on top of the source tree** once a dev container is created. This avoids having to run long +# running commands like "yarn install" from the ground up. Developers (and should) still run these commands +# after the actual dev container is created, but only differences will be processed. + +yarn install +yarn electron diff --git a/package.json b/package.json index 97923d0..e61b958 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "dependencies": {}, "devDependencies": { - "@jianboy/vscode-web": "1.5.10", + "@jianboy/vscode-web": "1.70.2", "npm-run-all": "^4.1.5", "@typescript-eslint/eslint-plugin": "^4.15.0", "@typescript-eslint/parser": "^4.15.0", diff --git a/vscode-web-gogs1s/package.json b/vscode-web-gogs1s/package.json index fb54a0a..2421d5b 100644 --- a/vscode-web-gogs1s/package.json +++ b/vscode-web-gogs1s/package.json @@ -1,6 +1,6 @@ { "name": "@jianboy/vscode-web", - "version": "1.5.10", + "version": "1.70.2", "description": "VS Code web for Gogs", "author": "jianboy", "license": "MIT", @@ -40,6 +40,7 @@ "devDependencies": { "@types/trusted-types": "^2.0.0", "fs-extra": "^10.0.0", + "node-gyp": "^9.1.0", "npm-run-all": "^4.1.5" } } diff --git a/vscode1.52.0 b/vscode1.52.0 deleted file mode 160000 index 940b5f4..0000000 --- a/vscode1.52.0 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 940b5f4bb5fa47866a54529ed759d95d09ee80be diff --git a/vscode1.70.2 b/vscode1.70.2 deleted file mode 160000 index e4503b3..0000000 --- a/vscode1.70.2 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e4503b30fc78200f846c62cf8091b76ff5547662 From aeb6a92f87cf6eef58c0d181342445bad952fc8f Mon Sep 17 00:00:00 2001 From: jianboy Date: Wed, 31 Aug 2022 19:48:58 +0000 Subject: [PATCH 5/7] remote environmentService --- .gitpod.Dockerfile | 2 +- vscode-web-gogs1s/package-lock.json | 3472 +++++++++++++++++ .../contrib/url/browser/trustedDomains.ts | 1 - .../page/browser/vs_code_welcome_page.ts | 50 - .../page/browser/welcomePage.contribution.ts | 62 - .../welcome/page/browser/welcomePage.css | 277 -- .../welcome/page/browser/welcomePage.ts | 796 ---- vscode-web-gogs1s/yarn.lock | 1736 ++++++--- yarn.lock | 2 +- 9 files changed, 4655 insertions(+), 1743 deletions(-) create mode 100644 vscode-web-gogs1s/package-lock.json delete mode 100644 vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts delete mode 100644 vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.contribution.ts delete mode 100644 vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.css delete mode 100644 vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 7b6c16f..81c639f 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -5,6 +5,6 @@ RUN sudo apt-get update \ g++ gcc make python2.7 pkg-config libx11-dev libxkbfile-dev libsecret-1-dev python-is-python3 rsync \ && sudo rm -rf /var/lib/apt/lists/* -RUN bash -c 'VERSION="16.9.1" && source $HOME/.nvm/nvm.sh && nvm install $VERSION && nvm use $VERSION && nvm alias default $VERSION' +RUN bash -c 'VERSION="16.17.0" && source $HOME/.nvm/nvm.sh && nvm install $VERSION && nvm use $VERSION && nvm alias default $VERSION' RUN echo "nvm use default &>/dev/null" >> ~/.bashrc.d/51-nvm-fix diff --git a/vscode-web-gogs1s/package-lock.json b/vscode-web-gogs1s/package-lock.json new file mode 100644 index 0000000..267a17e --- /dev/null +++ b/vscode-web-gogs1s/package-lock.json @@ -0,0 +1,3472 @@ +{ + "name": "@jianboy/vscode-web", + "version": "1.5.10", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@jianboy/vscode-web", + "version": "1.5.10", + "license": "MIT", + "dependencies": { + "iconv-lite-umd": "0.6.8", + "jschardet": "2.2.1", + "tas-client-umd": "0.1.2", + "vscode-oniguruma": "1.3.1", + "vscode-textmate": "5.2.0", + "xterm": "4.10.0-beta.4", + "xterm-addon-search": "0.8.0-beta.3", + "xterm-addon-unicode11": "0.3.0-beta.3", + "xterm-addon-webgl": "0.10.0-beta.1" + }, + "devDependencies": { + "@types/trusted-types": "^2.0.0", + "fs-extra": "^10.0.0", + "node-gyp": "^9.1.0", + "npm-run-all": "^4.1.5" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.0.tgz", + "integrity": "sha512-I8MnZqNXsOLHsU111oHbn3khtvKMi5Bn4qVFsIWSJcCP1KKDiXX5AEw8UPk0nSopeC+Hvxt6yAy1/a5PailFqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true, + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true, + "license": "ISC" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iconv-lite-umd": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/iconv-lite-umd/-/iconv-lite-umd-0.6.8.tgz", + "integrity": "sha512-zvXJ5gSwMC9JD3wDzH8CoZGc1pbiJn12Tqjk8BXYCnYz3hYL5GRjHW8LEykjXhV9WgNGI4rgpgHcbIiBfrRq6A==", + "license": "MIT" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true, + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true, + "license": "ISC" + }, + "node_modules/jschardet": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-2.2.1.tgz", + "integrity": "sha512-Ks2JNuUJoc7PGaZ7bVFtSEvOcr0rBq6Q1J5/7+zKWLT+g+4zziL63O0jg7y2jxhzIa1LVsHUbPXrbaWmz9iwDw==", + "license": "LGPL-2.1+", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/lru-cache": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", + "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-gyp": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.1.0.tgz", + "integrity": "sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.22 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz", + "integrity": "sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tas-client-umd": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tas-client-umd/-/tas-client-umd-0.1.2.tgz", + "integrity": "sha512-rT9BdDCejckqOTQL2ShX67QtTiAUGbmPm5ZTC8giXobBvZC6JuvBVy5G32hoGZ3Q0dpTvMfgpf3iVFNN2F7wzg==", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.3.1.tgz", + "integrity": "sha512-gz6ZBofA7UXafVA+m2Yt2zHKgXC2qedArprIsHAPKByTkwq9l5y/izAGckqxYml7mSbYxTRTfdRwsFq3cwF4LQ==", + "license": "MIT" + }, + "node_modules/vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "license": "MIT" + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xterm": { + "version": "4.10.0-beta.4", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.10.0-beta.4.tgz", + "integrity": "sha512-q/yRy2nn4mp1jWZe218TJwlKjXCIr6h28Kw0JMB+lcTeU+MebZ3TrHqlrNVnB+UJfFDOpkw0qfKYfRoV8G/hXA==", + "license": "MIT" + }, + "node_modules/xterm-addon-search": { + "version": "0.8.0-beta.3", + "resolved": "https://registry.npmjs.org/xterm-addon-search/-/xterm-addon-search-0.8.0-beta.3.tgz", + "integrity": "sha512-EZP97KJIJ4KGQaOPYiiOaRRJst6LOgeEFoQL46WcBl5EWH9pH8qfrv0BHAJ8+6nBV2B9u5M6rzxO1GvLLec19w==", + "license": "MIT", + "peerDependencies": { + "xterm": "^4.0.0" + } + }, + "node_modules/xterm-addon-unicode11": { + "version": "0.3.0-beta.3", + "resolved": "https://registry.npmjs.org/xterm-addon-unicode11/-/xterm-addon-unicode11-0.3.0-beta.3.tgz", + "integrity": "sha512-vaYopnOjn19wCLDCyIWPWLwKR7CvLPxB5YZ3CAxt9qL05o3symxIJJJC0DuCa4GaGKVjNc7EmjRCs5bsJ2O1tw==", + "license": "MIT", + "peerDependencies": { + "xterm": "^4.0.0" + } + }, + "node_modules/xterm-addon-webgl": { + "version": "0.10.0-beta.1", + "resolved": "https://registry.npmjs.org/xterm-addon-webgl/-/xterm-addon-webgl-0.10.0-beta.1.tgz", + "integrity": "sha512-XNZMrmiyFaz3XiPq+LqF0qn2QHpUEwuk+cG53JwpJHnWo3dd2jxoIgHFQUcrnvHIVPZMbTKySIwLCCC9uQVl7Q==", + "license": "MIT", + "peerDependencies": { + "xterm": "^4.0.0" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + }, + "dependencies": { + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "@types/trusted-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.0.tgz", + "integrity": "sha512-I8MnZqNXsOLHsU111oHbn3khtvKMi5Bn4qVFsIWSJcCP1KKDiXX5AEw8UPk0nSopeC+Hvxt6yAy1/a5PailFqg==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "iconv-lite-umd": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/iconv-lite-umd/-/iconv-lite-umd-0.6.8.tgz", + "integrity": "sha512-zvXJ5gSwMC9JD3wDzH8CoZGc1pbiJn12Tqjk8BXYCnYz3hYL5GRjHW8LEykjXhV9WgNGI4rgpgHcbIiBfrRq6A==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true + }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "jschardet": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-2.2.1.tgz", + "integrity": "sha512-Ks2JNuUJoc7PGaZ7bVFtSEvOcr0rBq6Q1J5/7+zKWLT+g+4zziL63O0jg7y2jxhzIa1LVsHUbPXrbaWmz9iwDw==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + } + } + }, + "lru-cache": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", + "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "dev": true + }, + "make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-gyp": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.1.0.tgz", + "integrity": "sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "socks": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "dev": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.padend": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz", + "integrity": "sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tas-client-umd": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tas-client-umd/-/tas-client-umd-0.1.2.tgz", + "integrity": "sha512-rT9BdDCejckqOTQL2ShX67QtTiAUGbmPm5ZTC8giXobBvZC6JuvBVy5G32hoGZ3Q0dpTvMfgpf3iVFNN2F7wzg==" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vscode-oniguruma": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.3.1.tgz", + "integrity": "sha512-gz6ZBofA7UXafVA+m2Yt2zHKgXC2qedArprIsHAPKByTkwq9l5y/izAGckqxYml7mSbYxTRTfdRwsFq3cwF4LQ==" + }, + "vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "xterm": { + "version": "4.10.0-beta.4", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.10.0-beta.4.tgz", + "integrity": "sha512-q/yRy2nn4mp1jWZe218TJwlKjXCIr6h28Kw0JMB+lcTeU+MebZ3TrHqlrNVnB+UJfFDOpkw0qfKYfRoV8G/hXA==" + }, + "xterm-addon-search": { + "version": "0.8.0-beta.3", + "resolved": "https://registry.npmjs.org/xterm-addon-search/-/xterm-addon-search-0.8.0-beta.3.tgz", + "integrity": "sha512-EZP97KJIJ4KGQaOPYiiOaRRJst6LOgeEFoQL46WcBl5EWH9pH8qfrv0BHAJ8+6nBV2B9u5M6rzxO1GvLLec19w==", + "requires": {} + }, + "xterm-addon-unicode11": { + "version": "0.3.0-beta.3", + "resolved": "https://registry.npmjs.org/xterm-addon-unicode11/-/xterm-addon-unicode11-0.3.0-beta.3.tgz", + "integrity": "sha512-vaYopnOjn19wCLDCyIWPWLwKR7CvLPxB5YZ3CAxt9qL05o3symxIJJJC0DuCa4GaGKVjNc7EmjRCs5bsJ2O1tw==", + "requires": {} + }, + "xterm-addon-webgl": { + "version": "0.10.0-beta.1", + "resolved": "https://registry.npmjs.org/xterm-addon-webgl/-/xterm-addon-webgl-0.10.0-beta.1.tgz", + "integrity": "sha512-XNZMrmiyFaz3XiPq+LqF0qn2QHpUEwuk+cG53JwpJHnWo3dd2jxoIgHFQUcrnvHIVPZMbTKySIwLCCC9uQVl7Q==", + "requires": {} + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts b/vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts index a9b2112..3ec5569 100644 --- a/vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts +++ b/vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts @@ -213,7 +213,6 @@ const gogs1sDefaultTrustedDomains = [ export function readStaticTrustedDomains(accessor: ServicesAccessor): IStaticTrustedDomains { const storageService = accessor.get(IStorageService); const productService = accessor.get(IProductService); - const environmentService = accessor.get(IBrowserWorkbenchEnvironmentService); const defaultTrustedDomains: string[] = productService.linkProtectionTrustedDomains ? [...productService.linkProtectionTrustedDomains, ...gogs1sDefaultTrustedDomains] diff --git a/vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts b/vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts deleted file mode 100644 index 993f950..0000000 --- a/vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts +++ /dev/null @@ -1,50 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { escape } from 'vs/base/common/strings'; -import { localize } from 'vs/nls'; - -export default () => ` - -`; diff --git a/vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.contribution.ts b/vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.contribution.ts deleted file mode 100644 index d7c4495..0000000 --- a/vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.contribution.ts +++ /dev/null @@ -1,62 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { localize } from 'vs/nls'; -import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { WelcomePageContribution, WelcomePageAction, WelcomeInputFactory } from 'vs/workbench/contrib/welcome/page/browser/welcomePage'; -import { IWorkbenchActionRegistry, Extensions as ActionExtensions, CATEGORIES } from 'vs/workbench/common/actions'; -import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; -import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -import { IEditorInputFactoryRegistry, Extensions as EditorExtensions } from 'vs/workbench/common/editor'; -import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; -import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; -import product from 'vs/platform/product/common/product'; - -Registry.as(ConfigurationExtensions.Configuration) - .registerConfiguration({ - ...workbenchConfigurationNodeBase, - 'properties': { - 'workbench.startupEditor': { - 'scope': ConfigurationScope.APPLICATION, // Make sure repositories cannot trigger opening a README for tracking. - 'type': 'string', - 'enum': [ - ...['none', 'welcomePage', 'readme', 'newUntitledFile', 'welcomePageInEmptyWorkbench'], - ...(product.quality !== 'stable' - ? ['gettingStarted'] - : []) - ], - 'enumDescriptions': [...[ - localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'workbench.startupEditor.none' }, "Start without an editor."), - localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'workbench.startupEditor.welcomePage' }, "Open the Welcome page (default)."), - localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'workbench.startupEditor.readme' }, "Open the README when opening a folder that contains one, fallback to 'welcomePage' otherwise."), - localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'workbench.startupEditor.newUntitledFile' }, "Open a new untitled file (only applies when opening an empty workspace)."), - localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'workbench.startupEditor.welcomePageInEmptyWorkbench' }, "Open the Welcome page when opening an empty workbench."),], - ...(product.quality !== 'stable' - ? [localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'workbench.startupEditor.gettingStarted' }, "Open the Getting Started page (experimental).")] - : []) - ], - 'default': 'readme', - 'description': localize('workbench.startupEditor', "Controls which editor is shown at startup, if none are restored from the previous session.") - }, - } - }); - -Registry.as(WorkbenchExtensions.Workbench) - .registerWorkbenchContribution(WelcomePageContribution, LifecyclePhase.Restored); - -Registry.as(ActionExtensions.WorkbenchActions) - .registerWorkbenchAction(SyncActionDescriptor.from(WelcomePageAction), 'Help: Welcome', CATEGORIES.Help.value); - -Registry.as(EditorExtensions.EditorInputFactories).registerEditorInputFactory(WelcomeInputFactory.ID, WelcomeInputFactory); - -MenuRegistry.appendMenuItem(MenuId.MenubarHelpMenu, { - group: '1_welcome', - command: { - id: 'workbench.action.showWelcomePage', - title: localize({ key: 'miWelcome', comment: ['&& denotes a mnemonic'] }, "&&Welcome") - }, - order: 1 -}); diff --git a/vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.css b/vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.css deleted file mode 100644 index 55834e0..0000000 --- a/vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.css +++ /dev/null @@ -1,277 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -.monaco-workbench .part.editor > .content .welcomePageContainer { - align-items: center; - display: flex; - justify-content: center; - min-width: 100%; - min-height: 100%; -} - -.monaco-workbench .part.editor > .content .welcomePage { - width: 90%; - max-width: 1200px; - font-size: 10px; -} - -.monaco-workbench .part.editor > .content .welcomePage .text-warning { - color: #cca700; -} - -.monaco-workbench .part.editor > .content .welcomePage .text-error { - color: #f48771; -} - -.monaco-workbench .part.editor > .content .welcomePage .text-success { - color: #89d185 -} - -.monaco-workbench .part.editor > .content .welcomePage .refresh-button { - vertical-align: bottom; - cursor: pointer; -} - -.monaco-workbench .part.editor > .content .welcomePage .refresh-button:hover { - color: #3794ff; -} - -.monaco-workbench .part.editor > .content .welcomePage .refresh-button:hover { - color: #3794ff; -} - -.monaco-workbench .part.editor > .content .welcomePage .refresh-button:active { - color: #094771; -} - -.monaco-workbench .part.editor > .content .welcomePage .row { - display: flex; - flex-flow: row; -} - -.monaco-workbench .part.editor > .content .welcomePage .row .section { - overflow: hidden; -} - -.monaco-workbench .part.editor > .content .welcomePage .row .splash { - overflow: hidden; -} - -.monaco-workbench .part.editor > .content .welcomePage .row .commands { - overflow: hidden; -} - -.monaco-workbench .part.editor > .content .welcomePage .row .commands .list { - overflow: hidden; -} - -.monaco-workbench .part.editor > .content .welcomePage p { - font-size: 1.3em; -} - -.monaco-workbench .part.editor > .content .welcomePage .keyboard { - font-family: "Lucida Grande", sans-serif;/* Keyboard shortcuts */ -} - -.monaco-workbench .part.editor > .content .welcomePage a { - text-decoration: none; -} - -.monaco-workbench .part.editor > .content .welcomePage a:focus { - outline: 1px solid -webkit-focus-ring-color; - outline-offset: -1px; -} - -.monaco-workbench .part.editor > .content .welcomePage h1 { - padding: 0; - margin: 0; - border: none; - font-weight: normal; - font-size: 3.6em; - white-space: nowrap; -} - -.monaco-workbench .part.editor > .content .welcomePage .title { - margin-top: 1em; - margin-bottom: 1em; - flex: 1 100%; -} - -.monaco-workbench .part.editor > .content .welcomePage .subtitle { - margin-top: .8em; - font-size: 2.6em; - display: block; -} - -.monaco-workbench.hc-black .part.editor > .content .welcomePage .subtitle { - font-weight: 200; -} - -.monaco-workbench .part.editor > .content .welcomePage .splash, -.monaco-workbench .part.editor > .content .welcomePage .commands { - flex: 1 1 0; -} - -.monaco-workbench .part.editor > .content .welcomePage h2 { - font-weight: 200; - margin-top: 17px; - margin-bottom: 5px; - font-size: 1.9em; - line-height: initial; -} - -.monaco-workbench .part.editor > .content .welcomePage .splash .section { - margin-bottom: 5em; -} - -.monaco-workbench .part.editor > .content .welcomePage .splash ul { - margin: 0; - font-size: 1.3em; - list-style: none; - padding: 0; -} - -.monaco-workbench .part.editor > .content .welcomePage .splash li { - min-width: 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.monaco-workbench .part.editor > .content .welcomePage.emptyRecent .splash .recent .list { - display: none; -} -.monaco-workbench .part.editor > .content .welcomePage .splash .recent .none { - display: none; -} -.monaco-workbench .part.editor > .content .welcomePage.emptyRecent .splash .recent .none { - display: initial; -} - -.monaco-workbench .part.editor > .content .welcomePage .splash .recent li.moreRecent { - margin-top: 5px; -} - -.monaco-workbench .part.editor > .content .welcomePage .splash .recent .path { - padding-left: 1em; -} - -.monaco-workbench .part.editor > .content .welcomePage .splash .title, -.monaco-workbench .part.editor > .content .welcomePage .splash .showOnStartup { - min-width: 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.monaco-workbench .part.editor > .content .welcomePage .splash .showOnStartup > .checkbox { - vertical-align: bottom; -} - -.monaco-workbench .part.editor > .content .welcomePage .commands .list { - list-style: none; - padding: 0; -} -.monaco-workbench .part.editor > .content .welcomePage .commands .item { - margin: 7px 0px; -} -.monaco-workbench .part.editor > .content .welcomePage .commands .item button { - margin: 1px; - padding: 12px 10px; - width: calc(100% - 2px); - height: 5em; - font-size: 1.3em; - text-align: left; - cursor: pointer; - white-space: nowrap; - font-family: inherit; -} - -.monaco-workbench .part.editor > .content .welcomePage .commands .item button > span { - display: inline-block; - width:100%; - min-width: 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.monaco-workbench .part.editor > .content .welcomePage .commands .item button h3 { - font-weight: normal; - font-size: 1em; - margin: 0; - margin-bottom: .25em; - min-width: 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.monaco-workbench .part.editor > .content .welcomePage .commands .item button { - border: none; -} - -.monaco-workbench.hc-black .part.editor > .content .welcomePage .commands .item button > h3 { - font-weight: bold; -} - -.monaco-workbench .part.editor > .content .welcomePage .commands .item button:focus { - outline-style: solid; - outline-width: 1px; -} - -.monaco-workbench.hc-black .part.editor > .content .welcomePage .commands .item button { - border-width: 1px; - border-style: solid; -} - -.monaco-workbench.hc-black .part.editor > .content .welcomePage .commands .item button:hover { - outline-width: 1px; - outline-style: dashed; - outline-offset: -5px; -} - -.monaco-workbench .part.editor > .content .welcomePage .commands .item button .enabledExtension { - display: none; -} -.monaco-workbench .part.editor > .content .welcomePage .commands .item button .installExtension.installed { - display: none; -} -.monaco-workbench .part.editor > .content .welcomePage .commands .item button .enabledExtension.installed { - display: inline; -} - -.monaco-workbench .part.editor > .content .welcomePageContainer.max-height-685px .title { - display: none; -} - -.file-icons-enabled .show-file-icons .vs_code_welcome_page-name-file-icon.file-icon::before { - content: ' '; - background-image: url('../../../../browser/media/code-icon.svg'); -} - -.monaco-workbench .part.editor > .content .welcomePage .mac-only, -.monaco-workbench .part.editor > .content .welcomePage .windows-only, -.monaco-workbench .part.editor > .content .welcomePage .linux-only { - display: none; -} -.monaco-workbench.mac .part.editor > .content .welcomePage .mac-only { - display: initial; -} -.monaco-workbench.windows .part.editor > .content .welcomePage .windows-only { - display: initial; -} -.monaco-workbench.linux .part.editor > .content .welcomePage .linux-only { - display: initial; -} -.monaco-workbench.mac .part.editor > .content .welcomePage li.mac-only { - display: list-item; -} -.monaco-workbench.windows .part.editor > .content .welcomePage li.windows-only { - display: list-item; -} -.monaco-workbench.linux .part.editor > .content .welcomePage li.linux-only { - display: list-item; -} diff --git a/vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts b/vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts deleted file mode 100644 index a460117..0000000 --- a/vscode-web-gogs1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts +++ /dev/null @@ -1,796 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import 'vs/css!./welcomePage'; -import 'vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page'; -import { URI } from 'vs/base/common/uri'; -import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; -import * as arrays from 'vs/base/common/arrays'; -import { WalkThroughInput } from 'vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput'; -import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { onUnexpectedError, isPromiseCanceledError } from 'vs/base/common/errors'; -import { IWindowOpenable } from 'vs/platform/windows/common/windows'; -import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { localize } from 'vs/nls'; -import { Action, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { FileAccess, Schemas } from 'vs/base/common/network'; -import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; -import { getInstalledExtensions, IExtensionStatus, onExtensionChanged, isKeymapExtension } from 'vs/workbench/contrib/extensions/common/extensionsUtils'; -import { IExtensionManagementService, IExtensionGalleryService, ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { IWorkbenchExtensionEnablementService, EnablementState } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; -import { IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; -import { ILifecycleService, StartupKind } from 'vs/workbench/services/lifecycle/common/lifecycle'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { splitName } from 'vs/base/common/labels'; -import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { focusBorder, textLinkForeground, textLinkActiveForeground, foreground, descriptionForeground, contrastBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { getExtraColor } from 'vs/workbench/contrib/welcome/walkThrough/common/walkThroughUtils'; -import { IExtensionsViewPaneContainer, IExtensionsWorkbenchService, VIEWLET_ID } from 'vs/workbench/contrib/extensions/common/extensions'; -import { IEditorInputFactory, EditorInput } from 'vs/workbench/common/editor'; -import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; -import { TimeoutTimer } from 'vs/base/common/async'; -import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { ILabelService } from 'vs/platform/label/common/label'; -import { IFileService } from 'vs/platform/files/common/files'; -import { joinPath } from 'vs/base/common/resources'; -import { IRecentlyOpened, isRecentWorkspace, IRecentWorkspace, IRecentFolder, isRecentFolder, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; -import { CancellationToken } from 'vs/base/common/cancellation'; -import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { IProductService } from 'vs/platform/product/common/productService'; -import { IEditorOptions } from 'vs/platform/editor/common/editor'; -import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; -import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { buttonBackground, buttonHoverBackground, welcomePageBackground } from 'vs/workbench/contrib/welcome/page/browser/welcomePageColors'; -import { replaceBrowserUrl } from 'vs/gogs1s/util'; - -const configurationKey = 'workbench.startupEditor'; -const oldConfigurationKey = 'workbench.welcome.enabled'; -const telemetryFrom = 'welcomePage'; - -const getCurrentFileState = (ref: string): { type: string, path: string } => { - const uri = URI.parse(window.location.href); - const [type, ...otherParts] = (uri.path || '').split('/').filter(Boolean).slice(2); - const refAndFilePath = otherParts.join('/'); - if (!['tree', 'blob'].includes(type) || !refAndFilePath.startsWith(ref)) { - return { type: 'tree', path: '/' }; - } - return { type, path: refAndFilePath.slice(ref.length) || '/' }; -}; - -export class WelcomePageContribution implements IWorkbenchContribution { - - constructor( - @IInstantiationService instantiationService: IInstantiationService, - @IConfigurationService configurationService: IConfigurationService, - @IEditorService private editorService: IEditorService, - @IBackupFileService backupFileService: IBackupFileService, - @IFileService fileService: IFileService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @ILifecycleService lifecycleService: ILifecycleService, - @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, - @ICommandService private readonly commandService: ICommandService, - ) { - - const enabled = isWelcomePageEnabled(configurationService, contextService); - if (enabled && lifecycleService.startupKind !== StartupKind.ReloadedWindow) { - const activeResource = editorService.activeEditor?.resource; - getCurrentAuthority(commandService).then((authority: string) => { - const fileState = getCurrentFileState(authority.split('+')[2]); - if (fileState.path !== '/' && (!activeResource || activeResource.scheme !== 'gogs1s' || activeResource.path !== fileState.path)) { - const currentFileUri = URI.from({ scheme: 'gogs1s', authority, path: fileState.path }); - fileService.resolve(currentFileUri) - .then(() => this.commandService.executeCommand(fileState.type === 'tree' ? 'revealInExplorer' : 'vscode.open', currentFileUri)) - .then(() => this.registerListeners(), () => this.registerListeners()); - return; - } - backupFileService.hasBackups().then(hasBackups => { - // Open the welcome even if we opened a set of default editors - if ((!editorService.activeEditor || layoutService.openedDefaultEditors) && !hasBackups) { - return Promise.all(contextService.getWorkspace().folders.map(folder => { - const folderUri = folder.uri; - return fileService.resolve(folderUri) - .then(folder => { - const files = folder.children ? folder.children.map(child => child.name).sort() : []; - const file = files.find(file => file.toLowerCase() === 'readme.md') || files.find(file => file.toLowerCase().startsWith('readme')); - - if (file) { - return joinPath(folderUri, file); - } - return undefined; - }, onUnexpectedError); - })).then(arrays.coalesce) - .then(readmes => { - if (!editorService.activeEditor) { - if (readmes.length) { - const isMarkDown = (readme: URI) => readme.path.toLowerCase().endsWith('.md'); - return Promise.all([ - this.commandService.executeCommand('markdown.showPreview', null, readmes.filter(isMarkDown), { locked: true }), - editorService.openEditors(readmes.filter(readme => !isMarkDown(readme)) - .map(readme => ({ resource: readme }))), - ]); - } else { - return instantiationService.createInstance(WelcomePage).openEditor(); - } - } - return undefined; - }); - } - return undefined; - }).then(undefined, onUnexpectedError).then(() => this.registerListeners(), () => this.registerListeners()); - }); - } - } - - private getGitHubFilePathOrEmpty(uri?: URI): string { - if (!uri || !uri.path || uri.scheme !== 'gogs1s') { - return ''; - } - return uri.path.startsWith('/') ? uri.path : `/${uri.path}`; - } - - private doUpdateWindowUrl(): void { - getCurrentAuthority(this.commandService).then(authority => { - const [owner, repo, ref] = authority.split('+'); - const editor = this.editorService.activeEditor; - const filePath = this.getGitHubFilePathOrEmpty(editor?.resource); - // if no file opened and the branch is HEAD current, only retain owner and repo in url - const windowUrl = !filePath && ref.toUpperCase() === 'HEAD' - ? `/${owner}/${repo}` - : `/${owner}/${repo}/${filePath ? 'blob' : 'tree'}/${ref}${filePath}`; - replaceBrowserUrl(windowUrl); - }); - } - - private registerListeners() { - this.editorService.onDidActiveEditorChange(() => this.doUpdateWindowUrl()); - } -} - -function isWelcomePageEnabled(configurationService: IConfigurationService, contextService: IWorkspaceContextService) { - const startupEditor = configurationService.inspect(configurationKey); - if (!startupEditor.userValue && !startupEditor.workspaceValue) { - const welcomeEnabled = configurationService.inspect(oldConfigurationKey); - if (welcomeEnabled.value !== undefined && welcomeEnabled.value !== null) { - return welcomeEnabled.value; - } - } - return startupEditor.value === 'welcomePage' || startupEditor.value === 'gettingStarted' || startupEditor.value === 'readme' || startupEditor.value === 'welcomePageInEmptyWorkbench' && contextService.getWorkbenchState() === WorkbenchState.EMPTY; -} - -function getCurrentAuthority(commandService: ICommandService): Promise { - return commandService.executeCommand('gogs1s.get-current-authority') as Promise; -} - -export class WelcomePageAction extends Action { - - public static readonly ID = 'workbench.action.showWelcomePage'; - public static readonly LABEL = localize('welcomePage', "Welcome"); - - constructor( - id: string, - label: string, - @IInstantiationService private readonly instantiationService: IInstantiationService - ) { - super(id, label); - } - - public run(): Promise { - return this.instantiationService.createInstance(WelcomePage) - .openEditor() - .then(() => undefined); - } -} - -interface ExtensionSuggestion { - name: string; - title?: string; - id: string; - isKeymap?: boolean; - isCommand?: boolean; -} - -const extensionPacks: ExtensionSuggestion[] = [ - { name: localize('welcomePage.javaScript', "JavaScript"), id: 'dbaeumer.vscode-eslint' }, - { name: localize('welcomePage.python', "Python"), id: 'ms-python.python' }, - { name: localize('welcomePage.java', "Java"), id: 'vscjava.vscode-java-pack' }, - { name: localize('welcomePage.php', "PHP"), id: 'felixfbecker.php-pack' }, - { name: localize('welcomePage.azure', "Azure"), title: localize('welcomePage.showAzureExtensions', "Show Azure extensions"), id: 'workbench.extensions.action.showAzureExtensions', isCommand: true }, - { name: localize('welcomePage.docker', "Docker"), id: 'ms-azuretools.vscode-docker' }, -]; - -const keymapExtensions: ExtensionSuggestion[] = [ - { name: localize('welcomePage.vim', "Vim"), id: 'vscodevim.vim', isKeymap: true }, - { name: localize('welcomePage.sublime', "Sublime"), id: 'ms-vscode.sublime-keybindings', isKeymap: true }, - { name: localize('welcomePage.atom', "Atom"), id: 'ms-vscode.atom-keybindings', isKeymap: true }, -]; - -interface Strings { - installEvent: string; - installedEvent: string; - detailsEvent: string; - - alreadyInstalled: string; - reloadAfterInstall: string; - installing: string; - extensionNotFound: string; -} - -/* __GDPR__ - "installExtension" : { - "${include}": [ - "${WelcomePageInstall-1}" - ] - } -*/ -/* __GDPR__ - "installedExtension" : { - "${include}": [ - "${WelcomePageInstalled-1}", - "${WelcomePageInstalled-2}", - "${WelcomePageInstalled-3}", - "${WelcomePageInstalled-4}", - "${WelcomePageInstalled-6}" - ] - } -*/ -/* __GDPR__ - "detailsExtension" : { - "${include}": [ - "${WelcomePageDetails-1}" - ] - } -*/ -const extensionPackStrings: Strings = { - installEvent: 'installExtension', - installedEvent: 'installedExtension', - detailsEvent: 'detailsExtension', - - alreadyInstalled: localize('welcomePage.extensionPackAlreadyInstalled', "Support for {0} is already installed."), - reloadAfterInstall: localize('welcomePage.willReloadAfterInstallingExtensionPack', "The window will reload after installing additional support for {0}."), - installing: localize('welcomePage.installingExtensionPack', "Installing additional support for {0}..."), - extensionNotFound: localize('welcomePage.extensionPackNotFound', "Support for {0} with id {1} could not be found."), -}; - -CommandsRegistry.registerCommand('workbench.extensions.action.showAzureExtensions', accessor => { - const viewletService = accessor.get(IViewletService); - return viewletService.openViewlet(VIEWLET_ID, true) - .then(viewlet => viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer) - .then(viewlet => { - viewlet.search('@sort:installs azure '); - viewlet.focus(); - }); -}); - -/* __GDPR__ - "installKeymap" : { - "${include}": [ - "${WelcomePageInstall-1}" - ] - } -*/ -/* __GDPR__ - "installedKeymap" : { - "${include}": [ - "${WelcomePageInstalled-1}", - "${WelcomePageInstalled-2}", - "${WelcomePageInstalled-3}", - "${WelcomePageInstalled-4}", - "${WelcomePageInstalled-6}" - ] - } -*/ -/* __GDPR__ - "detailsKeymap" : { - "${include}": [ - "${WelcomePageDetails-1}" - ] - } -*/ -const keymapStrings: Strings = { - installEvent: 'installKeymap', - installedEvent: 'installedKeymap', - detailsEvent: 'detailsKeymap', - - alreadyInstalled: localize('welcomePage.keymapAlreadyInstalled', "The {0} keyboard shortcuts are already installed."), - reloadAfterInstall: localize('welcomePage.willReloadAfterInstallingKeymap', "The window will reload after installing the {0} keyboard shortcuts."), - installing: localize('welcomePage.installingKeymap', "Installing the {0} keyboard shortcuts..."), - extensionNotFound: localize('welcomePage.keymapNotFound', "The {0} keyboard shortcuts with id {1} could not be found."), -}; - -const welcomeInputTypeId = 'workbench.editors.welcomePageInput'; - -class WelcomePage extends Disposable { - - readonly editorInput: WalkThroughInput; - - constructor( - @IEditorService private readonly editorService: IEditorService, - @IInstantiationService private readonly instantiationService: IInstantiationService, - @IWorkspacesService private readonly workspacesService: IWorkspacesService, - @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @ILabelService private readonly labelService: ILabelService, - @INotificationService private readonly notificationService: INotificationService, - @IWorkbenchExtensionEnablementService private readonly extensionEnablementService: IWorkbenchExtensionEnablementService, - @IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService, - @IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService, - @IExtensionRecommendationsService private readonly tipsService: IExtensionRecommendationsService, - @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, - @ILifecycleService lifecycleService: ILifecycleService, - @ITelemetryService private readonly telemetryService: ITelemetryService, - @IHostService private readonly hostService: IHostService, - @IProductService private readonly productService: IProductService, - @ICommandService private readonly commandService: ICommandService, - ) { - super(); - this._register(lifecycleService.onShutdown(() => this.dispose())); - - const gitHubTokenStatus = this.getGitHubTokenStatus(); - const recentlyOpened = this.workspacesService.getRecentlyOpened(); - const installedExtensions = this.instantiationService.invokeFunction(getInstalledExtensions); - const resource = FileAccess.asBrowserUri('./vs_code_welcome_page', require) - .with({ - scheme: Schemas.walkThrough, - query: JSON.stringify({ moduleId: 'vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page' }) - }); - this.editorInput = this.instantiationService.createInstance(WalkThroughInput, { - typeId: welcomeInputTypeId, - name: localize('welcome.title', "Welcome"), - resource, - telemetryFrom, - onReady: (container: HTMLElement) => this.onReady(container, recentlyOpened, installedExtensions, gitHubTokenStatus) - }); - } - - public openEditor(options: IEditorOptions = { pinned: false }) { - return this.editorService.openEditor(this.editorInput, options); - } - - private onReady(container: HTMLElement, recentlyOpened: Promise, installedExtensions: Promise, gitHubTokenStatus: Promise): void { - const enabled = isWelcomePageEnabled(this.configurationService, this.contextService); - const showOnStartup = container.querySelector('#showOnStartup'); - if (enabled) { - showOnStartup.setAttribute('checked', 'checked'); - } - showOnStartup.addEventListener('click', e => { - this.configurationService.updateValue(configurationKey, showOnStartup.checked ? 'welcomePage' : 'newUntitledFile'); - }); - - const prodName = container.querySelector('.welcomePage .title .caption') as HTMLElement; - if (prodName) { - prodName.textContent = this.productService.nameLong; - } - - gitHubTokenStatus.then(tokenStatus => this.doUpdateGitHubTokenStatus(container, tokenStatus)); - this.registerGogs1sListeners(container);//增加监听 - - recentlyOpened.then(({ workspaces }) => { - // Filter out the current workspace - workspaces = workspaces.filter(recent => !this.contextService.isCurrentWorkspace(isRecentWorkspace(recent) ? recent.workspace : recent.folderUri)); - if (!workspaces.length) { - const recent = container.querySelector('.welcomePage') as HTMLElement; - recent.classList.add('emptyRecent'); - return; - } - const ul = container.querySelector('.recent ul'); - if (!ul) { - return; - } - const moreRecent = ul.querySelector('.moreRecent')!; - const workspacesToShow = workspaces.slice(0, 5); - const updateEntries = () => { - const listEntries = this.createListEntries(workspacesToShow); - while (ul.firstChild) { - ul.removeChild(ul.firstChild); - } - ul.append(...listEntries, moreRecent); - }; - updateEntries(); - this._register(this.labelService.onDidChangeFormatters(updateEntries)); - }).then(undefined, onUnexpectedError); - - this.addExtensionList(container, '.extensionPackList', extensionPacks, extensionPackStrings); - this.addExtensionList(container, '.keymapList', keymapExtensions, keymapStrings); - - this.updateInstalledExtensions(container, installedExtensions); - this._register(this.instantiationService.invokeFunction(onExtensionChanged)(ids => { - for (const id of ids) { - if (container.querySelector(`.installExtension[data-extension="${id.id}"], .enabledExtension[data-extension="${id.id}"]`)) { - const installedExtensions = this.instantiationService.invokeFunction(getInstalledExtensions); - this.updateInstalledExtensions(container, installedExtensions); - break; - } - } - })); - } - - registerGogs1sListeners(container: HTMLElement) { - container.querySelector('.refresh-button')?.addEventListener('click', () => this.refreshGitHubTokenStatus(container)); - container.querySelector('.create-new-token')?.addEventListener('click', () => window?.open('https://git.yoqi.me/user/settings/applications')); - container.querySelector('.update-oauth-token')?.addEventListener('click', () => this.commandService.executeCommand('gogs1s.update-token').then(() => this.refreshGitHubTokenStatus(container))); - container.querySelector('.clear-oauth-token')?.addEventListener('click', () => this.commandService.executeCommand('gogs1s.clear-token').then(() => this.refreshGitHubTokenStatus(container))); - } - - updateElementText(element: HTMLElement, text: string | number, type?: 'SUCCESS' | 'WARNING' | 'ERROR') { - if (!element) { - return; - } - element.innerText = `${text}`; - element.classList.remove('text-warning', 'text-error', 'text-success'); - if (type === 'SUCCESS') { - element.classList.add('text-success'); - } else if (type === 'WARNING') { - element.classList.add('text-warning'); - } else if (type === 'ERROR') { - element.classList.add('text-error'); - } - } - - getGitHubTokenStatus() { - return this.commandService.executeCommand('gogs1s.validate-token', true); - } - - refreshGitHubTokenStatus(container: HTMLElement) { - const statusElement = container.querySelector('.rate-limit-status'); - this.updateElementText(statusElement, ''); - this.getGitHubTokenStatus().then(tokenStatus => { - this.doUpdateGitHubTokenStatus(container, tokenStatus); - }); - } - - doUpdateGitHubTokenStatus(container: HTMLElement, tokenStatus?: any) { - const statusElement = container.querySelector('.rate-limit-status'); - const limitElement = container.querySelector('.x-rate-limit-limit'); - const remainingElement = container.querySelector('.x-rate-limit-remaining'); - const resetElement = container.querySelector('.x-rate-limit-reset'); - const timerElement = container.querySelector('.rate-limit-reset-seconds'); - - if (!tokenStatus) { - this.updateElementText(statusElement, 'Unknown', 'WARNING'); - this.updateElementText(limitElement, 'Unknown', 'WARNING'); - this.updateElementText(remainingElement, 'Unknown', 'WARNING'); - this.updateElementText(resetElement, 'Unknown'); - this.updateElementText(timerElement, 'Unknown', 'WARNING'); - return; - } - - const textType = (value: number) => { - if (value <= 0) { - return 'ERROR'; - } - if (value > 99) { - return 'SUCCESS'; - } - return 'WARNING'; - }; - this.updateElementText(limitElement, tokenStatus.limit, textType(+tokenStatus.limit)); - this.updateElementText(remainingElement, tokenStatus.remaining, textType(+tokenStatus.remaining)); - this.updateElementText(resetElement, tokenStatus.reset); - this.updateElementText(timerElement, Math.max(tokenStatus.reset - Math.ceil(Date.now() / 1000), 0)); - - if (!tokenStatus.token) { - this.updateElementText(statusElement, 'Unauthorized', 'WARNING'); - return; - } - if (tokenStatus.valid) { - this.updateElementText(statusElement, 'Authorized', 'SUCCESS'); - return; - } - this.updateElementText(statusElement, 'Invalid Token', 'ERROR'); - } - - private createListEntries(recents: (IRecentWorkspace | IRecentFolder)[]) { - return recents.map(recent => { - let fullPath: string; - let windowOpenable: IWindowOpenable; - if (isRecentFolder(recent)) { - windowOpenable = { folderUri: recent.folderUri }; - fullPath = recent.label || this.labelService.getWorkspaceLabel(recent.folderUri, { verbose: true }); - } else { - fullPath = recent.label || this.labelService.getWorkspaceLabel(recent.workspace, { verbose: true }); - windowOpenable = { workspaceUri: recent.workspace.configPath }; - } - - const { name, parentPath } = splitName(fullPath); - - const li = document.createElement('li'); - const a = document.createElement('a'); - - a.innerText = name; - a.title = fullPath; - a.setAttribute('aria-label', localize('welcomePage.openFolderWithPath', "Open folder {0} with path {1}", name, parentPath)); - a.href = 'javascript:void(0)'; - a.addEventListener('click', e => { - this.telemetryService.publicLog2('workbenchActionExecuted', { - id: 'openRecentFolder', - from: telemetryFrom - }); - this.hostService.openWindow([windowOpenable], { forceNewWindow: e.ctrlKey || e.metaKey }); - e.preventDefault(); - e.stopPropagation(); - }); - li.appendChild(a); - - const span = document.createElement('span'); - span.classList.add('path'); - span.classList.add('detail'); - span.innerText = parentPath; - span.title = fullPath; - li.appendChild(span); - - return li; - }); - } - - private addExtensionList(container: HTMLElement, listSelector: string, suggestions: ExtensionSuggestion[], strings: Strings) { - const list = container.querySelector(listSelector); - if (list) { - suggestions.forEach((extension, i) => { - if (i) { - list.appendChild(document.createTextNode(localize('welcomePage.extensionListSeparator', ", "))); - } - - const a = document.createElement('a'); - a.innerText = extension.name; - a.title = extension.title || (extension.isKeymap ? localize('welcomePage.installKeymap', "Install {0} keymap", extension.name) : localize('welcomePage.installExtensionPack', "Install additional support for {0}", extension.name)); - if (extension.isCommand) { - a.href = `command:${extension.id}`; - list.appendChild(a); - } else { - a.classList.add('installExtension'); - a.setAttribute('data-extension', extension.id); - a.href = 'javascript:void(0)'; - a.addEventListener('click', e => { - this.installExtension(extension, strings); - e.preventDefault(); - e.stopPropagation(); - }); - list.appendChild(a); - - const span = document.createElement('span'); - span.innerText = extension.name; - span.title = extension.isKeymap ? localize('welcomePage.installedKeymap', "{0} keymap is already installed", extension.name) : localize('welcomePage.installedExtensionPack', "{0} support is already installed", extension.name); - span.classList.add('enabledExtension'); - span.setAttribute('data-extension', extension.id); - list.appendChild(span); - } - }); - } - } - - private installExtension(extensionSuggestion: ExtensionSuggestion, strings: Strings): void { - /* __GDPR__FRAGMENT__ - "WelcomePageInstall-1" : { - "from" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "extensionId": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog(strings.installEvent, { - from: telemetryFrom, - extensionId: extensionSuggestion.id, - }); - this.instantiationService.invokeFunction(getInstalledExtensions).then(extensions => { - const installedExtension = extensions.find(extension => areSameExtensions(extension.identifier, { id: extensionSuggestion.id })); - if (installedExtension && installedExtension.globallyEnabled) { - /* __GDPR__FRAGMENT__ - "WelcomePageInstalled-1" : { - "from" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "extensionId": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "outcome": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog(strings.installedEvent, { - from: telemetryFrom, - extensionId: extensionSuggestion.id, - outcome: 'already_enabled', - }); - this.notificationService.info(strings.alreadyInstalled.replace('{0}', extensionSuggestion.name)); - return; - } - const foundAndInstalled = installedExtension ? Promise.resolve(installedExtension.local) : this.extensionGalleryService.query({ names: [extensionSuggestion.id], source: telemetryFrom }, CancellationToken.None) - .then((result): null | Promise => { - const [extension] = result.firstPage; - if (!extension) { - return null; - } - return this.extensionManagementService.installFromGallery(extension) - .then(() => this.extensionManagementService.getInstalled()) - .then(installed => { - const local = installed.filter(i => areSameExtensions(extension.identifier, i.identifier))[0]; - // TODO: Do this as part of the install to avoid multiple events. - return this.extensionEnablementService.setEnablement([local], EnablementState.DisabledGlobally).then(() => local); - }); - }); - - this.notificationService.prompt( - Severity.Info, - strings.reloadAfterInstall.replace('{0}', extensionSuggestion.name), - [{ - label: localize('ok', "OK"), - run: () => { - const messageDelay = new TimeoutTimer(); - messageDelay.cancelAndSet(() => { - this.notificationService.info(strings.installing.replace('{0}', extensionSuggestion.name)); - }, 300); - const extensionsToDisable = extensions.filter(extension => isKeymapExtension(this.tipsService, extension) && extension.globallyEnabled).map(extension => extension.local); - extensionsToDisable.length ? this.extensionEnablementService.setEnablement(extensionsToDisable, EnablementState.DisabledGlobally) : Promise.resolve() - .then(() => { - return foundAndInstalled.then(foundExtension => { - messageDelay.cancel(); - if (foundExtension) { - return this.extensionEnablementService.setEnablement([foundExtension], EnablementState.EnabledGlobally) - .then(() => { - /* __GDPR__FRAGMENT__ - "WelcomePageInstalled-2" : { - "from" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "extensionId": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "outcome": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog(strings.installedEvent, { - from: telemetryFrom, - extensionId: extensionSuggestion.id, - outcome: installedExtension ? 'enabled' : 'installed', - }); - return this.hostService.reload(); - }); - } else { - /* __GDPR__FRAGMENT__ - "WelcomePageInstalled-3" : { - "from" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "extensionId": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "outcome": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog(strings.installedEvent, { - from: telemetryFrom, - extensionId: extensionSuggestion.id, - outcome: 'not_found', - }); - this.notificationService.error(strings.extensionNotFound.replace('{0}', extensionSuggestion.name).replace('{1}', extensionSuggestion.id)); - return undefined; - } - }); - }).then(undefined, err => { - /* __GDPR__FRAGMENT__ - "WelcomePageInstalled-4" : { - "from" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "extensionId": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "outcome": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog(strings.installedEvent, { - from: telemetryFrom, - extensionId: extensionSuggestion.id, - outcome: isPromiseCanceledError(err) ? 'canceled' : 'error', - }); - this.notificationService.error(err); - }); - } - }, { - label: localize('details', "Details"), - run: () => { - /* __GDPR__FRAGMENT__ - "WelcomePageDetails-1" : { - "from" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "extensionId": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog(strings.detailsEvent, { - from: telemetryFrom, - extensionId: extensionSuggestion.id, - }); - this.extensionsWorkbenchService.queryGallery({ names: [extensionSuggestion.id] }, CancellationToken.None) - .then(result => this.extensionsWorkbenchService.open(result.firstPage[0])) - .then(undefined, onUnexpectedError); - } - }] - ); - }).then(undefined, err => { - /* __GDPR__FRAGMENT__ - "WelcomePageInstalled-6" : { - "from" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "extensionId": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "outcome": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog(strings.installedEvent, { - from: telemetryFrom, - extensionId: extensionSuggestion.id, - outcome: isPromiseCanceledError(err) ? 'canceled' : 'error', - }); - this.notificationService.error(err); - }); - } - - private updateInstalledExtensions(container: HTMLElement, installedExtensions: Promise) { - installedExtensions.then(extensions => { - const elements = container.querySelectorAll('.installExtension, .enabledExtension'); - for (let i = 0; i < elements.length; i++) { - elements[i].classList.remove('installed'); - } - extensions.filter(ext => ext.globallyEnabled) - .map(ext => ext.identifier.id) - .forEach(id => { - const install = container.querySelectorAll(`.installExtension[data-extension="${id}"]`); - for (let i = 0; i < install.length; i++) { - install[i].classList.add('installed'); - } - const enabled = container.querySelectorAll(`.enabledExtension[data-extension="${id}"]`); - for (let i = 0; i < enabled.length; i++) { - enabled[i].classList.add('installed'); - } - }); - }).then(undefined, onUnexpectedError); - } -} - -export class WelcomeInputFactory implements IEditorInputFactory { - - static readonly ID = welcomeInputTypeId; - - public canSerialize(editorInput: EditorInput): boolean { - return true; - } - - public serialize(editorInput: EditorInput): string { - return '{}'; - } - - public deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): WalkThroughInput { - return instantiationService.createInstance(WelcomePage) - .editorInput; - } -} - -// theming - -registerThemingParticipant((theme, collector) => { - const backgroundColor = theme.getColor(welcomePageBackground); - if (backgroundColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .welcomePageContainer { background-color: ${backgroundColor}; }`); - } - const foregroundColor = theme.getColor(foreground); - if (foregroundColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .welcomePage .caption { color: ${foregroundColor}; }`); - } - const descriptionColor = theme.getColor(descriptionForeground); - if (descriptionColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .welcomePage .detail { color: ${descriptionColor}; }`); - } - const buttonColor = getExtraColor(theme, buttonBackground, { dark: 'rgba(0, 0, 0, .2)', extra_dark: 'rgba(200, 235, 255, .042)', light: 'rgba(0,0,0,.04)', hc: 'black' }); - if (buttonColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .welcomePage .commands .item button { background: ${buttonColor}; }`); - } - const buttonHoverColor = getExtraColor(theme, buttonHoverBackground, { dark: 'rgba(200, 235, 255, .072)', extra_dark: 'rgba(200, 235, 255, .072)', light: 'rgba(0,0,0,.10)', hc: null }); - if (buttonHoverColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .welcomePage .commands .item button:hover { background: ${buttonHoverColor}; }`); - } - const link = theme.getColor(textLinkForeground); - if (link) { - collector.addRule(`.monaco-workbench .part.editor > .content .welcomePage a { color: ${link}; }`); - } - const activeLink = theme.getColor(textLinkActiveForeground); - if (activeLink) { - collector.addRule(`.monaco-workbench .part.editor > .content .welcomePage a:hover, - .monaco-workbench .part.editor > .content .welcomePage a:active { color: ${activeLink}; }`); - } - const focusColor = theme.getColor(focusBorder); - if (focusColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .welcomePage a:focus { outline-color: ${focusColor}; }`); - } - const border = theme.getColor(contrastBorder); - if (border) { - collector.addRule(`.monaco-workbench .part.editor > .content .welcomePage .commands .item button { border-color: ${border}; }`); - } - const activeBorder = theme.getColor(activeContrastBorder); - if (activeBorder) { - collector.addRule(`.monaco-workbench .part.editor > .content .welcomePage .commands .item button:hover { outline-color: ${activeBorder}; }`); - } -}); diff --git a/vscode-web-gogs1s/yarn.lock b/vscode-web-gogs1s/yarn.lock index 6094aa3..0366d18 100644 --- a/vscode-web-gogs1s/yarn.lock +++ b/vscode-web-gogs1s/yarn.lock @@ -2,560 +2,1186 @@ # yarn lockfile v1 +"@gar/promisify@^1.1.3": + "integrity" "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + "resolved" "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" + "version" "1.1.3" + +"@npmcli/fs@^2.1.0": + "integrity" "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==" + "resolved" "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz" + "version" "2.1.2" + dependencies: + "@gar/promisify" "^1.1.3" + "semver" "^7.3.5" + +"@npmcli/move-file@^2.0.0": + "integrity" "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==" + "resolved" "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "mkdirp" "^1.0.4" + "rimraf" "^3.0.2" + +"@tootallnate/once@2": + "integrity" "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + "resolved" "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" + "version" "2.0.0" + "@types/trusted-types@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.0.tgz#aee6e868fcef74f2b8c71614b6df81a601a42f17" - integrity sha512-I8MnZqNXsOLHsU111oHbn3khtvKMi5Bn4qVFsIWSJcCP1KKDiXX5AEw8UPk0nSopeC+Hvxt6yAy1/a5PailFqg== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.18.0-next.2: - version "1.18.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" - integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.2" - is-callable "^1.2.3" - is-negative-zero "^2.0.1" - is-regex "^1.1.2" - is-string "^1.0.5" - object-inspect "^1.9.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -fs-extra@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -graceful-fs@^4.1.2: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -iconv-lite-umd@0.6.8: - version "0.6.8" - resolved "https://registry.yarnpkg.com/iconv-lite-umd/-/iconv-lite-umd-0.6.8.tgz#5ad310ec126b260621471a2d586f7f37b9958ec0" - integrity sha512-zvXJ5gSwMC9JD3wDzH8CoZGc1pbiJn12Tqjk8BXYCnYz3hYL5GRjHW8LEykjXhV9WgNGI4rgpgHcbIiBfrRq6A== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-bigint@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" - integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== - -is-boolean-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" - integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== - dependencies: - call-bind "^1.0.0" - -is-callable@^1.1.4, is-callable@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== - -is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-number-object@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" - integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== - -is-regex@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" - integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== - dependencies: - call-bind "^1.0.2" - has-symbols "^1.0.1" - -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -jschardet@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-2.2.1.tgz#03b0264669a90c7a5c436a68c5a7d4e4cb0c9823" - integrity sha512-Ks2JNuUJoc7PGaZ7bVFtSEvOcr0rBq6Q1J5/7+zKWLT+g+4zziL63O0jg7y2jxhzIa1LVsHUbPXrbaWmz9iwDw== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" + "integrity" "sha512-I8MnZqNXsOLHsU111oHbn3khtvKMi5Bn4qVFsIWSJcCP1KKDiXX5AEw8UPk0nSopeC+Hvxt6yAy1/a5PailFqg==" + "resolved" "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.0.tgz" + "version" "2.0.0" + +"abbrev@1": + "integrity" "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "resolved" "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + "version" "1.1.1" + +"agent-base@^6.0.2", "agent-base@6": + "integrity" "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==" + "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "debug" "4" + +"agentkeepalive@^4.2.1": + "integrity" "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==" + "resolved" "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz" + "version" "4.2.1" + dependencies: + "debug" "^4.1.0" + "depd" "^1.1.2" + "humanize-ms" "^1.2.1" + +"aggregate-error@^3.0.0": + "integrity" "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==" + "resolved" "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "clean-stack" "^2.0.0" + "indent-string" "^4.0.0" + +"ansi-regex@^5.0.1": + "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + "version" "5.0.1" + +"ansi-styles@^3.2.1": + "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + "version" "3.2.1" + dependencies: + "color-convert" "^1.9.0" + +"aproba@^1.0.3 || ^2.0.0": + "integrity" "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + "resolved" "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" + "version" "2.0.0" + +"are-we-there-yet@^3.0.0": + "integrity" "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==" + "resolved" "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "delegates" "^1.0.0" + "readable-stream" "^3.6.0" + +"balanced-match@^1.0.0": + "integrity" "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" + "version" "1.0.0" + +"brace-expansion@^1.1.7": + "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" + "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + "version" "1.1.11" + dependencies: + "balanced-match" "^1.0.0" + "concat-map" "0.0.1" + +"brace-expansion@^2.0.1": + "integrity" "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==" + "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "balanced-match" "^1.0.0" + +"cacache@^16.1.0": + "integrity" "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==" + "resolved" "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz" + "version" "16.1.3" + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + "chownr" "^2.0.0" + "fs-minipass" "^2.1.0" + "glob" "^8.0.1" + "infer-owner" "^1.0.4" + "lru-cache" "^7.7.1" + "minipass" "^3.1.6" + "minipass-collect" "^1.0.2" + "minipass-flush" "^1.0.5" + "minipass-pipeline" "^1.2.4" + "mkdirp" "^1.0.4" + "p-map" "^4.0.0" + "promise-inflight" "^1.0.1" + "rimraf" "^3.0.2" + "ssri" "^9.0.0" + "tar" "^6.1.11" + "unique-filename" "^2.0.0" + +"call-bind@^1.0.0", "call-bind@^1.0.2": + "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==" + "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "function-bind" "^1.1.1" + "get-intrinsic" "^1.0.2" + +"chalk@^2.4.1": + "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + "version" "2.4.2" + dependencies: + "ansi-styles" "^3.2.1" + "escape-string-regexp" "^1.0.5" + "supports-color" "^5.3.0" + +"chownr@^2.0.0": + "integrity" "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + "resolved" "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + "version" "2.0.0" + +"clean-stack@^2.0.0": + "integrity" "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + "resolved" "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + "version" "2.2.0" + +"color-convert@^1.9.0": + "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + "version" "1.9.3" + dependencies: + "color-name" "1.1.3" + +"color-name@1.1.3": + "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + "version" "1.1.3" + +"color-support@^1.1.3": + "integrity" "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + "resolved" "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" + "version" "1.1.3" + +"concat-map@0.0.1": + "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "version" "0.0.1" + +"console-control-strings@^1.1.0": + "integrity" "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "resolved" "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + "version" "1.1.0" + +"cross-spawn@^6.0.5": + "integrity" "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==" + "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" + "version" "6.0.5" + dependencies: + "nice-try" "^1.0.4" + "path-key" "^2.0.1" + "semver" "^5.5.0" + "shebang-command" "^1.2.0" + "which" "^1.2.9" + +"debug@^4.1.0", "debug@^4.3.3", "debug@4": + "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + "version" "4.3.4" + dependencies: + "ms" "2.1.2" + +"define-properties@^1.1.3": + "integrity" "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==" + "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "object-keys" "^1.0.12" + +"delegates@^1.0.0": + "integrity" "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "resolved" "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + "version" "1.0.0" + +"depd@^1.1.2": + "integrity" "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + "resolved" "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + "version" "1.1.2" + +"emoji-regex@^8.0.0": + "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + "version" "8.0.0" + +"encoding@^0.1.13": + "integrity" "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==" + "resolved" "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" + "version" "0.1.13" + dependencies: + "iconv-lite" "^0.6.2" + +"env-paths@^2.2.0": + "integrity" "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + "resolved" "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + "version" "2.2.1" + +"err-code@^2.0.2": + "integrity" "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + "resolved" "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" + "version" "2.0.3" + +"error-ex@^1.3.1": + "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" + "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + "version" "1.3.2" + dependencies: + "is-arrayish" "^0.2.1" + +"es-abstract@^1.18.0-next.2": + "integrity" "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==" + "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz" + "version" "1.18.0" + dependencies: + "call-bind" "^1.0.2" + "es-to-primitive" "^1.2.1" + "function-bind" "^1.1.1" + "get-intrinsic" "^1.1.1" + "has" "^1.0.3" + "has-symbols" "^1.0.2" + "is-callable" "^1.2.3" + "is-negative-zero" "^2.0.1" + "is-regex" "^1.1.2" + "is-string" "^1.0.5" + "object-inspect" "^1.9.0" + "object-keys" "^1.1.1" + "object.assign" "^4.1.2" + "string.prototype.trimend" "^1.0.4" + "string.prototype.trimstart" "^1.0.4" + "unbox-primitive" "^1.0.0" + +"es-to-primitive@^1.2.1": + "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==" + "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + "version" "1.2.1" + dependencies: + "is-callable" "^1.1.4" + "is-date-object" "^1.0.1" + "is-symbol" "^1.0.2" + +"escape-string-regexp@^1.0.5": + "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" + +"fs-extra@^10.0.0": + "integrity" "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==" + "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz" + "version" "10.0.0" + dependencies: + "graceful-fs" "^4.2.0" + "jsonfile" "^6.0.1" + "universalify" "^2.0.0" + +"fs-minipass@^2.0.0", "fs-minipass@^2.1.0": + "integrity" "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==" + "resolved" "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "minipass" "^3.0.0" + +"fs.realpath@^1.0.0": + "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + "version" "1.0.0" + +"function-bind@^1.1.1": + "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + "version" "1.1.1" + +"gauge@^4.0.3": + "integrity" "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==" + "resolved" "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz" + "version" "4.0.4" + dependencies: + "aproba" "^1.0.3 || ^2.0.0" + "color-support" "^1.1.3" + "console-control-strings" "^1.1.0" + "has-unicode" "^2.0.1" + "signal-exit" "^3.0.7" + "string-width" "^4.2.3" + "strip-ansi" "^6.0.1" + "wide-align" "^1.1.5" + +"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.1": + "integrity" "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==" + "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "function-bind" "^1.1.1" + "has" "^1.0.3" + "has-symbols" "^1.0.1" + +"glob@^7.1.3", "glob@^7.1.4": + "integrity" "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + "version" "7.2.3" + dependencies: + "fs.realpath" "^1.0.0" + "inflight" "^1.0.4" + "inherits" "2" + "minimatch" "^3.1.1" + "once" "^1.3.0" + "path-is-absolute" "^1.0.0" + +"glob@^8.0.1": + "integrity" "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==" + "resolved" "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" + "version" "8.0.3" + dependencies: + "fs.realpath" "^1.0.0" + "inflight" "^1.0.4" + "inherits" "2" + "minimatch" "^5.0.1" + "once" "^1.3.0" + +"graceful-fs@^4.1.2": + "integrity" "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz" + "version" "4.2.6" + +"graceful-fs@^4.1.6", "graceful-fs@^4.2.0", "graceful-fs@^4.2.6": + "integrity" "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz" + "version" "4.2.8" + +"has-bigints@^1.0.1": + "integrity" "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + "resolved" "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz" + "version" "1.0.1" + +"has-flag@^3.0.0": + "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + "version" "3.0.0" + +"has-symbols@^1.0.1", "has-symbols@^1.0.2": + "integrity" "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" + "version" "1.0.2" + +"has-unicode@^2.0.1": + "integrity" "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "resolved" "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + "version" "2.0.1" + +"has@^1.0.3": + "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" + "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "function-bind" "^1.1.1" + +"hosted-git-info@^2.1.4": + "integrity" "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + "version" "2.8.9" + +"http-cache-semantics@^4.1.0": + "integrity" "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "resolved" "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" + "version" "4.1.0" + +"http-proxy-agent@^5.0.0": + "integrity" "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==" + "resolved" "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "@tootallnate/once" "2" + "agent-base" "6" + "debug" "4" + +"https-proxy-agent@^5.0.0": + "integrity" "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==" + "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "agent-base" "6" + "debug" "4" + +"humanize-ms@^1.2.1": + "integrity" "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==" + "resolved" "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" + "version" "1.2.1" + dependencies: + "ms" "^2.0.0" + +"iconv-lite-umd@0.6.8": + "integrity" "sha512-zvXJ5gSwMC9JD3wDzH8CoZGc1pbiJn12Tqjk8BXYCnYz3hYL5GRjHW8LEykjXhV9WgNGI4rgpgHcbIiBfrRq6A==" + "resolved" "https://registry.npmjs.org/iconv-lite-umd/-/iconv-lite-umd-0.6.8.tgz" + "version" "0.6.8" + +"iconv-lite@^0.6.2": + "integrity" "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==" + "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + "version" "0.6.3" + dependencies: + "safer-buffer" ">= 2.1.2 < 3.0.0" + +"imurmurhash@^0.1.4": + "integrity" "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + "version" "0.1.4" + +"indent-string@^4.0.0": + "integrity" "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "resolved" "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + "version" "4.0.0" + +"infer-owner@^1.0.4": + "integrity" "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + "resolved" "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" + "version" "1.0.4" + +"inflight@^1.0.4": + "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" + "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + "version" "1.0.6" + dependencies: + "once" "^1.3.0" + "wrappy" "1" + +"inherits@^2.0.3", "inherits@2": + "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + "version" "2.0.4" + +"ip@^2.0.0": + "integrity" "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "resolved" "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" + "version" "2.0.0" + +"is-arrayish@^0.2.1": + "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + "version" "0.2.1" + +"is-bigint@^1.0.1": + "integrity" "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==" + "resolved" "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz" + "version" "1.0.1" + +"is-boolean-object@^1.1.0": + "integrity" "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==" + "resolved" "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "call-bind" "^1.0.0" + +"is-callable@^1.1.4", "is-callable@^1.2.3": + "integrity" "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz" + "version" "1.2.3" + +"is-core-module@^2.2.0": + "integrity" "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==" + "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz" + "version" "2.2.0" + dependencies: + "has" "^1.0.3" + +"is-date-object@^1.0.1": + "integrity" "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz" + "version" "1.0.2" + +"is-fullwidth-code-point@^3.0.0": + "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + "version" "3.0.0" + +"is-lambda@^1.0.1": + "integrity" "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" + "resolved" "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" + "version" "1.0.1" + +"is-negative-zero@^2.0.1": + "integrity" "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz" + "version" "2.0.1" + +"is-number-object@^1.0.4": + "integrity" "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + "resolved" "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz" + "version" "1.0.4" + +"is-regex@^1.1.2": + "integrity" "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==" + "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz" + "version" "1.1.2" + dependencies: + "call-bind" "^1.0.2" + "has-symbols" "^1.0.1" + +"is-string@^1.0.5": + "integrity" "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz" + "version" "1.0.5" + +"is-symbol@^1.0.2", "is-symbol@^1.0.3": + "integrity" "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==" + "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "has-symbols" "^1.0.1" + +"isexe@^2.0.0": + "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "version" "2.0.0" + +"jschardet@2.2.1": + "integrity" "sha512-Ks2JNuUJoc7PGaZ7bVFtSEvOcr0rBq6Q1J5/7+zKWLT+g+4zziL63O0jg7y2jxhzIa1LVsHUbPXrbaWmz9iwDw==" + "resolved" "https://registry.npmjs.org/jschardet/-/jschardet-2.2.1.tgz" + "version" "2.2.1" + +"json-parse-better-errors@^1.0.1": + "integrity" "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "resolved" "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + "version" "1.0.2" + +"jsonfile@^6.0.1": + "integrity" "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==" + "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + "version" "6.1.0" + dependencies: + "universalify" "^2.0.0" + optionalDependencies: + "graceful-fs" "^4.1.6" + +"load-json-file@^4.0.0": + "integrity" "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=" + "resolved" "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "graceful-fs" "^4.1.2" + "parse-json" "^4.0.0" + "pify" "^3.0.0" + "strip-bom" "^3.0.0" + +"lru-cache@^6.0.0": + "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "yallist" "^4.0.0" + +"lru-cache@^7.7.1": + "integrity" "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz" + "version" "7.14.0" + +"make-fetch-happen@^10.0.3": + "integrity" "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==" + "resolved" "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz" + "version" "10.2.1" + dependencies: + "agentkeepalive" "^4.2.1" + "cacache" "^16.1.0" + "http-cache-semantics" "^4.1.0" + "http-proxy-agent" "^5.0.0" + "https-proxy-agent" "^5.0.0" + "is-lambda" "^1.0.1" + "lru-cache" "^7.7.1" + "minipass" "^3.1.6" + "minipass-collect" "^1.0.2" + "minipass-fetch" "^2.0.3" + "minipass-flush" "^1.0.5" + "minipass-pipeline" "^1.2.4" + "negotiator" "^0.6.3" + "promise-retry" "^2.0.1" + "socks-proxy-agent" "^7.0.0" + "ssri" "^9.0.0" + +"memorystream@^0.3.1": + "integrity" "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" + "resolved" "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" + "version" "0.3.1" + +"minimatch@^3.0.4", "minimatch@^3.1.1": + "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "brace-expansion" "^1.1.7" + +"minimatch@^5.0.1": + "integrity" "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "brace-expansion" "^2.0.1" + +"minipass-collect@^1.0.2": + "integrity" "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==" + "resolved" "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "minipass" "^3.0.0" + +"minipass-fetch@^2.0.3": + "integrity" "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==" + "resolved" "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz" + "version" "2.1.2" + dependencies: + "minipass" "^3.1.6" + "minipass-sized" "^1.0.3" + "minizlib" "^2.1.2" optionalDependencies: - graceful-fs "^4.1.6" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -npm-run-all@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" - integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== - dependencies: - ansi-styles "^3.2.1" - chalk "^2.4.1" - cross-spawn "^6.0.5" - memorystream "^0.3.1" - minimatch "^3.0.4" - pidtree "^0.3.0" - read-pkg "^3.0.0" - shell-quote "^1.6.1" - string.prototype.padend "^3.0.0" - -object-inspect@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -pidtree@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" - integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -resolve@^1.10.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shell-quote@^1.6.1: - version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== - -string.prototype.padend@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz#6858ca4f35c5268ebd5e8615e1327d55f59ee311" - integrity sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -tas-client-umd@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/tas-client-umd/-/tas-client-umd-0.1.2.tgz#fe93ae085f65424292ac79feff4f1add3e50e624" - integrity sha512-rT9BdDCejckqOTQL2ShX67QtTiAUGbmPm5ZTC8giXobBvZC6JuvBVy5G32hoGZ3Q0dpTvMfgpf3iVFNN2F7wzg== - -unbox-primitive@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vscode-oniguruma@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.3.1.tgz#e2383879c3485b19f533ec34efea9d7a2b14be8f" - integrity sha512-gz6ZBofA7UXafVA+m2Yt2zHKgXC2qedArprIsHAPKByTkwq9l5y/izAGckqxYml7mSbYxTRTfdRwsFq3cwF4LQ== - -vscode-textmate@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" - integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -xterm-addon-search@0.8.0-beta.3: - version "0.8.0-beta.3" - resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.8.0-beta.3.tgz#c6c7e36a03706bd43d8bba383511acf9e435aed0" - integrity sha512-EZP97KJIJ4KGQaOPYiiOaRRJst6LOgeEFoQL46WcBl5EWH9pH8qfrv0BHAJ8+6nBV2B9u5M6rzxO1GvLLec19w== - -xterm-addon-unicode11@0.3.0-beta.3: - version "0.3.0-beta.3" - resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.3.0-beta.3.tgz#70af2dfb67809258edb62c19e2861f7ce5ccf5cd" - integrity sha512-vaYopnOjn19wCLDCyIWPWLwKR7CvLPxB5YZ3CAxt9qL05o3symxIJJJC0DuCa4GaGKVjNc7EmjRCs5bsJ2O1tw== - -xterm-addon-webgl@0.10.0-beta.1: - version "0.10.0-beta.1" - resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.10.0-beta.1.tgz#e0bf964945a9aa8fc18318ddbd32e56ec99c219e" - integrity sha512-XNZMrmiyFaz3XiPq+LqF0qn2QHpUEwuk+cG53JwpJHnWo3dd2jxoIgHFQUcrnvHIVPZMbTKySIwLCCC9uQVl7Q== - -xterm@4.10.0-beta.4: - version "4.10.0-beta.4" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.10.0-beta.4.tgz#95efce7a40ec582101ec9777f4ccc6e68e95185e" - integrity sha512-q/yRy2nn4mp1jWZe218TJwlKjXCIr6h28Kw0JMB+lcTeU+MebZ3TrHqlrNVnB+UJfFDOpkw0qfKYfRoV8G/hXA== + "encoding" "^0.1.13" + +"minipass-flush@^1.0.5": + "integrity" "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==" + "resolved" "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" + "version" "1.0.5" + dependencies: + "minipass" "^3.0.0" + +"minipass-pipeline@^1.2.4": + "integrity" "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==" + "resolved" "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" + "version" "1.2.4" + dependencies: + "minipass" "^3.0.0" + +"minipass-sized@^1.0.3": + "integrity" "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==" + "resolved" "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "minipass" "^3.0.0" + +"minipass@^3.0.0", "minipass@^3.1.1", "minipass@^3.1.6": + "integrity" "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==" + "resolved" "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz" + "version" "3.3.4" + dependencies: + "yallist" "^4.0.0" + +"minizlib@^2.1.1", "minizlib@^2.1.2": + "integrity" "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==" + "resolved" "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + "version" "2.1.2" + dependencies: + "minipass" "^3.0.0" + "yallist" "^4.0.0" + +"mkdirp@^1.0.3", "mkdirp@^1.0.4": + "integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + "version" "1.0.4" + +"ms@^2.0.0", "ms@2.1.2": + "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + "version" "2.1.2" + +"negotiator@^0.6.3": + "integrity" "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + "version" "0.6.3" + +"nice-try@^1.0.4": + "integrity" "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "resolved" "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" + "version" "1.0.5" + +"node-gyp@^9.1.0": + "integrity" "sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g==" + "resolved" "https://registry.npmjs.org/node-gyp/-/node-gyp-9.1.0.tgz" + "version" "9.1.0" + dependencies: + "env-paths" "^2.2.0" + "glob" "^7.1.4" + "graceful-fs" "^4.2.6" + "make-fetch-happen" "^10.0.3" + "nopt" "^5.0.0" + "npmlog" "^6.0.0" + "rimraf" "^3.0.2" + "semver" "^7.3.5" + "tar" "^6.1.2" + "which" "^2.0.2" + +"nopt@^5.0.0": + "integrity" "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==" + "resolved" "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "abbrev" "1" + +"normalize-package-data@^2.3.2": + "integrity" "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==" + "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + "version" "2.5.0" + dependencies: + "hosted-git-info" "^2.1.4" + "resolve" "^1.10.0" + "semver" "2 || 3 || 4 || 5" + "validate-npm-package-license" "^3.0.1" + +"npm-run-all@^4.1.5": + "integrity" "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==" + "resolved" "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz" + "version" "4.1.5" + dependencies: + "ansi-styles" "^3.2.1" + "chalk" "^2.4.1" + "cross-spawn" "^6.0.5" + "memorystream" "^0.3.1" + "minimatch" "^3.0.4" + "pidtree" "^0.3.0" + "read-pkg" "^3.0.0" + "shell-quote" "^1.6.1" + "string.prototype.padend" "^3.0.0" + +"npmlog@^6.0.0": + "integrity" "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==" + "resolved" "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "are-we-there-yet" "^3.0.0" + "console-control-strings" "^1.1.0" + "gauge" "^4.0.3" + "set-blocking" "^2.0.0" + +"object-inspect@^1.9.0": + "integrity" "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" + "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz" + "version" "1.9.0" + +"object-keys@^1.0.12", "object-keys@^1.1.1": + "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + "version" "1.1.1" + +"object.assign@^4.1.2": + "integrity" "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==" + "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "call-bind" "^1.0.0" + "define-properties" "^1.1.3" + "has-symbols" "^1.0.1" + "object-keys" "^1.1.1" + +"once@^1.3.0": + "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" + "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "wrappy" "1" + +"p-map@^4.0.0": + "integrity" "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==" + "resolved" "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "aggregate-error" "^3.0.0" + +"parse-json@^4.0.0": + "integrity" "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=" + "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "error-ex" "^1.3.1" + "json-parse-better-errors" "^1.0.1" + +"path-is-absolute@^1.0.0": + "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "version" "1.0.1" + +"path-key@^2.0.1": + "integrity" "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "resolved" "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + "version" "2.0.1" + +"path-parse@^1.0.6": + "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + "version" "1.0.7" + +"path-type@^3.0.0": + "integrity" "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==" + "resolved" "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "pify" "^3.0.0" + +"pidtree@^0.3.0": + "integrity" "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==" + "resolved" "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz" + "version" "0.3.1" + +"pify@^3.0.0": + "integrity" "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "resolved" "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + "version" "3.0.0" + +"promise-inflight@^1.0.1": + "integrity" "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + "resolved" "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" + "version" "1.0.1" + +"promise-retry@^2.0.1": + "integrity" "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==" + "resolved" "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "err-code" "^2.0.2" + "retry" "^0.12.0" + +"read-pkg@^3.0.0": + "integrity" "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=" + "resolved" "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "load-json-file" "^4.0.0" + "normalize-package-data" "^2.3.2" + "path-type" "^3.0.0" + +"readable-stream@^3.6.0": + "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==" + "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + "version" "3.6.0" + dependencies: + "inherits" "^2.0.3" + "string_decoder" "^1.1.1" + "util-deprecate" "^1.0.1" + +"resolve@^1.10.0": + "integrity" "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==" + "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" + "version" "1.20.0" + dependencies: + "is-core-module" "^2.2.0" + "path-parse" "^1.0.6" + +"retry@^0.12.0": + "integrity" "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" + "resolved" "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + "version" "0.12.0" + +"rimraf@^3.0.2": + "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "glob" "^7.1.3" + +"safe-buffer@~5.2.0": + "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + "version" "5.2.1" + +"safer-buffer@>= 2.1.2 < 3.0.0": + "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + "version" "2.1.2" + +"semver@^5.5.0", "semver@2 || 3 || 4 || 5": + "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + "version" "5.7.1" + +"semver@^7.3.5": + "integrity" "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + "version" "7.3.7" + dependencies: + "lru-cache" "^6.0.0" + +"set-blocking@^2.0.0": + "integrity" "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "resolved" "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + "version" "2.0.0" + +"shebang-command@^1.2.0": + "integrity" "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=" + "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "shebang-regex" "^1.0.0" + +"shebang-regex@^1.0.0": + "integrity" "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + "version" "1.0.0" + +"shell-quote@^1.6.1": + "integrity" "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + "resolved" "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz" + "version" "1.7.2" + +"signal-exit@^3.0.7": + "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + "version" "3.0.7" + +"smart-buffer@^4.2.0": + "integrity" "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + "resolved" "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + "version" "4.2.0" + +"socks-proxy-agent@^7.0.0": + "integrity" "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==" + "resolved" "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz" + "version" "7.0.0" + dependencies: + "agent-base" "^6.0.2" + "debug" "^4.3.3" + "socks" "^2.6.2" + +"socks@^2.6.2": + "integrity" "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==" + "resolved" "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz" + "version" "2.7.0" + dependencies: + "ip" "^2.0.0" + "smart-buffer" "^4.2.0" + +"spdx-correct@^3.0.0": + "integrity" "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==" + "resolved" "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" + "version" "3.1.1" + dependencies: + "spdx-expression-parse" "^3.0.0" + "spdx-license-ids" "^3.0.0" + +"spdx-exceptions@^2.1.0": + "integrity" "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "resolved" "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + "version" "2.3.0" + +"spdx-expression-parse@^3.0.0": + "integrity" "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==" + "resolved" "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "spdx-exceptions" "^2.1.0" + "spdx-license-ids" "^3.0.0" + +"spdx-license-ids@^3.0.0": + "integrity" "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" + "resolved" "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz" + "version" "3.0.7" + +"ssri@^9.0.0": + "integrity" "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==" + "resolved" "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz" + "version" "9.0.1" + dependencies: + "minipass" "^3.1.1" + +"string_decoder@^1.1.1": + "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" + "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + "version" "1.3.0" + dependencies: + "safe-buffer" "~5.2.0" + +"string-width@^1.0.2 || 2 || 3 || 4", "string-width@^4.2.3": + "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + "version" "4.2.3" + dependencies: + "emoji-regex" "^8.0.0" + "is-fullwidth-code-point" "^3.0.0" + "strip-ansi" "^6.0.1" + +"string.prototype.padend@^3.0.0": + "integrity" "sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==" + "resolved" "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "call-bind" "^1.0.2" + "define-properties" "^1.1.3" + "es-abstract" "^1.18.0-next.2" + +"string.prototype.trimend@^1.0.4": + "integrity" "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==" + "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "call-bind" "^1.0.2" + "define-properties" "^1.1.3" + +"string.prototype.trimstart@^1.0.4": + "integrity" "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==" + "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "call-bind" "^1.0.2" + "define-properties" "^1.1.3" + +"strip-ansi@^6.0.1": + "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "ansi-regex" "^5.0.1" + +"strip-bom@^3.0.0": + "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + "version" "3.0.0" + +"supports-color@^5.3.0": + "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + "version" "5.5.0" + dependencies: + "has-flag" "^3.0.0" + +"tar@^6.1.11", "tar@^6.1.2": + "integrity" "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==" + "resolved" "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz" + "version" "6.1.11" + dependencies: + "chownr" "^2.0.0" + "fs-minipass" "^2.0.0" + "minipass" "^3.0.0" + "minizlib" "^2.1.1" + "mkdirp" "^1.0.3" + "yallist" "^4.0.0" + +"tas-client-umd@0.1.2": + "integrity" "sha512-rT9BdDCejckqOTQL2ShX67QtTiAUGbmPm5ZTC8giXobBvZC6JuvBVy5G32hoGZ3Q0dpTvMfgpf3iVFNN2F7wzg==" + "resolved" "https://registry.npmjs.org/tas-client-umd/-/tas-client-umd-0.1.2.tgz" + "version" "0.1.2" + +"unbox-primitive@^1.0.0": + "integrity" "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==" + "resolved" "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "function-bind" "^1.1.1" + "has-bigints" "^1.0.1" + "has-symbols" "^1.0.2" + "which-boxed-primitive" "^1.0.2" + +"unique-filename@^2.0.0": + "integrity" "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==" + "resolved" "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "unique-slug" "^3.0.0" + +"unique-slug@^3.0.0": + "integrity" "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==" + "resolved" "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "imurmurhash" "^0.1.4" + +"universalify@^2.0.0": + "integrity" "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + "resolved" "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + "version" "2.0.0" + +"util-deprecate@^1.0.1": + "integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "version" "1.0.2" + +"validate-npm-package-license@^3.0.1": + "integrity" "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==" + "resolved" "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "spdx-correct" "^3.0.0" + "spdx-expression-parse" "^3.0.0" + +"vscode-oniguruma@1.3.1": + "integrity" "sha512-gz6ZBofA7UXafVA+m2Yt2zHKgXC2qedArprIsHAPKByTkwq9l5y/izAGckqxYml7mSbYxTRTfdRwsFq3cwF4LQ==" + "resolved" "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.3.1.tgz" + "version" "1.3.1" + +"vscode-textmate@5.2.0": + "integrity" "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==" + "resolved" "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz" + "version" "5.2.0" + +"which-boxed-primitive@^1.0.2": + "integrity" "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==" + "resolved" "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "is-bigint" "^1.0.1" + "is-boolean-object" "^1.1.0" + "is-number-object" "^1.0.4" + "is-string" "^1.0.5" + "is-symbol" "^1.0.3" + +"which@^1.2.9": + "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" + "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + "version" "1.3.1" + dependencies: + "isexe" "^2.0.0" + +"which@^2.0.2": + "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "isexe" "^2.0.0" + +"wide-align@^1.1.5": + "integrity" "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==" + "resolved" "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + "version" "1.1.5" + dependencies: + "string-width" "^1.0.2 || 2 || 3 || 4" + +"wrappy@1": + "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "version" "1.0.2" + +"xterm-addon-search@0.8.0-beta.3": + "integrity" "sha512-EZP97KJIJ4KGQaOPYiiOaRRJst6LOgeEFoQL46WcBl5EWH9pH8qfrv0BHAJ8+6nBV2B9u5M6rzxO1GvLLec19w==" + "resolved" "https://registry.npmjs.org/xterm-addon-search/-/xterm-addon-search-0.8.0-beta.3.tgz" + "version" "0.8.0-beta.3" + +"xterm-addon-unicode11@0.3.0-beta.3": + "integrity" "sha512-vaYopnOjn19wCLDCyIWPWLwKR7CvLPxB5YZ3CAxt9qL05o3symxIJJJC0DuCa4GaGKVjNc7EmjRCs5bsJ2O1tw==" + "resolved" "https://registry.npmjs.org/xterm-addon-unicode11/-/xterm-addon-unicode11-0.3.0-beta.3.tgz" + "version" "0.3.0-beta.3" + +"xterm-addon-webgl@0.10.0-beta.1": + "integrity" "sha512-XNZMrmiyFaz3XiPq+LqF0qn2QHpUEwuk+cG53JwpJHnWo3dd2jxoIgHFQUcrnvHIVPZMbTKySIwLCCC9uQVl7Q==" + "resolved" "https://registry.npmjs.org/xterm-addon-webgl/-/xterm-addon-webgl-0.10.0-beta.1.tgz" + "version" "0.10.0-beta.1" + +"xterm@^4.0.0", "xterm@4.10.0-beta.4": + "integrity" "sha512-q/yRy2nn4mp1jWZe218TJwlKjXCIr6h28Kw0JMB+lcTeU+MebZ3TrHqlrNVnB+UJfFDOpkw0qfKYfRoV8G/hXA==" + "resolved" "https://registry.npmjs.org/xterm/-/xterm-4.10.0-beta.4.tgz" + "version" "4.10.0-beta.4" + +"yallist@^4.0.0": + "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + "version" "4.0.0" diff --git a/yarn.lock b/yarn.lock index 3bb0e48..77851a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -59,7 +59,7 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== -"@jianboy/vscode-web@1.5.10": +"@jianboy/vscode-web@1.70.2": version "1.5.10" resolved "https://registry.yarnpkg.com/@jianboy/vscode-web/-/vscode-web-1.5.10.tgz#58d3744d161e7d7607d4372d790d06da9acbf353" integrity sha512-xuRRSEbuw3FPce7YbyLr0STWLCPhu7B71WdpXiQVPlZ6PmHa8zQPCaeIYR/cOZUqtWH3cKcciC9aGlA/AySphg== From e4bdc6c5aad194e6f89745b5da926e1b652e93af Mon Sep 17 00:00:00 2001 From: jianboy Date: Wed, 31 Aug 2022 20:15:11 +0000 Subject: [PATCH 6/7] remove import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; --- .../src/vs/workbench/contrib/url/browser/trustedDomains.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts b/vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts index 3ec5569..264ef28 100644 --- a/vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts +++ b/vscode-web-gogs1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts @@ -15,7 +15,6 @@ import { IAuthenticationService } from 'vs/workbench/services/authentication/com import { IFileService } from 'vs/platform/files/common/files'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; const TRUSTED_DOMAINS_URI = URI.parse('trustedDomains:/Trusted Domains'); From 661f63da2cd00969004c59cc20ac9148a16157e9 Mon Sep 17 00:00:00 2001 From: jianboy Date: Wed, 31 Aug 2022 22:05:24 +0000 Subject: [PATCH 7/7] add cdn --- .gitpod.yml | 5 ++++- resources/index.html | 4 ++-- scripts/build/build-gogs1s-extensions.sh | 1 + vscode-web-gogs1s/scripts/build-vscode.sh | 10 +++++----- vscode-web-gogs1s/scripts/copy-vscode.sh | 2 +- yarn.lock | 6 +++--- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index cb58aca..c8c7bbe 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -32,4 +32,7 @@ github: # add a "Review in Gitpod" button to the pull request's description (defaults to false) addBadge: false # add a label once the prebuild is ready to pull requests (defaults to false) - addLabel: false \ No newline at end of file + addLabel: false +vscode: + extensions: + - mutantdino.resourcemonitor \ No newline at end of file diff --git a/resources/index.html b/resources/index.html index 67561ff..87e24d9 100644 --- a/resources/index.html +++ b/resources/index.html @@ -139,12 +139,12 @@

You need to enable JavaScript to run this app.

'xterm-addon-webgl': `${window.location.origin}/static/node_modules/xterm-addon-webgl/lib/xterm-addon-webgl.js`, 'tas-client-umd': `${window.location.origin}/static/node_modules/tas-client-umd/lib/tas-client-umd.js`, 'iconv-lite-umd': `${window.location.origin}/static/node_modules/iconv-lite-umd/lib/iconv-lite-umd.js`, - 'jschardet': `https://cdn.yoqi.me/code.git/static/node_modules/jschardet/dist/jschardet.min.js`, + 'jschardet': `https://cdn.yoqi.me/code.git/1.70.2/static/node_modules/jschardet/dist/jschardet.min.js`, } }; - + diff --git a/scripts/build/build-gogs1s-extensions.sh b/scripts/build/build-gogs1s-extensions.sh index ca022a7..db96b15 100755 --- a/scripts/build/build-gogs1s-extensions.sh +++ b/scripts/build/build-gogs1s-extensions.sh @@ -9,6 +9,7 @@ function main() { do if [ -d "$entry" ] then + echo ----------------$entry cd $entry yarn compile fi diff --git a/vscode-web-gogs1s/scripts/build-vscode.sh b/vscode-web-gogs1s/scripts/build-vscode.sh index bc85fc6..78a4bec 100755 --- a/vscode-web-gogs1s/scripts/build-vscode.sh +++ b/vscode-web-gogs1s/scripts/build-vscode.sh @@ -8,12 +8,12 @@ echo $APP_ROOT # build vscode source and vscode builtin extensions function main() { cd ${APP_ROOT} - rsync -a resources/gulp-gogs1s.js lib/vscode + # rsync -a resources/gulp-gogs1s.js lib/vscode cd lib/vscode - - yarn gulp compile-build - yarn gulp optimize --gulpfile ./gulp-gogs1s.js - yarn gulp minify --gulpfile ./gulp-gogs1s.js + yarn gulp vscode-web-min + # yarn gulp compile-build + # yarn gulp optimize --gulpfile ./gulp-gogs1s.js + # yarn gulp minify --gulpfile ./gulp-gogs1s.js echo "build vscode done!" } diff --git a/vscode-web-gogs1s/scripts/copy-vscode.sh b/vscode-web-gogs1s/scripts/copy-vscode.sh index 2d3b1c6..61f34a9 100755 --- a/vscode-web-gogs1s/scripts/copy-vscode.sh +++ b/vscode-web-gogs1s/scripts/copy-vscode.sh @@ -8,7 +8,7 @@ function main() { cd ${APP_ROOT} TARGET="dist/vscode" mkdir -p ${TARGET} - rsync -a --del lib/vscode/out-vscode-min/ "${TARGET}" + rsync -a --del lib/vscode/out-vscode-web-min/ "${TARGET}" echo "copy vscode done!" } diff --git a/yarn.lock b/yarn.lock index 77851a7..8b26d6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -60,9 +60,9 @@ integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== "@jianboy/vscode-web@1.70.2": - version "1.5.10" - resolved "https://registry.yarnpkg.com/@jianboy/vscode-web/-/vscode-web-1.5.10.tgz#58d3744d161e7d7607d4372d790d06da9acbf353" - integrity sha512-xuRRSEbuw3FPce7YbyLr0STWLCPhu7B71WdpXiQVPlZ6PmHa8zQPCaeIYR/cOZUqtWH3cKcciC9aGlA/AySphg== + version "1.70.2" + resolved "https://registry.yarnpkg.com/@jianboy/vscode-web/-/vscode-web-1.70.2.tgz#013cc7398159f47e942a768df131670a3fd64098" + integrity sha512-StMc6WBGLZiPF8XUkcERiv51PnTK0QmVuOfj4vyldbvFIQfzo0WtLCml1WGmgquFSF+nwyxIypkbj6KQHJ9+rQ== dependencies: iconv-lite-umd "0.6.8" jschardet "2.2.1"
-
-
-

${escape(localize('welcomePage.vscode', "Visual Studio Code"))}

-

- One second to read code with VS Code -

-
-
-
- -

-
-
-
-

Authentication

-
-
-
-
-
-
-
-

${escape(localize('welcomePage.learn', "Learn"))}

-
-
-
-
-
-
-
-
-