diff --git a/.editorconfig b/.editorconfig index 65705d954568..0f6dc9448dc5 100644 --- a/.editorconfig +++ b/.editorconfig @@ -3,4 +3,9 @@ root = true [*] indent_style = space trim_trailing_whitespace = true + +# The indent size used in the `package.json` file cannot be changed +# https://github.com/npm/npm/pull/3180#issuecomment-16336516 +[{*.yml,*.yaml,package.json}] +indent_style = space indent_size = 2 diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bf02bc67eabc..abcca10b1fa4 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -54,10 +54,6 @@ jobs: run: yarn lint if: success() - - name: Run code-server unit tests - run: yarn test:unit - if: success() - - name: Upload coverage report to Codecov run: yarn coverage if: success() @@ -408,6 +404,9 @@ jobs: rm -r node_modules/playwright yarn install --check-files + - name: Run end-to-end tests + run: yarn test:unit + - name: Run end-to-end tests run: yarn test:e2e diff --git a/.gitignore b/.gitignore index 3cc6e31d7af3..8f02ff037e2b 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ vendor/modules node-* /plugins /lib/coder-cloud-agent +/lib/linkup .home coverage **/.DS_Store diff --git a/.prettierrc.yaml b/.prettierrc.yaml index a0634116d20d..bf4b4a7d239b 100644 --- a/.prettierrc.yaml +++ b/.prettierrc.yaml @@ -2,3 +2,16 @@ printWidth: 120 semi: false trailingComma: all arrowParens: always +singleQuote: false +useTabs: false + +overrides: + # Attempt to keep VScode's existing code style intact. + - files: "vendor/modules/code-oss-dev/**/*.ts" + options: + # No limit defined upstream. + printWidth: 10000 + semi: true + singleQuote: true + useTabs: true + arrowParens: avoid diff --git a/ci/build/build-code-server.sh b/ci/build/build-code-server.sh index c17725393435..b3b1967a65c8 100755 --- a/ci/build/build-code-server.sh +++ b/ci/build/build-code-server.sh @@ -15,23 +15,28 @@ main() { chmod +x out/node/entry.js fi + # for arch; we do not use OS from lib.sh and get our own. + # lib.sh normalizes macos to darwin - but cloud-agent's binaries do not + source ./ci/lib.sh + OS="$(uname | tr '[:upper:]' '[:lower:]')" + if ! [ -f ./lib/coder-cloud-agent ]; then echo "Downloading the cloud agent..." - # for arch; we do not use OS from lib.sh and get our own. - # lib.sh normalizes macos to darwin - but cloud-agent's binaries do not - source ./ci/lib.sh - OS="$(uname | tr '[:upper:]' '[:lower:]')" - set +e curl -fsSL "https://github.com/cdr/cloud-agent/releases/latest/download/cloud-agent-$OS-$ARCH" -o ./lib/coder-cloud-agent chmod +x ./lib/coder-cloud-agent set -e fi - yarn browserify out/browser/register.js -o out/browser/register.browserified.js - yarn browserify out/browser/pages/login.js -o out/browser/pages/login.browserified.js - yarn browserify out/browser/pages/vscode.js -o out/browser/pages/vscode.browserified.js + if ! [ -f ./lib/linkup ]; then + echo "Downloading Link agent..." + + set +e + curl -fsSL "https://storage.googleapis.com/coder-link-releases/latest/linkup-$OS-$ARCH" -o ./lib/linkup + chmod +x ./lib/linkup + set -e + fi } main "$@" diff --git a/ci/build/build-release.sh b/ci/build/build-release.sh index ba3193513e8e..f7b7df2662dc 100755 --- a/ci/build/build-release.sh +++ b/ci/build/build-release.sh @@ -61,6 +61,7 @@ EOF rsync node_modules/ "$RELEASE_PATH/node_modules" mkdir -p "$RELEASE_PATH/lib" rsync ./lib/coder-cloud-agent "$RELEASE_PATH/lib" + rsync ./lib/linkup "$RELEASE_PATH/lib" fi } @@ -80,8 +81,8 @@ bundle_vscode() { rsync "$VSCODE_SRC_PATH/extensions/postinstall.js" "$VSCODE_OUT_PATH/extensions" mkdir -p "$VSCODE_OUT_PATH/resources/"{linux,web} - rsync "$VSCODE_SRC_PATH/resources/linux/code.png" "$VSCODE_OUT_PATH/resources/linux/code.png" - rsync "$VSCODE_SRC_PATH/resources/web/callback.html" "$VSCODE_OUT_PATH/resources/web/callback.html" + rsync "$VSCODE_SRC_PATH/resources/linux/" "$VSCODE_OUT_PATH/resources/linux/" + rsync "$VSCODE_SRC_PATH/resources/web/" "$VSCODE_OUT_PATH/resources/web/" # Add the commit and date and enable telemetry. This just makes telemetry # available; telemetry can still be disabled by flag or setting. diff --git a/ci/build/build-vscode.sh b/ci/build/build-vscode.sh index ca35d4f3b064..91e83e7f0cdc 100755 --- a/ci/build/build-vscode.sh +++ b/ci/build/build-vscode.sh @@ -11,8 +11,10 @@ main() { cd vendor/modules/code-oss-dev - yarn gulp compile-build compile-extensions-build compile-extension-media + yarn gulp compile-build compile-extensions-build compile-extension-media compile-web + yarn gulp optimize --gulpfile ./coder.js + if [[ $MINIFY ]]; then yarn gulp minify --gulpfile ./coder.js fi diff --git a/ci/build/npm-postinstall.sh b/ci/build/npm-postinstall.sh index 76c558d1f823..38412ee7baff 100755 --- a/ci/build/npm-postinstall.sh +++ b/ci/build/npm-postinstall.sh @@ -63,6 +63,12 @@ main() { echo "Failed to download cloud agent; --link will not work" fi + if curl -fsSL "https://storage.googleapis.com/coder-link-releases/latest/linkup-$OS-$ARCH" -o ./lib/linkup; then + chmod +x ./lib/linkup + else + echo "Failed to download Link agent; the Link extension will not work" + fi + if ! vscode_yarn; then echo "You may not have the required dependencies to build the native modules." echo "Please see https://github.com/cdr/code-server/blob/master/docs/npm.md" diff --git a/ci/dev/watch.ts b/ci/dev/watch.ts index a0c116ec28ed..6b783f4066b9 100644 --- a/ci/dev/watch.ts +++ b/ci/dev/watch.ts @@ -1,6 +1,4 @@ -import browserify from "browserify" import * as cp from "child_process" -import * as fs from "fs" import * as path from "path" import { onLine } from "../../src/node/util" @@ -8,7 +6,7 @@ async function main(): Promise { try { const watcher = new Watcher() await watcher.watch() - } catch (error) { + } catch (error: any) { console.error(error.message) process.exit(1) } @@ -38,6 +36,9 @@ class Watcher { } const vscode = cp.spawn("yarn", ["watch"], { cwd: this.vscodeSourcePath }) + + const vscodeWebExtensions = cp.spawn("yarn", ["watch-web"], { cwd: this.vscodeSourcePath }) + const tsc = cp.spawn("tsc", ["--watch", "--pretty", "--preserveWatchOutput"], { cwd: this.rootPath }) const plugin = process.env.PLUGIN_DIR ? cp.spawn("yarn", ["build", "--watch"], { cwd: process.env.PLUGIN_DIR }) @@ -48,6 +49,10 @@ class Watcher { vscode.removeAllListeners() vscode.kill() + Watcher.log("killing vs code web extension watcher") + vscodeWebExtensions.removeAllListeners() + vscodeWebExtensions.kill() + Watcher.log("killing tsc") tsc.removeAllListeners() tsc.kill() @@ -75,10 +80,17 @@ class Watcher { Watcher.log("vs code watcher terminated unexpectedly") cleanup(code) }) + + vscodeWebExtensions.on("exit", (code) => { + Watcher.log("vs code extension watcher terminated unexpectedly") + cleanup(code) + }) + tsc.on("exit", (code) => { Watcher.log("tsc terminated unexpectedly") cleanup(code) }) + if (plugin) { plugin.on("exit", (code) => { Watcher.log("plugin terminated unexpectedly") @@ -86,18 +98,14 @@ class Watcher { }) } + vscodeWebExtensions.stderr.on("data", (d) => process.stderr.write(d)) vscode.stderr.on("data", (d) => process.stderr.write(d)) tsc.stderr.on("data", (d) => process.stderr.write(d)) + if (plugin) { plugin.stderr.on("data", (d) => process.stderr.write(d)) } - const browserFiles = [ - path.join(this.rootPath, "out/browser/register.js"), - path.join(this.rootPath, "out/browser/pages/login.js"), - path.join(this.rootPath, "out/browser/pages/vscode.js"), - ] - let startingVscode = false let startedVscode = false onLine(vscode, (line, original) => { @@ -120,7 +128,6 @@ class Watcher { console.log("[tsc]", original) } if (line.includes("Watching for file changes")) { - bundleBrowserCode(browserFiles) restartServer() } }) @@ -139,19 +146,4 @@ class Watcher { } } -function bundleBrowserCode(inputFiles: string[]) { - console.log(`[browser] bundling...`) - inputFiles.forEach(async (path: string) => { - const outputPath = path.replace(".js", ".browserified.js") - browserify() - .add(path) - .bundle() - .on("error", function (error: Error) { - console.error(error.toString()) - }) - .pipe(fs.createWriteStream(outputPath)) - }) - console.log(`[browser] done bundling`) -} - main() diff --git a/package.json b/package.json index a236c6e756d0..1b0c1277bf02 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,6 @@ "main": "out/node/entry.js", "devDependencies": { "@schemastore/package": "^0.0.6", - "@types/body-parser": "^1.19.0", - "@types/browserify": "^12.0.36", "@types/compression": "^1.7.0", "@types/cookie-parser": "^1.4.2", "@types/express": "^4.17.8", @@ -48,13 +46,11 @@ "@types/safe-compare": "^1.1.0", "@types/semver": "^7.1.0", "@types/split2": "^3.2.0", - "@types/tar-fs": "^2.0.0", - "@types/tar-stream": "^2.1.0", + "@types/trusted-types": "^2.0.2", "@types/ws": "^8.0.0", "@typescript-eslint/eslint-plugin": "^4.7.0", "@typescript-eslint/parser": "^4.7.0", "audit-ci": "^4.0.0", - "browserify": "^17.0.0", "codecov": "^3.8.3", "doctoc": "^2.0.0", "eslint": "^7.7.0", @@ -68,7 +64,7 @@ "stylelint": "^13.0.0", "stylelint-config-recommended": "^5.0.0", "ts-node": "^10.0.0", - "typescript": "^4.1.3" + "typescript": "^4.4.0-dev.20210528" }, "resolutions": { "ansi-regex": "^5.0.1", @@ -85,7 +81,6 @@ "dependencies": { "@coder/logger": "1.1.16", "argon2": "^0.28.0", - "body-parser": "^1.19.0", "compression": "^1.7.4", "cookie-parser": "^1.4.5", "env-paths": "^2.2.0", @@ -103,7 +98,6 @@ "safe-compare": "^1.1.4", "semver": "^7.1.3", "split2": "^3.2.2", - "tar-fs": "^2.0.0", "ws": "^8.0.0", "xdg-basedir": "^4.0.0", "yarn": "^1.22.4" diff --git a/src/browser/media/manifest.json b/src/browser/media/manifest.json deleted file mode 100644 index a16709e1ee90..000000000000 --- a/src/browser/media/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "code-server", - "short_name": "code-server", - "start_url": "{{BASE}}", - "display": "fullscreen", - "background-color": "#fff", - "description": "Run editors on a remote server.", - "icons": [ - { - "src": "{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "{{CS_STATIC_BASE}}/src/browser/media/pwa-icon-512.png", - "type": "image/png", - "sizes": "512x512" - } - ] -} diff --git a/src/browser/pages/error.html b/src/browser/pages/error.html index 56e03e27a628..1ff716d40614 100644 --- a/src/browser/pages/error.html +++ b/src/browser/pages/error.html @@ -10,10 +10,11 @@ http-equiv="Content-Security-Policy" content="style-src 'self'; manifest-src 'self'; img-src 'self' data:; font-src 'self' data:;" /> + {{ERROR_TITLE}} - code-server - + @@ -30,6 +31,5 @@

{{ERROR_HEADER}}

- diff --git a/src/browser/pages/login.html b/src/browser/pages/login.html index 896927e3812c..f8837c8f30e3 100644 --- a/src/browser/pages/login.html +++ b/src/browser/pages/login.html @@ -13,7 +13,7 @@ code-server login - + @@ -30,7 +30,6 @@

Welcome to code-server

