diff --git a/.gitpod.yml b/.gitpod.yml index 1e4a5dc..0a8da11 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -6,7 +6,7 @@ tasks: gp sync-await start && gp await-port 6080 && for i in `seq 10 -1 1` ; do echo -ne "\rStarting Chrome in $i " && sleep 1 && echo -ne "\r" ; done && - google-chrome --no-first-run --disable-dev-shm-usage --start-maximized --load-extension=/workspace/browser-extension https://github.com/gitpod-io/template-sveltekit + google-chrome --no-first-run --disable-dev-shm-usage --start-maximized --load-extension=/workspace/browser-extension https://github.com/gitpod-io/template-sveltekit https://github.com/gitpod-io/gitpod/pull/9378 https://github.com/gitpod-io/gitpod/issues/6707 https://github.com/gitpod-io/gitpod/blob/main/components/supervisor-api/notification.proto - name: Webpack Dev Server init: yarn install && yarn build && yarn package command: > diff --git a/package.json b/package.json index 9d24496..b9bf465 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "dom-loaded": "^2.0.0", "github-injection": "^1.0.1", "select-dom": "^5.1.0", - "webextension-polyfill": "^0.7.0" + "webextension-polyfill": "^0.7.0", + "@gitpod/gitpod-protocol": "main" }, "devDependencies": { "copy-webpack-plugin": "^7.0.0", diff --git a/src/config.ts b/src/config.ts index 7d22004..f4e49d7 100644 --- a/src/config.ts +++ b/src/config.ts @@ -5,12 +5,14 @@ export interface Config { gitpodURL: string; openAsPopup: boolean; rewritePeriodKeybind: boolean; + useLatest: boolean; } export const DEFAULT_CONFIG: Config = { gitpodURL: "https://gitpod.io", openAsPopup: false, - rewritePeriodKeybind: false + rewritePeriodKeybind: false, + useLatest: false, }; export interface ConfigListener { diff --git a/src/gitpodify.ts b/src/gitpodify.ts index 6f188f9..f1709f2 100644 --- a/src/gitpodify.ts +++ b/src/gitpodify.ts @@ -42,7 +42,7 @@ const init = async (injectedByUserClick: boolean = false) => { if (injectedByUserClick) { // User clicked on the Gitpod extension icon. We open the Gitpod with this page as context. - window.open(renderGitpodUrl(config.gitpodURL)); + window.open(renderGitpodUrl(config.gitpodURL).gitpodUrl); } // Perform the actual, initial injection diff --git a/src/ide-options.json b/src/ide-options.json new file mode 100644 index 0000000..3d70209 --- /dev/null +++ b/src/ide-options.json @@ -0,0 +1,87 @@ +{ + "clients": { + "jetbrains-gateway": { + "defaultDesktopIDE": "intellij", + "desktopIDEs": [ + "intellij", + "goland", + "pycharm", + "phpstorm" + ], + "installationSteps": [ + "If you don't see an open dialog in your browser, make sure you have the JetBrains Gateway with Gitpod Plugin installed on your machine, and then click ${OPEN_LINK_LABEL} below." + ] + }, + "vscode": { + "defaultDesktopIDE": "code-desktop", + "desktopIDEs": [ + "code-desktop" + ], + "installationSteps": [ + "If you don't see an open dialog in your browser, make sure you have VS Code installed on your machine, and then click ${OPEN_LINK_LABEL} below." + ] + }, + "vscode-insiders": { + "defaultDesktopIDE": "code-desktop", + "desktopIDEs": [ + "code-desktop" + ], + "installationSteps": [ + "If you don't see an open dialog in your browser, make sure you have VS Code Insiders installed on your machine, and then click ${OPEN_LINK_LABEL} below." + ] + } + }, + "defaultDesktopIde": "code-desktop", + "defaultIde": "code", + "options": { + "code": { + "image": "eu.gcr.io/gitpod-core-dev/build/ide/code:commit-54b4098031a1a3a600c1fd73d070c4aab27e1cd8", + "label": "Browser", + "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/code:nightly@sha256:b62ea2f415d46505c1ffa75f171dc00a0b099105e99ef070ee65ec05084fba61", + "logo": "https://ide.gitpod.io/image/ide-logo/vscode.svg", + "orderKey": "00", + "title": "VS Code", + "type": "browser" + }, + "code-desktop": { + "image": "eu.gcr.io/gitpod-core-dev/build/ide/code-desktop:commit-b121fec8e215abd2d0328ef28b8808a59852cb4c", + "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/code-desktop-insiders:commit-b121fec8e215abd2d0328ef28b8808a59852cb4c@sha256:1b65f8959b1eac330e736c18d1824f34c2ad21df81438ba8c3351e04d5f539ad", + "logo": "https://ide.gitpod.io/image/ide-logo/vscode.svg", + "orderKey": "02", + "title": "VS Code", + "type": "desktop" + }, + "goland": { + "image": "eu.gcr.io/gitpod-core-dev/build/ide/goland:commit-a4234aa724a4658207fdf6a64e5c07f204da86d1", + "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/goland:latest@sha256:2c23f10430fb3fe62d19fe39f40b4dea4869eab31ae72e5f7bddeb6679a4dcd7", + "logo": "https://ide.gitpod.io/image/ide-logo/golandLogo.svg", + "orderKey": "05", + "title": "GoLand", + "type": "desktop" + }, + "intellij": { + "image": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:commit-bbdbb44b0a85a2c36e6854d818fe920d0ee5369c", + "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/intellij:latest@sha256:6109564a542707a8962054d864ee0679388b77bcb66c8fd987924a831cbaf486", + "logo": "https://ide.gitpod.io/image/ide-logo/intellijIdeaLogo.svg", + "orderKey": "04", + "title": "IntelliJ IDEA", + "type": "desktop" + }, + "phpstorm": { + "image": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:commit-a4234aa724a4658207fdf6a64e5c07f204da86d1", + "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/phpstorm:latest@sha256:81085f80e4227b9e034aa37adb2256c279d2cca4cd3b4101feb3abd8f53e90d2", + "logo": "https://ide.gitpod.io/image/ide-logo/phpstormLogo.svg", + "orderKey": "07", + "title": "PhpStorm", + "type": "desktop" + }, + "pycharm": { + "image": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:commit-a4234aa724a4658207fdf6a64e5c07f204da86d1", + "latestImage": "eu.gcr.io/gitpod-core-dev/build/ide/pycharm:latest@sha256:4698b906f4852d44b48ef3df858fcef73da69628a2da3188cd6e70116d84865e", + "logo": "https://ide.gitpod.io/image/ide-logo/pycharmLogo.svg", + "orderKey": "06", + "title": "PyCharm", + "type": "desktop" + } + } +} \ No newline at end of file diff --git a/src/injectors/bitbucket-injector.ts b/src/injectors/bitbucket-injector.ts index 6dadbc6..707075b 100644 --- a/src/injectors/bitbucket-injector.ts +++ b/src/injectors/bitbucket-injector.ts @@ -1,13 +1,13 @@ import { InjectorBase, ButtonInjector, checkIsBtnUpToDate } from "./injector"; import { ConfigProvider } from "../config"; -import { renderGitpodUrl, makeOpenInPopup } from "../utils"; +import { renderGitpodUrl, makeOpenInPopup, UrlInfo } from "../utils"; import select = require("select-dom"); namespace Gitpodify { - export const NAV_BTN_ID = "gitpod-btn-nav"; - export const NAV_BTN_CLASS = "gitpod-nav-btn"; + export const NAV_BTN_ID = "gitpod-btn-nav"; + export const NAV_BTN_CLASS = "gitpod-nav-btn"; export const NAV_BTN_CLASS_SELECTOR = "." + NAV_BTN_CLASS; - + export const CSS_REF_BTN_CONTAINER = "gitpod-btn-container"; export const CSS_REF_NO_CONTAINER = "no-container"; } @@ -38,8 +38,8 @@ export class BitbucketInjector extends InjectorBase { checkIsInjected(): boolean { const button = document.getElementById(`${Gitpodify.NAV_BTN_ID}`); - const currentUrl = renderGitpodUrl(this.config.gitpodURL); - return checkIsBtnUpToDate(button, currentUrl); + const urlInfo = renderGitpodUrl(this.config.gitpodURL); + return checkIsBtnUpToDate(button, urlInfo.gitpodUrl); } async inject(): Promise { @@ -54,17 +54,17 @@ export class BitbucketInjector extends InjectorBase { abstract class ButtonInjectorBase implements ButtonInjector { - constructor(protected readonly parent: string, protected btnClasses: string, protected readonly up?: number) { + constructor(protected readonly parent: string, protected btnClasses: string, protected readonly up?: number, protected readonly test?: boolean) { } abstract isApplicableToCurrentPage(): boolean; - inject(currentUrl: string, openAsPopup: boolean) { + inject(urlInfo: UrlInfo, openAsPopup: boolean, useLatest: boolean) { let actionbar = select(this.parent); - if(actionbar && this.up) { - for(let i = 0; i < this.up; i++) { - if(actionbar.parentElement) { + if (actionbar && this.up) { + for (let i = 0; i < this.up; i++) { + if (actionbar.parentElement) { actionbar = actionbar.parentElement; } else { return; @@ -75,6 +75,7 @@ abstract class ButtonInjectorBase implements ButtonInjector { return; } + const currentUrl = urlInfo.gitpodUrl; const oldBtn = document.getElementById(Gitpodify.NAV_BTN_ID); if (oldBtn) { if (!checkIsBtnUpToDate(oldBtn, currentUrl)) { @@ -88,16 +89,16 @@ abstract class ButtonInjectorBase implements ButtonInjector { const btn = this.renderButton(currentUrl, openAsPopup); const btnGroup = actionbar.children; - if (btnGroup && btnGroup.length > 0){ + if (btnGroup && btnGroup.length > 0) { actionbar.insertBefore(btn, btnGroup[0]); - } + } } protected renderButton(url: string, openAsPopup: boolean, float: boolean = true): HTMLElement { let classes = Gitpodify.NAV_BTN_CLASS; if (float) { classes = `${classes} ${this.btnClasses} aui-button`; - } + } const container = document.createElement('div'); container.id = Gitpodify.CSS_REF_BTN_CONTAINER; diff --git a/src/injectors/github-injector.ts b/src/injectors/github-injector.ts index 24b8f57..b4a1499 100644 --- a/src/injectors/github-injector.ts +++ b/src/injectors/github-injector.ts @@ -2,13 +2,14 @@ import * as select from 'select-dom'; import * as ghInjection from 'github-injection'; import { ConfigProvider } from '../config'; import { ButtonInjector, InjectorBase, checkIsBtnUpToDate, rewritePeriodKeybindGitHub } from './injector'; -import { renderGitpodUrl, makeOpenInPopup } from '../utils'; +import { renderGitpodUrl, ideOptions, createElementFromHTML, UrlInfo, makeOpenInPopup, renderGitpodCustomEditor } from '../utils'; +import { IDEOptions } from "@gitpod/gitpod-protocol/lib/ide-protocol"; namespace Gitpodify { - export const NAV_BTN_ID = "gitpod-btn-nav"; - export const NAV_BTN_CLASS = "gitpod-nav-btn"; + export const NAV_BTN_ID = "gitpod-btn-nav"; + export const NAV_BTN_CLASS = "gitpod-nav-btn"; export const NAV_BTN_CLASS_SELECTOR = "." + NAV_BTN_CLASS; - + export const CSS_REF_BTN_CONTAINER = "gitpod-btn-container"; export const CSS_REF_NO_CONTAINER = "no-container"; } @@ -42,19 +43,19 @@ export class GitHubInjector extends InjectorBase { checkIsInjected(): boolean { const button = document.getElementById(`${Gitpodify.NAV_BTN_ID}`); - const currentUrl = renderGitpodUrl(this.config.gitpodURL); - return checkIsBtnUpToDate(button, currentUrl); + const urlInfo = renderGitpodUrl(this.config.gitpodURL); + return checkIsBtnUpToDate(button, urlInfo.gitpodUrl); } async inject(): Promise { // ghInjection triggers an event whenever only parts of the GitHub page have been reloaded - ghInjection(() => { + ghInjection(() => { if (!this.checkIsInjected()) { this.injectButtons(); } - + (async () => { - await rewritePeriodKeybindGitHub(); + await rewritePeriodKeybindGitHub(); })(); }); } @@ -69,13 +70,18 @@ abstract class ButtonInjectorBase implements ButtonInjector { constructor( protected readonly parentSelector: string, protected readonly btnClasses: string, + protected readonly containerClasses: string = "", protected readonly float: boolean = true, protected readonly asFirstChild: boolean = false - ) {} + ) { } abstract isApplicableToCurrentPage(): boolean; - inject(currentUrl: string, openAsPopup: boolean) { + protected adjustButton(a: HTMLAnchorElement) { + // do nothing + } + + inject(urlInfo: UrlInfo, openAsPopup: boolean, useLatest: boolean) { const actionbar = select(this.parentSelector); if (!actionbar) { return; @@ -83,15 +89,15 @@ abstract class ButtonInjectorBase implements ButtonInjector { const oldBtn = document.getElementById(Gitpodify.NAV_BTN_ID); if (oldBtn) { - if (!checkIsBtnUpToDate(oldBtn, currentUrl)) { + if (!checkIsBtnUpToDate(oldBtn, urlInfo.gitpodUrl)) { // update button - (oldBtn as HTMLAnchorElement).href = currentUrl; + (oldBtn as HTMLAnchorElement).href = urlInfo.gitpodUrl; } // button is there and up-to-date return; } - const btn = this.renderButton(currentUrl, openAsPopup); + const btn = this.genButton(urlInfo, openAsPopup, useLatest); const btnGroup = actionbar.getElementsByClassName("BtnGroup"); const detailsBtn = Array.from(actionbar.children) @@ -111,67 +117,92 @@ abstract class ButtonInjectorBase implements ButtonInjector { } const primaryButtons = actionbar.getElementsByClassName("btn-primary"); - if (primaryButtons && primaryButtons.length > 1) { + if (primaryButtons && primaryButtons.length > 2) { Array.from(primaryButtons) - .slice(0, primaryButtons.length - 1) + .slice(0, primaryButtons.length - 2) .forEach(primaryButton => primaryButton.classList.replace("btn-primary", "btn-secondary")); } } - protected renderButton(url: string, openAsPopup: boolean): HTMLElement { + genOptionsString(ideOptions: IDEOptions, urlInfo: UrlInfo, useLatest: boolean) { + if (!ideOptions.clients) { + return [] + } + return Object.entries(ideOptions.options ?? {}).map(([ide, ideOption]) => { + const url = renderGitpodCustomEditor(urlInfo.host, urlInfo.originUrl, ide, useLatest); + const title = ideOption.title + (ideOption.type === "desktop" ? "" : (" - " + ideOption.type.toUpperCase())); + return ` + + +
+ ${title} + + Open in ${title} + + +
+
` + }) + } + + genButton(urlInfo: UrlInfo, openAsPopup: boolean, useLatest: boolean) { let classes = this.btnClasses + ` ${Gitpodify.NAV_BTN_CLASS}`; if (this.float) { classes = classes + ` float-right`; } - - const container = document.createElement('div'); - container.id = Gitpodify.CSS_REF_BTN_CONTAINER; - container.className = classes; - - const a = document.createElement('a'); - a.id = Gitpodify.NAV_BTN_ID; - a.title = "Gitpod"; - a.text = "Gitpod" - a.href = url; - a.target = "_blank"; + + const element = createElementFromHTML(` +
+ Gitpod + +
+ + + + ${this.genOptionsString(ideOptions, urlInfo, useLatest).join("\n")} + +
+
`) if (openAsPopup) { - makeOpenInPopup(a); + element.querySelectorAll('a').forEach(e => { + makeOpenInPopup(e); + }); } - a.className = "btn btn-sm btn-primary"; - - this.adjustButton(a); - - container.appendChild(a); - return container; - } - protected adjustButton(a: HTMLAnchorElement) { - // do nothing + return element } } class PullInjector extends ButtonInjectorBase { constructor() { - super(".gh-header-actions", ""); + super(".gh-header-actions", "btn-sm", "ml-0"); } isApplicableToCurrentPage(): boolean { - return window.location.pathname.includes("/pull/"); + return window.location.pathname.includes("/pull/"); } } class IssueInjector extends ButtonInjectorBase { constructor() { - super(".gh-header-actions", ""); + super(".gh-header-actions", "btn-sm", "ml-1"); } isApplicableToCurrentPage(): boolean { - return window.location.pathname.includes("/issues/"); + return window.location.pathname.includes("/issues/"); } } class FileInjector extends ButtonInjectorBase { constructor() { - super(".repository-content > div > div", "gitpod-file-btn"); + super(".repository-content > div > div > div", "gitpod-file-btn", "ml-2"); } protected adjustButton(a: HTMLAnchorElement): void { @@ -185,7 +216,7 @@ class FileInjector extends ButtonInjectorBase { class NavigationInjector extends ButtonInjectorBase { constructor() { - super(".file-navigation", "empty-icon position-relative"); + super(".file-navigation", "empty-icon position-relative", "ml-2"); } protected adjustButton(a: HTMLAnchorElement): void { @@ -199,7 +230,7 @@ class NavigationInjector extends ButtonInjectorBase { class EmptyRepositoryInjector extends ButtonInjectorBase { constructor() { - super(".repository-content", Gitpodify.CSS_REF_NO_CONTAINER, false, true); + super(".repository-content", Gitpodify.CSS_REF_NO_CONTAINER, "", false, true); } protected adjustButton(a: HTMLAnchorElement): void { diff --git a/src/injectors/gitlab-injector.ts b/src/injectors/gitlab-injector.ts index 7df992c..763b52c 100644 --- a/src/injectors/gitlab-injector.ts +++ b/src/injectors/gitlab-injector.ts @@ -2,13 +2,18 @@ import * as domloaded from 'dom-loaded'; import * as select from 'select-dom'; import { ConfigProvider } from '../config'; import { ButtonInjector, InjectorBase, checkIsBtnUpToDate, rewritePeriodKeybindGitLab } from './injector'; -import { renderGitpodUrl, makeOpenInPopup } from '../utils'; +import { renderGitpodUrl, makeOpenInPopup, UrlInfo, renderGitpodCustomEditor, createElementFromHTML, ideOptions } from '../utils'; +import { IDEOptions } from '@gitpod/gitpod-protocol/lib/ide-protocol'; namespace Gitpodify { - export const BTN_ID = "gitpod-btn-nav"; - export const BTN_CLASS = "gitpod-nav-btn"; + export const BTN_ID = "gitpod-btn-nav"; + export const BTN_CLASS = "gitpod-nav-btn"; } + +const DropdownID = "gitpod-dropdown" +const DropdownTriggerID = "gitpod-dropdown-trigger" + export class GitlabInjector extends InjectorBase { constructor(protected readonly configProvider: ConfigProvider) { @@ -30,8 +35,8 @@ export class GitlabInjector extends InjectorBase { checkIsInjected(): boolean { const button = document.getElementById(`${Gitpodify.BTN_ID}`); - const currentUrl = renderGitpodUrl(this.config.gitpodURL); - return checkIsBtnUpToDate(button, currentUrl); + const urlInfo = renderGitpodUrl(this.config.gitpodURL); + return checkIsBtnUpToDate(button, urlInfo.gitpodUrl); } async inject(): Promise { @@ -57,11 +62,12 @@ class RepositoryInjector implements ButtonInjector { return result; } - inject(currentUrl: string, openAsPopup: boolean) { + inject(urlInfo: UrlInfo, openAsPopup: boolean, useLatest: boolean) { const parent = select(RepositoryInjector.PARENT_SELECTOR); if (!parent || !parent.firstElementChild) { return; } + const currentUrl = urlInfo.gitpodUrl; const oldBtn = document.getElementById(Gitpodify.BTN_ID); if (oldBtn && !checkIsBtnUpToDate(oldBtn, currentUrl)) { @@ -70,8 +76,9 @@ class RepositoryInjector implements ButtonInjector { return; } - const btn = this.renderButton(currentUrl, openAsPopup); + const btn = this.renderButton(urlInfo, openAsPopup, useLatest); parent.firstElementChild.appendChild(btn); + this.bindDropdown() const primaryButtons = parent.firstElementChild.getElementsByClassName("btn-primary"); if (primaryButtons && primaryButtons.length > 1) { @@ -84,27 +91,101 @@ class RepositoryInjector implements ButtonInjector { } } - protected renderButton(url: string, openAsPopup: boolean): HTMLElement { - const container = document.createElement('div'); - container.className = "project-clone-holder d-none d-md-inline-block"; - - const container2ndLevel = document.createElement('div'); - container2ndLevel.className = "git-clone-holder js-git-clone-holder"; - - const a = document.createElement('a'); - a.id = Gitpodify.BTN_ID; - a.title = "Gitpod"; - a.text = "Gitpod" - a.href = url; - a.target = "_blank"; - a.className = "gl-button btn btn-info"; - - if (openAsPopup) { - makeOpenInPopup(a); + genOptionsString(ideOptions: IDEOptions, urlInfo: UrlInfo, useLatest: boolean) { + if (!ideOptions.clients) { + return [] + } + return Object.entries(ideOptions.options ?? {}).map(([ide, ideOption]) => { + const url = renderGitpodCustomEditor(urlInfo.host, urlInfo.originUrl, ide, useLatest); + const title = ideOption.title + (ideOption.type === "desktop" ? "" : (" - " + ideOption.type.toUpperCase())); + const logo = ideOption.logo + return `` + }) + } + + bindDropdown() { + const element = document.querySelector('#' + DropdownTriggerID) as HTMLButtonElement + if (element == null) { + return + } + element.onclick = () => { this.triggerDropdown() } + } + + triggerDropdown() { + const element = document.querySelector('#' + DropdownID) + const show = !element?.classList.contains("show") + if (show) { + element?.classList.add("show") + } else { + element?.classList.remove("show") } + } + + protected renderButton(urlInfo: UrlInfo, openAsPopup: boolean, useLatest: boolean) { + const element = createElementFromHTML(` + `) - container2ndLevel.appendChild(a); - container.appendChild(container2ndLevel); - return container; + if (openAsPopup) { + element.querySelectorAll('a').forEach(e => { + makeOpenInPopup(e); + }); + } + return element } + + // protected renderButton(url: string, openAsPopup: boolean): HTMLElement { + // const container = document.createElement('div'); + // container.className = "project-clone-holder d-none d-md-inline-block"; + + // const container2ndLevel = document.createElement('div'); + // container2ndLevel.className = "git-clone-holder js-git-clone-holder"; + + // const a = document.createElement('a'); + // a.id = Gitpodify.BTN_ID; + // a.title = "Gitpod"; + // a.text = "Gitpod" + // a.href = url; + // a.target = "_blank"; + // a.className = "gl-button btn btn-info"; + + // if (openAsPopup) { + // makeOpenInPopup(a); + // } + + // container2ndLevel.appendChild(a); + // container.appendChild(container2ndLevel); + // return container; + // } } \ No newline at end of file diff --git a/src/injectors/injector.ts b/src/injectors/injector.ts index 70d1c9a..581ae10 100644 --- a/src/injectors/injector.ts +++ b/src/injectors/injector.ts @@ -1,5 +1,5 @@ import { ConfigProvider } from "../config"; -import { renderGitpodUrl } from "../utils"; +import { renderGitpodUrl, UrlInfo } from "../utils"; import { isVisible } from "../utils"; export interface Injector { @@ -37,14 +37,14 @@ export interface ButtonInjector { * Injects the actual button * @param currentUrl The currently configured Gitpod URL */ - inject(currentUrl: string, openAsPopup: boolean): void; + inject(urlInfo: UrlInfo, openAsPopup: boolean, useLatest: boolean): void; } export abstract class InjectorBase implements Injector { constructor( protected readonly configProvider: ConfigProvider, protected readonly buttonInjectors: ButtonInjector[] - ) {} + ) { } abstract canHandleCurrentPage(): boolean; abstract checkIsInjected(): boolean; @@ -52,10 +52,10 @@ export abstract class InjectorBase implements Injector { abstract update(): Promise; injectButtons(singleInjector: boolean = false) { - const currentUrl = renderGitpodUrl(this.config.gitpodURL); + const urlInfo = renderGitpodUrl(this.config.gitpodURL); for (const injector of this.buttonInjectors) { if (injector.isApplicableToCurrentPage()) { - injector.inject(currentUrl, this.config.openAsPopup); + injector.inject(urlInfo, this.config.openAsPopup, this.config.useLatest); if (singleInjector) { break; } @@ -99,7 +99,7 @@ export async function rewritePeriodKeybindGitLab() { if (config.rewritePeriodKeybind) { const unbindMousetrapScript = document.createElement('script'); - unbindMousetrapScript.innerHTML='window.Mousetrap.unbind(".");'; + unbindMousetrapScript.innerHTML = 'window.Mousetrap.unbind(".");'; document.head.appendChild(unbindMousetrapScript); document.onkeydown = (e: KeyboardEvent) => { diff --git a/src/options/options.html b/src/options/options.html index ab52ed3..62da782 100644 --- a/src/options/options.html +++ b/src/options/options.html @@ -2,7 +2,7 @@ - +
@@ -10,6 +10,13 @@
+
+ + +
diff --git a/src/options/options.ts b/src/options/options.ts index eed9820..f1be70e 100644 --- a/src/options/options.ts +++ b/src/options/options.ts @@ -3,6 +3,7 @@ import { ConfigProvider } from "../config"; const gitpodUrlInput = document.getElementById("gitpod-url-input")! as HTMLInputElement; const gitpodRewriteKeybind = document.getElementById("gitpod-replace-keybind")! as HTMLInputElement; const gitpodPopupInput = document.getElementById("gitpod-open-as-popup")! as HTMLInputElement; +const useLatestCheckbox = document.getElementById("use-latest")! as HTMLInputElement; const messageElement = document.getElementById("message")! as HTMLDivElement; @@ -12,6 +13,7 @@ const init = async () => { // Initialize UI const initialConfig = configProvider.getConfig(); gitpodUrlInput.value = initialConfig.gitpodURL; + useLatestCheckbox.checked = initialConfig.useLatest; gitpodPopupInput.checked = initialConfig.openAsPopup; gitpodRewriteKeybind.checked = initialConfig.rewritePeriodKeybind; @@ -22,6 +24,7 @@ const init = async () => { // Update config (propagated internally) configProvider.setConfig({ gitpodURL: gitpodUrlInput.value || undefined, + useLatest: useLatestCheckbox.checked, openAsPopup: gitpodPopupInput.checked, rewritePeriodKeybind: gitpodRewriteKeybind.checked }); @@ -38,7 +41,7 @@ const init = async () => { } save() }); - [gitpodPopupInput, gitpodRewriteKeybind].forEach((el) => el.addEventListener('change', save)) + [useLatestCheckbox, gitpodPopupInput, gitpodRewriteKeybind].forEach((el) => el.addEventListener('change', save)) }; init().catch(err => console.error(err)); diff --git a/src/utils.ts b/src/utils.ts index 4648976..f8257a9 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,21 +1,61 @@ -export function renderGitpodUrl(gitpodURL: string): string { +import { IDEOptions } from "@gitpod/gitpod-protocol/lib/ide-protocol"; +import * as ideOpts from "./ide-options.json" + +export declare interface UrlInfo { + host: string; + originUrl: string; + gitpodUrl: string; +} + +export function renderGitpodUrl(gitpodURL: string): UrlInfo { + // TODO: make sure we are not using gitpod.io + // since referer will been tracked and broke our tracking data + gitpodURL = "https://hw-9434-open-via-url.staging.gitpod-dev.com" const baseURL = `${window.location.protocol}//${window.location.host}`; - return `${gitpodURL}/#${baseURL}` + window.location.pathname + window.location.search; + const originUrl = baseURL + window.location.pathname + window.location.search + return { + originUrl, + host: gitpodURL, + gitpodUrl: `${gitpodURL}/#${originUrl}`, + }; +} + +const referrer = "browser-extension" +export function renderGitpodCustomEditor(gpHost: string, repoUrl: string, ide: string, useLatest: boolean) { + // TODO: make sure we are not using gitpod.io + // since referer will been tracked and broke our tracking data + gpHost = "https://hw-9434-open-via-url.staging.gitpod-dev.com" + return `${gpHost}/#editor:${ide}:${useLatest ? 'latest' : ''}:${referrer}/${repoUrl}` } export function isVisible(el: HTMLElement) { try { - const rect = el.getBoundingClientRect(); - if (rect.height === 0 && rect.width === 0) { - return false; - } - if (el.style.opacity === '0' || el.style.visibility === 'hidden') { - return false; - } - } catch {} + const rect = el.getBoundingClientRect(); + if (rect.height === 0 && rect.width === 0) { + return false; + } + if (el.style.opacity === '0' || el.style.visibility === 'hidden') { + return false; + } + } catch { } return true; } export function makeOpenInPopup(a: HTMLAnchorElement): void { a.onclick = () => !window.open(a.href, a.target, 'menubar=no,toolbar=no,location=no,dependent'); +} + +export function openInPopup(url: string, target: string): void { + !window.open(url, target, 'menubar=no,toolbar=no,location=no,dependent'); +} + +export const ideOptions = ideOpts as IDEOptions; + +export function createElementFromHTML(str: string): HTMLElement { + var div = document.createElement('div'); + div.innerHTML = str.trim(); + if (div.childNodes.length === 1) { + return div.childNodes.item(0) as HTMLElement + } + return div; } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 35070c7..1f74759 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,7 +20,8 @@ "sourceMap": false, "declaration": false, "declarationMap": false, - "skipLibCheck": true + "skipLibCheck": true, + "resolveJsonModule": true }, "include": [ "src" diff --git a/yarn.lock b/yarn.lock index fb3fe88..1da72ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,11 +2,45 @@ # yarn lockfile v1 +"@babel/runtime@^7.15.4": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" + integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== + dependencies: + regenerator-runtime "^0.13.4" + "@discoveryjs/json-ext@^0.5.0": version "0.5.2" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== +"@gitpod/gitpod-protocol@main": + version "0.1.5-main.2910" + resolved "https://registry.yarnpkg.com/@gitpod/gitpod-protocol/-/gitpod-protocol-0.1.5-main.2910.tgz#67d2138ccdbf01332990a8734af1b72c93f78651" + integrity sha512-lnJjO/GU4ZnLsiDCdPeTptvZGjC4xH91qkxzQud/YabeS4aX9JStvvlb3xHtbuDZoZL+IdXtzo72JaR3p8j1LA== + dependencies: + "@types/react" "17.0.32" + ajv "^6.5.4" + analytics-node "^4.0.1" + cookie "^0.4.2" + inversify "^5.1.1" + jaeger-client "^3.18.1" + js-yaml "^3.10.0" + opentracing "^0.14.5" + prom-client "^13.2.0" + random-number-csprng "^1.0.2" + react "17.0.2" + react-dom "17.0.2" + reconnecting-websocket "^4.4.0" + reflect-metadata "^0.1.13" + uuid "^8.3.2" + vscode-jsonrpc "^5.0.1" + vscode-languageserver-protocol "3.16.0" + vscode-languageserver-types "3.16.0" + vscode-uri "^1.0.1" + vscode-ws-jsonrpc "^0.2.0" + ws "^7.4.6" + "@nodelib/fs.scandir@2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" @@ -28,6 +62,14 @@ "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" +"@segment/loosely-validate-event@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz#87dfc979e5b4e7b82c5f1d8b722dfd5d77644681" + integrity sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw== + dependencies: + component-type "^1.2.1" + join-component "^1.1.0" + "@types/eslint-scope@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" @@ -64,6 +106,25 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.28.tgz#cade4b64f8438f588951a6b35843ce536853f25b" integrity sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g== +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/react@17.0.32": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.32.tgz#89a161286bbe2325d4d516420a27364a324909f4" + integrity sha512-hAm1pmwA3oZWbkB985RFwNvBRMG0F3KWSiC4/hNmanigKZMiKQoH5Q6etNw8HIDztTGfvXyOjPvdNnvBUCuaPg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + "@webassemblyjs/ast@1.11.0": version "1.11.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f" @@ -227,7 +288,7 @@ ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.12.5: +ajv@^6.12.5, ajv@^6.5.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -237,16 +298,57 @@ ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +analytics-node@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/analytics-node/-/analytics-node-4.0.1.tgz#f3d20738d4da1e4aa7236d654d9f580e254a7437" + integrity sha512-+zXOOTB+eTRW6R9+pfvPfk1dHraFJzhNnAyZiYJIDGOjHQgfk9qfqgoJX9MfR4qY0J/E1YJ3FBncrLGadTDW1A== + dependencies: + "@segment/loosely-validate-event" "^2.0.0" + axios "^0.21.1" + axios-retry "^3.0.2" + lodash.isstring "^4.0.1" + md5 "^2.2.1" + ms "^2.0.0" + remove-trailing-slash "^0.1.0" + uuid "^3.2.1" + +ansi-color@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-color/-/ansi-color-0.2.1.tgz#3e75c037475217544ed763a8db5709fa9ae5bf9a" + integrity sha1-PnXAN0dSF1RO12Oo21cJ+prlv5o= + ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +axios-retry@^3.0.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.2.4.tgz#f447a53c3456f5bfeca18f20c3a3272207d082ae" + integrity sha512-Co3UXiv4npi6lM963mfnuH90/YFLKWWDmoBYfxkHT5xtkSSWNqK9zdG3fw5/CP/dsoKB5aMMJCsgab+tp1OxLQ== + dependencies: + "@babel/runtime" "^7.15.4" + is-retry-allowed "^2.2.0" + +axios@^0.21.1: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -257,6 +359,16 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bintrees@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.1.tgz#0e655c9b9c2435eaab68bf4027226d2b55a34524" + integrity sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ= + +bluebird@^3.3.3: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -288,6 +400,16 @@ 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== +bufrw@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/bufrw/-/bufrw-1.3.0.tgz#28d6cfdaf34300376836310f5c31d57eeb40c8fa" + integrity sha512-jzQnSbdJqhIltU9O5KUiTtljP9ccw2u5ix59McQy4pV2xGhVLhRZIndY8GIrgh5HjXa6+QJ9AQhOd2QWQizJFQ== + dependencies: + ansi-color "^0.2.1" + error "^7.0.0" + hexer "^1.5.0" + xtend "^4.0.0" + camelcase@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" @@ -298,6 +420,11 @@ caniuse-lite@^1.0.30001219: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== +charenc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + chrome-trace-event@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" @@ -329,11 +456,21 @@ commander@^7.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.1.0.tgz#f2eaecf131f10e36e07d894698226e36ae0eb5ff" integrity sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg== +component-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-type/-/component-type-1.2.1.tgz#8a47901700238e4fc32269771230226f24b415a9" + integrity sha1-ikeQFwAjjk/DIml3EjAibyS0Fak= + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +cookie@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + copy-webpack-plugin@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-7.0.0.tgz#3506f867ca6e861ee2769d4deaf8fa0d2563ada9" @@ -348,6 +485,11 @@ copy-webpack-plugin@^7.0.0: schema-utils "^3.0.0" serialize-javascript "^5.0.1" +create-error@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/create-error/-/create-error-0.3.1.tgz#69810245a629e654432bf04377360003a5351a23" + integrity sha1-aYECRaYp5lRDK/BDdzYAA6U1GiM= + cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -357,6 +499,11 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypt@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + css-loader@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.0.2.tgz#24f758dae349bad0a440c50d7e2067742e0899cb" @@ -380,6 +527,11 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +csstype@^3.0.2: + version "3.0.11" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" + integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -422,6 +574,21 @@ envinfo@^7.7.3: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.4.tgz#c6311cdd38a0e86808c1c9343f667e4267c4a320" integrity sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ== +error@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + integrity sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI= + dependencies: + string-template "~0.2.1" + xtend "~4.0.0" + +error@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" + integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA== + dependencies: + string-template "~0.2.1" + es-module-lexer@^0.3.26: version "0.3.26" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.3.26.tgz#7b507044e97d5b03b01d4392c74ffeb9c177a83b" @@ -440,6 +607,11 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -526,6 +698,11 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" +follow-redirects@^1.14.0: + version "1.14.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" + integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -599,6 +776,16 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hexer@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/hexer/-/hexer-1.5.0.tgz#b86ce808598e8a9d1892c571f3cedd86fc9f0653" + integrity sha1-uGzoCFmOip0YksVx887dhvyfBlM= + dependencies: + ansi-color "^0.2.1" + minimist "^1.1.0" + process "^0.10.0" + xtend "^4.0.0" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -652,6 +839,16 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== +inversify@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.1.1.tgz#6fbd668c591337404e005a1946bfe0d802c08730" + integrity sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ== + +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== + is-core-module@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" @@ -683,6 +880,11 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-retry-allowed@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz#88f34cbd236e043e71b6932d09b0c65fb7b4d71d" + integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== + is-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" @@ -698,6 +900,17 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +jaeger-client@^3.18.1: + version "3.19.0" + resolved "https://registry.yarnpkg.com/jaeger-client/-/jaeger-client-3.19.0.tgz#9b5bd818ebd24e818616ee0f5cffe1722a53ae6e" + integrity sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw== + dependencies: + node-int64 "^0.4.0" + opentracing "^0.14.4" + thriftrw "^3.5.0" + uuid "^8.3.2" + xorshift "^1.1.1" + jest-worker@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" @@ -707,6 +920,24 @@ jest-worker@^26.6.2: merge-stream "^2.0.0" supports-color "^7.0.0" +join-component@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/join-component/-/join-component-1.1.0.tgz#b8417b750661a392bee2c2537c68b2a9d4977cd5" + integrity sha1-uEF7dQZho5K+4sJTfGiyqdSXfNU= + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.10.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -750,6 +981,23 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +long@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f" + integrity sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8= + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -757,6 +1005,15 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +md5@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== + dependencies: + charenc "0.0.2" + crypt "0.0.2" + is-buffer "~1.1.6" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -799,11 +1056,21 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimist@^1.1.0: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + 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== +ms@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + nanoid@^3.1.23: version "3.1.23" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" @@ -814,6 +1081,11 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + node-releases@^1.1.71: version "1.1.72" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" @@ -831,6 +1103,11 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -845,6 +1122,11 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +opentracing@^0.14.4, opentracing@^0.14.5: + version "0.14.7" + resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.7.tgz#25d472bd0296dc0b64d7b94cbc995219031428f5" + integrity sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -960,6 +1242,18 @@ postcss@^8.2.4: nanoid "^3.1.23" source-map-js "^0.6.2" +process@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/process/-/process-0.10.1.tgz#842457cc51cfed72dc775afeeafb8c6034372725" + integrity sha1-hCRXzFHP7XLcd1r+6vuMYDQ3JyU= + +prom-client@^13.2.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-13.2.0.tgz#99d13357912dd400f8911b77df19f7b328a93e92" + integrity sha512-wGr5mlNNdRNzEhRYXgboUU2LxHWIojxscJKmtG3R8f4/KiWqyYgXTLHs0+Ted7tG3zFT7pgHJbtomzZ1L0ARaQ== + dependencies: + tdigest "^0.1.1" + punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -970,6 +1264,14 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== +random-number-csprng@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/random-number-csprng/-/random-number-csprng-1.0.2.tgz#fcd120e62dffc2c07674c7c3fe01e16b25f73a26" + integrity sha1-/NEg5i3/wsB2dMfD/gHhayX3OiY= + dependencies: + bluebird "^3.3.3" + create-error "^0.3.1" + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -977,6 +1279,23 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +react-dom@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + rechoir@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" @@ -984,6 +1303,26 @@ rechoir@^0.7.0: dependencies: resolve "^1.9.0" +reconnecting-websocket@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz#3b0e5b96ef119e78a03135865b8bb0af1b948783" + integrity sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng== + +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +remove-trailing-slash@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz#be2285a59f39c74d1bce4f825950061915e3780d" + integrity sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -1033,6 +1372,14 @@ safe-buffer@^5.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" @@ -1127,6 +1474,16 @@ source-map@~0.7.2: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +string-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -1152,6 +1509,13 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== +tdigest@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.1.tgz#2e3cb2c39ea449e55d1e6cd91117accca4588021" + integrity sha1-Ljyyw56kSeVdHmzZEReszKRYgCE= + dependencies: + bintrees "1.0.1" + terser-webpack-plugin@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz#7effadee06f7ecfa093dbbd3e9ab23f5f3ed8673" @@ -1173,6 +1537,15 @@ terser@^5.5.1: source-map "~0.7.2" source-map-support "~0.5.19" +thriftrw@^3.5.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/thriftrw/-/thriftrw-3.12.0.tgz#30857847755e7f036b2e0a79d11c9f55075539d9" + integrity sha512-4YZvR4DPEI41n4Opwr4jmrLGG4hndxr7387kzRFIIzxHQjarPusH4lGXrugvgb7TtPrfZVTpZCVe44/xUxowEw== + dependencies: + bufrw "^1.3.0" + error "7.0.2" + long "^2.4.0" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1202,11 +1575,56 @@ util-deprecate@^1.0.2: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +uuid@^3.2.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + v8-compile-cache@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== +vscode-jsonrpc@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz#108bdb09b4400705176b957ceca9e0880e9b6d4e" + integrity sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg== + +vscode-jsonrpc@^5.0.0, vscode-jsonrpc@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794" + integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A== + +vscode-languageserver-protocol@3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz#34135b61a9091db972188a07d337406a3cdbe821" + integrity sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A== + dependencies: + vscode-jsonrpc "6.0.0" + vscode-languageserver-types "3.16.0" + +vscode-languageserver-types@3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz#ecf393fc121ec6974b2da3efb3155644c514e247" + integrity sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA== + +vscode-uri@^1.0.1: + version "1.0.8" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.8.tgz#9769aaececae4026fb6e22359cb38946580ded59" + integrity sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ== + +vscode-ws-jsonrpc@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-0.2.0.tgz#5e9c26e10da54a1a235da7d59e74508bbcb8edd9" + integrity sha512-NE9HNRgPjCaPyTJvIudcpyIWPImxwRDtuTX16yks7SAiZgSXigxAiZOvSvVBGmD1G/OMfrFo6BblOtjVR9DdVA== + dependencies: + vscode-jsonrpc "^5.0.0" + watchpack@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" @@ -1309,6 +1727,21 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +ws@^7.4.6: + version "7.5.7" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + +xorshift@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/xorshift/-/xorshift-1.2.0.tgz#30a4cdd8e9f8d09d959ed2a88c42a09c660e8148" + integrity sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g== + +xtend@^4.0.0, xtend@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"