Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/microsoft/vscode.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Pasero <benjpas@microsoft.com>2022-01-20 15:48:08 +0300
committerGitHub <noreply@github.com>2022-01-20 15:48:08 +0300
commit13461f8c61ebe54d37a18b054af5ff4ede23500e (patch)
treeeacf1ed6548a080319a159a9130467172e1d60c1
parent7cde8b945f917aa6494112a6071cefefbcae63ea (diff)
Web: change `yarn web` to run with our server instead of playground (#139725)
* web - first cut `yarn web` via our server * properly pipe output * web - remove traces of web playground * web - remember last opened workspace for convinience * use vscode-test-web for server less, clean up web commands * fix comment * fix `yarn web` * rename to code-server * open system browser * code-server script: use minimist * test resolver: use ./scripts/code-server * integartion tests: fix code-server command name Co-authored-by: Martin Aeschlimann <martinae@microsoft.com>
-rw-r--r--.eslintignore4
-rw-r--r--.vscode/launch.json24
-rw-r--r--.vscode/tasks.json8
-rw-r--r--build/filters.js1
-rw-r--r--build/gulpfile.vscode.web.js3
-rw-r--r--extensions/vscode-test-resolver/src/extension.ts2
-rw-r--r--package.json3
-rw-r--r--resources/server/bin-dev/code-server.bat43
-rw-r--r--resources/server/bin-dev/code-server.js93
-rwxr-xr-xresources/server/bin-dev/code-server.sh28
-rw-r--r--resources/server/bin-dev/code-web.js87
-rw-r--r--resources/web/bin-dev/code-web-playground.js130
-rw-r--r--resources/web/callback.html81
-rw-r--r--resources/web/code-web.js663
-rw-r--r--scripts/code-server.bat (renamed from resources/server/web.bat)8
-rwxr-xr-xscripts/code-server.sh (renamed from resources/server/web.sh)6
-rw-r--r--scripts/code-web.bat20
-rwxr-xr-xscripts/code-web.sh24
-rw-r--r--src/vs/code/browser/workbench/workbench.ts45
-rw-r--r--test/automation/src/playwrightDriver.ts2
-rw-r--r--test/integration/browser/src/index.ts2
-rw-r--r--yarn.lock574
22 files changed, 889 insertions, 962 deletions
diff --git a/.eslintignore b/.eslintignore
index ec701c48888..112cdef4d25 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -17,7 +17,3 @@
**/extensions/typescript-basics/test/colorize-fixtures/**
**/extensions/**/dist/**
**/extensions/typescript-language-features/test-workspace/**
-
-# These files are not linted by `yarn eslint`, so we exclude them from being linted in the editor.
-# This ensures that if we add new rules and they pass CI, there are also no errors in the editor.
-/resources/web/code-web.js
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 6c5dda1ce3d..84affe5f920 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -244,10 +244,16 @@
}
},
{
- "type": "node",
+ "type": "pwa-node",
"request": "launch",
- "name": "VS Code (Web)",
- "program": "${workspaceFolder}/resources/web/code-web.js",
+ "name": "VS Code Server (Web)",
+ "runtimeExecutable": "${workspaceFolder}/scripts/code-server.sh",
+ "windows": {
+ "runtimeExecutable": "${workspaceFolder}/scripts/code-server.bat",
+ },
+ "outFiles": [
+ "${workspaceFolder}/out/**/*.js"
+ ],
"presentation": {
"group": "0_vscode",
"order": 2
@@ -279,9 +285,9 @@
"request": "launch",
"outFiles": [],
"perScriptSourcemaps": "yes",
- "name": "VS Code (Web, Chrome)",
- "url": "http://localhost:8080",
- "preLaunchTask": "Run web",
+ "name": "VS Code Server (Web, Chrome)",
+ "url": "http://localhost:8080?tkn=dev-token",
+ "preLaunchTask": "Run code server",
"presentation": {
"group": "0_vscode",
"order": 3
@@ -292,10 +298,10 @@
"request": "launch",
"outFiles": [],
"perScriptSourcemaps": "yes",
- "name": "VS Code (Web, Edge)",
- "url": "http://localhost:8080",
+ "name": "VS Code Server (Web, Edge)",
+ "url": "http://localhost:8080?tkn=dev-token",
"pauseForSourceMap": false,
- "preLaunchTask": "Run web",
+ "preLaunchTask": "Run code server",
"presentation": {
"group": "0_vscode",
"order": 3
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index ebf95734c04..2582d30365e 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -171,8 +171,12 @@
},
{
"type": "shell",
- "command": "yarn web --no-launch",
- "label": "Run web",
+ "command": "./scripts/code-server-web.sh",
+ "windows": {
+ "command": ".\\scripts\\code-server.bat"
+ },
+ "args": ["--no-launch", "--connection-token", "dev-token", "--port", "8080"],
+ "label": "Run code server",
"isBackground": true,
"problemMatcher": {
"pattern": {
diff --git a/build/filters.js b/build/filters.js
index 7055e4d83b2..bff7cad1c20 100644
--- a/build/filters.js
+++ b/build/filters.js
@@ -147,7 +147,6 @@ module.exports.copyrightFilter = [
'!build/linux/libcxx-fetcher.*',
'!resources/linux/snap/snapcraft.yaml',
'!resources/win32/bin/code.js',
- '!resources/web/code-web.js',
'!resources/completions/**',
'!extensions/configuration-editing/build/inline-allOf.ts',
'!extensions/markdown-language-features/media/highlight.css',
diff --git a/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js
index 8b22be3d203..cd298243d5e 100644
--- a/build/gulpfile.vscode.web.js
+++ b/build/gulpfile.vscode.web.js
@@ -100,8 +100,7 @@ const createVSCodeWebFileContentMapper = (extensionsRoot) => {
// (2) Patch builtin extensions
if (path.endsWith('vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.js')) {
- // Do not inline `vscode-web-playground` even if it has been packed!
- const builtinExtensions = JSON.stringify(extensions.scanBuiltinExtensions(extensionsRoot, ['vscode-web-playground']));
+ const builtinExtensions = JSON.stringify(extensions.scanBuiltinExtensions(extensionsRoot));
return content.replace('/*BUILD->INSERT_BUILTIN_EXTENSIONS*/', builtinExtensions.substr(1, builtinExtensions.length - 2) /* without [ and ]*/);
}
diff --git a/extensions/vscode-test-resolver/src/extension.ts b/extensions/vscode-test-resolver/src/extension.ts
index 6c9c6d3087e..de9cc74815f 100644
--- a/extensions/vscode-test-resolver/src/extension.ts
+++ b/extensions/vscode-test-resolver/src/extension.ts
@@ -104,7 +104,7 @@ export function activate(context: vscode.ExtensionContext) {
if (!commit) { // dev mode
const serverCommand = process.platform === 'win32' ? 'code-server.bat' : 'code-server.sh';
const vscodePath = path.resolve(path.join(context.extensionPath, '..', '..'));
- const serverCommandPath = path.join(vscodePath, 'resources', 'server', 'bin-dev', serverCommand);
+ const serverCommandPath = path.join(vscodePath, 'scripts', serverCommand);
outputChannel.appendLine(`Launching server: VSCODE_AGENT_FOLDER="${remoteDataDir}" "${serverCommandPath}" ${commandArgs.join(' ')}`);
diff --git a/package.json b/package.json
index fa17c57022f..f4019a555c9 100644
--- a/package.json
+++ b/package.json
@@ -43,7 +43,7 @@
"vscode-dts-compile-check": "tsc -p src/tsconfig.vscode-dts.json && tsc -p src/tsconfig.vscode-proposed-dts.json",
"valid-layers-check": "node build/lib/layersChecker.js",
"update-distro": "node build/npm/update-distro.js",
- "web": "node resources/web/code-web.js",
+ "web": "echo 'yarn web' is replaced by './scripts/code-server-web' or './scripts/code-web'",
"compile-web": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js compile-web",
"watch-web": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js watch-web",
"eslint": "node build/eslint",
@@ -123,6 +123,7 @@
"@types/yazl": "^2.4.2",
"@typescript-eslint/eslint-plugin": "3.2.0",
"@typescript-eslint/parser": "^3.3.0",
+ "@vscode/test-web": "^0.0.18",
"ansi-colors": "^3.2.3",
"asar": "^3.0.3",
"chromium-pickle-js": "^0.2.0",
diff --git a/resources/server/bin-dev/code-server.bat b/resources/server/bin-dev/code-server.bat
deleted file mode 100644
index d6a61b53267..00000000000
--- a/resources/server/bin-dev/code-server.bat
+++ /dev/null
@@ -1,43 +0,0 @@
-@echo off
-setlocal
-
-title VSCode Remote Agent
-
-pushd %~dp0\..\..\..
-
-:: Configuration
-set NODE_ENV=development
-set VSCODE_DEV=1
-
-:: Sync built-in extensions
-call yarn download-builtin-extensions
-
-FOR /F "tokens=*" %%g IN ('node build/lib/node.js') do (SET NODE=%%g)
-
-:: Download nodejs executable for remote
-IF NOT EXIST "%NODE%" (
- call yarn gulp node
-)
-
-:: Launch Agent
-set _FIRST_ARG=%1
-if "%_FIRST_ARG:~0,9%"=="--inspect" (
- set INSPECT=%1
- shift
-) else (
- set INSPECT=
-)
-
-:loop1
-if "%~1"=="" goto after_loop
-set RESTVAR=%RESTVAR% %1
-shift
-goto loop1
-
-:after_loop
-
-call "%NODE%" %INSPECT% "out\vs\server\main.js" %RESTVAR%
-
-popd
-
-endlocal
diff --git a/resources/server/bin-dev/code-server.js b/resources/server/bin-dev/code-server.js
new file mode 100644
index 00000000000..2b5ef20c82d
--- /dev/null
+++ b/resources/server/bin-dev/code-server.js
@@ -0,0 +1,93 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+// @ts-check
+
+const cp = require('child_process');
+const path = require('path');
+const os = require('os');
+const opn = require('opn');
+const crypto = require('crypto');
+const minimist = require('minimist');
+
+const args = minimist(process.argv.slice(2), {
+ boolean: [
+ 'help',
+ ],
+ string: [
+ 'host',
+ 'port',
+ 'driver',
+ 'connection-token'
+ ],
+});
+
+if (args.help) {
+ console.log(
+ './scripts/code-server.sh|bat [options]\n' +
+ ' --launch Opens a browser'
+ );
+}
+
+const serverArgs = process.argv.slice(2).filter(v => v !== '--launch');
+
+const HOST = args['host'] ?? 'localhost';
+const PORT = args['port'] ?? '9888';
+const TOKEN = args['connection-token'] ?? String(crypto.randomInt(0xffffffff));
+
+if (!args['connection-token'] === undefined && !args['connection-token-file'] === undefined && !args['no-connection-token']) {
+ serverArgs.push('--connection-token', TOKEN);
+}
+if (args['host'] === undefined) {
+ serverArgs.push('--host', HOST);
+}
+if (args['port'] === undefined) {
+ serverArgs.push('--port', PORT);
+}
+
+if (args['driver']) {
+ // given a DRIVER, we auto-shutdown when tests are done
+ serverArgs.push('--enable-remote-auto-shutdown', '--remote-auto-shutdown-without-delay');
+}
+
+const env = { ...process.env };
+env['VSCODE_AGENT_FOLDER'] = env['VSCODE_AGENT_FOLDER'] || path.join(os.homedir(), '.vscode-server-oss-dev');
+env['NODE_ENV'] = 'development';
+env['VSCODE_DEV'] = '1';
+const entryPoint = path.join(__dirname, '..', '..', '..', 'out', 'vs', 'server', 'main.js');
+
+startServer();
+
+function startServer() {
+ console.log(`Starting server: ${entryPoint} ${serverArgs.join(' ')}`);
+ const proc = cp.spawn(process.execPath, [entryPoint, ...serverArgs], { env });
+
+ proc.stdout.on('data', data => {
+ // Log everything
+ console.log(data.toString());
+ });
+
+ // Log errors
+ proc.stderr.on('data', data => {
+ console.error(data.toString());
+ });
+
+ proc.on('exit', () => process.exit());
+
+ process.on('exit', () => proc.kill());
+ process.on('SIGINT', () => {
+ proc.kill();
+ process.exit(128 + 2); // https://nodejs.org/docs/v14.16.0/api/process.html#process_signal_events
+ });
+ process.on('SIGTERM', () => {
+ proc.kill();
+ process.exit(128 + 15); // https://nodejs.org/docs/v14.16.0/api/process.html#process_signal_events
+ });
+
+}
+
+if (args['launch']) {
+ opn(`http://${HOST}:${PORT}/?tkn=${TOKEN}`);
+}
diff --git a/resources/server/bin-dev/code-server.sh b/resources/server/bin-dev/code-server.sh
deleted file mode 100755
index 99a47c4fb22..00000000000
--- a/resources/server/bin-dev/code-server.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env bash
-
-if [[ "$OSTYPE" == "darwin"* ]]; then
- realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; }
- ROOT=$(dirname $(dirname $(dirname $(dirname $(realpath "$0")))))
-else
- ROOT=$(dirname $(dirname $(dirname $(dirname $(readlink -f $0)))))
-fi
-
-function code() {
- cd $ROOT
-
- # Sync built-in extensions
- yarn download-builtin-extensions
-
- NODE=$(node build/lib/node.js)
-
- # Download nodejs
- if [ ! -f $NODE ]; then
- yarn gulp node
- fi
-
- NODE_ENV=development \
- VSCODE_DEV=1 \
- $NODE "$ROOT/out/vs/server/main.js" "$@"
-}
-
-code "$@"
diff --git a/resources/server/bin-dev/code-web.js b/resources/server/bin-dev/code-web.js
deleted file mode 100644
index 0fdb7c76d2c..00000000000
--- a/resources/server/bin-dev/code-web.js
+++ /dev/null
@@ -1,87 +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
-
-const cp = require('child_process');
-const path = require('path');
-const os = require('os');
-
-const serverArgs = [];
-
-// Server Config
-let PORT = 9888;
-let DRIVER = undefined;
-let LOGS_PATH = undefined;
-
-// Workspace Config
-let FOLDER = undefined;
-let WORKSPACE = undefined;
-
-// Settings Sync Config
-let GITHUB_AUTH_TOKEN = undefined;
-let ENABLE_SYNC = false;
-
-for (let idx = 0; idx <= process.argv.length - 2; idx++) {
- const arg = process.argv[idx];
- switch (arg) {
- case '--port': PORT = Number(process.argv[idx + 1]); break;
- case '--folder': FOLDER = process.argv[idx + 1]; break;
- case '--workspace': WORKSPACE = process.argv[idx + 1]; break;
- case '--driver': DRIVER = process.argv[idx + 1]; break;
- case '--github-auth': GITHUB_AUTH_TOKEN = process.argv[idx + 1]; break;
- case '--logsPath': LOGS_PATH = process.argv[idx + 1]; break;
- case '--enable-sync': ENABLE_SYNC = true; break;
- }
-}
-
-serverArgs.push('--port', String(PORT));
-if (FOLDER) {
- serverArgs.push('--folder', FOLDER);
-}
-if (WORKSPACE) {
- serverArgs.push('--workspace', WORKSPACE);
-}
-if (DRIVER) {
- serverArgs.push('--driver', DRIVER);
-
- // given a DRIVER, we auto-shutdown when tests are done
- serverArgs.push('--enable-remote-auto-shutdown', '--remote-auto-shutdown-without-delay');
-}
-if (LOGS_PATH) {
- serverArgs.push('--logsPath', LOGS_PATH);
-}
-if (GITHUB_AUTH_TOKEN) {
- serverArgs.push('--github-auth', GITHUB_AUTH_TOKEN);
-}
-if (ENABLE_SYNC) {
- serverArgs.push('--enable-sync', true);
-}
-
-// Connection Token
-serverArgs.push('--connection-token', '00000');
-
-// Server should really only listen from localhost
-serverArgs.push('--host', '127.0.0.1');
-
-const env = { ...process.env };
-env['VSCODE_AGENT_FOLDER'] = env['VSCODE_AGENT_FOLDER'] || path.join(os.homedir(), '.vscode-web-dev');
-const entryPoint = path.join(__dirname, '..', '..', '..', 'out', 'vs', 'server', 'main.js');
-
-startServer();
-
-function startServer() {
- const proc = cp.spawn(process.execPath, [entryPoint, ...serverArgs], { env });
-
- proc.stdout.on('data', data => {
- // Log everything
- console.log(data.toString());
- });
-
- // Log errors
- proc.stderr.on('data', data => {
- console.error(data.toString());
- });
-}
diff --git a/resources/web/bin-dev/code-web-playground.js b/resources/web/bin-dev/code-web-playground.js
new file mode 100644
index 00000000000..57a3e4d8d26
--- /dev/null
+++ b/resources/web/bin-dev/code-web-playground.js
@@ -0,0 +1,130 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+// @ts-check
+
+const testWeb = require('@vscode/test-web');
+
+const fs = require('fs');
+const path = require('path');
+
+const minimist = require('minimist');
+const fancyLog = require('fancy-log');
+const ansiColors = require('ansi-colors');
+const remote = require('gulp-remote-retry-src');
+const vfs = require('vinyl-fs');
+const opn = require('opn');
+
+const APP_ROOT = path.join(__dirname, '..', '..', '..');
+const WEB_DEV_EXTENSIONS_ROOT = path.join(APP_ROOT, '.build', 'builtInWebDevExtensions');
+
+const WEB_PLAYGROUND_VERSION = '0.0.13';
+
+const args = minimist(process.argv.slice(2), {
+ boolean: [
+ 'help',
+ 'verbose',
+ 'open-devtools'
+ ],
+ string: [
+ 'host',
+ 'port',
+ 'extension',
+ 'browserType'
+ ],
+});
+
+if (args.help) {
+ console.log(
+ './scripts/code-web.sh|bat [options]\n' +
+ ' --host Server host address\n' +
+ ' --port Server port\n' +
+ ' --browserType The browser type to launch: `chromium` (default), `firefox`, `webkit` or `none`' +
+ ' --extension Path of an extension to include\n' +
+ ' --open-devtools Open the dev tools' +
+ ' --verbose Print out more information\n' +
+ ' --help\n' +
+ '[Example]\n' +
+ ' ./scripts/code-web.sh|bat --port 8080'
+ );
+ process.exit(0);
+}
+
+openTestWeb();
+
+
+async function openTestWeb() {
+ await ensureWebDevExtensions();
+ const extensionPaths = [WEB_DEV_EXTENSIONS_ROOT];
+ const extensions = args['extension'];
+ if (Array.isArray(extensions)) {
+ extensionPaths.push(...extensions);
+ } else if (extensions) {
+ extensionPaths.push(extensions);
+ }
+ const host = args.host || 'localhost';
+ const port = args.port || 8080;
+
+ await testWeb.open({
+ browserType: args['browserType'] ?? 'none',
+ host,
+ port,
+ folderUri: 'memfs:///sample-folder',
+ vsCodeDevPath: APP_ROOT,
+ extensionPaths,
+ devTools: !!args['open-devtools'],
+ hideServerLog: !args['verbose'],
+ verbose: !!args['verbose']
+ });
+
+
+ if (!args['browserType']) {
+ opn(`http://${host}:${port}/`);
+ }
+}
+
+async function directoryExists(path) {
+ try {
+ return (await fs.promises.stat(path)).isDirectory();
+ } catch {
+ return false;
+ }
+}
+
+async function ensureWebDevExtensions() {
+
+ // Playground (https://github.com/microsoft/vscode-web-playground)
+ const webDevPlaygroundRoot = path.join(WEB_DEV_EXTENSIONS_ROOT, 'vscode-web-playground');
+ const webDevPlaygroundExists = await directoryExists(webDevPlaygroundRoot);
+
+ let downloadPlayground = false;
+ if (webDevPlaygroundExists) {
+ try {
+ const webDevPlaygroundPackageJson = JSON.parse(((await fs.promises.readFile(path.join(webDevPlaygroundRoot, 'package.json'))).toString()));
+ if (webDevPlaygroundPackageJson.version !== WEB_PLAYGROUND_VERSION) {
+ downloadPlayground = true;
+ }
+ } catch (error) {
+ downloadPlayground = true;
+ }
+ } else {
+ downloadPlayground = true;
+ }
+
+ if (downloadPlayground) {
+ if (args.verbose) {
+ fancyLog(`${ansiColors.magenta('Web Development extensions')}: Downloading vscode-web-playground to ${webDevPlaygroundRoot}`);
+ }
+ await new Promise((resolve, reject) => {
+ remote(['package.json', 'dist/extension.js', 'dist/extension.js.map'], {
+ base: 'https://raw.githubusercontent.com/microsoft/vscode-web-playground/main/'
+ }).pipe(vfs.dest(webDevPlaygroundRoot)).on('end', resolve).on('error', reject);
+ });
+ } else {
+ if (args.verbose) {
+ fancyLog(`${ansiColors.magenta('Web Development extensions')}: Using existing vscode-web-playground in ${webDevPlaygroundRoot}`);
+ }
+ }
+}
diff --git a/resources/web/callback.html b/resources/web/callback.html
deleted file mode 100644
index 81f217e980b..00000000000
--- a/resources/web/callback.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!-- Copyright (C) Microsoft Corporation. All rights reserved. -->
-<!DOCTYPE html>
-<html>
-
-<head>
- <meta charset="utf-8" />
-
- <!-- Disable pinch zooming -->
- <meta name="viewport"
- content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
-
- <!-- Content Security Policy -->
- <meta http-equiv="Content-Security-Policy" content="
- default-src 'self';
- img-src 'self' https: data: blob:;
- media-src 'none';
- script-src 'self';
- style-src 'self' 'unsafe-inline';
- font-src 'self' blob:;
- ">
-
- <title>Visual Studio Code</title>
-
- <!-- Styling -->
- <style type="text/css">
- html {
- height: 100%;
- }
-
- body {
- box-sizing: border-box;
- min-height: 100%;
- margin: 0;
- padding: 15px 30px;
- display: flex;
- flex-direction: column;
- color: white;
- font-family: "Segoe UI", "Helvetica Neue", "Helvetica", Arial, sans-serif;
- background-color: #373277;
- }
-
- .branding {
- background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PGRlZnM+PHN0eWxlPi5pY29uLWNhbnZhcy10cmFuc3BhcmVudHtmaWxsOiNmNmY2ZjY7b3BhY2l0eTowO30uaWNvbi13aGl0ZXtmaWxsOiNmZmY7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5CcmFuZFZpc3VhbFN0dWRpb0NvZGUyMDE3UlRXXzI0eF93aGl0ZV8yNHg8L3RpdGxlPjxwYXRoIGNsYXNzPSJpY29uLWNhbnZhcy10cmFuc3BhcmVudCIgZD0iTTI0LDBWMjRIMFYwWiIvPjxwYXRoIGNsYXNzPSJpY29uLXdoaXRlIiBkPSJNMjQsMi41VjIxLjVMMTgsMjQsMCwxOC41di0uNTYxbDE4LDEuNTQ1VjBaTTEsMTMuMTExLDQuMzg1LDEwLDEsNi44ODlsMS40MTgtLjgyN0w1Ljg1Myw4LjY1LDEyLDNsMywxLjQ1NlYxNS41NDRMMTIsMTcsNS44NTMsMTEuMzUsMi40MTksMTMuOTM5Wk03LjY0NCwxMCwxMiwxMy4yODNWNi43MTdaIi8+PC9zdmc+");
- background-size: 24px;
- background-repeat: no-repeat;
- background-position: left 50%;
- padding-left: 36px;
- font-size: 20px;
- letter-spacing: -0.04rem;
- font-weight: 400;
- color: white;
- text-decoration: none;
- }
-
- .message-container {
- flex-grow: 1;
- display: flex;
- align-items: center;
- justify-content: center;
- margin: 0 30px;
- }
-
- .message {
- font-weight: 300;
- font-size: 1.3rem;
- }
- </style>
-</head>
-
-<body>
- <span class="branding">
- Visual Studio Code
- </span>
- <div class="message-container">
- <div class="message">
- You can close this page now.
- </div>
- </div>
-</body>
-
-</html>
diff --git a/resources/web/code-web.js b/resources/web/code-web.js
deleted file mode 100644
index 1f038e7d5f8..00000000000
--- a/resources/web/code-web.js
+++ /dev/null
@@ -1,663 +0,0 @@
-#!/usr/bin/env node
-
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-
-// @ts-check
-
-const http = require('http');
-const url = require('url');
-const fs = require('fs');
-const path = require('path');
-const util = require('util');
-const opn = require('opn');
-const minimist = require('minimist');
-const fancyLog = require('fancy-log');
-const ansiColors = require('ansi-colors');
-const remote = require('gulp-remote-retry-src');
-const vfs = require('vinyl-fs');
-const uuid = require('uuid');
-
-const extensions = require('../../build/lib/extensions');
-const { getBuiltInExtensions } = require('../../build/lib/builtInExtensions');
-
-const APP_ROOT = path.join(__dirname, '..', '..');
-const BUILTIN_EXTENSIONS_ROOT = path.join(APP_ROOT, 'extensions');
-const BUILTIN_MARKETPLACE_EXTENSIONS_ROOT = path.join(APP_ROOT, '.build', 'builtInExtensions');
-const WEB_DEV_EXTENSIONS_ROOT = path.join(APP_ROOT, '.build', 'builtInWebDevExtensions');
-const WEB_MAIN = path.join(APP_ROOT, 'src', 'vs', 'code', 'browser', 'workbench', 'workbench-dev.html');
-
-// This is useful to simulate real world CORS
-const ALLOWED_CORS_ORIGINS = [
- 'http://localhost:8081',
- 'http://127.0.0.1:8081',
- 'http://localhost:8080',
- 'http://127.0.0.1:8080',
-];
-
-const WEB_PLAYGROUND_VERSION = '0.0.13';
-
-const args = minimist(process.argv, {
- boolean: [
- 'no-launch',
- 'help',
- 'verbose',
- 'wrap-iframe',
- 'enable-sync',
- ],
- string: [
- 'scheme',
- 'host',
- 'port',
- 'local_port',
- 'extension',
- 'extensionId',
- 'github-auth',
- 'open-file'
- ],
-});
-
-if (args.help) {
- console.log(
- 'yarn web [options]\n' +
- ' --no-launch Do not open Code in the browser\n' +
- ' --wrap-iframe Wrap the Web Worker Extension Host in an iframe\n' +
- ' --enable-sync Enable sync by default\n' +
- ' --scheme Protocol (https or http)\n' +
- ' --host Remote host\n' +
- ' --port Remote/Local port\n' +
- ' --local_port Local port override\n' +
- ' --extension Path of an extension to include\n' +
- ' --extensionId Id of an extension to include\n' +
- ' --open-file uri of the file to open. Also support selections in the file. Eg: scheme://authority/path#L1:2-L10:3\n' +
- ' --github-auth Github authentication token\n' +
- ' --verbose Print out more information\n' +
- ' --help\n' +
- '[Example]\n' +
- ' yarn web --scheme https --host example.com --port 8080 --local_port 30000'
- );
- process.exit(0);
-}
-
-const PORT = args.port || process.env.PORT || 8080;
-const LOCAL_PORT = args.local_port || process.env.LOCAL_PORT || PORT;
-const SCHEME = args.scheme || process.env.VSCODE_SCHEME || 'http';
-const HOST = args.host || 'localhost';
-const AUTHORITY = process.env.VSCODE_AUTHORITY || `${HOST}:${PORT}`;
-
-const exists = (path) => util.promisify(fs.exists)(path);
-const readFile = (path) => util.promisify(fs.readFile)(path);
-
-async function getBuiltInExtensionInfos() {
- await getBuiltInExtensions();
-
- const allExtensions = [];
- /** @type {Object.<string, string>} */
- const locations = {};
-
- const [localExtensions, marketplaceExtensions, webDevExtensions] = await Promise.all([
- extensions.scanBuiltinExtensions(BUILTIN_EXTENSIONS_ROOT),
- extensions.scanBuiltinExtensions(BUILTIN_MARKETPLACE_EXTENSIONS_ROOT),
- ensureWebDevExtensions().then(() => extensions.scanBuiltinExtensions(WEB_DEV_EXTENSIONS_ROOT))
- ]);
- for (const ext of localExtensions) {
- allExtensions.push(ext);
- locations[ext.extensionPath] = path.join(BUILTIN_EXTENSIONS_ROOT, ext.extensionPath);
- }
- for (const ext of marketplaceExtensions) {
- allExtensions.push(ext);
- locations[ext.extensionPath] = path.join(BUILTIN_MARKETPLACE_EXTENSIONS_ROOT, ext.extensionPath);
- }
- for (const ext of webDevExtensions) {
- allExtensions.push(ext);
- locations[ext.extensionPath] = path.join(WEB_DEV_EXTENSIONS_ROOT, ext.extensionPath);
- }
- for (const ext of allExtensions) {
- if (ext.packageJSON.browser) {
- let mainFilePath = path.join(locations[ext.extensionPath], ext.packageJSON.browser);
- if (path.extname(mainFilePath) !== '.js') {
- mainFilePath += '.js';
- }
- if (!await exists(mainFilePath)) {
- fancyLog(`${ansiColors.red('Error')}: Could not find ${mainFilePath}. Use ${ansiColors.cyan('yarn watch-web')} to build the built-in extensions.`);
- }
- }
- }
- return { extensions: allExtensions, locations };
-}
-
-async function ensureWebDevExtensions() {
-
- // Playground (https://github.com/microsoft/vscode-web-playground)
- const webDevPlaygroundRoot = path.join(WEB_DEV_EXTENSIONS_ROOT, 'vscode-web-playground');
- const webDevPlaygroundExists = await exists(webDevPlaygroundRoot);
-
- let downloadPlayground = false;
- if (webDevPlaygroundExists) {
- try {
- const webDevPlaygroundPackageJson = JSON.parse(((await readFile(path.join(webDevPlaygroundRoot, 'package.json'))).toString()));
- if (webDevPlaygroundPackageJson.version !== WEB_PLAYGROUND_VERSION) {
- downloadPlayground = true;
- }
- } catch (error) {
- downloadPlayground = true;
- }
- } else {
- downloadPlayground = true;
- }
-
- if (downloadPlayground) {
- if (args.verbose) {
- fancyLog(`${ansiColors.magenta('Web Development extensions')}: Downloading vscode-web-playground to ${webDevPlaygroundRoot}`);
- }
- await new Promise((resolve, reject) => {
- remote(['package.json', 'dist/extension.js', 'dist/extension.js.map'], {
- base: 'https://raw.githubusercontent.com/microsoft/vscode-web-playground/main/'
- }).pipe(vfs.dest(webDevPlaygroundRoot)).on('end', resolve).on('error', reject);
- });
- } else {
- if (args.verbose) {
- fancyLog(`${ansiColors.magenta('Web Development extensions')}: Using existing vscode-web-playground in ${webDevPlaygroundRoot}`);
- }
- }
-}
-
-async function getCommandlineProvidedExtensionInfos() {
- const extensions = [];
-
- /** @type {Object.<string, string>} */
- const locations = {};
-
- let extensionArg = args['extension'];
- let extensionIdArg = args['extensionId'];
- if (!extensionArg && !extensionIdArg) {
- return { extensions, locations };
- }
-
- if (extensionArg) {
- const extensionPaths = Array.isArray(extensionArg) ? extensionArg : [extensionArg];
- await Promise.all(extensionPaths.map(async extensionPath => {
- extensionPath = path.resolve(process.cwd(), extensionPath);
- const packageJSON = await getExtensionPackageJSON(extensionPath);
- if (packageJSON) {
- const extensionId = `${packageJSON.publisher}.${packageJSON.name}`;
- extensions.push({ scheme: SCHEME, authority: AUTHORITY, path: `/extension/${extensionId}` });
- locations[extensionId] = extensionPath;
- }
- }));
- }
-
- if (extensionIdArg) {
- extensions.push(...(Array.isArray(extensionIdArg) ? extensionIdArg : [extensionIdArg]));
- }
-
- return { extensions, locations };
-}
-
-async function getExtensionPackageJSON(extensionPath) {
-
- const packageJSONPath = path.join(extensionPath, 'package.json');
- if (await exists(packageJSONPath)) {
- try {
- let packageJSON = JSON.parse((await readFile(packageJSONPath)).toString());
- if (packageJSON.main && !packageJSON.browser) {
- return; // unsupported
- }
- return packageJSON;
- } catch (e) {
- console.log(e);
- }
- }
- return undefined;
-}
-
-const builtInExtensionsPromise = getBuiltInExtensionInfos();
-const commandlineProvidedExtensionsPromise = getCommandlineProvidedExtensionInfos();
-
-const mapCallbackUriToRequestId = new Map();
-
-/**
- * @param req {http.IncomingMessage}
- * @param res {http.ServerResponse}
- */
-const requestHandler = (req, res) => {
- const parsedUrl = url.parse(req.url, true);
- const pathname = parsedUrl.pathname;
-
- res.setHeader('Access-Control-Allow-Origin', '*');
-
- try {
- if (/(\/static)?\/favicon\.ico/.test(pathname)) {
- // favicon
- return serveFile(req, res, path.join(APP_ROOT, 'resources', 'win32', 'code.ico'));
- }
- if (/(\/static)?\/manifest\.json/.test(pathname)) {
- // manifest
- res.writeHead(200, { 'Content-Type': 'application/json' });
- return res.end(JSON.stringify({
- 'name': 'Code - OSS',
- 'short_name': 'Code - OSS',
- 'start_url': '/',
- 'lang': 'en-US',
- 'display': 'standalone'
- }));
- }
- if (/^\/static\//.test(pathname)) {
- // static requests
- return handleStatic(req, res, parsedUrl);
- }
- if (/^\/extension\//.test(pathname)) {
- // default extension requests
- return handleExtension(req, res, parsedUrl);
- }
- if (pathname === '/') {
- // main web
- return handleRoot(req, res);
- } else if (pathname === '/callback') {
- // callback support
- return handleCallback(req, res, parsedUrl);
- } else if (pathname === '/fetch-callback') {
- // callback fetch support
- return handleFetchCallback(req, res, parsedUrl);
- } else if (pathname === '/builtin') {
- // builtin extnesions JSON
- return handleBuiltInExtensions(req, res, parsedUrl);
- }
-
- return serveError(req, res, 404, 'Not found.');
- } catch (error) {
- console.error(error.toString());
-
- return serveError(req, res, 500, 'Internal Server Error.');
- }
-};
-
-const server = http.createServer(requestHandler);
-server.listen(LOCAL_PORT, () => {
- if (LOCAL_PORT !== PORT) {
- console.log(`Operating location at http://0.0.0.0:${LOCAL_PORT}`);
- }
- console.log(`Web UI available at ${SCHEME}://${AUTHORITY}`);
-});
-server.on('error', err => {
- console.error(`Error occurred in server:`);
- console.error(err);
-});
-
-/**
- * @param {import('http').IncomingMessage} req
- */
-function addCORSReplyHeader(req) {
- if (typeof req.headers['origin'] !== 'string') {
- // not a CORS request
- return false;
- }
- return (ALLOWED_CORS_ORIGINS.indexOf(req.headers['origin']) >= 0);
-}
-
-/**
- * @param {import('http').IncomingMessage} req
- * @param {import('http').ServerResponse} res
- * @param {import('url').UrlWithParsedQuery} parsedUrl
- */
-async function handleBuiltInExtensions(req, res, parsedUrl) {
- const { extensions } = await builtInExtensionsPromise;
- res.writeHead(200, { 'Content-Type': 'application/json' });
- return res.end(JSON.stringify(extensions));
-}
-
-/**
- * @param {import('http').IncomingMessage} req
- * @param {import('http').ServerResponse} res
- * @param {import('url').UrlWithParsedQuery} parsedUrl
- */
-async function handleStatic(req, res, parsedUrl) {
-
- if (/^\/static\/extensions\//.test(parsedUrl.pathname)) {
- const relativePath = decodeURIComponent(parsedUrl.pathname.substr('/static/extensions/'.length));
- const filePath = getExtensionFilePath(relativePath, (await builtInExtensionsPromise).locations);
- const responseHeaders = {};
- if (addCORSReplyHeader(req)) {
- responseHeaders['Access-Control-Allow-Origin'] = '*';
- }
- if (!filePath) {
- return serveError(req, res, 400, `Bad request.`, responseHeaders);
- }
- return serveFile(req, res, filePath, responseHeaders);
- }
-
- // Strip `/static/` from the path
- const relativeFilePath = path.normalize(decodeURIComponent(parsedUrl.pathname.substr('/static/'.length)));
-
- return serveFile(req, res, path.join(APP_ROOT, relativeFilePath));
-}
-
-/**
- * @param {import('http').IncomingMessage} req
- * @param {import('http').ServerResponse} res
- * @param {import('url').UrlWithParsedQuery} parsedUrl
- */
-async function handleExtension(req, res, parsedUrl) {
- // Strip `/extension/` from the path
- const relativePath = decodeURIComponent(parsedUrl.pathname.substr('/extension/'.length));
- const filePath = getExtensionFilePath(relativePath, (await commandlineProvidedExtensionsPromise).locations);
- const responseHeaders = {};
- if (addCORSReplyHeader(req)) {
- responseHeaders['Access-Control-Allow-Origin'] = '*';
- }
- if (!filePath) {
- return serveError(req, res, 400, `Bad request.`, responseHeaders);
- }
- return serveFile(req, res, filePath, responseHeaders);
-}
-
-/**
- * @param {import('http').IncomingMessage} req
- * @param {import('http').ServerResponse} res
- */
-async function handleRoot(req, res) {
- let folderUri = { scheme: 'memfs', path: `/sample-folder` };
-
- const match = req.url && req.url.match(/\?([^#]+)/);
- if (match) {
- const qs = new URLSearchParams(match[1]);
-
- let gh = qs.get('gh');
- if (gh) {
- if (gh.startsWith('/')) {
- gh = gh.substr(1);
- }
-
- const [owner, repo, ...branch] = gh.split('/', 3);
- const ref = branch.join('/');
- folderUri = { scheme: 'github', authority: `${owner}+${repo}${ref ? `+${ref}` : ''}`, path: '/' };
- } else {
- let cs = qs.get('cs');
- if (cs) {
- if (cs.startsWith('/')) {
- cs = cs.substr(1);
- }
-
- const [owner, repo, ...branch] = cs.split('/');
- const ref = branch.join('/');
- folderUri = { scheme: 'codespace', authority: `${owner}+${repo}${ref ? `+${ref}` : ''}`, path: '/' };
- }
- }
- }
-
- const { extensions: builtInExtensions } = await builtInExtensionsPromise;
- const { extensions: additionalBuiltinExtensions, locations: staticLocations } = await commandlineProvidedExtensionsPromise;
-
- const dedupedBuiltInExtensions = [];
- for (const builtInExtension of builtInExtensions) {
- const extensionId = `${builtInExtension.packageJSON.publisher}.${builtInExtension.packageJSON.name}`;
- if (staticLocations[extensionId]) {
- fancyLog(`${ansiColors.magenta('BuiltIn extensions')}: Ignoring built-in ${extensionId} because it was overridden via --extension argument`);
- continue;
- }
-
- dedupedBuiltInExtensions.push(builtInExtension);
- }
-
- if (args.verbose) {
- fancyLog(`${ansiColors.magenta('BuiltIn extensions')}: ${dedupedBuiltInExtensions.map(e => path.basename(e.extensionPath)).join(', ')}`);
- fancyLog(`${ansiColors.magenta('Additional extensions')}: ${additionalBuiltinExtensions.map(e => typeof e === 'string' ? e : path.basename(e.path)).join(', ') || 'None'}`);
- }
-
- const openFileUrl = args['open-file'] ? url.parse(args['open-file'], true) : undefined;
- let selection;
- if (openFileUrl?.hash) {
- const rangeMatch = /L(?<startLineNumber>\d+)(?::(?<startColumn>\d+))?((?:-L(?<endLineNumber>\d+))(?::(?<endColumn>\d+))?)?/.exec(openFileUrl.hash);
- if (rangeMatch?.groups) {
- const { startLineNumber, startColumn, endLineNumber, endColumn } = rangeMatch.groups;
- const start = { line: parseInt(startLineNumber), column: startColumn ? (parseInt(startColumn) || 1) : 1 };
- const end = endLineNumber ? { line: parseInt(endLineNumber), column: endColumn ? (parseInt(endColumn) || 1) : 1 } : start;
- selection = { start, end }
- }
- }
- const webConfigJSON = {
- folderUri: folderUri,
- additionalBuiltinExtensions,
- defaultLayout: openFileUrl ? {
- force: true,
- editors: [{
- uri: {
- scheme: openFileUrl.protocol.substring(0, openFileUrl.protocol.length - 1),
- authority: openFileUrl.host,
- path: openFileUrl.path,
- },
- selection,
- }]
- } : undefined,
- settingsSyncOptions: args['enable-sync'] ? {
- enabled: true
- } : undefined
- };
- if (args['wrap-iframe']) {
- webConfigJSON._wrapWebWorkerExtHostInIframe = true;
- }
-
- const authSessionInfo = args['github-auth'] ? {
- id: uuid.v4(),
- providerId: 'github',
- accessToken: args['github-auth'],
- scopes: [['user:email'], ['repo']]
- } : undefined;
-
- const data = (await readFile(WEB_MAIN)).toString()
- .replace('{{WORKBENCH_WEB_CONFIGURATION}}', () => escapeAttribute(JSON.stringify(webConfigJSON))) // use a replace function to avoid that regexp replace patterns ($&, $0, ...) are applied
- .replace('{{WORKBENCH_BUILTIN_EXTENSIONS}}', () => escapeAttribute(JSON.stringify(dedupedBuiltInExtensions)))
- .replace('{{WORKBENCH_AUTH_SESSION}}', () => authSessionInfo ? escapeAttribute(JSON.stringify(authSessionInfo)) : '')
- .replace('{{WEBVIEW_ENDPOINT}}', '');
-
- const headers = {
- 'Content-Type': 'text/html',
- 'Content-Security-Policy': 'require-trusted-types-for \'script\';'
- };
- res.writeHead(200, headers);
- return res.end(data);
-}
-
-/**
- * Handle HTTP requests for /callback
- * @param {import('http').IncomingMessage} req
- * @param {import('http').ServerResponse} res
- * @param {import('url').UrlWithParsedQuery} parsedUrl
-*/
-async function handleCallback(req, res, parsedUrl) {
- const wellKnownKeys = ['vscode-requestId', 'vscode-scheme', 'vscode-authority', 'vscode-path', 'vscode-query', 'vscode-fragment'];
- const [requestId, vscodeScheme, vscodeAuthority, vscodePath, vscodeQuery, vscodeFragment] = wellKnownKeys.map(key => {
- const value = getFirstQueryValue(parsedUrl, key);
- if (value) {
- return decodeURIComponent(value);
- }
-
- return value;
- });
-
- if (!requestId) {
- res.writeHead(400, { 'Content-Type': 'text/plain' });
- return res.end(`Bad request.`);
- }
-
- // merge over additional query values that we got
- let query = vscodeQuery;
- let index = 0;
- getFirstQueryValues(parsedUrl, wellKnownKeys).forEach((value, key) => {
- if (!query) {
- query = '';
- }
-
- const prefix = (index++ === 0) ? '' : '&';
- query += `${prefix}${key}=${value}`;
- });
-
-
- // add to map of known callbacks
- mapCallbackUriToRequestId.set(requestId, JSON.stringify({ scheme: vscodeScheme || 'code-oss', authority: vscodeAuthority, path: vscodePath, query, fragment: vscodeFragment }));
- return serveFile(req, res, path.join(APP_ROOT, 'resources', 'web', 'callback.html'), { 'Content-Type': 'text/html' });
-}
-
-/**
- * Handle HTTP requests for /fetch-callback
- * @param {import('http').IncomingMessage} req
- * @param {import('http').ServerResponse} res
- * @param {import('url').UrlWithParsedQuery} parsedUrl
-*/
-async function handleFetchCallback(req, res, parsedUrl) {
- const requestId = getFirstQueryValue(parsedUrl, 'vscode-requestId');
- if (!requestId) {
- res.writeHead(400, { 'Content-Type': 'text/plain' });
- return res.end(`Bad request.`);
- }
-
- const knownCallbackUri = mapCallbackUriToRequestId.get(requestId);
- if (knownCallbackUri) {
- mapCallbackUriToRequestId.delete(requestId);
- }
-
- res.writeHead(200, { 'Content-Type': 'text/json' });
- return res.end(knownCallbackUri);
-}
-
-/**
- * @param {import('url').UrlWithParsedQuery} parsedUrl
- * @param {string} key
- * @returns {string | undefined}
-*/
-function getFirstQueryValue(parsedUrl, key) {
- const result = parsedUrl.query[key];
- return Array.isArray(result) ? result[0] : result;
-}
-
-/**
- * @param {import('url').UrlWithParsedQuery} parsedUrl
- * @param {string[] | undefined} ignoreKeys
- * @returns {Map<string, string>}
-*/
-function getFirstQueryValues(parsedUrl, ignoreKeys) {
- const queryValues = new Map();
-
- for (const key in parsedUrl.query) {
- if (ignoreKeys && ignoreKeys.indexOf(key) >= 0) {
- continue;
- }
-
- const value = getFirstQueryValue(parsedUrl, key);
- if (typeof value === 'string') {
- queryValues.set(key, value);
- }
- }
-
- return queryValues;
-}
-
-/**
- * @param {string} value
- */
-function escapeAttribute(value) {
- return value.replace(/"/g, '&quot;');
-}
-
-/**
- * @param {string} relativePath
- * @param {Object.<string, string>} locations
- * @returns {string | undefined}
-*/
-function getExtensionFilePath(relativePath, locations) {
- const firstSlash = relativePath.indexOf('/');
- if (firstSlash === -1) {
- return undefined;
- }
- const extensionId = relativePath.substr(0, firstSlash);
-
- const extensionPath = locations[extensionId];
- if (!extensionPath) {
- return undefined;
- }
- return path.join(extensionPath, relativePath.substr(firstSlash + 1));
-}
-
-/**
- * @param {import('http').IncomingMessage} req
- * @param {import('http').ServerResponse} res
- * @param {string} errorMessage
- */
-function serveError(req, res, errorCode, errorMessage, responseHeaders = Object.create(null)) {
- responseHeaders['Content-Type'] = 'text/plain';
- res.writeHead(errorCode, responseHeaders);
- res.end(errorMessage);
-}
-
-const textMimeType = {
- '.html': 'text/html',
- '.js': 'text/javascript',
- '.json': 'application/json',
- '.css': 'text/css',
- '.svg': 'image/svg+xml',
-};
-
-const mapExtToMediaMimes = {
- '.bmp': 'image/bmp',
- '.gif': 'image/gif',
- '.ico': 'image/x-icon',
- '.jpe': 'image/jpg',
- '.jpeg': 'image/jpg',
- '.jpg': 'image/jpg',
- '.png': 'image/png',
- '.tga': 'image/x-tga',
- '.tif': 'image/tiff',
- '.tiff': 'image/tiff',
- '.woff': 'application/font-woff'
-};
-
-/**
- * @param {string} forPath
- */
-function getMediaMime(forPath) {
- const ext = path.extname(forPath);
-
- return mapExtToMediaMimes[ext.toLowerCase()];
-}
-
-/**
- * @param {import('http').IncomingMessage} req
- * @param {import('http').ServerResponse} res
- * @param {string} filePath
- */
-async function serveFile(req, res, filePath, responseHeaders = Object.create(null)) {
- try {
-
- // Sanity checks
- filePath = path.normalize(filePath); // ensure no "." and ".."
-
- const stat = await util.promisify(fs.stat)(filePath);
-
- // Check if file modified since
- const etag = `W/"${[stat.ino, stat.size, stat.mtime.getTime()].join('-')}"`; // weak validator (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag)
- if (req.headers['if-none-match'] === etag) {
- res.writeHead(304);
- return res.end();
- }
-
- // Headers
- responseHeaders['Content-Type'] = textMimeType[path.extname(filePath)] || getMediaMime(filePath) || 'text/plain';
- responseHeaders['Etag'] = etag;
-
- res.writeHead(200, responseHeaders);
-
- // Data
- fs.createReadStream(filePath).pipe(res);
- } catch (error) {
- console.error(error.toString());
- responseHeaders['Content-Type'] = 'text/plain';
- res.writeHead(404, responseHeaders);
- return res.end('Not found');
- }
-}
-
-if (args.launch !== false) {
- opn(`${SCHEME}://${HOST}:${PORT}`);
-}
diff --git a/resources/server/web.bat b/scripts/code-server.bat
index d131dafffc6..6c3bf915366 100644
--- a/resources/server/web.bat
+++ b/scripts/code-server.bat
@@ -1,9 +1,9 @@
@echo off
setlocal
-title VSCode Web Server
+title VSCode Server
-pushd %~dp0\..\..
+pushd %~dp0\..
:: Configuration
set NODE_ENV=development
@@ -17,8 +17,8 @@ call yarn gulp node
:: Launch Server
FOR /F "tokens=*" %%g IN ('node build/lib/node.js') do (SET NODE=%%g)
-call "%NODE%" resources\server\bin-dev\code-web.js %*
+call "%NODE%" resources\server\bin-dev\code-server.js %*
popd
-endlocal \ No newline at end of file
+endlocal
diff --git a/resources/server/web.sh b/scripts/code-server.sh
index da072e5f2d0..b1c266ec2e4 100755
--- a/resources/server/web.sh
+++ b/scripts/code-server.sh
@@ -2,9 +2,9 @@
if [[ "$OSTYPE" == "darwin"* ]]; then
realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; }
- ROOT=$(dirname $(dirname $(dirname $(realpath "$0"))))
+ ROOT=$(dirname $(dirname $(realpath "$0")))
else
- ROOT=$(dirname $(dirname $(dirname $(readlink -f $0))))
+ ROOT=$(dirname $(dirname $(readlink -f $0)))
fi
function code() {
@@ -20,7 +20,7 @@ function code() {
NODE_ENV=development \
VSCODE_DEV=1 \
- $NODE $(dirname "$0")/bin-dev/code-web.js "$@"
+ $NODE ./resources/server/bin-dev/code-server.js "$@"
}
code "$@"
diff --git a/scripts/code-web.bat b/scripts/code-web.bat
new file mode 100644
index 00000000000..5ad704aea78
--- /dev/null
+++ b/scripts/code-web.bat
@@ -0,0 +1,20 @@
+@echo off
+setlocal
+
+title VSCode Web Serverless
+
+pushd %~dp0\..
+
+:: Sync built-in extensions
+call yarn download-builtin-extensions
+
+:: Download nodejs executable for remote
+call yarn gulp node
+
+:: Launch Server
+FOR /F "tokens=*" %%g IN ('node build/lib/node.js') do (SET NODE=%%g)
+call "%NODE%" resources\web\bin-dev\code-web-playground.js %*
+
+popd
+
+endlocal
diff --git a/scripts/code-web.sh b/scripts/code-web.sh
new file mode 100755
index 00000000000..dd32d01117e
--- /dev/null
+++ b/scripts/code-web.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+
+if [[ "$OSTYPE" == "darwin"* ]]; then
+ realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; }
+ ROOT=$(dirname $(dirname $(realpath "$0")))
+else
+ ROOT=$(dirname $(dirname $(readlink -f $0)))
+fi
+
+function code() {
+ cd $ROOT
+
+ # Sync built-in extensions
+ yarn download-builtin-extensions
+
+ # Load remote node
+ yarn gulp node
+
+ NODE=$(node build/lib/node.js)
+
+ $NODE ./resources/web/bin-dev/code-web-playground.js "$@"
+}
+
+code "$@"
diff --git a/src/vs/code/browser/workbench/workbench.ts b/src/vs/code/browser/workbench/workbench.ts
index ec954fdf319..5c6991648e6 100644
--- a/src/vs/code/browser/workbench/workbench.ts
+++ b/src/vs/code/browser/workbench/workbench.ts
@@ -5,6 +5,7 @@
import { isStandalone } from 'vs/base/browser/browser';
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';
@@ -23,7 +24,7 @@ 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;
@@ -55,7 +56,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);
}
@@ -72,7 +73,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<string | null> {
@@ -165,7 +166,7 @@ class LocalStorageCredentialsProvider implements ICredentialsProvider {
}
async clear(): Promise<void> {
- window.localStorage.removeItem(LocalStorageCredentialsProvider.CREDENTIALS_OPENED_KEY);
+ window.localStorage.removeItem(LocalStorageCredentialsProvider.CREDENTIALS_STORAGE_KEY);
}
}
@@ -279,11 +280,13 @@ class LocalStorageURLCallbackProvider extends Disposable implements IURLCallback
class WorkspaceProvider implements IWorkspaceProvider {
- static QUERY_PARAM_EMPTY_WINDOW = 'ew';
- static QUERY_PARAM_FOLDER = 'folder';
- static QUERY_PARAM_WORKSPACE = 'workspace';
+ private static readonly LAST_WORKSPACE_STORAGE_KEY = 'workspace.lastOpened';
- static QUERY_PARAM_PAYLOAD = 'payload';
+ 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;
@@ -315,7 +318,7 @@ class WorkspaceProvider implements IWorkspaceProvider {
// Payload
case WorkspaceProvider.QUERY_PARAM_PAYLOAD:
try {
- payload = JSON.parse(value);
+ payload = parse(value); // use marshalling#parse() to revive potential URIs
} catch (error) {
console.error(error); // possible invalid JSON
}
@@ -323,17 +326,37 @@ class WorkspaceProvider implements IWorkspaceProvider {
}
});
- // If no workspace is provided through the URL, check for config attribute from server
+ // If no workspace is provided through the URL, check for config
+ // attribute from server and fallback to last opened workspace
+ // from storage
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 = (() => {
+ const lastWorkspaceRaw = window.localStorage.getItem(WorkspaceProvider.LAST_WORKSPACE_STORAGE_KEY);
+ if (lastWorkspaceRaw) {
+ try {
+ return parse(lastWorkspaceRaw); // use marshalling#parse() to revive potential URIs
+ } catch (error) {
+ // Ignore
+ }
+ }
+
+ return undefined;
+ })();
}
}
+ // Keep this as last opened workspace in storage
+ if (workspace) {
+ window.localStorage.setItem(WorkspaceProvider.LAST_WORKSPACE_STORAGE_KEY, JSON.stringify(workspace));
+ } else {
+ window.localStorage.removeItem(WorkspaceProvider.LAST_WORKSPACE_STORAGE_KEY);
+ }
+
return new WorkspaceProvider(workspace, payload);
}
diff --git a/test/automation/src/playwrightDriver.ts b/test/automation/src/playwrightDriver.ts
index 56c1d6de871..73b7e3048be 100644
--- a/test/automation/src/playwrightDriver.ts
+++ b/test/automation/src/playwrightDriver.ts
@@ -236,7 +236,7 @@ async function launchServer(options: LaunchOptions) {
logger.log(`Starting built server from '${serverLocation}'`);
logger.log(`Storing log files into '${logsPath}'`);
} else {
- serverLocation = join(root, `resources/server/web.${process.platform === 'win32' ? 'bat' : 'sh'}`);
+ serverLocation = join(root, `scripts/code-server.${process.platform === 'win32' ? 'bat' : 'sh'}`);
args.push('--logsPath', logsPath);
logger.log(`Starting server out of sources from '${serverLocation}'`);
diff --git a/test/integration/browser/src/index.ts b/test/integration/browser/src/index.ts
index 584f091550c..3507cbbf5b5 100644
--- a/test/integration/browser/src/index.ts
+++ b/test/integration/browser/src/index.ts
@@ -139,7 +139,7 @@ async function launchServer(browserType: BrowserType): Promise<{ endpoint: url.U
console.log(`Storing log files into '${logsPath}'`);
}
} else {
- serverLocation = path.join(root, `resources/server/web.${process.platform === 'win32' ? 'bat' : 'sh'}`);
+ serverLocation = path.join(root, `scripts/code-server.${process.platform === 'win32' ? 'bat' : 'sh'}`);
serverArgs.push('--logsPath', logsPath);
process.env.VSCODE_DEV = '1';
diff --git a/yarn.lock b/yarn.lock
index 8271b084cd6..8cacb3d3329 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -751,6 +751,17 @@
"@types/yargs" "^16.0.0"
chalk "^4.0.0"
+"@koa/router@^10.1.1":
+ version "10.1.1"
+ resolved "https://registry.yarnpkg.com/@koa/router/-/router-10.1.1.tgz#8e5a85c9b243e0bc776802c0de564561e57a5f78"
+ integrity sha512-ORNjq5z4EmQPriKbR0ER3k4Gh7YGNhWDL7JBW+8wXDrHLbWYKYSJaOJ9aN06npF5tbTxe2JBOsurpJDAvjiXKw==
+ dependencies:
+ debug "^4.1.1"
+ http-errors "^1.7.3"
+ koa-compose "^4.1.0"
+ methods "^1.1.2"
+ path-to-regexp "^6.1.0"
+
"@microsoft/applicationinsights-analytics-js@2.6.4":
version "2.6.4"
resolved "https://registry.yarnpkg.com/@microsoft/applicationinsights-analytics-js/-/applicationinsights-analytics-js-2.6.4.tgz#22ad17276ed922f2f0e66b7efe304f31c50ede64"
@@ -1537,6 +1548,24 @@
ts-morph "^12.2.0"
vscode-ripgrep "^1.12.1"
+"@vscode/test-web@^0.0.18":
+ version "0.0.18"
+ resolved "https://registry.yarnpkg.com/@vscode/test-web/-/test-web-0.0.18.tgz#c9d33fe446794b444f18c3c24360371c45546d50"
+ integrity sha512-DHaE+m/c7tDKTidq2j2MdFPZYtMuhDZgjT2uHS6V7FpiZjVRJzwkvHHgAu1gQxxB0MHi59vorS/piQ9iWx1JTQ==
+ dependencies:
+ "@koa/router" "^10.1.1"
+ decompress "^4.2.1"
+ decompress-targz "^4.1.1"
+ http-proxy-agent "^4.0.1"
+ https-proxy-agent "^5.0.0"
+ koa "^2.13.1"
+ koa-morgan "^1.0.1"
+ koa-mount "^4.0.0"
+ koa-static "^5.0.0"
+ minimist "^1.2.5"
+ playwright "1.14.1"
+ vscode-uri "^3.0.2"
+
"@vscode/vscode-languagedetection@1.0.21":
version "1.0.21"
resolved "https://registry.yarnpkg.com/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.21.tgz#89b48f293f6aa3341bb888c1118d16ff13b032d3"
@@ -1845,6 +1874,14 @@ abbrev@1:
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+accepts@^1.3.5:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
acorn-jsx@^5.0.0, acorn-jsx@^5.2.0:
version "5.3.1"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
@@ -2414,6 +2451,13 @@ base@^0.11.1:
mixin-deep "^1.2.0"
pascalcase "^0.1.1"
+basic-auth@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a"
+ integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==
+ dependencies:
+ safe-buffer "5.1.2"
+
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
@@ -2458,6 +2502,14 @@ bindings@^1.5.0:
dependencies:
file-uri-to-path "1.0.0"
+bl@^1.0.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7"
+ integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==
+ dependencies:
+ readable-stream "^2.3.5"
+ safe-buffer "^5.1.1"
+
bl@^4.0.2:
version "4.0.3"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489"
@@ -2632,6 +2684,19 @@ browserslist@^4.17.5:
node-releases "^2.0.1"
picocolors "^1.0.0"
+buffer-alloc-unsafe@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+ integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+
+buffer-alloc@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+ integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+ dependencies:
+ buffer-alloc-unsafe "^1.1.0"
+ buffer-fill "^1.0.0"
+
buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
@@ -2642,6 +2707,11 @@ buffer-equal@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74=
+buffer-fill@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+ integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
+
buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
@@ -2661,7 +2731,7 @@ buffer@^4.3.0:
ieee754 "^1.1.4"
isarray "^1.0.0"
-buffer@^5.5.0:
+buffer@^5.2.1, buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
@@ -2738,6 +2808,14 @@ cache-base@^1.0.1:
union-value "^1.0.0"
unset-value "^1.0.0"
+cache-content-type@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c"
+ integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==
+ dependencies:
+ mime-types "^2.1.18"
+ ylru "^1.2.0"
+
cacheable-request@^6.0.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
@@ -3095,6 +3173,11 @@ cls-hooked@^4.2.2:
emitter-listener "^1.0.1"
semver "^5.4.1"
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+
coa@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
@@ -3223,7 +3306,7 @@ commander@^2.19.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
-commander@^2.20.0:
+commander@^2.20.0, commander@^2.8.1:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -3233,6 +3316,11 @@ commander@^5.0.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
+commander@^6.1.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
+ integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
+
commander@^7.0.0, commander@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
@@ -3308,6 +3396,18 @@ constants-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
+content-disposition@~0.5.2:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-type@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
continuation-local-storage@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#11f613f74e914fe9b34c92ad2d28fe6ae1db7ffb"
@@ -3323,6 +3423,14 @@ convert-source-map@^1.0.0, convert-source-map@^1.5.0, convert-source-map@^1.7.0:
dependencies:
safe-buffer "~5.1.1"
+cookies@~0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90"
+ integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==
+ dependencies:
+ depd "~2.0.0"
+ keygrip "~1.1.0"
+
copy-concurrently@^1.0.0:
version "1.0.5"
resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
@@ -3684,6 +3792,13 @@ debug-fabulous@^1.0.0:
memoizee "0.4.X"
object-assign "4.X"
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
debug@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
@@ -3719,13 +3834,6 @@ debug@4.3.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
dependencies:
ms "2.1.2"
-debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
debug@^3.1.0:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
@@ -3733,6 +3841,13 @@ debug@^3.1.0:
dependencies:
ms "^2.1.1"
+debug@^4.3.2:
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
+ integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
+ dependencies:
+ ms "2.1.2"
+
decamelize@^1.1.1, decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -3762,6 +3877,59 @@ decompress-response@^4.2.0:
dependencies:
mimic-response "^2.0.0"
+decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
+ integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
+ dependencies:
+ file-type "^5.2.0"
+ is-stream "^1.1.0"
+ tar-stream "^1.5.2"
+
+decompress-tarbz2@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
+ integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
+ dependencies:
+ decompress-tar "^4.1.0"
+ file-type "^6.1.0"
+ is-stream "^1.1.0"
+ seek-bzip "^1.0.5"
+ unbzip2-stream "^1.0.9"
+
+decompress-targz@^4.0.0, decompress-targz@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
+ integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
+ dependencies:
+ decompress-tar "^4.1.1"
+ file-type "^5.2.0"
+ is-stream "^1.1.0"
+
+decompress-unzip@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
+ integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k=
+ dependencies:
+ file-type "^3.8.0"
+ get-stream "^2.2.0"
+ pify "^2.3.0"
+ yauzl "^2.4.2"
+
+decompress@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118"
+ integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==
+ dependencies:
+ decompress-tar "^4.0.0"
+ decompress-tarbz2 "^4.0.0"
+ decompress-targz "^4.0.0"
+ decompress-unzip "^4.0.1"
+ graceful-fs "^4.1.10"
+ make-dir "^1.0.0"
+ pify "^2.3.0"
+ strip-dirs "^2.0.0"
+
deemon@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/deemon/-/deemon-1.4.0.tgz#01c09cc23eec41e5d7ddac082eb52c3611d38dff"
@@ -3770,6 +3938,11 @@ deemon@^1.4.0:
bl "^4.0.2"
tree-kill "^1.2.2"
+deep-equal@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+ integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=
+
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
@@ -3851,6 +4024,16 @@ delegates@^1.0.0:
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+depd@^2.0.0, depd@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
deprecation@^2.0.0, deprecation@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
@@ -3864,6 +4047,11 @@ des.js@^1.0.0:
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
+destroy@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
detect-file@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
@@ -4067,6 +4255,11 @@ editorconfig@^0.15.2:
semver "^5.6.0"
sigmund "^1.0.1"
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
electron-to-chromium@^1.3.723:
version "1.3.737"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.737.tgz#196f2e9656f4f3c31930750e1899c091b72d36b5"
@@ -4308,6 +4501,11 @@ escalade@^3.1.1:
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+escape-html@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
@@ -4837,6 +5035,21 @@ file-loader@^4.2.0:
loader-utils "^1.2.3"
schema-utils "^2.0.0"
+file-type@^3.8.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
+ integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
+
+file-type@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
+ integrity sha1-LdvqfHP/42No365J3DOMBYwritY=
+
+file-type@^6.1.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
+ integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
+
file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
@@ -5066,6 +5279,11 @@ fragment-cache@^0.2.1:
dependencies:
map-cache "^0.2.2"
+fresh@~0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
from2@^2.1.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
@@ -5221,6 +5439,14 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
has "^1.0.3"
has-symbols "^1.0.1"
+get-stream@^2.2.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
+ integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=
+ dependencies:
+ object-assign "^4.0.1"
+ pinkie-promise "^2.0.0"
+
get-stream@^4.0.0, get-stream@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
@@ -5461,6 +5687,11 @@ graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.6
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+graceful-fs@^4.1.10:
+ version "4.2.9"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
+ integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
+
graceful-fs@^4.1.2, graceful-fs@^4.2.4:
version "4.2.6"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
@@ -5912,11 +6143,40 @@ html-escaper@^2.0.0:
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491"
integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==
+http-assert@^1.3.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f"
+ integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==
+ dependencies:
+ deep-equal "~1.0.1"
+ http-errors "~1.8.0"
+
http-cache-semantics@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c"
+ integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.1"
+
+http-errors@~1.6.2:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+ integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
http-proxy-agent@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
@@ -6092,7 +6352,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -6405,6 +6665,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
dependencies:
is-extglob "^2.1.1"
+is-natural-number@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
+ integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=
+
is-negated-glob@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
@@ -6882,6 +7147,13 @@ just-extend@^4.0.2:
resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744"
integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==
+keygrip@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226"
+ integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==
+ dependencies:
+ tsscmp "1.0.6"
+
keytar@7.6.0:
version "7.6.0"
resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.6.0.tgz#498e796443cb543d31722099443f29d7b5c44100"
@@ -6926,6 +7198,80 @@ kind-of@^6.0.0, kind-of@^6.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+koa-compose@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877"
+ integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==
+
+koa-convert@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5"
+ integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==
+ dependencies:
+ co "^4.6.0"
+ koa-compose "^4.1.0"
+
+koa-morgan@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/koa-morgan/-/koa-morgan-1.0.1.tgz#08052e0ce0d839d3c43178b90a5bb3424bef1f99"
+ integrity sha1-CAUuDODYOdPEMXi5CluzQkvvH5k=
+ dependencies:
+ morgan "^1.6.1"
+
+koa-mount@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/koa-mount/-/koa-mount-4.0.0.tgz#e0265e58198e1a14ef889514c607254ff386329c"
+ integrity sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ==
+ dependencies:
+ debug "^4.0.1"
+ koa-compose "^4.1.0"
+
+koa-send@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-5.0.1.tgz#39dceebfafb395d0d60beaffba3a70b4f543fe79"
+ integrity sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==
+ dependencies:
+ debug "^4.1.1"
+ http-errors "^1.7.3"
+ resolve-path "^1.4.0"
+
+koa-static@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943"
+ integrity sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==
+ dependencies:
+ debug "^3.1.0"
+ koa-send "^5.0.0"
+
+koa@^2.13.1:
+ version "2.13.4"
+ resolved "https://registry.yarnpkg.com/koa/-/koa-2.13.4.tgz#ee5b0cb39e0b8069c38d115139c774833d32462e"
+ integrity sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==
+ dependencies:
+ accepts "^1.3.5"
+ cache-content-type "^1.0.0"
+ content-disposition "~0.5.2"
+ content-type "^1.0.4"
+ cookies "~0.8.0"
+ debug "^4.3.2"
+ delegates "^1.0.0"
+ depd "^2.0.0"
+ destroy "^1.0.4"
+ encodeurl "^1.0.2"
+ escape-html "^1.0.3"
+ fresh "~0.5.2"
+ http-assert "^1.3.0"
+ http-errors "^1.6.3"
+ is-generator-function "^1.0.7"
+ koa-compose "^4.1.0"
+ koa-convert "^2.0.0"
+ on-finished "^2.3.0"
+ only "~0.0.2"
+ parseurl "^1.3.2"
+ statuses "^1.5.0"
+ type-is "^1.6.16"
+ vary "^1.1.2"
+
last-run@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b"
@@ -7174,6 +7520,13 @@ lru-queue@^0.1.0:
dependencies:
es5-ext "~0.10.2"
+make-dir@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
+ dependencies:
+ pify "^3.0.0"
+
make-dir@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
@@ -7277,6 +7630,11 @@ mdn-data@2.0.4:
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
mem@^4.0.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
@@ -7338,6 +7696,11 @@ merge2@^1.3.0:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+methods@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
version "3.1.10"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
@@ -7391,6 +7754,11 @@ mime-db@1.48.0:
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
+mime-db@1.51.0:
+ version "1.51.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
+ integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
+
mime-types@^2.1.12, mime-types@~2.1.19:
version "2.1.28"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd"
@@ -7398,6 +7766,13 @@ mime-types@^2.1.12, mime-types@~2.1.19:
dependencies:
mime-db "1.45.0"
+mime-types@^2.1.18, mime-types@~2.1.24:
+ version "2.1.34"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
+ integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
+ dependencies:
+ mime-db "1.51.0"
+
mime-types@^2.1.27:
version "2.1.31"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b"
@@ -7620,6 +7995,17 @@ mocha@^8.3.0:
yargs-parser "20.2.4"
yargs-unparser "2.0.0"
+morgan@^1.6.1:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7"
+ integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==
+ dependencies:
+ basic-auth "~2.0.1"
+ debug "2.6.9"
+ depd "~2.0.0"
+ on-finished "~2.3.0"
+ on-headers "~1.0.2"
+
move-concurrently@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
@@ -7734,6 +8120,11 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
@@ -8094,6 +8485,18 @@ object.values@^1.1.0:
es-abstract "^1.18.0-next.1"
has "^1.0.3"
+on-finished@^2.3.0, on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+on-headers@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+ integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
+
once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -8115,6 +8518,11 @@ onetime@^5.1.0, onetime@^5.1.2:
dependencies:
mimic-fn "^2.1.0"
+only@~0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
+ integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=
+
open@^8.3.0:
version "8.4.0"
resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8"
@@ -8341,6 +8749,11 @@ parse-passwd@^1.0.0:
resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
+parseurl@^1.3.2:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
pascalcase@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
@@ -8378,7 +8791,7 @@ path-exists@^4.0.0:
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
-path-is-absolute@^1.0.0:
+path-is-absolute@1.0.1, path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
@@ -8422,6 +8835,11 @@ path-to-regexp@^1.7.0:
dependencies:
isarray "0.0.1"
+path-to-regexp@^6.1.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.0.tgz#f7b3803336104c346889adece614669230645f38"
+ integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==
+
path-type@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
@@ -8491,7 +8909,7 @@ pidtree@^0.3.0:
resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a"
integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==
-pify@^2.0.0:
+pify@^2.0.0, pify@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
@@ -8573,6 +8991,26 @@ playwright-core@=1.18.0-rc1:
yauzl "^2.10.0"
yazl "^2.5.1"
+playwright@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.14.1.tgz#73913d3044a85a58edf13148245279231072532e"
+ integrity sha512-JYNjhwWcfsBkg0FMGLbFO9e58FVdmICE4k97/glIQV7cBULL7oxNjRQC7Ffe+Y70XVNnP0HSJLaA0W5SukyftQ==
+ dependencies:
+ commander "^6.1.0"
+ debug "^4.1.1"
+ extract-zip "^2.0.1"
+ https-proxy-agent "^5.0.0"
+ jpeg-js "^0.4.2"
+ mime "^2.4.6"
+ pngjs "^5.0.0"
+ progress "^2.0.3"
+ proper-lockfile "^4.1.1"
+ proxy-from-env "^1.1.0"
+ rimraf "^3.0.2"
+ stack-utils "^2.0.3"
+ ws "^7.4.6"
+ yazl "^2.5.1"
+
plist@^3.0.1:
version "3.0.4"
resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.4.tgz#a62df837e3aed2bb3b735899d510c4f186019cbe"
@@ -9225,7 +9663,7 @@ read-pkg@^3.0.0:
normalize-package-data "^2.3.2"
path-type "^3.0.0"
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
@@ -9481,6 +9919,14 @@ resolve-options@^1.1.0:
dependencies:
value-or-function "^3.0.0"
+resolve-path@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7"
+ integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=
+ dependencies:
+ http-errors "~1.6.2"
+ path-is-absolute "1.0.1"
+
resolve-url@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
@@ -9631,16 +10077,16 @@ rxjs@^6.4.0, rxjs@^6.6.0:
dependencies:
tslib "^1.9.0"
-safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
- integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
-safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
safe-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
@@ -9684,6 +10130,13 @@ schema-utils@^3.0.0:
ajv "^6.12.5"
ajv-keywords "^3.5.2"
+seek-bzip@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4"
+ integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==
+ dependencies:
+ commander "^2.8.1"
+
semver-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
@@ -9776,6 +10229,16 @@ setimmediate@^1.0.4:
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+setprototypeof@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+ integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
sha.js@^2.4.0, sha.js@^2.4.8:
version "2.4.11"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
@@ -10151,6 +10614,11 @@ static-extend@^0.1.1:
define-property "^0.2.5"
object-copy "^0.1.0"
+"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
stream-browserify@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
@@ -10362,6 +10830,13 @@ strip-bom@^3.0.0:
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
+strip-dirs@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
+ integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
+ dependencies:
+ is-natural-number "^4.0.1"
+
strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
@@ -10528,6 +11003,19 @@ tar-fs@^2.0.0:
pump "^3.0.0"
tar-stream "^2.1.4"
+tar-stream@^1.5.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
+ integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
+ dependencies:
+ bl "^1.0.0"
+ buffer-alloc "^1.2.0"
+ end-of-stream "^1.0.0"
+ fs-constants "^1.0.0"
+ readable-stream "^2.3.0"
+ to-buffer "^1.1.1"
+ xtend "^4.0.0"
+
tar-stream@^2.1.4:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
@@ -10725,6 +11213,11 @@ to-arraybuffer@^1.0.0:
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
+to-buffer@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
+ integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
+
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
@@ -10774,6 +11267,11 @@ to-through@^2.0.0:
dependencies:
through2 "^2.0.3"
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
tough-cookie@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
@@ -10849,6 +11347,11 @@ tslib@^2.0.0, tslib@^2.2.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
+tsscmp@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
+ integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==
+
tsutils@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
@@ -10905,6 +11408,14 @@ type-fest@^0.8.1:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+type-is@^1.6.16:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
type@^1.0.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
@@ -10953,6 +11464,14 @@ unbox-primitive@^1.0.1:
has-symbols "^1.0.2"
which-boxed-primitive "^1.0.2"
+unbzip2-stream@^1.0.9:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7"
+ integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==
+ dependencies:
+ buffer "^5.2.1"
+ through "^2.3.8"
+
unc-path-regex@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
@@ -11174,6 +11693,11 @@ value-or-function@^3.0.0:
resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=
+vary@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
vendors@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
@@ -11350,6 +11874,11 @@ vscode-textmate@6.0.0:
resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-6.0.0.tgz#a3777197235036814ac9a92451492f2748589210"
integrity sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==
+vscode-uri@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84"
+ integrity sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA==
+
vscode-windows-ca-certs@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/vscode-windows-ca-certs/-/vscode-windows-ca-certs-0.3.0.tgz#324e1f8ba842bbf048a39e7c0ee8fe655e9adfcc"
@@ -11933,7 +12462,7 @@ yaserver@^0.2.0:
resolved "https://registry.yarnpkg.com/yaserver/-/yaserver-0.2.0.tgz#56393027dc13f3c1bb89d20e0bd17269aa927802"
integrity sha512-onsELrl7Y42M4P3T9R0N/ZJNJRu4cGwzhDyOWIFRMJvPUIrGKInYGh+DJBefrbr1qoyDu7DSCLl9BL5hSSVfDA==
-yauzl@^2.10.0, yauzl@^2.9.2:
+yauzl@^2.10.0, yauzl@^2.4.2, yauzl@^2.9.2:
version "2.10.0"
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
@@ -11963,6 +12492,11 @@ yazl@^2.5.1:
dependencies:
buffer-crc32 "~0.2.3"
+ylru@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f"
+ integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==
+
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"