- diff --git a/src/browser/pages/login.ts b/src/browser/pages/login.ts deleted file mode 100644 index cd3fd0d16542..000000000000 --- a/src/browser/pages/login.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { getOptions } from "../../common/util" -import "../register" - -const options = getOptions() -const el = document.getElementById("base") as HTMLInputElement -if (el) { - el.value = options.base -} diff --git a/src/browser/pages/vscode.html b/src/browser/pages/vscode.html deleted file mode 100644 index a01223ceccd0..000000000000 --- a/src/browser/pages/vscode.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/browser/pages/vscode.ts b/src/browser/pages/vscode.ts deleted file mode 100644 index ed5849648955..000000000000 --- a/src/browser/pages/vscode.ts +++ /dev/null @@ -1,253 +0,0 @@ -import { getOptions, Options } from "../../common/util" -import "../register" - -// TODO@jsjoeio: Add proper types. -type FixMeLater = any - -// NOTE@jsjoeio -// This lives here ../../../lib/vscode/src/vs/base/common/platform.ts#L106 -export const nlsConfigElementId = "vscode-remote-nls-configuration" - -type NlsConfiguration = { - locale: string - availableLanguages: { [key: string]: string } | {} - _languagePackId?: string - _translationsConfigFile?: string - _cacheRoot?: string - _resolvedLanguagePackCoreLocation?: string - _corruptedFile?: string - _languagePackSupport?: boolean - loadBundle?: FixMeLater -} - -/** - * Helper function to create the path to the bundle - * for getNlsConfiguration. - */ -export function createBundlePath(_resolvedLanguagePackCoreLocation: string | undefined, bundle: string) { - // NOTE@jsjoeio - this comment was here before me - // Refers to operating systems that use a different path separator. - // Probably just Windows but we're not sure if "/" breaks on Windows - // so we'll leave it alone for now. - // FIXME: Only works if path separators are /. - return (_resolvedLanguagePackCoreLocation || "") + "/" + bundle.replace(/\//g, "!") + ".nls.json" -} - -/** - * A helper function to get the NLS Configuration settings. - * - * This is used by VSCode for localizations (i.e. changing - * the display language). - * - * Make sure to wrap this in a try/catch block when you call it. - **/ -export function getNlsConfiguration(_document: Document, base: string) { - const errorMsgPrefix = "[vscode]" - const nlsConfigElement = _document?.getElementById(nlsConfigElementId) - const dataSettings = nlsConfigElement?.getAttribute("data-settings") - - if (!nlsConfigElement) { - throw new Error( - `${errorMsgPrefix} Could not parse NLS configuration. Could not find nlsConfigElement with id: ${nlsConfigElementId}`, - ) - } - - if (!dataSettings) { - throw new Error( - `${errorMsgPrefix} Could not parse NLS configuration. Found nlsConfigElement but missing data-settings attribute.`, - ) - } - - const nlsConfig = JSON.parse(dataSettings) as NlsConfiguration - - if (nlsConfig._resolvedLanguagePackCoreLocation) { - // NOTE@jsjoeio - // Not sure why we use Object.create(null) instead of {} - // They are not the same - // See: https://stackoverflow.com/a/15518712/3015595 - // We copied this from ../../../lib/vscode/src/bootstrap.js#L143 - const bundles: { - [key: string]: string - } = Object.create(null) - - type LoadBundleCallback = (_: undefined, result?: string) => void - - nlsConfig.loadBundle = async (bundle: string, _language: string, cb: LoadBundleCallback): Promise => { - const result = bundles[bundle] - - if (result) { - return cb(undefined, result) - } - - try { - const path = createBundlePath(nlsConfig._resolvedLanguagePackCoreLocation, bundle) - const response = await fetch(`${base}/vscode/resource/?path=${encodeURIComponent(path)}`) - const json = await response.json() - bundles[bundle] = json - return cb(undefined, json) - } catch (error) { - return cb(error) - } - } - } - - return nlsConfig -} - -type GetLoaderParams = { - nlsConfig: NlsConfiguration - options: Options - _window: Window -} - -/** - * Link to types in the loader source repo - * https://github.com/microsoft/vscode-loader/blob/main/src/loader.d.ts#L280 - */ -type Loader = { - baseUrl: string - recordStats: boolean - // TODO@jsjoeio: There don't appear to be any types for trustedTypes yet. - trustedTypesPolicy: FixMeLater - paths: { - [key: string]: string - } - "vs/nls": NlsConfiguration -} - -/** - * A helper function which creates a script url if the value - * is valid. - * - * Extracted into a function to make it easier to test - */ -export function _createScriptURL(value: string, origin: string): string { - if (value.startsWith(origin)) { - return value - } - throw new Error(`Invalid script url: ${value}`) -} - -/** - * A helper function to get the require loader - * - * This used by VSCode/code-server - * to load files. - * - * We extracted the logic into a function so that - * it's easier to test. - **/ -export function getConfigurationForLoader({ nlsConfig, options, _window }: GetLoaderParams) { - const loader: Loader = { - // Without the full URL VS Code will try to load file://. - baseUrl: `${window.location.origin}${options.csStaticBase}/vendor/modules/code-oss-dev/out`, - recordStats: true, - trustedTypesPolicy: (_window as FixMeLater).trustedTypes?.createPolicy("amdLoader", { - createScriptURL(value: string): string { - return _createScriptURL(value, window.location.origin) - }, - }), - paths: { - "vscode-textmate": `../node_modules/vscode-textmate/release/main`, - "vscode-oniguruma": `../node_modules/vscode-oniguruma/release/main`, - xterm: `../node_modules/xterm/lib/xterm.js`, - "xterm-addon-search": `../node_modules/xterm-addon-search/lib/xterm-addon-search.js`, - "xterm-addon-unicode11": `../node_modules/xterm-addon-unicode11/lib/xterm-addon-unicode11.js`, - "xterm-addon-webgl": `../node_modules/xterm-addon-webgl/lib/xterm-addon-webgl.js`, - "tas-client-umd": `../node_modules/tas-client-umd/lib/tas-client-umd.js`, - "iconv-lite-umd": `../node_modules/iconv-lite-umd/lib/iconv-lite-umd.js`, - jschardet: `../node_modules/jschardet/dist/jschardet.min.js`, - }, - "vs/nls": nlsConfig, - } - - return loader -} - -/** - * Sets the body background color to match the theme. - */ -export function setBodyBackgroundToThemeBackgroundColor(_document: Document, _localStorage: Storage) { - const errorMsgPrefix = "[vscode]" - const colorThemeData = _localStorage.getItem("colorThemeData") - - if (!colorThemeData) { - throw new Error( - `${errorMsgPrefix} Could not set body background to theme background color. Could not find colorThemeData in localStorage.`, - ) - } - - let _colorThemeData - try { - // We wrap this JSON.parse logic in a try/catch - // because it can throw if the JSON is invalid. - // and instead of throwing a random error - // we can throw our own error, which will be more helpful - // to the end user. - _colorThemeData = JSON.parse(colorThemeData) - } catch { - throw new Error( - `${errorMsgPrefix} Could not set body background to theme background color. Could not parse colorThemeData from localStorage.`, - ) - } - - const hasColorMapProperty = Object.prototype.hasOwnProperty.call(_colorThemeData, "colorMap") - if (!hasColorMapProperty) { - throw new Error( - `${errorMsgPrefix} Could not set body background to theme background color. colorThemeData is missing colorMap.`, - ) - } - - const editorBgColor = _colorThemeData.colorMap["editor.background"] - - if (!editorBgColor) { - throw new Error( - `${errorMsgPrefix} Could not set body background to theme background color. colorThemeData.colorMap["editor.background"] is undefined.`, - ) - } - - _document.body.style.background = editorBgColor - - return null -} - -/** - * A helper function to encapsulate all the - * logic used in this file. - * - * We purposely include all of this in a single function - * so that it's easier to test. - */ -export function main(_document: Document | undefined, _window: Window | undefined, _localStorage: Storage | undefined) { - if (!_document) { - throw new Error(`document is undefined.`) - } - - if (!_window) { - throw new Error(`window is undefined.`) - } - - if (!_localStorage) { - throw new Error(`localStorage is undefined.`) - } - - const options = getOptions() - const nlsConfig = getNlsConfiguration(_document, options.base) - - const loader = getConfigurationForLoader({ - nlsConfig, - options, - _window, - }) - - ;(self.require as unknown as Loader) = loader - - setBodyBackgroundToThemeBackgroundColor(_document, _localStorage) -} - -try { - main(document, window, localStorage) -} catch (error) { - console.error("[vscode] failed to initialize VS Code") - console.error(error) -} diff --git a/src/browser/register.ts b/src/browser/register.ts deleted file mode 100644 index 4774ad5fa467..000000000000 --- a/src/browser/register.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { logger } from "@coder/logger" -import { getOptions, normalize, logError } from "../common/util" - -export async function registerServiceWorker(): Promise { - const options = getOptions() - logger.level = options.logLevel - - const path = normalize(`${options.csStaticBase}/out/browser/serviceWorker.js`) - try { - await navigator.serviceWorker.register(path, { - scope: options.base + "/", - }) - logger.info(`[Service Worker] registered`) - } catch (error) { - logError(logger, `[Service Worker] registration`, error) - } -} - -if (typeof navigator !== "undefined" && "serviceWorker" in navigator) { - registerServiceWorker() -} else { - logger.error(`[Service Worker] navigator is undefined`) -} diff --git a/src/browser/serviceWorker.ts b/src/browser/serviceWorker.ts deleted file mode 100644 index 25765a1a4a68..000000000000 --- a/src/browser/serviceWorker.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -self.addEventListener("install", () => { - console.log("[Service Worker] installed") -}) - -self.addEventListener("activate", (event: any) => { - event.waitUntil((self as any).clients.claim()) - console.log("[Service Worker] activated") -}) - -self.addEventListener("fetch", () => { - // Without this event handler we won't be recognized as a PWA. -}) diff --git a/src/common/emitter.ts b/src/common/emitter.ts index 353ce851e825..ceb6dcfcd21b 100644 --- a/src/common/emitter.ts +++ b/src/common/emitter.ts @@ -46,7 +46,7 @@ export class Emitter { this.listeners.map(async (cb) => { try { await cb(value, promise) - } catch (error) { + } catch (error: any) { logger.error(error.message) } }), diff --git a/src/common/util.ts b/src/common/util.ts index 4e4f23cfd818..20470ad4e189 100644 --- a/src/common/util.ts +++ b/src/common/util.ts @@ -1,19 +1,3 @@ -/* - * This file exists in two locations: - * - src/common/util.ts - * - lib/vscode/src/vs/server/common/util.ts - * The second is a symlink to the first. - */ - -/** - * Base options included on every page. - */ -export interface Options { - base: string - csStaticBase: string - logLevel: number -} - /** * Split a string up to the delimiter. If the delimiter doesn't exist the first * item will have all the text and the second item will be an empty string. @@ -67,14 +51,14 @@ export const resolveBase = (base?: string): string => { } /** - * Get options embedded in the HTML or query params. + * Get client-side configuration embedded in the HTML or query params. */ -export const getOptions = (): T => { - let options: T +export const getClientConfiguration = (): T => { + let config: T try { - options = JSON.parse(document.getElementById("coder-options")!.getAttribute("data-settings")!) + config = JSON.parse(document.getElementById("coder-options")!.getAttribute("data-settings")!) } catch (error) { - options = {} as T + config = {} as T } // You can also pass options in stringified form to the options query @@ -83,16 +67,16 @@ export const getOptions = (): T => { const params = new URLSearchParams(location.search) const queryOpts = params.get("options") if (queryOpts) { - options = { - ...options, + config = { + ...config, ...JSON.parse(queryOpts), } } - options.base = resolveBase(options.base) - options.csStaticBase = resolveBase(options.csStaticBase) + config.base = resolveBase(config.base) + config.csStaticBase = resolveBase(config.csStaticBase) - return options + return config } /** @@ -109,17 +93,6 @@ export const arrayify = (value?: T | T[]): T[] => { return [value] } -/** - * Get the first string. If there's no string return undefined. - */ -export const getFirstString = (value: string | string[] | object | undefined): string | undefined => { - if (Array.isArray(value)) { - return value[0] - } - - return typeof value === "string" ? value : undefined -} - // TODO: Might make sense to add Error handling to the logger itself. export function logError(logger: { error: (msg: string) => void }, prefix: string, err: Error | string): void { if (err instanceof Error) { diff --git a/src/node/app.ts b/src/node/app.ts index a4e099c0f86d..b2bfc74f5060 100644 --- a/src/node/app.ts +++ b/src/node/app.ts @@ -9,6 +9,35 @@ import { DefaultedArgs } from "./cli" import { isNodeJSErrnoException } from "./util" import { handleUpgrade } from "./wsRouter" +type ListenOptions = Pick + +const listen = (server: http.Server, { host, port, socket }: ListenOptions) => { + return new Promise(async (resolve, reject) => { + server.on("error", reject) + + const onListen = () => { + // Promise resolved earlier so this is an unrelated error. + server.off("error", reject) + server.on("error", (err) => util.logError(logger, "http server error", err)) + + resolve() + } + + if (socket) { + try { + await fs.unlink(socket) + } catch (error: any) { + handleArgsSocketCatchError(error) + } + + server.listen(socket, onListen) + } else { + // [] is the correct format when using :: but Node errors with them. + server.listen(port, host.replace(/^\[|\]$/g, ""), onListen) + } + }) +} + /** * Create an Express app and an HTTP/S server to serve it. */ @@ -27,28 +56,7 @@ export const createApp = async (args: DefaultedArgs): Promise<[Express, Express, ) : http.createServer(app) - let resolved = false - await new Promise(async (resolve2, reject) => { - const resolve = () => { - resolved = true - resolve2() - } - server.on("error", (err) => { - handleServerError(resolved, err, reject) - }) - - if (args.socket) { - try { - await fs.unlink(args.socket) - } catch (error: any) { - handleArgsSocketCatchError(error) - } - server.listen(args.socket, resolve) - } else { - // [] is the correct format when using :: but Node errors with them. - server.listen(args.port, args.host.replace(/^\[|\]$/g, ""), resolve) - } - }) + await listen(server, args) const wsApp = express() handleUpgrade(wsApp, server) diff --git a/src/node/cli.ts b/src/node/cli.ts index 088431b7aa02..fe9b3fc13142 100644 --- a/src/node/cli.ts +++ b/src/node/cli.ts @@ -3,12 +3,11 @@ import { promises as fs } from "fs" import yaml from "js-yaml" import * as os from "os" import * as path from "path" -import { Args as VsArgs } from "../../typings/ipc" import { canConnect, generateCertificate, generatePassword, humanPath, paths } from "./util" export enum Feature { - /** Web socket compression. */ - PermessageDeflate = "permessage-deflate", + // No current experimental features! + Placeholder = "placeholder", } export enum AuthType { @@ -30,7 +29,21 @@ export enum LogLevel { export class OptionalString extends Optional {} -export interface Args extends VsArgs { +export interface Args + extends Pick< + CodeServerLib.NativeParsedArgs, + | "user-data-dir" + | "enable-proposed-api" + | "extensions-dir" + | "builtin-extensions-dir" + | "extra-extensions-dir" + | "extra-builtin-extensions-dir" + | "ignore-last-opened" + | "locale" + | "log" + | "verbose" + | "_" + > { config?: string auth?: AuthType password?: string @@ -56,8 +69,6 @@ export interface Args extends VsArgs { "show-versions"?: boolean "uninstall-extension"?: string[] "proxy-domain"?: string[] - locale?: string - _: string[] "reuse-window"?: boolean "new-window"?: boolean @@ -546,7 +557,7 @@ export async function readConfigFile(configPath?: string): Promise { flag: "wx", // wx means to fail if the path exists. }) logger.info(`Wrote default config file to ${humanPath(configPath)}`) - } catch (error) { + } catch (error: any) { // EEXIST is fine; we don't want to overwrite existing configurations. if (error.code !== "EEXIST") { throw error @@ -670,7 +681,7 @@ export const shouldOpenInExistingInstance = async (args: Args): Promise => { try { return await fs.readFile(path.join(os.tmpdir(), "vscode-ipc"), "utf8") - } catch (error) { + } catch (error: any) { if (error.code !== "ENOENT") { throw error } diff --git a/src/node/constants.ts b/src/node/constants.ts index d36f9a24a800..8b46a986449b 100644 --- a/src/node/constants.ts +++ b/src/node/constants.ts @@ -3,11 +3,13 @@ import { JSONSchemaForNPMPackageJsonFiles } from "@schemastore/package" import * as os from "os" import * as path from "path" +export const WORKBENCH_WEB_CONFIG_ID = "vscode-workbench-web-configuration" + export function getPackageJson(relativePath: string): JSONSchemaForNPMPackageJsonFiles { let pkg = {} try { pkg = require(relativePath) - } catch (error) { + } catch (error: any) { logger.warn(error.message) } @@ -19,5 +21,6 @@ const pkg = getPackageJson("../../package.json") export const version = pkg.version || "development" export const commit = pkg.commit || "development" export const rootPath = path.resolve(__dirname, "../..") +export const vsRootPath = path.join(rootPath, "vendor/modules/code-oss-dev") export const tmpdir = path.join(os.tmpdir(), "code-server") export const isDevMode = commit === "development" diff --git a/src/node/entry.ts b/src/node/entry.ts index 568718781d62..f0600b1de716 100644 --- a/src/node/entry.ts +++ b/src/node/entry.ts @@ -9,11 +9,11 @@ import { } from "./cli" import { commit, version } from "./constants" import { openInExistingInstance, runCodeServer, runVsCodeCli } from "./main" -import * as proxyAgent from "./proxy_agent" +import { monkeyPatchProxyProtocols } from "./proxy_agent" import { isChild, wrapper } from "./wrapper" async function entry(): Promise { - proxyAgent.monkeyPatch(false) + monkeyPatchProxyProtocols() // There's no need to check flags like --help or to spawn in an existing // instance for the child process because these would have already happened in @@ -46,11 +46,13 @@ async function entry(): Promise { if (args.version) { if (args.json) { - console.log({ - codeServer: version, - commit, - vscode: require("../../vendor/modules/code-oss-dev/package.json").version, - }) + console.log( + JSON.stringify({ + codeServer: version, + commit, + vscode: require("../../vendor/modules/code-oss-dev/package.json").version, + }), + ) } else { console.log(version, commit) } diff --git a/src/node/http.ts b/src/node/http.ts index d7ffa1f144d4..8254e4abf25b 100644 --- a/src/node/http.ts +++ b/src/node/http.ts @@ -1,13 +1,14 @@ import { field, logger } from "@coder/logger" import * as express from "express" import * as expressCore from "express-serve-static-core" +import path from "path" import qs from "qs" import { HttpCode, HttpError } from "../common/http" -import { normalize, Options } from "../common/util" +import { normalize } from "../common/util" import { AuthType, DefaultedArgs } from "./cli" -import { commit, rootPath } from "./constants" +import { version as codeServerVersion } from "./constants" import { Heart } from "./heart" -import { getPasswordMethod, IsCookieValidArgs, isCookieValid, sanitizeString, escapeHtml } from "./util" +import { getPasswordMethod, IsCookieValidArgs, isCookieValid, sanitizeString, escapeHtml, escapeJSON } from "./util" declare global { // eslint-disable-next-line @typescript-eslint/no-namespace @@ -19,6 +20,16 @@ declare global { } } +export const createClientConfiguration = (req: express.Request): CodeServerLib.ClientConfiguration => { + const base = relativeRoot(req) + + return { + base, + csStaticBase: normalize(path.join(base, "_static/")), + codeServerVersion, + } +} + /** * Replace common variable strings in HTML templates. */ @@ -27,18 +38,16 @@ export const replaceTemplates = ( content: string, extraOpts?: Omit, ): string => { - const base = relativeRoot(req) - const options: Options = { - base, - csStaticBase: base + "/static/" + commit + rootPath, - logLevel: logger.level, + const serverOptions: CodeServerLib.ClientConfiguration = { + ...createClientConfiguration(req), ...extraOpts, } + return content .replace(/{{TO}}/g, (typeof req.query.to === "string" && escapeHtml(req.query.to)) || "/") - .replace(/{{BASE}}/g, options.base) - .replace(/{{CS_STATIC_BASE}}/g, options.csStaticBase) - .replace(/"{{OPTIONS}}"/, `'${JSON.stringify(options)}'`) + .replace(/{{BASE}}/g, serverOptions.base) + .replace(/{{CS_STATIC_BASE}}/g, serverOptions.csStaticBase) + .replace("{{OPTIONS}}", () => escapeJSON(serverOptions)) } /** diff --git a/src/node/link.ts b/src/node/link.ts new file mode 100644 index 000000000000..5dfe795228da --- /dev/null +++ b/src/node/link.ts @@ -0,0 +1,22 @@ +import { logger } from "@coder/logger" +import { spawn } from "child_process" +import path from "path" + +export function startLink(port: number): Promise { + logger.debug(`running link targetting ${port}`) + + const agent = spawn(path.resolve(__dirname, "../../lib/linkup"), ["--devurl", `code:${port}:code-server`], { + shell: false, + }) + return new Promise((res, rej) => { + agent.on("error", rej) + agent.on("close", (code) => { + if (code !== 0) { + return rej({ + message: `Link exited with ${code}`, + }) + } + res() + }) + }) +} diff --git a/src/node/main.ts b/src/node/main.ts index 1e9569faef47..ae68406fe661 100644 --- a/src/node/main.ts +++ b/src/node/main.ts @@ -1,49 +1,42 @@ import { field, logger } from "@coder/logger" -import * as cp from "child_process" import http from "http" -import * as path from "path" -import { CliMessage, OpenCommandPipeArgs } from "../../typings/ipc" +import path from "path" import { plural } from "../common/util" import { createApp, ensureAddress } from "./app" import { AuthType, DefaultedArgs, Feature } from "./cli" import { coderCloudBind } from "./coder_cloud" import { commit, version } from "./constants" +import { startLink } from "./link" import { register } from "./routes" -import { humanPath, isFile, open } from "./util" - -export const runVsCodeCli = (args: DefaultedArgs): void => { - logger.debug("forking vs code cli...") - const vscode = cp.fork(path.resolve(__dirname, "../../vendor/modules/code-oss-dev/out/vs/server/fork"), [], { - env: { - ...process.env, - CODE_SERVER_PARENT_PID: process.pid.toString(), - }, - }) - vscode.once("message", (message: any) => { - logger.debug("got message from VS Code", field("message", message)) - if (message.type !== "ready") { - logger.error("Unexpected response waiting for ready response", field("type", message.type)) - process.exit(1) - } - const send: CliMessage = { type: "cli", args } - vscode.send(send) - }) - vscode.once("error", (error) => { +import { humanPath, isFile, loadAMDModule, open } from "./util" + +/** + * This is useful when an CLI arg should be passed to VS Code directly, + * such as when managing extensions. + * @deprecated This should be removed when code-server merges with lib/vscode. + */ +export const runVsCodeCli = async (args: DefaultedArgs): Promise => { + logger.debug("Running VS Code CLI") + + const cliProcessMain = await loadAMDModule("vs/code/node/cliProcessMain", "main") + + try { + await cliProcessMain(args) + } catch (error) { logger.error("Got error from VS Code", field("error", error)) - process.exit(1) - }) - vscode.on("exit", (code) => process.exit(code || 0)) + } + + process.exit(0) } export const openInExistingInstance = async (args: DefaultedArgs, socketPath: string): Promise => { - const pipeArgs: OpenCommandPipeArgs & { fileURIs: string[] } = { + const pipeArgs: CodeServerLib.OpenCommandPipeArgs & { fileURIs: string[] } = { type: "open", folderURIs: [], fileURIs: [], forceReuseWindow: args["reuse-window"], forceNewWindow: args["new-window"], } - for (let i = 0; i < args._.length; i++) { const fp = path.resolve(args._[i]) if (await isFile(fp)) { @@ -52,17 +45,14 @@ export const openInExistingInstance = async (args: DefaultedArgs, socketPath: st pipeArgs.folderURIs.push(fp) } } - if (pipeArgs.forceNewWindow && pipeArgs.fileURIs.length > 0) { logger.error("--new-window can only be used with folder paths") process.exit(1) } - if (pipeArgs.folderURIs.length === 0 && pipeArgs.fileURIs.length === 0) { logger.error("Please specify at least one file or folder") process.exit(1) } - const vscode = http.request( { path: "/", @@ -129,6 +119,15 @@ export const runCodeServer = async (args: DefaultedArgs): Promise = logger.info(" - Connected to cloud agent") } + try { + const port = parseInt(serverAddress.split(":").pop() as string, 10) + startLink(port).catch((ex) => { + logger.debug("Link daemon exited!", field("error", ex)) + }) + } catch (error) { + logger.debug("Failed to start link daemon!", error as any) + } + if (args.enable && args.enable.length > 0) { logger.info("Enabling the following experimental features:") args.enable.forEach((feature) => { diff --git a/src/node/plugin.ts b/src/node/plugin.ts index 036e118e88c9..69f32720c27c 100644 --- a/src/node/plugin.ts +++ b/src/node/plugin.ts @@ -172,9 +172,9 @@ export class PluginAPI { } await this.loadPlugin(path.join(dir, ent.name)) } - } catch (err) { - if (err.code !== "ENOENT") { - this.logger.warn(`failed to load plugins from ${q(dir)}: ${err.message}`) + } catch (error: any) { + if (error.code !== "ENOENT") { + this.logger.warn(`failed to load plugins from ${q(dir)}: ${error.message}`) } } } @@ -195,9 +195,9 @@ export class PluginAPI { } const p = this._loadPlugin(dir, packageJSON) this.plugins.set(p.name, p) - } catch (err) { - if (err.code !== "ENOENT") { - this.logger.warn(`failed to load plugin: ${err.stack}`) + } catch (error: any) { + if (error.code !== "ENOENT") { + this.logger.warn(`failed to load plugin: ${error.stack}`) } } } @@ -278,7 +278,7 @@ export class PluginAPI { } try { await p.deinit() - } catch (error) { + } catch (error: any) { this.logger.error("plugin failed to deinit", field("name", p.name), field("error", error.message)) } }), diff --git a/src/node/proxy_agent.ts b/src/node/proxy_agent.ts index 39607c8da81f..35b38ba75378 100644 --- a/src/node/proxy_agent.ts +++ b/src/node/proxy_agent.ts @@ -1,7 +1,10 @@ -import { logger } from "@coder/logger" -import * as http from "http" -import * as proxyAgent from "proxy-agent" -import * as proxyFromEnv from "proxy-from-env" +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Coder Technologies. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import ProxyAgent from "proxy-agent" +import { getProxyForUrl } from "proxy-from-env" /** * This file has nothing to do with the code-server proxy. @@ -11,10 +14,6 @@ import * as proxyFromEnv from "proxy-from-env" * - https://www.npmjs.com/package/proxy-agent * - https://www.npmjs.com/package/proxy-from-env * - * This file exists in two locations: - * - src/node/proxy_agent.ts - * - lib/vscode/src/vs/base/node/proxy_agent.ts - * The second is a symlink to the first. */ /** @@ -31,50 +30,41 @@ import * as proxyFromEnv from "proxy-from-env" * Even if they do, it's probably the same proxy so we should be fine! And those knobs * are deprecated anyway. */ -export function monkeyPatch(inVSCode: boolean): void { - if (shouldEnableProxy()) { - const http = require("http") - const https = require("https") - - // If we do not pass in a proxy URL, proxy-agent will get the URL from the environment. - // See https://www.npmjs.com/package/proxy-from-env. - // Also see shouldEnableProxy. - const pa = newProxyAgent(inVSCode) - http.globalAgent = pa - https.globalAgent = pa +export function monkeyPatchProxyProtocols(): void { + if (!shouldEnableProxy()) { + return } -} -function newProxyAgent(inVSCode: boolean): http.Agent { - // The reasoning for this split is that VS Code's build process does not have - // esModuleInterop enabled but the code-server one does. As a result depending on where - // we execute, we either have a default attribute or we don't. - // - // I can't enable esModuleInterop in VS Code's build process as it breaks and spits out - // a huge number of errors. And we can't use require as otherwise the modules won't be - // included in the final product. - if (inVSCode) { - return new (proxyAgent as any)() - } else { - return new (proxyAgent as any).default() - } + const http = require("http") + const https = require("https") + + // If we do not pass in a proxy URL, proxy-agent will get the URL from the environment. + // See https://www.npmjs.com/package/proxy-from-env. + // Also see shouldEnableProxy. + const pa = new ProxyAgent() + http.globalAgent = pa + https.globalAgent = pa } +const sampleUrls = [new URL("http://example.com/"), new URL("https://example.com/")] + // If they have $NO_PROXY set to example.com then this check won't work! // But that's drastically unlikely. export function shouldEnableProxy(): boolean { - let shouldEnable = false + const testedProxyEndpoints = sampleUrls.map((url) => { + return { + url, + proxyUrl: getProxyForUrl(url.toString()), + } + }) - const httpProxy = proxyFromEnv.getProxyForUrl(`http://example.com`) - if (httpProxy) { - shouldEnable = true - logger.debug(`using $HTTP_PROXY ${httpProxy}`) - } + let shouldEnable = false - const httpsProxy = proxyFromEnv.getProxyForUrl(`https://example.com`) - if (httpsProxy) { - shouldEnable = true - logger.debug(`using $HTTPS_PROXY ${httpsProxy}`) + for (const { url, proxyUrl } of testedProxyEndpoints) { + if (proxyUrl) { + console.debug(`${url.protocol} -- Using "${proxyUrl}"`) + shouldEnable = true + } } return shouldEnable diff --git a/src/node/routes/errors.ts b/src/node/routes/errors.ts new file mode 100644 index 000000000000..757e9f7449d5 --- /dev/null +++ b/src/node/routes/errors.ts @@ -0,0 +1,45 @@ +import { logger } from "@coder/logger" +import express from "express" +import { promises as fs } from "fs" +import path from "path" +import { WebsocketRequest } from "../../../typings/pluginapi" +import { HttpCode } from "../../common/http" +import { rootPath } from "../constants" +import { replaceTemplates } from "../http" +import { getMediaMime } from "../util" + +const notFoundCodes = ["ENOENT", "EISDIR", "FileNotFound"] +export const errorHandler: express.ErrorRequestHandler = async (err, req, res, next) => { + if (notFoundCodes.includes(err.code)) { + err.status = HttpCode.NotFound + } + + const status = err.status ?? err.statusCode ?? 500 + res.status(status) + + // Assume anything that explicitly accepts text/html is a user browsing a + // page (as opposed to an xhr request). Don't use `req.accepts()` since + // *every* request that I've seen (in Firefox and Chromium at least) + // includes `*/*` making it always truthy. Even for css/javascript. + if (req.headers.accept && req.headers.accept.includes("text/html")) { + const resourcePath = path.resolve(rootPath, "src/browser/pages/error.html") + res.set("Content-Type", getMediaMime(resourcePath)) + const content = await fs.readFile(resourcePath, "utf8") + res.send( + replaceTemplates(req, content) + .replace(/{{ERROR_TITLE}}/g, status) + .replace(/{{ERROR_HEADER}}/g, status) + .replace(/{{ERROR_BODY}}/g, err.message), + ) + } else { + res.json({ + error: err.message, + ...(err.details || {}), + }) + } +} + +export const wsErrorHandler: express.ErrorRequestHandler = async (err, req, res, next) => { + logger.error(`${err.message} ${err.stack}`) + ;(req as WebsocketRequest).ws.end() +} diff --git a/src/node/routes/index.ts b/src/node/routes/index.ts index 42edbe117a24..08a2dcc18421 100644 --- a/src/node/routes/index.ts +++ b/src/node/routes/index.ts @@ -1,5 +1,4 @@ import { logger } from "@coder/logger" -import bodyParser from "body-parser" import cookieParser from "cookie-parser" import * as express from "express" import { promises as fs } from "fs" @@ -10,22 +9,21 @@ import * as pluginapi from "../../../typings/pluginapi" import { HttpCode, HttpError } from "../../common/http" import { plural } from "../../common/util" import { AuthType, DefaultedArgs } from "../cli" -import { rootPath } from "../constants" +import { commit, isDevMode, rootPath } from "../constants" import { Heart } from "../heart" -import { ensureAuthenticated, redirect, replaceTemplates } from "../http" +import { ensureAuthenticated, redirect } from "../http" import { PluginAPI } from "../plugin" import { getMediaMime, paths } from "../util" import { wrapper } from "../wrapper" import * as apps from "./apps" import * as domainProxy from "./domainProxy" +import { errorHandler, wsErrorHandler } from "./errors" import * as health from "./health" import * as login from "./login" import * as logout from "./logout" import * as pathProxy from "./pathProxy" -// static is a reserved keyword. -import * as _static from "./static" import * as update from "./update" -import * as vscode from "./vscode" +import { createVSServerRouter, VSServerResult } from "./vscode" /** * Register all routes and middleware. @@ -124,13 +122,15 @@ export const register = async ( wrapper.onDispose(() => pluginApi.dispose()) } - app.use(bodyParser.json()) - app.use(bodyParser.urlencoded({ extended: true })) + app.use(express.json()) + app.use(express.urlencoded({ extended: true })) - app.use("/", vscode.router) - wsApp.use("/", vscode.wsRouter.router) - app.use("/vscode", vscode.router) - wsApp.use("/vscode", vscode.wsRouter.router) + app.use( + "/_static", + express.static(rootPath, { + cacheControl: commit !== "development", + }), + ) app.use("/healthz", health.router) wsApp.use("/healthz", health.wsRouter.router) @@ -143,49 +143,32 @@ export const register = async ( app.all("/logout", (req, res) => redirect(req, res, "/", {})) } - app.use("/static", _static.router) app.use("/update", update.router) - app.use(() => { - throw new HttpError("Not Found", HttpCode.NotFound) - }) - - const errorHandler: express.ErrorRequestHandler = async (err, req, res, next) => { - if (err.code === "ENOENT" || err.code === "EISDIR") { - err.status = HttpCode.NotFound - } - - const status = err.status ?? err.statusCode ?? 500 - res.status(status) - - // Assume anything that explicitly accepts text/html is a user browsing a - // page (as opposed to an xhr request). Don't use `req.accepts()` since - // *every* request that I've seen (in Firefox and Chromium at least) - // includes `*/*` making it always truthy. Even for css/javascript. - if (req.headers.accept && req.headers.accept.includes("text/html")) { - const resourcePath = path.resolve(rootPath, "src/browser/pages/error.html") - res.set("Content-Type", getMediaMime(resourcePath)) - const content = await fs.readFile(resourcePath, "utf8") - res.send( - replaceTemplates(req, content) - .replace(/{{ERROR_TITLE}}/g, status) - .replace(/{{ERROR_HEADER}}/g, status) - .replace(/{{ERROR_BODY}}/g, err.message), - ) + let vscode: VSServerResult + try { + vscode = await createVSServerRouter(args) + app.use("/", vscode.router) + wsApp.use("/", vscode.wsRouter.router) + app.use("/vscode", vscode.router) + wsApp.use("/vscode", vscode.wsRouter.router) + } catch (error: any) { + if (isDevMode) { + logger.warn(error) + logger.warn("VS Server router may still be compiling.") } else { - res.json({ - error: err.message, - ...(err.details || {}), - }) + throw error } } - app.use(errorHandler) + server.on("close", () => { + vscode.vscodeServer.close() + }) - const wsErrorHandler: express.ErrorRequestHandler = async (err, req, res, next) => { - logger.error(`${err.message} ${err.stack}`) - ;(req as pluginapi.WebsocketRequest).ws.end() - } + app.use(() => { + throw new HttpError("Not Found", HttpCode.NotFound) + }) + app.use(errorHandler) wsApp.use(wsErrorHandler) } diff --git a/src/node/routes/login.ts b/src/node/routes/login.ts index 999b8dfaf5b9..8b8164f16b4e 100644 --- a/src/node/routes/login.ts +++ b/src/node/routes/login.ts @@ -111,7 +111,7 @@ router.post("/", async (req, res) => { ) throw new Error("Incorrect password") - } catch (error) { + } catch (error: any) { const renderedHtml = await getRoot(req, error) res.send(renderedHtml) } diff --git a/src/node/routes/static.ts b/src/node/routes/static.ts deleted file mode 100644 index 29a1ad3bc7ed..000000000000 --- a/src/node/routes/static.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { field, logger } from "@coder/logger" -import { Router } from "express" -import { promises as fs } from "fs" -import * as path from "path" -import { Readable } from "stream" -import * as tarFs from "tar-fs" -import * as zlib from "zlib" -import { HttpCode, HttpError } from "../../common/http" -import { getFirstString } from "../../common/util" -import { rootPath } from "../constants" -import { authenticated, ensureAuthenticated, replaceTemplates } from "../http" -import { getMediaMime, pathToFsPath } from "../util" - -export const router = Router() - -// The commit is for caching. -router.get("/(:commit)(/*)?", async (req, res) => { - // Used by VS Code to load extensions into the web worker. - const tar = getFirstString(req.query.tar) - if (tar) { - await ensureAuthenticated(req) - let stream: Readable = tarFs.pack(pathToFsPath(tar)) - if (req.headers["accept-encoding"] && req.headers["accept-encoding"].includes("gzip")) { - logger.debug("gzipping tar", field("path", tar)) - const compress = zlib.createGzip() - stream.pipe(compress) - stream.on("error", (error) => compress.destroy(error)) - stream.on("close", () => compress.end()) - stream = compress - res.header("content-encoding", "gzip") - } - res.set("Content-Type", "application/x-tar") - stream.on("close", () => res.end()) - return stream.pipe(res) - } - - // If not a tar use the remainder of the path to load the resource. - if (!req.params[0]) { - throw new HttpError("Not Found", HttpCode.NotFound) - } - - const resourcePath = path.resolve(req.params[0]) - - // Make sure it's in code-server if you aren't authenticated. This lets - // unauthenticated users load the login assets. - const isAuthenticated = await authenticated(req) - if (!resourcePath.startsWith(rootPath) && !isAuthenticated) { - throw new HttpError("Unauthorized", HttpCode.Unauthorized) - } - - // Don't cache during development. - can also be used if you want to make a - // static request without caching. - if (req.params.commit !== "development" && req.params.commit !== "-") { - res.header("Cache-Control", "public, max-age=31536000") - } - - // Without this the default is to use the directory the script loaded from. - if (req.headers["service-worker"]) { - res.header("service-worker-allowed", "/") - } - - res.set("Content-Type", getMediaMime(resourcePath)) - - if (resourcePath.endsWith("manifest.json")) { - const content = await fs.readFile(resourcePath, "utf8") - return res.send(replaceTemplates(req, content)) - } - - const content = await fs.readFile(resourcePath) - return res.send(content) -}) diff --git a/src/node/routes/vscode.ts b/src/node/routes/vscode.ts index d91abb4b0536..4244d2ceae1d 100644 --- a/src/node/routes/vscode.ts +++ b/src/node/routes/vscode.ts @@ -1,232 +1,73 @@ -import * as crypto from "crypto" -import { Request, Router } from "express" -import { promises as fs } from "fs" -import * as path from "path" -import qs from "qs" -import * as ipc from "../../../typings/ipc" -import { Emitter } from "../../common/emitter" -import { HttpCode, HttpError } from "../../common/http" -import { getFirstString } from "../../common/util" -import { Feature } from "../cli" -import { isDevMode, rootPath, version } from "../constants" -import { authenticated, ensureAuthenticated, redirect, replaceTemplates } from "../http" -import { getMediaMime, pathToFsPath } from "../util" -import { VscodeProvider } from "../vscode" -import { Router as WsRouter } from "../wsRouter" - -export const router = Router() - -const vscode = new VscodeProvider() - -router.get("/", async (req, res) => { - const isAuthenticated = await authenticated(req) - if (!isAuthenticated) { - return redirect(req, res, "login", { - // req.baseUrl can be blank if already at the root. - to: req.baseUrl && req.baseUrl !== "/" ? req.baseUrl : undefined, - }) - } - - const [content, options] = await Promise.all([ - await fs.readFile(path.join(rootPath, "src/browser/pages/vscode.html"), "utf8"), - (async () => { - try { - return await vscode.initialize({ args: req.args, remoteAuthority: req.headers.host || "" }, req.query) - } catch (error) { - const devMessage = isDevMode ? "It might not have finished compiling." : "" - throw new Error(`VS Code failed to load. ${devMessage} ${error.message}`) - } - })(), - ]) - - options.productConfiguration.codeServerVersion = version - - res.send( - replaceTemplates( - req, - // Uncomment prod blocks if not in development. TODO: Would this be - // better as a build step? Or maintain two HTML files again? - !isDevMode ? content.replace(//g, "") : content, - { - authed: req.args.auth !== "none", - disableUpdateCheck: !!req.args["disable-update-check"], - }, - ) - .replace(`"{{REMOTE_USER_DATA_URI}}"`, `'${JSON.stringify(options.remoteUserDataUri)}'`) - .replace(`"{{PRODUCT_CONFIGURATION}}"`, `'${JSON.stringify(options.productConfiguration)}'`) - .replace(`"{{WORKBENCH_WEB_CONFIGURATION}}"`, `'${JSON.stringify(options.workbenchWebConfiguration)}'`) - .replace(`"{{NLS_CONFIGURATION}}"`, `'${JSON.stringify(options.nlsConfiguration)}'`), - ) -}) - -/** - * TODO: Might currently be unused. - */ -router.get("/resource(/*)?", ensureAuthenticated, async (req, res) => { - const path = getFirstString(req.query.path) - if (path) { - res.set("Content-Type", getMediaMime(path)) - res.send(await fs.readFile(pathToFsPath(path))) - } -}) - -/** - * Used by VS Code to load files. - */ -router.get("/vscode-remote-resource(/*)?", ensureAuthenticated, async (req, res) => { - const path = getFirstString(req.query.path) - if (path) { - res.set("Content-Type", getMediaMime(path)) - res.send(await fs.readFile(pathToFsPath(path))) - } -}) - -/** - * VS Code webviews use these paths to load files and to load webview assets - * like HTML and JavaScript. - */ -router.get("/webview/*", ensureAuthenticated, async (req, res) => { - res.set("Content-Type", getMediaMime(req.path)) - if (/^vscode-resource/.test(req.params[0])) { - return res.send(await fs.readFile(req.params[0].replace(/^vscode-resource(\/file)?/, ""))) - } - return res.send( - await fs.readFile(path.join(vscode.vsRootPath, "out/vs/workbench/contrib/webview/browser/pre", req.params[0])), - ) -}) - -interface Callback { - uri: { - scheme: string - authority?: string - path?: string - query?: string - fragment?: string - } - timeout: NodeJS.Timeout +import * as express from "express" +import { Server } from "http" +import path from "path" +import { AuthType, DefaultedArgs } from "../cli" +import { version as codeServerVersion, vsRootPath } from "../constants" +import { ensureAuthenticated } from "../http" +import { loadAMDModule } from "../util" +import { Router as WsRouter, WebsocketRouter } from "../wsRouter" +import { errorHandler } from "./errors" + +export interface VSServerResult { + router: express.Router + wsRouter: WebsocketRouter + vscodeServer: Server } -const callbacks = new Map() -const callbackEmitter = new Emitter<{ id: string; callback: Callback }>() +export const createVSServerRouter = async (args: DefaultedArgs): Promise => { + // Delete `VSCODE_CWD` very early even before + // importing bootstrap files. We have seen + // reports where `code .` would use the wrong + // current working directory due to our variable + // somehow escaping to the parent shell + // (https://github.com/microsoft/vscode/issues/126399) + delete process.env["VSCODE_CWD"] -/** - * Get vscode-requestId from the query and throw if it's missing or invalid. - */ -const getRequestId = (req: Request): string => { - if (!req.query["vscode-requestId"]) { - throw new HttpError("vscode-requestId is missing", HttpCode.BadRequest) - } + const bootstrap = require(path.join(vsRootPath, "out", "bootstrap")) + const bootstrapNode = require(path.join(vsRootPath, "out", "bootstrap-node")) + const product = require(path.join(vsRootPath, "product.json")) - if (typeof req.query["vscode-requestId"] !== "string") { - throw new HttpError("vscode-requestId is not a string", HttpCode.BadRequest) - } + // Avoid Monkey Patches from Application Insights + bootstrap.avoidMonkeyPatchFromAppInsights() - return req.query["vscode-requestId"] -} + // Enable portable support + bootstrapNode.configurePortable(product) -// Matches VS Code's fetch timeout. -const fetchTimeout = 5 * 60 * 1000 + // Enable ASAR support + bootstrap.enableASARSupport() -// The callback endpoints are used during authentication. A URI is stored on -// /callback and then fetched later on /fetch-callback. -// See ../../../lib/vscode/resources/web/code-web.js -router.get("/callback", ensureAuthenticated, async (req, res) => { - const uriKeys = [ - "vscode-requestId", - "vscode-scheme", - "vscode-authority", - "vscode-path", - "vscode-query", - "vscode-fragment", - ] + // Signal processes that we got launched as CLI + process.env["VSCODE_CLI"] = "1" - const id = getRequestId(req) + const vscodeServerMain = await loadAMDModule("vs/server/entry", "createVSServer") - // Move any query variables that aren't URI keys into the URI's query - // (importantly, this will include the code for oauth). - const query: qs.ParsedQs = {} - for (const key in req.query) { - if (!uriKeys.includes(key)) { - query[key] = req.query[key] - } - } - - const callback = { - uri: { - scheme: getFirstString(req.query["vscode-scheme"]) || "code-oss", - authority: getFirstString(req.query["vscode-authority"]), - path: getFirstString(req.query["vscode-path"]), - query: (getFirstString(req.query.query) || "") + "&" + qs.stringify(query), - fragment: getFirstString(req.query["vscode-fragment"]), - }, - // Make sure the map doesn't leak if nothing fetches this URI. - timeout: setTimeout(() => callbacks.delete(id), fetchTimeout), - } - - callbacks.set(id, callback) - callbackEmitter.emit({ id, callback }) - - res.sendFile(path.join(rootPath, "vendor/modules/code-oss-dev/resources/web/callback.html")) -}) - -router.get("/fetch-callback", ensureAuthenticated, async (req, res) => { - const id = getRequestId(req) - - const send = (callback: Callback) => { - clearTimeout(callback.timeout) - callbacks.delete(id) - res.json(callback.uri) - } - - const callback = callbacks.get(id) - if (callback) { - return send(callback) - } - - // VS Code will try again if the route returns no content but it seems more - // efficient to just wait on this request for as long as possible? - const handler = callbackEmitter.event(({ id: emitId, callback }) => { - if (id === emitId) { - handler.dispose() - send(callback) - } + const serverUrl = new URL(`${args.cert ? "https" : "http"}://${args.host}:${args.port}`) + const vscodeServer = await vscodeServerMain({ + codeServerVersion, + serverUrl, + args, + authed: args.auth !== AuthType.None, + disableUpdateCheck: !!args["disable-update-check"], }) - // If the client closes the connection. - req.on("close", () => handler.dispose()) -}) + const router = express.Router() + const wsRouter = WsRouter() -export const wsRouter = WsRouter() + router.all("*", ensureAuthenticated, (req, res, next) => { + req.on("error", (error) => errorHandler(error, req, res, next)) -wsRouter.ws("/", ensureAuthenticated, async (req) => { - const magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" - const reply = crypto - .createHash("sha1") - .update(req.headers["sec-websocket-key"] + magic) - .digest("base64") - - const responseHeaders = [ - "HTTP/1.1 101 Switching Protocols", - "Upgrade: websocket", - "Connection: Upgrade", - `Sec-WebSocket-Accept: ${reply}`, - ] + vscodeServer.emit("request", req, res) + }) - // See if the browser reports it supports web socket compression. - // TODO: Parse this header properly. - const extensions = req.headers["sec-websocket-extensions"] - const isCompressionSupported = extensions ? extensions.includes("permessage-deflate") : false + wsRouter.ws("/", ensureAuthenticated, (req) => { + vscodeServer.emit("upgrade", req, req.socket, req.head) - // TODO: For now we only use compression if the user enables it. - const isCompressionEnabled = !!req.args.enable?.includes(Feature.PermessageDeflate) + req.socket.resume() + }) - const useCompression = isCompressionEnabled && isCompressionSupported - if (useCompression) { - // This response header tells the browser the server supports compression. - responseHeaders.push("Sec-WebSocket-Extensions: permessage-deflate; server_max_window_bits=15") + return { + router, + wsRouter, + vscodeServer, } - - req.ws.write(responseHeaders.join("\r\n") + "\r\n\r\n") - - await vscode.sendWebsocket(req.ws, req.query, useCompression) -}) +} diff --git a/src/node/settings.ts b/src/node/settings.ts index ee955aad9e99..4cce755a8a08 100644 --- a/src/node/settings.ts +++ b/src/node/settings.ts @@ -20,7 +20,7 @@ export class SettingsProvider { try { const raw = (await fs.readFile(this.settingsPath, "utf8")).trim() return raw ? JSON.parse(raw) : {} - } catch (error) { + } catch (error: any) { if (error.code !== "ENOENT") { logger.warn(error.message) } @@ -37,7 +37,7 @@ export class SettingsProvider { const oldSettings = await this.read() const nextSettings = { ...oldSettings, ...settings } await fs.writeFile(this.settingsPath, JSON.stringify(nextSettings, null, 2)) - } catch (error) { + } catch (error: any) { logger.warn(error.message) } } diff --git a/src/node/update.ts b/src/node/update.ts index 6f9aa39e58c7..e9679fa42a21 100644 --- a/src/node/update.ts +++ b/src/node/update.ts @@ -60,7 +60,7 @@ export class UpdateProvider { } logger.debug("got latest version", field("latest", update.version)) return update - } catch (error) { + } catch (error: any) { logger.error("Failed to get latest version", field("error", error.message)) return { checked: now, diff --git a/src/node/uriTransformer.ts b/src/node/uriTransformer.ts deleted file mode 100644 index 50d07b1ce71b..000000000000 --- a/src/node/uriTransformer.ts +++ /dev/null @@ -1,66 +0,0 @@ -// In a bit of a hack, this file is stored in two places -// - src/node/uri_transformer.ts -// - lib/vscode/src/vs/server/uriTransformer.ts - -// The reason for this is that we need a CommonJS-compiled -// version of this file to supply as a command line argument -// to extensionHostProcessSetup.ts; but we also need to include -// it ourselves cleanly in `lib/vscode/src/vs/server`. - -// @oxy: Could not figure out how to compile as a CommonJS module -// in the same tree as VSCode, which is why I came up with the solution -// of storing it in two places. - -// NOTE: copied over from lib/vscode/src/vs/common/uriIpc.ts -// remember to update this for proper type checks! - -interface UriParts { - scheme: string - authority?: string - path?: string -} - -interface IRawURITransformer { - transformIncoming(uri: UriParts): UriParts - transformOutgoing(uri: UriParts): UriParts - transformOutgoingScheme(scheme: string): string -} - -// Using `export =` is deliberate. -// See lib/vscode/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts; -// they include the file directly with a node require and expect a function as `module.exports`. -// `export =` in TypeScript is equivalent to `module.exports =` in vanilla JS. -export = function rawURITransformerFactory(authority: string) { - return new RawURITransformer(authority) -} - -class RawURITransformer implements IRawURITransformer { - constructor(private readonly authority: string) {} - - transformIncoming(uri: UriParts): UriParts { - switch (uri.scheme) { - case "vscode-remote": - return { scheme: "file", path: uri.path } - default: - return uri - } - } - - transformOutgoing(uri: UriParts): UriParts { - switch (uri.scheme) { - case "file": - return { scheme: "vscode-remote", authority: this.authority, path: uri.path } - default: - return uri - } - } - - transformOutgoingScheme(scheme: string): string { - switch (scheme) { - case "file": - return "vscode-remote" - default: - return scheme - } - } -} diff --git a/src/node/util.ts b/src/node/util.ts index ce92a3522535..4f3078a623f2 100644 --- a/src/node/util.ts +++ b/src/node/util.ts @@ -10,7 +10,7 @@ import * as path from "path" import safeCompare from "safe-compare" import * as util from "util" import xdgBasedir from "xdg-basedir" -import { getFirstString } from "../common/util" +import { vsRootPath } from "./constants" export interface Paths { data: string @@ -157,7 +157,7 @@ export const generatePassword = async (length = 24): Promise => { export const hash = async (password: string): Promise => { try { return await argon2.hash(password) - } catch (error) { + } catch (error: any) { logger.error(error) return "" } @@ -172,7 +172,7 @@ export const isHashMatch = async (password: string, hash: string) => { } try { return await argon2.verify(hash, password) - } catch (error) { + } catch (error: any) { throw new Error(error) } } @@ -439,55 +439,6 @@ export const isObject = (obj: T): obj is T => { return !Array.isArray(obj) && typeof obj === "object" && obj !== null } -/** - * Taken from vs/base/common/charCode.ts. Copied for now instead of importing so - * we don't have to set up a `vs` alias to be able to import with types (since - * the alternative is to directly import from `out`). - */ -enum CharCode { - Slash = 47, - A = 65, - Z = 90, - a = 97, - z = 122, - Colon = 58, -} - -/** - * Compute `fsPath` for the given uri. - * Taken from vs/base/common/uri.ts. It's not imported to avoid also importing - * everything that file imports. - */ -export function pathToFsPath(path: string, keepDriveLetterCasing = false): string { - const isWindows = process.platform === "win32" - const uri = { authority: undefined, path: getFirstString(path) || "", scheme: "file" } - let value: string - - if (uri.authority && uri.path.length > 1 && uri.scheme === "file") { - // unc path: file://shares/c$/far/boo - value = `//${uri.authority}${uri.path}` - } else if ( - uri.path.charCodeAt(0) === CharCode.Slash && - ((uri.path.charCodeAt(1) >= CharCode.A && uri.path.charCodeAt(1) <= CharCode.Z) || - (uri.path.charCodeAt(1) >= CharCode.a && uri.path.charCodeAt(1) <= CharCode.z)) && - uri.path.charCodeAt(2) === CharCode.Colon - ) { - if (!keepDriveLetterCasing) { - // windows drive letter: file:///c:/far/boo - value = uri.path[1].toLowerCase() + uri.path.substr(2) - } else { - value = uri.path.substr(1) - } - } else { - // other path - value = uri.path - } - if (isWindows) { - value = value.replace(/\//g, "\\") - } - return value -} - /** * Return a promise that resolves with whether the socket path is active. */ @@ -533,3 +484,23 @@ export function escapeHtml(unsafe: string): string { export function isNodeJSErrnoException(error: unknown): error is NodeJS.ErrnoException { return error instanceof Error && (error as NodeJS.ErrnoException).code !== undefined } + +// TODO: Replace with proper templating system. +export const escapeJSON = (value: cp.Serializable) => JSON.stringify(value).replace(/"/g, """) + +type AMDModule = { [exportName: string]: T } + +/** + * Loads AMD module, typically from a compiled VSCode bundle. + * + * @deprecated This should be gradually phased out as code-server migrates to lib/vscode + * @param amdPath Path to module relative to lib/vscode + * @param exportName Given name of export in the file + */ +export const loadAMDModule = async (amdPath: string, exportName: string): Promise => { + const module = await new Promise>((resolve, reject) => { + require(path.join(vsRootPath, "out/bootstrap-amd")).load(amdPath, resolve, reject) + }) + + return module[exportName] as T +} diff --git a/src/node/vscode.ts b/src/node/vscode.ts deleted file mode 100644 index 2c07f7ce20b7..000000000000 --- a/src/node/vscode.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { logger } from "@coder/logger" -import * as cp from "child_process" -import * as net from "net" -import * as path from "path" -import * as ipc from "../../typings/ipc" -import { arrayify, generateUuid } from "../common/util" -import { rootPath } from "./constants" -import { settings } from "./settings" -import { SocketProxyProvider } from "./socket" -import { isFile } from "./util" -import { onMessage, wrapper } from "./wrapper" - -export class VscodeProvider { - public readonly serverRootPath: string - public readonly vsRootPath: string - private _vscode?: Promise - private readonly socketProvider = new SocketProxyProvider() - - public constructor() { - this.vsRootPath = path.resolve(rootPath, "vendor/modules/code-oss-dev") - this.serverRootPath = path.join(this.vsRootPath, "out/vs/server") - wrapper.onDispose(() => this.dispose()) - } - - public async dispose(): Promise { - this.socketProvider.stop() - if (this._vscode) { - const vscode = await this._vscode - vscode.removeAllListeners() - vscode.kill() - this._vscode = undefined - } - } - - public async initialize( - options: Omit, - query: ipc.Query, - ): Promise { - const { lastVisited } = await settings.read() - let startPath = await this.getFirstPath([ - { url: query.workspace, workspace: true }, - { url: query.folder, workspace: false }, - options.args._ && options.args._.length > 0 - ? { url: path.resolve(options.args._[options.args._.length - 1]) } - : undefined, - !options.args["ignore-last-opened"] ? lastVisited : undefined, - ]) - - if (query.ew) { - startPath = undefined - } - - settings.write({ - lastVisited: startPath, - query, - }) - - const id = generateUuid() - const vscode = await this.fork() - - logger.debug("setting up vs code...") - - this.send( - { - type: "init", - id, - options: { - ...options, - startPath, - }, - }, - vscode, - ) - - const message = await onMessage( - vscode, - (message): message is ipc.OptionsMessage => { - // There can be parallel initializations so wait for the right ID. - return message.type === "options" && message.id === id - }, - ) - - return message.options - } - - private fork(): Promise { - if (this._vscode) { - return this._vscode - } - - logger.debug("forking vs code...") - const vscode = cp.fork(path.join(this.serverRootPath, "fork")) - - const dispose = () => { - vscode.removeAllListeners() - vscode.kill() - this._vscode = undefined - } - - vscode.on("error", (error: Error) => { - logger.error(error.message) - if (error.stack) { - logger.debug(error.stack) - } - dispose() - }) - - vscode.on("exit", (code) => { - logger.error(`VS Code exited unexpectedly with code ${code}`) - dispose() - }) - - this._vscode = onMessage(vscode, (message): message is ipc.ReadyMessage => { - return message.type === "ready" - }).then(() => vscode) - - return this._vscode - } - - /** - * VS Code expects a raw socket. It will handle all the web socket frames. - */ - public async sendWebsocket(socket: net.Socket, query: ipc.Query, permessageDeflate: boolean): Promise { - const vscode = await this._vscode - // TLS sockets cannot be transferred to child processes so we need an - // in-between. Non-TLS sockets will be returned as-is. - const socketProxy = await this.socketProvider.createProxy(socket) - this.send({ type: "socket", query, permessageDeflate }, vscode, socketProxy) - } - - private send(message: ipc.CodeServerMessage, vscode?: cp.ChildProcess, socket?: net.Socket): void { - if (!vscode || vscode.killed) { - throw new Error("vscode is not running") - } - vscode.send(message, socket) - } - - /** - * Choose the first non-empty path from the provided array. - * - * Each array item consists of `url` and an optional `workspace` boolean that - * indicates whether that url is for a workspace. - * - * `url` can be a fully qualified URL or just the path portion. - * - * `url` can also be a query object to make it easier to pass in query - * variables directly but anything that isn't a string or string array is not - * valid and will be ignored. - */ - private async getFirstPath( - startPaths: Array<{ url?: string | string[] | ipc.Query | ipc.Query[]; workspace?: boolean } | undefined>, - ): Promise { - for (let i = 0; i < startPaths.length; ++i) { - const startPath = startPaths[i] - const url = arrayify(startPath && startPath.url).find((p) => !!p) - if (startPath && url && typeof url === "string") { - return { - url, - // The only time `workspace` is undefined is for the command-line - // argument, in which case it's a path (not a URL) so we can stat it - // without having to parse it. - workspace: typeof startPath.workspace !== "undefined" ? startPath.workspace : await isFile(url), - } - } - } - return undefined - } -} diff --git a/src/node/wrapper.ts b/src/node/wrapper.ts index 68eacbbcadc3..8e8d9ccabab2 100644 --- a/src/node/wrapper.ts +++ b/src/node/wrapper.ts @@ -267,7 +267,7 @@ export class ParentProcess extends Process { try { this.started = this._start() await this.started - } catch (error) { + } catch (error: any) { this.logger.error(error.message) this.exit(typeof error.code === "number" ? error.code : 1) } diff --git a/test/package.json b/test/package.json index 1a7f46655f5e..fffc28e8ecf8 100644 --- a/test/package.json +++ b/test/package.json @@ -4,7 +4,7 @@ "devDependencies": { "@playwright/test": "^1.12.1", "@types/jest": "^26.0.20", - "@types/jsdom": "^16.2.6", + "@types/jsdom": "^16.2.13", "@types/node-fetch": "^2.5.8", "@types/supertest": "^2.0.10", "@types/wtfnode": "^0.7.0", diff --git a/test/unit/browser/pages/login.test.ts b/test/unit/browser/pages/login.test.ts index 92d4d1176c5e..cfef3c1ce023 100644 --- a/test/unit/browser/pages/login.test.ts +++ b/test/unit/browser/pages/login.test.ts @@ -24,10 +24,8 @@ describe("login", () => { const spy = jest.spyOn(document, "getElementById") // Create a fake element and set the attribute const mockElement = document.createElement("input") - mockElement.setAttribute("id", "base") const expected = { base: "./hello-world", - csStaticBase: "./static/development/Users/jp/Dev/code-server", logLevel: 2, disableTelemetry: false, disableUpdateCheck: false, @@ -35,11 +33,6 @@ describe("login", () => { mockElement.setAttribute("data-settings", JSON.stringify(expected)) document.body.appendChild(mockElement) spy.mockImplementation(() => mockElement) - // Load file - require("../../../../src/browser/pages/login") - - const el: HTMLInputElement | null = document.querySelector("input#base") - expect(el?.value).toBe("/hello-world") }) }) describe("there is not an element with id 'base'", () => { @@ -76,15 +69,5 @@ describe("login", () => { afterAll(() => { jest.restoreAllMocks() }) - - it("should do nothing", () => { - spy.mockImplementation(() => null) - // Load file - require("../../../../src/browser/pages/login") - - // It's called once by getOptions in the top of the file - // and then another to get the base element - expect(spy).toHaveBeenCalledTimes(2) - }) }) }) diff --git a/test/unit/browser/pages/vscode.test.ts b/test/unit/browser/pages/vscode.test.ts deleted file mode 100644 index 52c1d89c3618..000000000000 --- a/test/unit/browser/pages/vscode.test.ts +++ /dev/null @@ -1,400 +0,0 @@ -/** - * @jest-environment jsdom - */ -import fetchMock from "jest-fetch-mock" -import { JSDOM } from "jsdom" -import { - getNlsConfiguration, - nlsConfigElementId, - getConfigurationForLoader, - setBodyBackgroundToThemeBackgroundColor, - _createScriptURL, - main, - createBundlePath, -} from "../../../../src/browser/pages/vscode" - -describe("vscode", () => { - describe("getNlsConfiguration", () => { - let _document: Document - - beforeEach(() => { - // We use underscores to not confuse with global values - const { window: _window } = new JSDOM() - _document = _window.document - fetchMock.enableMocks() - }) - - afterEach(() => { - fetchMock.resetMocks() - }) - - it("should throw an error if no nlsConfigElement", () => { - const errorMsgPrefix = "[vscode]" - const errorMessage = `${errorMsgPrefix} Could not parse NLS configuration. Could not find nlsConfigElement with id: ${nlsConfigElementId}` - - expect(() => { - getNlsConfiguration(_document, "") - }).toThrowError(errorMessage) - }) - it("should throw an error if no nlsConfig", () => { - const mockElement = _document.createElement("div") - mockElement.setAttribute("id", nlsConfigElementId) - _document.body.appendChild(mockElement) - - const errorMsgPrefix = "[vscode]" - const errorMessage = `${errorMsgPrefix} Could not parse NLS configuration. Found nlsConfigElement but missing data-settings attribute.` - - expect(() => { - getNlsConfiguration(_document, "") - }).toThrowError(errorMessage) - - _document.body.removeChild(mockElement) - }) - it("should return the correct configuration", () => { - const mockElement = _document.createElement("div") - const dataSettings = { - first: "Jane", - last: "Doe", - } - - mockElement.setAttribute("id", nlsConfigElementId) - mockElement.setAttribute("data-settings", JSON.stringify(dataSettings)) - _document.body.appendChild(mockElement) - const actual = getNlsConfiguration(_document, "") - - expect(actual).toStrictEqual(dataSettings) - - _document.body.removeChild(mockElement) - }) - it("should return and have a loadBundle property if _resolvedLangaugePackCoreLocation", async () => { - const mockElement = _document.createElement("div") - const dataSettings = { - locale: "en", - availableLanguages: ["en", "de"], - _resolvedLanguagePackCoreLocation: "./", - } - - mockElement.setAttribute("id", nlsConfigElementId) - mockElement.setAttribute("data-settings", JSON.stringify(dataSettings)) - _document.body.appendChild(mockElement) - const nlsConfig = getNlsConfiguration(_document, "") - - expect(nlsConfig._resolvedLanguagePackCoreLocation).not.toBe(undefined) - expect(nlsConfig.loadBundle).not.toBe(undefined) - - const mockCallbackFn = jest.fn((_, bundle) => { - return bundle - }) - - fetchMock.mockOnce(JSON.stringify({ key: "hello world" })) - // Ensure that load bundle works as expected - // by mocking the fetch response and checking that the callback - // had the expected value - await nlsConfig.loadBundle("hello", "en", mockCallbackFn) - expect(mockCallbackFn).toHaveBeenCalledTimes(1) - expect(mockCallbackFn).toHaveBeenCalledWith(undefined, { key: "hello world" }) - - // Call it again to ensure it loads from the cache - // it should return the same value - await nlsConfig.loadBundle("hello", "en", mockCallbackFn) - expect(mockCallbackFn).toHaveBeenCalledTimes(2) - expect(mockCallbackFn).toHaveBeenCalledWith(undefined, { key: "hello world" }) - - fetchMock.mockReject(new Error("fake error message")) - const mockCallbackFn2 = jest.fn((error) => error) - // Call it for a different bundle and mock a failed fetch call - // to ensure we get the expected error - const error = await nlsConfig.loadBundle("goodbye", "es", mockCallbackFn2) - expect(error.message).toEqual("fake error message") - - // Clean up - _document.body.removeChild(mockElement) - }) - }) - describe("createBundlePath", () => { - it("should return the correct path", () => { - const _resolvedLangaugePackCoreLocation = "./languages" - const bundle = "/bundle.js" - const expected = "./languages/!bundle.js.nls.json" - const actual = createBundlePath(_resolvedLangaugePackCoreLocation, bundle) - expect(actual).toBe(expected) - }) - it("should return the correct path (even if _resolvedLangaugePackCoreLocation is undefined)", () => { - const _resolvedLangaugePackCoreLocation = undefined - const bundle = "/bundle.js" - const expected = "/!bundle.js.nls.json" - const actual = createBundlePath(_resolvedLangaugePackCoreLocation, bundle) - expect(actual).toBe(expected) - }) - }) - describe("setBodyBackgroundToThemeBackgroundColor", () => { - let _document: Document - let _localStorage: Storage - - beforeEach(() => { - // We need to set the url in the JSDOM constructor - // to prevent this error "SecurityError: localStorage is not available for opaque origins" - // See: https://github.com/jsdom/jsdom/issues/2304#issuecomment-622314949 - const { window: _window } = new JSDOM("", { url: "http://localhost/" }) - _document = _window.document - _localStorage = _window.localStorage - }) - it("should return null", () => { - const test = { - colorMap: { - [`editor.background`]: "#ff3270", - }, - } - _localStorage.setItem("colorThemeData", JSON.stringify(test)) - - expect(setBodyBackgroundToThemeBackgroundColor(_document, _localStorage)).toBeNull() - - _localStorage.removeItem("colorThemeData") - }) - it("should throw an error if it can't find colorThemeData in localStorage", () => { - const errorMsgPrefix = "[vscode]" - const errorMessage = `${errorMsgPrefix} Could not set body background to theme background color. Could not find colorThemeData in localStorage.` - - expect(() => { - setBodyBackgroundToThemeBackgroundColor(_document, _localStorage) - }).toThrowError(errorMessage) - }) - it("should throw an error if there is an error parsing colorThemeData from localStorage", () => { - const errorMsgPrefix = "[vscode]" - const errorMessage = `${errorMsgPrefix} Could not set body background to theme background color. Could not parse colorThemeData from localStorage.` - - _localStorage.setItem( - "colorThemeData", - '{"id":"vs-dark max-SS-Cyberpunk-themes-cyberpunk-umbra-color-theme-json","label":"Activate UMBRA protocol","settingsId":"Activate "errorForeground":"#ff3270","foreground":"#ffffff","sideBarTitle.foreground":"#bbbbbb"},"watch\\":::false}', - ) - - expect(() => { - setBodyBackgroundToThemeBackgroundColor(_document, _localStorage) - }).toThrowError(errorMessage) - - localStorage.removeItem("colorThemeData") - }) - it("should throw an error if there is no colorMap property", () => { - const errorMsgPrefix = "[vscode]" - const errorMessage = `${errorMsgPrefix} Could not set body background to theme background color. colorThemeData is missing colorMap.` - - const test = { - id: "hey-joe", - } - _localStorage.setItem("colorThemeData", JSON.stringify(test)) - - expect(() => { - setBodyBackgroundToThemeBackgroundColor(_document, _localStorage) - }).toThrowError(errorMessage) - - _localStorage.removeItem("colorThemeData") - }) - it("should throw an error if there is no editor.background color", () => { - const errorMsgPrefix = "[vscode]" - const errorMessage = `${errorMsgPrefix} Could not set body background to theme background color. colorThemeData.colorMap["editor.background"] is undefined.` - - const test = { - id: "hey-joe", - colorMap: { - editor: "#fff", - }, - } - _localStorage.setItem("colorThemeData", JSON.stringify(test)) - - expect(() => { - setBodyBackgroundToThemeBackgroundColor(_document, _localStorage) - }).toThrowError(errorMessage) - - _localStorage.removeItem("colorThemeData") - }) - it("should set the body background to the editor background color", () => { - const test = { - colorMap: { - [`editor.background`]: "#ff3270", - }, - } - _localStorage.setItem("colorThemeData", JSON.stringify(test)) - - setBodyBackgroundToThemeBackgroundColor(_document, _localStorage) - - // When the body.style.backgroundColor is set using hex - // it is converted to rgb - // which is why we use that in the assertion - expect(_document.body.style.backgroundColor).toBe("rgb(255, 50, 112)") - - _localStorage.removeItem("colorThemeData") - }) - }) - describe("getConfigurationForLoader", () => { - let _window: Window - - beforeEach(() => { - const { window: __window } = new JSDOM() - // @ts-expect-error the Window from JSDOM is not exactly the same as Window - // so we expect an error here - _window = __window - }) - it("should return a loader object (with undefined trustedTypesPolicy)", () => { - const options = { - base: ".", - csStaticBase: "/", - logLevel: 1, - } - const nlsConfig = { - first: "Jane", - last: "Doe", - locale: "en", - availableLanguages: {}, - } - const loader = getConfigurationForLoader({ - options, - _window, - nlsConfig: nlsConfig, - }) - - expect(loader).toStrictEqual({ - baseUrl: "http://localhost//vendor/modules/code-oss-dev/out", - paths: { - "iconv-lite-umd": "../node_modules/iconv-lite-umd/lib/iconv-lite-umd.js", - jschardet: "../node_modules/jschardet/dist/jschardet.min.js", - "tas-client-umd": "../node_modules/tas-client-umd/lib/tas-client-umd.js", - "vscode-oniguruma": "../node_modules/vscode-oniguruma/release/main", - "vscode-textmate": "../node_modules/vscode-textmate/release/main", - xterm: "../node_modules/xterm/lib/xterm.js", - "xterm-addon-search": "../node_modules/xterm-addon-search/lib/xterm-addon-search.js", - "xterm-addon-unicode11": "../node_modules/xterm-addon-unicode11/lib/xterm-addon-unicode11.js", - "xterm-addon-webgl": "../node_modules/xterm-addon-webgl/lib/xterm-addon-webgl.js", - }, - recordStats: true, - - trustedTypesPolicy: undefined, - "vs/nls": { - availableLanguages: {}, - first: "Jane", - last: "Doe", - locale: "en", - }, - }) - }) - it("should return a loader object with trustedTypesPolicy", () => { - interface PolicyOptions { - createScriptUrl: (url: string) => string - } - - function mockCreatePolicy(policyName: string, options: PolicyOptions) { - return { - name: policyName, - ...options, - } - } - - const mockFn = jest.fn(mockCreatePolicy) - - // @ts-expect-error we are adding a custom property to window - _window.trustedTypes = { - createPolicy: mockFn, - } - - const options = { - base: "/", - csStaticBase: "/", - logLevel: 1, - } - const nlsConfig = { - first: "Jane", - last: "Doe", - locale: "en", - availableLanguages: {}, - } - const loader = getConfigurationForLoader({ - options, - _window, - nlsConfig: nlsConfig, - }) - - expect(loader.trustedTypesPolicy).not.toBe(undefined) - expect(loader.trustedTypesPolicy.name).toBe("amdLoader") - - // Check that we can actually create a script URL - // using the createScriptURL on the loader object - const scriptUrl = loader.trustedTypesPolicy.createScriptURL("http://localhost/foo.js") - expect(scriptUrl).toBe("http://localhost/foo.js") - }) - }) - describe("_createScriptURL", () => { - it("should return the correct url", () => { - const url = _createScriptURL("localhost/foo/bar.js", "localhost") - - expect(url).toBe("localhost/foo/bar.js") - }) - it("should throw if the value doesn't start with the origin", () => { - expect(() => { - _createScriptURL("localhost/foo/bar.js", "coder.com") - }).toThrow("Invalid script url: localhost/foo/bar.js") - }) - }) - describe("main", () => { - let _window: Window - let _document: Document - let _localStorage: Storage - - beforeEach(() => { - // We need to set the url in the JSDOM constructor - // to prevent this error "SecurityError: localStorage is not available for opaque origins" - // See: https://github.com/jsdom/jsdom/issues/2304#issuecomment-62231494 - const { window: __window } = new JSDOM("", { url: "http://localhost/" }) - // @ts-expect-error the Window from JSDOM is not exactly the same as Window - // so we expect an error here - _window = __window - _document = __window.document - _localStorage = __window.localStorage - - const mockElement = _document.createElement("div") - const dataSettings = { - first: "Jane", - last: "Doe", - } - - mockElement.setAttribute("id", nlsConfigElementId) - mockElement.setAttribute("data-settings", JSON.stringify(dataSettings)) - _document.body.appendChild(mockElement) - - const test = { - colorMap: { - [`editor.background`]: "#ff3270", - }, - } - _localStorage.setItem("colorThemeData", JSON.stringify(test)) - }) - afterEach(() => { - _localStorage.removeItem("colorThemeData") - }) - it("should throw if document is missing", () => { - expect(() => { - main(undefined, _window, _localStorage) - }).toThrow("document is undefined.") - }) - it("should throw if window is missing", () => { - expect(() => { - main(_document, undefined, _localStorage) - }).toThrow("window is undefined.") - }) - it("should throw if localStorage is missing", () => { - expect(() => { - main(_document, _window, undefined) - }).toThrow("localStorage is undefined.") - }) - it("should add loader to self.require", () => { - main(_document, _window, _localStorage) - - expect(Object.prototype.hasOwnProperty.call(self, "require")).toBe(true) - }) - it("should not throw in browser context", () => { - // Assuming we call it in a normal browser context - // where everything is defined - expect(() => { - main(_document, _window, _localStorage) - }).not.toThrow() - }) - }) -}) diff --git a/test/unit/browser/register.test.ts b/test/unit/browser/register.test.ts deleted file mode 100644 index 1c213196602c..000000000000 --- a/test/unit/browser/register.test.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { JSDOM } from "jsdom" -import { registerServiceWorker } from "../../../src/browser/register" -import { createLoggerMock } from "../../utils/helpers" -import { LocationLike } from "../common/util.test" - -describe("register", () => { - describe("when navigator and serviceWorker are defined", () => { - const mockRegisterFn = jest.fn() - - beforeAll(() => { - const { window } = new JSDOM() - global.window = window as unknown as Window & typeof globalThis - global.document = window.document - global.navigator = window.navigator - global.location = window.location - - Object.defineProperty(global.navigator, "serviceWorker", { - value: { - register: mockRegisterFn, - }, - }) - }) - - const loggerModule = createLoggerMock() - beforeEach(() => { - jest.clearAllMocks() - jest.mock("@coder/logger", () => loggerModule) - }) - - afterEach(() => { - jest.resetModules() - }) - - afterAll(() => { - jest.restoreAllMocks() - - // We don't want these to stay around because it can affect other tests - global.window = undefined as unknown as Window & typeof globalThis - global.document = undefined as unknown as Document & typeof globalThis - global.navigator = undefined as unknown as Navigator & typeof globalThis - global.location = undefined as unknown as Location & typeof globalThis - }) - - it("test should have access to browser globals from beforeAll", () => { - expect(typeof global.window).not.toBeFalsy() - expect(typeof global.document).not.toBeFalsy() - expect(typeof global.navigator).not.toBeFalsy() - expect(typeof global.location).not.toBeFalsy() - }) - - it("should register a ServiceWorker", () => { - // Load service worker like you would in the browser - require("../../../src/browser/register") - expect(mockRegisterFn).toHaveBeenCalled() - expect(mockRegisterFn).toHaveBeenCalledTimes(1) - }) - - it("should log an error if something doesn't work", () => { - const message = "Can't find browser" - const error = new Error(message) - - mockRegisterFn.mockImplementation(() => { - throw error - }) - - // Load service worker like you would in the browser - require("../../../src/browser/register") - - expect(mockRegisterFn).toHaveBeenCalled() - expect(loggerModule.logger.error).toHaveBeenCalled() - expect(loggerModule.logger.error).toHaveBeenCalledTimes(1) - expect(loggerModule.logger.error).toHaveBeenCalledWith( - `[Service Worker] registration: ${error.message} ${error.stack}`, - ) - }) - }) - - describe("when navigator and serviceWorker are NOT defined", () => { - const loggerModule = createLoggerMock() - beforeEach(() => { - jest.clearAllMocks() - jest.mock("@coder/logger", () => loggerModule) - }) - - afterAll(() => { - jest.restoreAllMocks() - }) - - it("should log an error", () => { - // Load service worker like you would in the browser - require("../../../src/browser/register") - expect(loggerModule.logger.error).toHaveBeenCalled() - expect(loggerModule.logger.error).toHaveBeenCalledTimes(1) - expect(loggerModule.logger.error).toHaveBeenCalledWith("[Service Worker] navigator is undefined") - }) - }) - - describe("registerServiceWorker", () => { - let serviceWorkerPath: string - let serviceWorkerScope: string - const mockFn = jest.fn((path: string, options: { scope: string }) => { - serviceWorkerPath = path - serviceWorkerScope = options.scope - return undefined - }) - - beforeAll(() => { - const location: LocationLike = { - pathname: "", - origin: "http://localhost:8080/", - } - const { window } = new JSDOM() - global.window = window as unknown as Window & typeof globalThis - global.document = window.document - global.navigator = window.navigator - global.location = location as Location - - Object.defineProperty(global.navigator, "serviceWorker", { - value: { - register: mockFn, - }, - }) - }) - - afterEach(() => { - mockFn.mockClear() - jest.resetModules() - }) - - afterAll(() => { - jest.restoreAllMocks() - - // We don't want these to stay around because it can affect other tests - global.window = undefined as unknown as Window & typeof globalThis - global.document = undefined as unknown as Document & typeof globalThis - global.navigator = undefined as unknown as Navigator & typeof globalThis - global.location = undefined as unknown as Location & typeof globalThis - }) - it("should register when options.base is undefined", async () => { - // Mock getElementById - const csStaticBasePath = "/static/development/Users/jp/Dev/code-server" - const spy = jest.spyOn(document, "getElementById") - // Create a fake element and set the attribute - const mockElement = document.createElement("div") - mockElement.id = "coder-options" - mockElement.setAttribute( - "data-settings", - `{"csStaticBase":"${csStaticBasePath}","logLevel":2,"disableUpdateCheck":false}`, - ) - // Return mockElement from the spy - // this way, when we call "getElementById" - // it returns the element - spy.mockImplementation(() => mockElement) - - await registerServiceWorker() - - expect(mockFn).toBeCalled() - expect(serviceWorkerPath).toMatch(`${csStaticBasePath}/out/browser/serviceWorker.js`) - expect(serviceWorkerScope).toMatch("/") - }) - it("should register when options.base is defined", async () => { - const csStaticBasePath = "/static/development/Users/jp/Dev/code-server" - const spy = jest.spyOn(document, "getElementById") - // Create a fake element and set the attribute - const mockElement = document.createElement("div") - mockElement.id = "coder-options" - mockElement.setAttribute( - "data-settings", - `{"base":"proxy/","csStaticBase":"${csStaticBasePath}","logLevel":2,"disableUpdateCheck":false}`, - ) - // Return mockElement from the spy - // this way, when we call "getElementById" - // it returns the element - spy.mockImplementation(() => mockElement) - - await registerServiceWorker() - - expect(mockFn).toBeCalled() - expect(serviceWorkerPath).toMatch(`/out/browser/serviceWorker.js`) - expect(serviceWorkerScope).toMatch("/") - }) - }) -}) diff --git a/test/unit/browser/serviceWorker.test.ts b/test/unit/browser/serviceWorker.test.ts deleted file mode 100644 index 8f41173b8173..000000000000 --- a/test/unit/browser/serviceWorker.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -interface MockEvent { - claim: jest.Mock - waitUntil?: jest.Mock -} - -interface Listener { - event: string - cb: (event?: MockEvent) => void -} - -describe("serviceWorker", () => { - let listeners: Listener[] = [] - let spy: jest.SpyInstance - let claimSpy: jest.Mock - let waitUntilSpy: jest.Mock - - function emit(event: string) { - listeners - .filter((listener) => listener.event === event) - .forEach((listener) => { - switch (event) { - case "activate": - listener.cb({ - claim: jest.fn(), - waitUntil: jest.fn(() => waitUntilSpy()), - }) - break - default: - listener.cb() - } - }) - } - - beforeEach(() => { - claimSpy = jest.fn() - spy = jest.spyOn(console, "log") - waitUntilSpy = jest.fn() - - Object.assign(global, { - self: global, - addEventListener: (event: string, cb: () => void) => { - listeners.push({ event, cb }) - }, - clients: { - claim: claimSpy.mockResolvedValue("claimed"), - }, - }) - }) - - afterEach(() => { - jest.restoreAllMocks() - jest.resetModules() - spy.mockClear() - claimSpy.mockClear() - - // Clear all the listeners - listeners = [] - }) - - it("should add 3 listeners: install, activate and fetch", () => { - require("../../../src/browser/serviceWorker.ts") - const listenerEventNames = listeners.map((listener) => listener.event) - - expect(listeners).toHaveLength(3) - expect(listenerEventNames).toContain("install") - expect(listenerEventNames).toContain("activate") - expect(listenerEventNames).toContain("fetch") - }) - - it("should call the proper callbacks for 'install'", async () => { - require("../../../src/browser/serviceWorker.ts") - emit("install") - expect(spy).toHaveBeenCalledWith("[Service Worker] installed") - expect(spy).toHaveBeenCalledTimes(1) - }) - - it("should do nothing when 'fetch' is called", async () => { - require("../../../src/browser/serviceWorker.ts") - emit("fetch") - expect(spy).not.toHaveBeenCalled() - }) - - it("should call the proper callbacks for 'activate'", async () => { - require("../../../src/browser/serviceWorker.ts") - emit("activate") - - // Activate serviceWorker - expect(spy).toHaveBeenCalledWith("[Service Worker] activated") - expect(waitUntilSpy).toHaveBeenCalled() - expect(claimSpy).toHaveBeenCalled() - }) -}) diff --git a/test/unit/common/util.test.ts b/test/unit/common/util.test.ts index 85422aa84629..4cf76cffcb23 100644 --- a/test/unit/common/util.test.ts +++ b/test/unit/common/util.test.ts @@ -131,7 +131,7 @@ describe("util", () => { }) it("should return options with base and cssStaticBase even if it doesn't exist", () => { - expect(util.getOptions()).toStrictEqual({ + expect(util.getClientConfiguration()).toStrictEqual({ base: "", csStaticBase: "", }) @@ -151,7 +151,7 @@ describe("util", () => { // it returns the element spy.mockImplementation(() => mockElement) - expect(util.getOptions()).toStrictEqual({ + expect(util.getClientConfiguration()).toStrictEqual({ base: "", csStaticBase: "/static/development/Users/jp/Dev/code-server", disableUpdateCheck: false, @@ -167,7 +167,7 @@ describe("util", () => { // spreads the original options // then parses the queryOpts location.search = '?options={"logLevel":2}' - expect(util.getOptions()).toStrictEqual({ + expect(util.getClientConfiguration()).toStrictEqual({ base: "", csStaticBase: "", logLevel: 2, @@ -194,20 +194,6 @@ describe("util", () => { }) }) - describe("getFirstString", () => { - it("should return the string if passed a string", () => { - expect(util.getFirstString("Hello world!")).toBe("Hello world!") - }) - - it("should get the first string from an array", () => { - expect(util.getFirstString(["Hello", "World"])).toBe("Hello") - }) - - it("should return undefined if the value isn't an array or a string", () => { - expect(util.getFirstString({ name: "Coder" })).toBe(undefined) - }) - }) - describe("logError", () => { afterEach(() => { jest.clearAllMocks() diff --git a/test/unit/node/app.test.ts b/test/unit/node/app.test.ts index d3fccc3caeef..89626882be73 100644 --- a/test/unit/node/app.test.ts +++ b/test/unit/node/app.test.ts @@ -122,26 +122,6 @@ describe("createApp", () => { expect(unlinkSpy).toHaveBeenCalledTimes(1) server.close() }) - it("should catch errors thrown when unlinking a socket", async () => { - const tmpDir2 = await tmpdir("unlink-socket-error") - const tmpFile = path.join(tmpDir2, "unlink-socket-file") - // await promises.writeFile(tmpFile, "") - const socketPath = tmpFile - const defaultArgs = await setDefaults({ - _: [], - socket: socketPath, - }) - - const app = await createApp(defaultArgs) - const server = app[2] - - expect(spy).toHaveBeenCalledTimes(1) - expect(spy).toHaveBeenCalledWith(`ENOENT: no such file or directory, unlink '${socketPath}'`) - - server.close() - // Ensure directory was removed - rmdirSync(tmpDir2, { recursive: true }) - }) it("should create an https server if args.cert exists", async () => { const testCertificate = await generateCertificate("localhost") diff --git a/test/unit/node/routes/static.test.ts b/test/unit/node/routes/static.test.ts index cca66ffcb4d8..3856e0f654bc 100644 --- a/test/unit/node/routes/static.test.ts +++ b/test/unit/node/routes/static.test.ts @@ -1,10 +1,16 @@ import { promises as fs } from "fs" import * as path from "path" +import { rootPath } from "../../../../src/node/constants" import { tmpdir } from "../../../utils/helpers" import * as httpserver from "../../../utils/httpserver" import * as integration from "../../../utils/integration" -describe("/static", () => { +const NOT_FOUND = { + code: 404, + message: "not found", +} + +describe("/_static", () => { let _codeServer: httpserver.HttpServer | undefined function codeServer(): httpserver.HttpServer { if (!_codeServer) { @@ -17,14 +23,8 @@ describe("/static", () => { let testFileContent: string | undefined let nonExistentTestFile: string | undefined - // The static endpoint expects a commit and then the full path of the file. - // The commit is just for cache busting so we can use anything we want. `-` - // and `development` are specially recognized in that they will cause the - // static endpoint to avoid sending cache headers. - const commit = "-" - beforeAll(async () => { - const testDir = await tmpdir("static") + const testDir = await tmpdir("_static") testFile = path.join(testDir, "test") testFileContent = "static file contents" nonExistentTestFile = path.join(testDir, "i-am-not-here") @@ -39,20 +39,12 @@ describe("/static", () => { }) function commonTests() { - it("should return a 404 when a commit and file are not provided", async () => { - const resp = await codeServer().fetch("https://github.com/static") - expect(resp.status).toBe(404) - - const content = await resp.json() - expect(content).toStrictEqual({ error: "Not Found" }) - }) - it("should return a 404 when a file is not provided", async () => { - const resp = await codeServer().fetch(`/static/${commit}`) - expect(resp.status).toBe(404) + const resp = await codeServer().fetch(`/_static/`) + expect(resp.status).toBe(NOT_FOUND.code) const content = await resp.json() - expect(content).toStrictEqual({ error: "Not Found" }) + expect(content.error).toContain(NOT_FOUND.message) }) } @@ -64,73 +56,22 @@ describe("/static", () => { commonTests() it("should return a 404 for a nonexistent file", async () => { - const resp = await codeServer().fetch(`/static/${commit}/${nonExistentTestFile}`) - expect(resp.status).toBe(404) + const filePath = path.join("/_static/", nonExistentTestFile!) - const content = await resp.json() - expect(content.error).toMatch("ENOENT") + const resp = await codeServer().fetch(filePath) + expect(resp.status).toBe(NOT_FOUND.code) }) it("should return a 200 and file contents for an existent file", async () => { - const resp = await codeServer().fetch(`/static/${commit}${testFile}`) + const resp = await codeServer().fetch("https://github.com/_static/src/browser/robots.txt") expect(resp.status).toBe(200) - const content = await resp.text() - expect(content).toStrictEqual(testFileContent) - }) - }) - - describe("enabled authentication", () => { - // Store whatever might be in here so we can restore it afterward. - // TODO: We should probably pass this as an argument somehow instead of - // manipulating the environment. - const previousEnvPassword = process.env.PASSWORD - - beforeEach(async () => { - process.env.PASSWORD = "test" - _codeServer = await integration.setup(["--auth=password"], "") - }) + const localFilePath = path.join(rootPath, "src/browser/robots.txt") + const localFileContent = await fs.readFile(localFilePath, "utf8") - afterEach(() => { - process.env.PASSWORD = previousEnvPassword - }) - - commonTests() - - describe("inside code-server root", () => { - it("should return a 404 for a nonexistent file", async () => { - const resp = await codeServer().fetch(`/static/${commit}/${__filename}-does-not-exist`) - expect(resp.status).toBe(404) - - const content = await resp.json() - expect(content.error).toMatch("ENOENT") - }) - - it("should return a 200 and file contents for an existent file", async () => { - const resp = await codeServer().fetch(`/static/${commit}${__filename}`) - expect(resp.status).toBe(200) - - const content = await resp.text() - expect(content).toStrictEqual(await fs.readFile(__filename, "utf8")) - }) - }) - - describe("outside code-server root", () => { - it("should return a 401 for a nonexistent file", async () => { - const resp = await codeServer().fetch(`/static/${commit}/${nonExistentTestFile}`) - expect(resp.status).toBe(401) - - const content = await resp.json() - expect(content).toStrictEqual({ error: "Unauthorized" }) - }) - - it("should return a 401 for an existent file", async () => { - const resp = await codeServer().fetch(`/static/${commit}${testFile}`) - expect(resp.status).toBe(401) - - const content = await resp.json() - expect(content).toStrictEqual({ error: "Unauthorized" }) - }) + // console.log(localFileContent) + const content = await resp.text() + expect(content).toStrictEqual(localFileContent) }) }) }) diff --git a/test/unit/node/util.test.ts b/test/unit/node/util.test.ts index d7e6cf87ce06..717428983bb8 100644 --- a/test/unit/node/util.test.ts +++ b/test/unit/node/util.test.ts @@ -457,31 +457,6 @@ describe("escapeHtml", () => { }) }) -describe("pathToFsPath", () => { - it("should convert a path to a file system path", () => { - expect(util.pathToFsPath("/foo/bar/baz")).toBe("/foo/bar/baz") - }) - it("should lowercase drive letter casing by default", () => { - expect(util.pathToFsPath("/C:/far/boo")).toBe("c:/far/boo") - }) - it("should keep drive letter casing when set to true", () => { - expect(util.pathToFsPath("/C:/far/bo", true)).toBe("C:/far/bo") - }) - it("should replace / with \\ on Windows", () => { - const ORIGINAL_PLATFORM = process.platform - - Object.defineProperty(process, "platform", { - value: "win32", - }) - - expect(util.pathToFsPath("/C:/far/boo")).toBe("c:\\far\\boo") - - Object.defineProperty(process, "platform", { - value: ORIGINAL_PLATFORM, - }) - }) -}) - describe("isFile", () => { const testDir = path.join(tmpdir, "tests", "isFile") let pathToFile = "" diff --git a/test/yarn.lock b/test/yarn.lock index fb97b3806513..c975aeb310f5 100644 --- a/test/yarn.lock +++ b/test/yarn.lock @@ -1101,10 +1101,10 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/jsdom@^16.2.6": - version "16.2.6" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.6.tgz#9ddf0521e49be5365797e690c3ba63148e562c29" - integrity sha512-yQA+HxknGtW9AkRTNyiSH3OKW5V+WzO8OPTdne99XwJkYC+KYxfNIcoJjeiSqP3V00PUUpFP6Myoo9wdIu78DQ== +"@types/jsdom@^16.2.13": + version "16.2.13" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.13.tgz#126c8b7441b159d6234610a48de77b6066f1823f" + integrity sha512-8JQCjdeAidptSsOcRWk2iTm9wCcwn9l+kRG6k5bzUacrnm1ezV4forq0kWjUih/tumAeoG+OspOvQEbbRucBTw== dependencies: "@types/node" "*" "@types/parse5" "*" diff --git a/tsconfig.json b/tsconfig.json index 06ab8ced5ae8..e7eec93ee22c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,9 +15,14 @@ "sourceMap": true, "tsBuildInfoFile": "./.cache/tsbuildinfo", "incremental": true, - "typeRoots": ["./node_modules/@types", "./typings", "./test/node_modules/@types"], + "typeRoots": [ + "./node_modules/@types", + "./typings", + "./test/node_modules/@types", + "./vendor/modules/code-oss-dev/src/vs/server/@types" + ], "downlevelIteration": true }, - "include": ["./src/**/*.ts"], + "include": ["./src/**/*"], "exclude": ["/test", "/lib", "/ci", "/doc"] } diff --git a/typings/ipc.d.ts b/typings/ipc.d.ts deleted file mode 100644 index 60e9924fdfd3..000000000000 --- a/typings/ipc.d.ts +++ /dev/null @@ -1,137 +0,0 @@ -/** - * External interfaces for integration into code-server over IPC. - * This file exists in two locations: - * - typings/ipc.d.ts - * - lib/vscode/src/typings/ipc.d.ts - * The second is a symlink to the first. - */ -export interface Options { - authed: boolean - base: string - csStaticBase: string - disableUpdateCheck: boolean - logLevel: number -} - -export interface InitMessage { - type: "init" - id: string - options: VscodeOptions -} - -export type Query = { [key: string]: string | string[] | undefined | Query | Query[] } - -export interface SocketMessage { - type: "socket" - query: Query - permessageDeflate: boolean -} - -export interface CliMessage { - type: "cli" - args: Args -} - -export interface OpenCommandPipeArgs { - type: "open" - fileURIs?: string[] - folderURIs: string[] - forceNewWindow?: boolean - diffMode?: boolean - addMode?: boolean - gotoLineMode?: boolean - forceReuseWindow?: boolean - waitMarkerFilePath?: string -} - -export type CodeServerMessage = InitMessage | SocketMessage | CliMessage - -export interface ReadyMessage { - type: "ready" -} - -export interface OptionsMessage { - id: string - type: "options" - options: WorkbenchOptions -} - -export type VscodeMessage = ReadyMessage | OptionsMessage - -export interface StartPath { - url: string - workspace: boolean -} - -export interface Args { - "user-data-dir"?: string - - "enable-proposed-api"?: string[] - "extensions-dir"?: string - "builtin-extensions-dir"?: string - "extra-extensions-dir"?: string[] - "extra-builtin-extensions-dir"?: string[] - "ignore-last-opened"?: boolean - - locale?: string - - log?: string - verbose?: boolean - - _: string[] -} - -export interface VscodeOptions { - readonly args: Args - readonly remoteAuthority: string - readonly startPath?: StartPath -} - -export interface VscodeOptionsMessage extends VscodeOptions { - readonly id: string -} - -export interface UriComponents { - readonly scheme: string - readonly authority: string - readonly path: string - readonly query: string - readonly fragment: string -} - -export interface NLSConfiguration { - locale: string - availableLanguages: { - [key: string]: string - } - pseudo?: boolean - _languagePackSupport?: boolean -} - -export interface WorkbenchOptions { - readonly workbenchWebConfiguration: { - readonly remoteAuthority?: string - readonly folderUri?: UriComponents - readonly workspaceUri?: UriComponents - readonly logLevel?: number - readonly workspaceProvider?: { - payload: [["userDataPath", string], ["enableProposedApi", string]] - } - } - readonly remoteUserDataUri: UriComponents - readonly productConfiguration: { - codeServerVersion?: string - readonly extensionsGallery?: { - readonly serviceUrl: string - readonly itemUrl: string - readonly controlUrl: string - readonly recommendationsUrl: string - } - } - readonly nlsConfiguration: NLSConfiguration - readonly commit: string -} - -export interface WorkbenchOptionsMessage { - id: string -} diff --git a/vendor/package.json b/vendor/package.json index 22fe1709b706..2d9c7275daf9 100644 --- a/vendor/package.json +++ b/vendor/package.json @@ -7,6 +7,6 @@ "postinstall": "./postinstall.sh" }, "devDependencies": { - "code-oss-dev": "cdr/vscode#9cb5fb3759f46b10bc66e676fa7f44c51e84824b" + "code-oss-dev": "cdr/vscode#63718dfe9f975d6638d46c1548a5feb482c6dfa8" } } diff --git a/vendor/yarn.lock b/vendor/yarn.lock index d505c31d46d2..7e8afff38583 100644 --- a/vendor/yarn.lock +++ b/vendor/yarn.lock @@ -2,11 +2,6 @@ # yarn lockfile v1 -"@coder/logger@^1.1.16": - version "1.1.16" - resolved "https://registry.yarnpkg.com/@coder/logger/-/logger-1.1.16.tgz#ee5b1b188f680733f35c11b065bbd139d618c1e1" - integrity sha512-X6VB1++IkosYY6amRAiMvuvCf12NA4+ooX+gOuu5bJIkdjmh4Lz7QpJcWRdgxesvo1msriDDr9E/sDbIWf6vsQ== - "@electron/get@^1.0.1": version "1.13.0" resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.13.0.tgz#95c6bcaff4f9a505ea46792424f451efea89228c" @@ -150,7 +145,7 @@ agent-base@5: resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== -agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: +agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== @@ -197,13 +192,6 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -ast-types@^0.13.2: - version "0.13.4" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" - integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== - dependencies: - tslib "^2.0.1" - base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -260,11 +248,6 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - cacheable-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" @@ -313,17 +296,17 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -code-oss-dev@cdr/vscode#9cb5fb3759f46b10bc66e676fa7f44c51e84824b: - version "1.60.0" - resolved "https://codeload.github.com/cdr/vscode/tar.gz/9cb5fb3759f46b10bc66e676fa7f44c51e84824b" +code-oss-dev@cdr/vscode#63718dfe9f975d6638d46c1548a5feb482c6dfa8: + version "1.60.2" + resolved "https://codeload.github.com/cdr/vscode/tar.gz/63718dfe9f975d6638d46c1548a5feb482c6dfa8" dependencies: - "@coder/logger" "^1.1.16" "@microsoft/applicationinsights-web" "^2.6.4" "@vscode/sqlite3" "4.0.12" "@vscode/vscode-languagedetection" "1.0.20" applicationinsights "1.0.8" chokidar "3.5.1" graceful-fs "4.2.6" + handlebars "^4.7.7" http-proxy-agent "^2.1.0" https-proxy-agent "^2.2.3" iconv-lite-umd "0.6.8" @@ -333,8 +316,7 @@ code-oss-dev@cdr/vscode#9cb5fb3759f46b10bc66e676fa7f44c51e84824b: native-watchdog "1.3.0" node-pty "0.11.0-beta7" nsfw "2.1.2" - proxy-agent "^4.0.1" - proxy-from-env "^1.1.0" + path-to-regexp "^6.2.0" spdlog "^0.13.0" sudo-prompt "9.2.1" tar-stream "^2.2.0" @@ -457,11 +439,6 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - defer-to-connect@^1.0.1: version "1.1.3" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" @@ -474,25 +451,11 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -degenerator@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-2.2.0.tgz#49e98c11fa0293c5b26edfbb52f15729afcdb254" - integrity sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg== - dependencies: - ast-types "^0.13.2" - escodegen "^1.8.1" - esprima "^4.0.0" - delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -568,33 +531,6 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^1.8.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" @@ -610,11 +546,6 @@ extract-zip@^1.0.3: mkdirp "^0.5.4" yauzl "^2.10.0" -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -694,7 +625,7 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" -get-uri@3, get-uri@^3.0.2: +get-uri@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c" integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg== @@ -775,6 +706,18 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +handlebars@^4.7.7: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -785,17 +728,6 @@ http-cache-semantics@^4.0.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.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - 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" @@ -804,7 +736,7 @@ http-proxy-agent@^2.1.0: agent-base "4" debug "3.1.0" -http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: +http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== @@ -813,14 +745,6 @@ http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: agent-base "6" debug "4" -https-proxy-agent@5, https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - https-proxy-agent@^2.2.3: version "2.2.4" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" @@ -837,24 +761,25 @@ https-proxy-agent@^4.0.0: agent-base "5" debug "4" +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + iconv-lite-umd@0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/iconv-lite-umd/-/iconv-lite-umd-0.6.8.tgz#5ad310ec126b260621471a2d586f7f37b9958ec0" integrity sha512-zvXJ5gSwMC9JD3wDzH8CoZGc1pbiJn12Tqjk8BXYCnYz3hYL5GRjHW8LEykjXhV9WgNGI4rgpgHcbIiBfrRq6A== -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@^2.0.3, inherits@^2.0.4, 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== @@ -952,14 +877,6 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - lodash@^4.17.10: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -975,13 +892,6 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -1068,10 +978,10 @@ native-watchdog@1.3.0: resolved "https://registry.yarnpkg.com/native-watchdog/-/native-watchdog-1.3.0.tgz#88cee94c9dc766b85c8506eda14c8bd8c9618e27" integrity sha512-WOjGRNGkYZ5MXsntcvCYrKtSYMaewlbCFplbcUVo9bE80LPVt8TAVFHYWB8+a6fWCGYheq21+Wtt6CJrUaCJhw== -netmask@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" - integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== node-abi@^2.21.0: version "2.30.1" @@ -1154,46 +1064,15 @@ once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -pac-proxy-agent@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz#66883eeabadc915fc5e95457324cb0f0ac78defb" - integrity sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - get-uri "3" - http-proxy-agent "^4.0.1" - https-proxy-agent "5" - pac-resolver "^4.1.0" - raw-body "^2.2.0" - socks-proxy-agent "5" - -pac-resolver@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-4.2.0.tgz#b82bcb9992d48166920bc83c7542abb454bd9bdd" - integrity sha512-rPACZdUyuxT5Io/gFKUeeZFfE5T7ve7cAkE5TUZRRfuKP0u5Hocwe48X7ZEm6mYB+bTB0Qf+xlVlA/RM/i6RCQ== - dependencies: - degenerator "^2.2.0" - ip "^1.1.5" - netmask "^2.0.1" +path-to-regexp@^6.2.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== pend@~1.2.0: version "1.2.0" @@ -1229,11 +1108,6 @@ prebuild-install@^6.0.0: tar-fs "^2.0.0" tunnel-agent "^0.6.0" -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" @@ -1254,21 +1128,7 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= -proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-4.0.1.tgz#326c3250776c7044cd19655ccbfadf2e065a045c" - integrity sha512-ODnQnW2jc/FUVwHHuaZEfN5otg/fMbvMxz9nMSUQfJ9JU7q2SZvSULSsjLloVgJOiv9yhc8GlNMKc4GkFmcVEA== - dependencies: - agent-base "^6.0.0" - debug "4" - http-proxy-agent "^4.0.0" - https-proxy-agent "^5.0.0" - lru-cache "^5.1.1" - pac-proxy-agent "^4.1.0" - proxy-from-env "^1.0.0" - socks-proxy-agent "^5.0.0" - -proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: +proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -1281,16 +1141,6 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -raw-body@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" - integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== - dependencies: - bytes "3.1.0" - http-errors "1.7.3" - iconv-lite "0.4.24" - unpipe "1.0.0" - rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -1369,11 +1219,6 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -1408,11 +1253,6 @@ set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - signal-exit@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -1437,7 +1277,7 @@ smart-buffer@^4.1.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -socks-proxy-agent@5, socks-proxy-agent@^5.0.0: +socks-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== @@ -1454,7 +1294,7 @@ socks@^2.3.3: ip "^1.1.5" smart-buffer "^4.1.0" -source-map@~0.6.1: +source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -1473,11 +1313,6 @@ sprintf-js@^1.1.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -1583,16 +1418,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tslib@^2.0.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -1605,13 +1430,6 @@ tunnel@^0.0.6: resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - type-fest@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" @@ -1622,16 +1440,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +uglify-js@^3.1.4: + version "3.14.2" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.2.tgz#d7dd6a46ca57214f54a2d0a43cad0f35db82ac99" + integrity sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A== + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" @@ -1728,10 +1546,10 @@ windows-process-tree@0.3.0: dependencies: nan "^2.13.2" -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= wrappy@1: version "1.0.2" @@ -1778,11 +1596,6 @@ xterm@4.14.0-beta.22: resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.14.0-beta.22.tgz#89e1060927f6542645f53584bfcd35cec08abe5a" integrity sha512-zl4d2fmjAoCB+G0O5tq2kNkoe7dnnrcY2Daj6VFPPV6nItyXrgRzlKWNfTjKYunC3kU2ApYy+FnHulO7lWuXSw== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" diff --git a/yarn.lock b/yarn.lock index 7b07d7473573..1156343ec198 100644 --- a/yarn.lock +++ b/yarn.lock @@ -339,7 +339,7 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.1.tgz#a6ca6a9a0ff366af433f42f5f0e124794ff6b8f1" integrity sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA== -"@types/body-parser@*", "@types/body-parser@^1.19.0": +"@types/body-parser@*": version "1.19.1" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c" integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg== @@ -347,14 +347,6 @@ "@types/connect" "*" "@types/node" "*" -"@types/browserify@^12.0.36": - version "12.0.37" - resolved "https://registry.yarnpkg.com/@types/browserify/-/browserify-12.0.37.tgz#f08312f17b4a7411441cce3a45434a0ce81c4da3" - integrity sha512-rGVZQhqlBMdnU0Wcq/RDO6+I1tppM42SqVq5ZEXiw2ft/A55Ro+dz4aKTy28gniwOIxZhRFqb5N+qnbg7J040g== - dependencies: - "@types/insert-module-globals" "*" - "@types/node" "*" - "@types/compression@^1.7.0": version "1.7.1" resolved "https://registry.yarnpkg.com/@types/compression/-/compression-1.7.1.tgz#d935a1cd6f5cd9a4dc8b0d8aadf2ee91a2975acc" @@ -402,13 +394,6 @@ dependencies: "@types/node" "*" -"@types/insert-module-globals@*": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@types/insert-module-globals/-/insert-module-globals-7.0.1.tgz#234f9263f6b315088287e3597d7e98033804a031" - integrity sha512-qtSfo/jdYHO4jNO6QCp4CwR/TPrvR39Yan5K4nPU1iCmxcnTWiERKDXcvFGuXEmfpjrHeOCvrZPa0UrUsy+mvA== - dependencies: - "@types/node" "*" - "@types/js-yaml@^4.0.0": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.2.tgz#4117a7a378593a218e9d6f0ef44ce6d5d9edf7fa" @@ -505,20 +490,10 @@ dependencies: "@types/node" "*" -"@types/tar-fs@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/tar-fs/-/tar-fs-2.0.1.tgz#6391dcad1b03dea2d79fac07371585ab54472bb1" - integrity sha512-qlsQyIY9sN7p221xHuXKNoMfUenOcvEBN4zI8dGsYbYCqHtTarXOEXSIgUnK+GcR0fZDse6pAIc5pIrCh9NefQ== - dependencies: - "@types/node" "*" - "@types/tar-stream" "*" - -"@types/tar-stream@*", "@types/tar-stream@^2.1.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@types/tar-stream/-/tar-stream-2.2.1.tgz#7cb4516fe6d1a926a37b7733905c50885718e7ad" - integrity sha512-zhcfACZ4HavArMutfAB1/ApfSx44kNF2zyytU4mbO1dGCT/y9kL2IZwRDRyYYtBUxW6LRparZpLoX8i67b6IZw== - dependencies: - "@types/node" "*" +"@types/trusted-types@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" + integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": version "2.0.3" @@ -601,7 +576,7 @@ "@typescript-eslint/types" "4.28.5" eslint-visitor-keys "^2.0.0" -JSONStream@^1.0.3, JSONStream@^1.3.5: +JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -627,26 +602,12 @@ acorn-jsx@^5.3.1: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== -acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" - integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== - dependencies: - acorn "^7.0.0" - acorn-walk "^7.0.0" - xtend "^4.0.2" - -acorn-walk@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.0.0, acorn@^7.4.0: +acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -agent-base@6, agent-base@^6.0.0: +agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== @@ -784,24 +745,6 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -assert@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - ast-types@^0.13.2: version "0.13.4" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" @@ -839,11 +782,6 @@ autoprefixer@^9.8.6: postcss "^7.0.32" postcss-value-parser "^4.1.0" -available-typed-arrays@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz#9e0ae84ecff20caae6a94a1c3bc39b955649b7a9" - integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA== - bail@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" @@ -859,31 +797,7 @@ balanced-match@^2.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== -base64-js@^1.0.2, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -body-parser@1.19.0, body-parser@^1.19.0: +body-parser@1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -919,145 +833,6 @@ braces@^3.0.1: dependencies: fill-range "^7.0.1" -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browser-pack@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" - integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== - dependencies: - JSONStream "^1.0.3" - combine-source-map "~0.8.0" - defined "^1.0.0" - safe-buffer "^5.1.1" - through2 "^2.0.0" - umd "^3.0.0" - -browser-resolve@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" - integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== - dependencies: - resolve "^1.17.0" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserify@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/browserify/-/browserify-17.0.0.tgz#4c48fed6c02bfa2b51fd3b670fddb805723cdc22" - integrity sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w== - dependencies: - JSONStream "^1.0.3" - assert "^1.4.0" - browser-pack "^6.0.1" - browser-resolve "^2.0.0" - browserify-zlib "~0.2.0" - buffer "~5.2.1" - cached-path-relative "^1.0.0" - concat-stream "^1.6.0" - console-browserify "^1.1.0" - constants-browserify "~1.0.0" - crypto-browserify "^3.0.0" - defined "^1.0.0" - deps-sort "^2.0.1" - domain-browser "^1.2.0" - duplexer2 "~0.1.2" - events "^3.0.0" - glob "^7.1.0" - has "^1.0.0" - htmlescape "^1.1.0" - https-browserify "^1.0.0" - inherits "~2.0.1" - insert-module-globals "^7.2.1" - labeled-stream-splicer "^2.0.0" - mkdirp-classic "^0.5.2" - module-deps "^6.2.3" - os-browserify "~0.3.0" - parents "^1.0.1" - path-browserify "^1.0.0" - process "~0.11.0" - punycode "^1.3.2" - querystring-es3 "~0.2.0" - read-only-stream "^2.0.0" - readable-stream "^2.0.2" - resolve "^1.1.4" - shasum-object "^1.0.0" - shell-quote "^1.6.1" - stream-browserify "^3.0.0" - stream-http "^3.0.0" - string_decoder "^1.1.1" - subarg "^1.0.0" - syntax-error "^1.1.1" - through2 "^2.0.0" - timers-browserify "^1.0.1" - tty-browserify "0.0.1" - url "~0.11.0" - util "~0.12.0" - vm-browserify "^1.0.0" - xtend "^4.0.0" - browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.5: version "4.16.6" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" @@ -1092,32 +867,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@~5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" - integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -1128,11 +877,6 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" - integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -1207,24 +951,11 @@ charenc@0.0.2: resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -1291,16 +1022,6 @@ colorette@^1.2.1, colorette@^1.2.2: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== -combine-source-map@^0.8.0, combine-source-map@~0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" - integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos= - dependencies: - convert-source-map "~1.1.0" - inline-source-map "~0.6.0" - lodash.memoize "~3.0.3" - source-map "~0.5.3" - compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -1326,31 +1047,11 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -constants-browserify@~1.0.0: - version "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.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -1370,11 +1071,6 @@ convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" -convert-source-map@~1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" - integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= - cookie-parser@^1.4.5: version "1.4.5" resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.5.tgz#3e572d4b7c0c80f9c61daf604e4336831b5d1d49" @@ -1409,37 +1105,6 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -1459,33 +1124,11 @@ crypt@0.0.2: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= -crypto-browserify@^3.0.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -dash-ast@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" - integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== - data-uri-to-buffer@3: version "3.0.1" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" @@ -1532,11 +1175,16 @@ decamelize@^1.1.0, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -1544,11 +1192,6 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - degenerator@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-3.0.1.tgz#7ef78ec0c8577a544477308ddf1d2d6e88d51f5b" @@ -1569,24 +1212,6 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -deps-sort@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" - integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== - dependencies: - JSONStream "^1.0.3" - shasum-object "^1.0.0" - subarg "^1.0.0" - through2 "^2.0.0" - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - 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" @@ -1597,29 +1222,11 @@ detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -detective@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" - integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== - dependencies: - acorn-node "^1.6.1" - defined "^1.0.0" - minimist "^1.1.1" - diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1670,11 +1277,6 @@ dom-serializer@^1.0.1: domhandler "^4.0.0" entities "^2.0.0" -domain-browser@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - domelementtype@1, domelementtype@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" @@ -1723,13 +1325,6 @@ domutils@^2.0.0: domelementtype "^2.2.0" domhandler "^4.2.0" -duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= - dependencies: - readable-stream "^2.0.2" - duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -1745,19 +1340,6 @@ electron-to-chromium@^1.3.723: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz#857e310ca00f0b75da4e1db6ff0e073cc4a91ddf" integrity sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg== -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -1773,13 +1355,6 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - enquirer@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -2075,19 +1650,6 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - execall@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" @@ -2169,11 +1731,6 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fast-safe-stringify@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" - integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== - fast-url-parser@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" @@ -2265,11 +1822,6 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - format@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" @@ -2290,11 +1842,6 @@ from@^0.1.7: resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -2353,11 +1900,6 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-assigned-identifiers@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" - integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== - get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -2396,18 +1938,6 @@ glob-parent@^5.1.0, glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" -glob@^7.1.0: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^7.1.3: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -2472,11 +2002,16 @@ gonzales-pe@^4.3.0: dependencies: minimist "^1.2.5" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.2: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" @@ -2507,39 +2042,13 @@ has-unicode@^2.0.0: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= -has@^1.0.0, has@^1.0.3: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - hosted-git-info@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.0.tgz#9f06639a90beff66cacae6e77f8387b431d61ddc" @@ -2552,11 +2061,6 @@ html-tags@^3.1.0: resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== -htmlescape@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" - integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= - htmlparser2@^3.10.0: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" @@ -2624,11 +2128,6 @@ httpolyglot@^0.1.2: resolved "https://registry.yarnpkg.com/httpolyglot/-/httpolyglot-0.1.2.tgz#e4d347fe8984a62f467d4060df527f1851f6997b" integrity sha1-5NNH/omEpi9GfUBg31J/GFH2mXs= -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - https-proxy-agent@5, https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" @@ -2644,11 +2143,6 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.13, ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore-walk@3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" @@ -2697,16 +2191,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, 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== -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -2717,29 +2206,6 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inline-source-map@~0.6.0: - version "0.6.2" - resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" - integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU= - dependencies: - source-map "~0.5.3" - -insert-module-globals@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz#d5e33185181a4e1f33b15f7bf100ee91890d5cb3" - integrity sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg== - dependencies: - JSONStream "^1.0.3" - acorn-node "^1.5.2" - combine-source-map "^0.8.0" - concat-stream "^1.6.1" - is-buffer "^1.1.0" - path-is-absolute "^1.0.1" - process "~0.11.0" - through2 "^2.0.0" - undeclared-identifiers "^1.1.2" - xtend "^4.0.0" - ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -2763,13 +2229,6 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" -is-arguments@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" - integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== - dependencies: - call-bind "^1.0.0" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -2787,7 +2246,7 @@ is-boolean-object@^1.1.0: dependencies: call-bind "^1.0.0" -is-buffer@^1.1.0, is-buffer@^1.1.4, is-buffer@~1.1.6: +is-buffer@^1.1.4, is-buffer@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== @@ -2841,11 +2300,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-generator-function@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.9.tgz#e5f82c2323673e7fcad3d12858c83c4039f6399c" - integrity sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A== - is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" @@ -2908,17 +2362,6 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.1" -is-typed-array@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e" - integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug== - dependencies: - available-typed-arrays "^1.0.2" - call-bind "^1.0.2" - es-abstract "^1.18.0-next.2" - foreach "^2.0.5" - has-symbols "^1.0.1" - is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -3040,14 +2483,6 @@ known-css-properties@^0.21.0: resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.21.0.tgz#15fbd0bbb83447f3ce09d8af247ed47c68ede80d" integrity sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw== -labeled-stream-splicer@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" - integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== - dependencies: - inherits "^2.0.1" - stream-splicer "^2.0.0" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -3104,11 +2539,6 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= -lodash.memoize@~3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" - integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -3188,15 +2618,6 @@ mathml-tag-names@^2.1.3: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - md5@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" @@ -3288,14 +2709,6 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - mime-db@1.47.0, "mime-db@>= 1.43.0 < 2": version "1.47.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" @@ -3318,16 +2731,6 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -3344,7 +2747,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: +minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -3364,37 +2767,11 @@ minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" -mkdirp-classic@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - mkdirp@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -module-deps@^6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.3.tgz#15490bc02af4b56cf62299c7c17cba32d71a96ee" - integrity sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA== - dependencies: - JSONStream "^1.0.3" - browser-resolve "^2.0.0" - cached-path-relative "^1.0.2" - concat-stream "~1.6.0" - defined "^1.0.0" - detective "^5.2.0" - duplexer2 "^0.1.2" - inherits "^2.0.1" - parents "^1.0.0" - readable-stream "^2.0.2" - resolve "^1.4.0" - stream-combiner2 "^1.1.1" - subarg "^1.0.0" - through2 "^2.0.0" - xtend "^4.0.0" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -3502,7 +2879,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -3549,7 +2926,7 @@ on-headers@~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.4.0: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -3585,11 +2962,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -os-browserify@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - os-tmpdir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -3657,11 +3029,6 @@ pac-resolver@^5.0.0: ip "^1.1.5" netmask "^2.0.1" -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -3669,24 +3036,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parents@^1.0.0, parents@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" - integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E= - dependencies: - path-platform "~0.11.15" - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - parse-entities@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" @@ -3734,11 +3083,6 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -path-browserify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -3749,7 +3093,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.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +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= @@ -3764,11 +3108,6 @@ path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-platform@~0.11.15: - version "0.11.15" - resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" - integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= - path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -3793,17 +3132,6 @@ pause-stream@^0.0.11: dependencies: through "~2.3" -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - pem@^1.14.2: version "1.14.4" resolved "https://registry.yarnpkg.com/pem/-/pem-1.14.4.tgz#a68c70c6e751ccc5b3b5bcd7af78b0aec1177ff9" @@ -3950,11 +3278,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@~0.11.0: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -3987,31 +3310,6 @@ proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - punycode@^1.3.2: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -4034,16 +3332,6 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -querystring-es3@~0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - queue-microtask@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" @@ -4054,21 +3342,6 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -4094,13 +3367,6 @@ raw-body@^2.2.0: iconv-lite "0.4.24" unpipe "1.0.0" -read-only-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" - integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A= - dependencies: - readable-stream "^2.0.2" - read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -4147,7 +3413,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6: +readable-stream@^2.0.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== @@ -4160,7 +3426,7 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: +readable-stream@^3.0.0, readable-stream@^3.1.1: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -4279,7 +3545,7 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve@^1.1.4, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.4.0: +resolve@^1.13.1, resolve@^1.17.0, resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -4299,14 +3565,6 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - rotating-file-stream@^2.1.1: version "2.1.5" resolved "https://registry.yarnpkg.com/rotating-file-stream/-/rotating-file-stream-2.1.5.tgz#6490d0a09e11dd4d441aa5d4d3676debed4a44e4" @@ -4332,7 +3590,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@5.1.2, 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.1.0, safe-buffer@~5.1.1, safe-buffer@~5.2.0: +safe-buffer@5.1.2, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1, 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== @@ -4344,7 +3602,7 @@ safe-compare@^1.1.4: dependencies: buffer-alloc "^1.2.0" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -4405,21 +3663,6 @@ setprototypeof@1.1.1: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== -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" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shasum-object@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e" - integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg== - dependencies: - fast-safe-stringify "^2.0.7" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4432,11 +3675,6 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.6.1: - version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== - shellcheck@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shellcheck/-/shellcheck-1.0.0.tgz#263479d92c3708d63d98883f896481461cf17cd0" @@ -4456,11 +3694,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -4476,23 +3709,23 @@ slice-ansi@^4.0.0: is-fullwidth-code-point "^3.0.0" smart-buffer@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" - integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== socks-proxy-agent@5, socks-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60" - integrity sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA== + version "5.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" + integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== dependencies: - agent-base "6" + agent-base "^6.0.2" debug "4" socks "^2.3.3" socks@^2.3.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.0.tgz#6b984928461d39871b3666754b9000ecf39dfac2" - integrity sha512-mNmr9owlinMplev0Wd7UHFlqI4ofnBnNzFuzrm63PPaHgbkqCFe4T5LzwKmtQ/f2tX0NTpcdVLyD/FHxFBstYw== + version "2.6.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" + integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== dependencies: ip "^1.1.5" smart-buffer "^4.1.0" @@ -4505,7 +3738,7 @@ source-map-support@^0.5.17: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.5.0, source-map@~0.5.3: +source-map@^0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -4575,22 +3808,6 @@ state-toggle@^1.0.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -stream-browserify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" - integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== - dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" - -stream-combiner2@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" - integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= - dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" - stream-combiner@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" @@ -4606,24 +3823,6 @@ stream-events@^1.0.5: dependencies: stubs "^3.0.0" -stream-http@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" - integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.4" - readable-stream "^3.6.0" - xtend "^4.0.2" - -stream-splicer@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" - integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.2" - string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -4799,13 +3998,6 @@ stylelint@^13.0.0: v8-compile-cache "^2.3.0" write-file-atomic "^3.0.3" -subarg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" - integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= - dependencies: - minimist "^1.1.0" - sugarss@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d" @@ -4832,13 +4024,6 @@ svg-tags@^1.0.0: resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= -syntax-error@^1.1.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" - integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== - dependencies: - acorn-node "^1.2.0" - table@^6.0.9, table@^6.6.0: version "6.7.1" resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" @@ -4851,27 +4036,6 @@ table@^6.0.9, table@^6.6.0: string-width "^4.2.0" strip-ansi "^6.0.0" -tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - tar@^6.1.0, tar@^6.1.9: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" @@ -4900,26 +4064,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - through@2, "through@>=2.2.7 <3", through@^2.3.8, through@~2.3, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -timers-browserify@^1.0.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" - integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0= - dependencies: - process "~0.11.0" - 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" @@ -4994,9 +4143,9 @@ tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" - integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tsutils@^3.21.0: version "3.21.0" @@ -5005,11 +4154,6 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" -tty-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" - integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -5059,20 +4203,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@^4.1.3: - version "4.3.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" - integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== - -umd@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" - integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== +typescript@^4.4.0-dev.20210528: + version "4.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.2.tgz#6d618640d430e3569a1dfb44f7d7e600ced3ee86" + integrity sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ== unbox-primitive@^1.0.0: version "1.0.1" @@ -5084,17 +4218,6 @@ unbox-primitive@^1.0.0: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" -undeclared-identifiers@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" - integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== - dependencies: - acorn-node "^1.3.0" - dash-ast "^1.0.0" - get-assigned-identifiers "^1.2.0" - simple-concat "^1.0.0" - xtend "^4.0.1" - underscore@^1.13.1, underscore@~1.12.1: version "1.13.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" @@ -5204,14 +4327,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - urlgrey@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-1.0.0.tgz#72d2f904482d0b602e3c7fa599343d699bbe1017" @@ -5224,25 +4339,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@~0.12.0: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -5304,11 +4400,6 @@ vfile@^4.0.0: unist-util-stringify-position "^2.0.0" vfile-message "^2.0.0" -vm-browserify@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - vm2@^3.9.3: version "3.9.3" resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.3.tgz#29917f6cc081cc43a3f580c26c5b553fd3c91f40" @@ -5330,19 +4421,6 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which-typed-array@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff" - integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA== - dependencies: - available-typed-arrays "^1.0.2" - call-bind "^1.0.0" - es-abstract "^1.18.0-next.1" - foreach "^2.0.5" - function-bind "^1.1.1" - has-symbols "^1.0.1" - is-typed-array "^1.1.3" - which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -5394,9 +4472,9 @@ write-file-atomic@^3.0.3: typedarray-to-buffer "^3.1.5" ws@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.0.0.tgz#550605d13dfc1437c9ec1396975709c6d7ffc57d" - integrity sha512-6AcSIXpBlS0QvCVKk+3cWnWElLsA6SzC0lkQ43ciEglgXJXiCWK3/CGFEJ+Ybgp006CMibamAsqOlxE9s4AvYA== + version "8.2.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.0.tgz#0b738cd484bfc9303421914b11bb4011e07615bb" + integrity sha512-uYhVJ/m9oXwEI04iIVmgLmugh2qrZihkywG9y5FfZV2ATeLIzHf93qs+tUNqlttbQK957/VX3mtwAS+UfIwA4g== x-is-string@^0.1.0: version "0.1.0" @@ -5413,7 +4491,7 @@ xregexp@2.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==