diff --git a/.gitignore b/.gitignore index ac180b8954dd6..e1c9591c482a5 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,7 @@ lerna-debug.log coverage errorShots examples/*/src-gen -examples/*/webpack.config.js +examples/*/gen-webpack.config.js .browser_modules **/docs/api package-backup.json diff --git a/.gitpod.yml b/.gitpod.yml index e334dfcd62823..083104bfaf744 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -3,6 +3,8 @@ image: ports: - port: 3000 # Theia - port: 3030 # VS Code extension tests +- port: 9229 # Node.js debug port + onOpen: ignore - port: 9339 # Node.js debug port onOpen: ignore - port: 6080 diff --git a/NOTICE.md b/NOTICE.md index 8ae3cd9b42ab2..3c7aaa1c04c25 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -256,12 +256,6 @@ vscode-java-debug (0.15.0) * License: MIT -webdriverio (n/a) - -* License: MIT -* Project: http://webdriver.io/ -* Source: https://github.com/webdriverio/webdriverio.git - when (3.7.8) * License: MIT diff --git a/configs/mocha.opts b/configs/mocha.opts index ef23a43a792c7..fe572b0e6d792 100644 --- a/configs/mocha.opts +++ b/configs/mocha.opts @@ -3,3 +3,4 @@ --require reflect-metadata/Reflect --reporter spec --watch-extensions js +--exit diff --git a/dev-packages/application-manager/package.json b/dev-packages/application-manager/package.json index a5deb04487b94..2dc3b6f63f665 100644 --- a/dev-packages/application-manager/package.json +++ b/dev-packages/application-manager/package.json @@ -35,6 +35,7 @@ "@theia/application-package": "^0.14.0", "@theia/compression-webpack-plugin": "^3.0.0", "@types/fs-extra": "^4.0.2", + "@types/webpack": "^4.41.2", "babel-loader": "^8.0.6", "circular-dependency-plugin": "^5.0.0", "copy-webpack-plugin": "^4.5.0", diff --git a/dev-packages/application-manager/src/expose-loader.ts b/dev-packages/application-manager/src/expose-loader.ts new file mode 100644 index 0000000000000..95b3edbb301b1 --- /dev/null +++ b/dev-packages/application-manager/src/expose-loader.ts @@ -0,0 +1,73 @@ +/******************************************************************************** + * Copyright (C) 2019 TypeFox and others. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the Eclipse + * Public License v. 2.0 are satisfied: GNU General Public License, version 2 + * with the GNU Classpath Exception which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + ********************************************************************************/ + +import * as path from 'path'; +import * as webpack from 'webpack'; +// tslint:disable:no-implicit-dependencies +import { RawSourceMap } from 'source-map'; +import { ApplicationPackage } from '@theia/application-package/lib/application-package'; + +const modulePackages: { dir: string, name?: string }[] = []; +for (const extensionPackage of new ApplicationPackage({ projectPath: process.cwd() }).extensionPackages) { + modulePackages.push({ + name: extensionPackage.name, + dir: path.dirname(extensionPackage.raw.installed!.packagePath) + }); +} + +function exposeModule(modulePackage: { dir: string, name?: string }, resourcePath: string, source: string): string { + if (!modulePackage.name) { + return source; + } + const { dir, name } = path.parse(resourcePath); + let moduleName = path.join(modulePackage.name, dir.substring(modulePackage.dir.length)); + if (name !== 'index') { + moduleName = path.join(moduleName, name); + } + if (path.sep !== '/') { + moduleName = moduleName.split(path.sep).join('/'); + } + return source + `\nif (!global) global = {};\n(global['theia'] = global['theia'] || {})['${moduleName}'] = this;\n`; +} + +export = function (this: webpack.loader.LoaderContext, source: string, sourceMap?: RawSourceMap): string | undefined { + if (this.cacheable) { + this.cacheable(); + } + + let modulePackage = modulePackages.find(({ dir }) => this.resourcePath.startsWith(dir)); + if (modulePackage) { + this.callback(undefined, exposeModule(modulePackage, this.resourcePath, source), sourceMap); + return; + } + const index = this.resourcePath.lastIndexOf('/node_modules'); + if (index !== -1) { + const nodeModulesPath = this.resourcePath.substring(0, index + '/node_modules'.length); + let dir = this.resourcePath; + while ((dir = path.dirname(dir)) !== nodeModulesPath) { + try { + const { name } = require(path.join(dir, 'package.json')); + modulePackage = { name, dir }; + modulePackages.push(modulePackage); + this.callback(undefined, exposeModule(modulePackage, this.resourcePath, source), sourceMap); + return; + } catch { + /** no-op */ + } + } + } + this.callback(undefined, source, sourceMap); +}; diff --git a/dev-packages/application-manager/src/generator/frontend-generator.ts b/dev-packages/application-manager/src/generator/frontend-generator.ts index 816d8bd5aad38..68599e0d02981 100644 --- a/dev-packages/application-manager/src/generator/frontend-generator.ts +++ b/dev-packages/application-manager/src/generator/frontend-generator.ts @@ -88,6 +88,8 @@ function load(raw) { } function start() { + (window['theia'] = window['theia'] || {}).container = container; + const themeService = ThemeService.get(); themeService.loadUserTheme(); diff --git a/dev-packages/application-manager/src/generator/webpack-generator.ts b/dev-packages/application-manager/src/generator/webpack-generator.ts index d60cabb82ca86..555b6192212d7 100644 --- a/dev-packages/application-manager/src/generator/webpack-generator.ts +++ b/dev-packages/application-manager/src/generator/webpack-generator.ts @@ -15,24 +15,45 @@ ********************************************************************************/ import * as paths from 'path'; +import * as fs from 'fs-extra'; import { AbstractGenerator } from './abstract-generator'; export class WebpackGenerator extends AbstractGenerator { async generate(): Promise { - await this.write(this.configPath, this.compileWebpackConfig()); + await this.write(this.genConfigPath, this.compileWebpackConfig()); + if (await this.shouldGenerateUserWebpackConfig()) { + await this.write(this.configPath, this.compileUserWebpackConfig()); + } + } + + protected async shouldGenerateUserWebpackConfig(): Promise { + try { + const content = await fs.readFile(this.configPath, 'utf8'); + return content.indexOf('gen-webpack.config') === -1; + } catch { + return true; + } } get configPath(): string { return this.pck.path('webpack.config.js'); } + get genConfigPath(): string { + return this.pck.path('gen-webpack.config.js'); + } + protected resolve(moduleName: string, path: string): string { return this.pck.resolveModulePath(moduleName, path).split(paths.sep).join('/'); } protected compileWebpackConfig(): string { - return `// @ts-check + return `/** + * Don't touch this file. It will be renerated by theia build. + * To customize webpack configuration change ${this.configPath} + */ +// @ts-check const path = require('path'); const webpack = require('webpack'); const yargs = require('yargs'); @@ -201,4 +222,24 @@ module.exports = { };`; } + protected compileUserWebpackConfig(): string { + return `/** + * This file can be edited to customize webpack configuration. + * To reset delete this file and rerun yarn build again. + */ +// @ts-check +const config = require('${this.genConfigPath}'); + +/** + * Expose bundled modules on window.theia.moduleName namespace, e.g. + * window['theia']['@theia/core/lib/common/uri']. + * Such syntax can be used by external code, for instance, for testing. +config.module.rules.push({ + test: /\\.js$/, + loader: require.resolve('@theia/application-manager/lib/expose-loader') +}); */ + +module.exports = config;`; + } + } diff --git a/examples/api-tests/package.json b/examples/api-tests/package.json new file mode 100644 index 0000000000000..98db46089048c --- /dev/null +++ b/examples/api-tests/package.json @@ -0,0 +1,20 @@ +{ + "name": "@theia/api-tests", + "version": "0.14.0", + "description": "Theia API tests", + "dependencies": { + "@theia/core": "^0.14.0" + }, + "license": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0", + "repository": { + "type": "git", + "url": "https://github.com/eclipse-theia/theia.git" + }, + "bugs": { + "url": "https://github.com/eclipse-theia/theia/issues" + }, + "homepage": "https://github.com/eclipse-theia/theia", + "files": [ + "src" + ] +} diff --git a/examples/api-tests/src/editors.spec.js b/examples/api-tests/src/editors.spec.js new file mode 100644 index 0000000000000..8addb3597265a --- /dev/null +++ b/examples/api-tests/src/editors.spec.js @@ -0,0 +1,42 @@ +/******************************************************************************** + * Copyright (C) 2020 TypeFox and others. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the Eclipse + * Public License v. 2.0 are satisfied: GNU General Public License, version 2 + * with the GNU Classpath Exception which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + ********************************************************************************/ + +// @ts-check +describe('Editors', function () { + + const { assert } = chai; + + const { EditorManager } = require('@theia/editor/lib/browser/editor-manager'); + const Uri = require('@theia/core/lib/common/uri'); + const { WorkspaceService } = require('@theia/workspace/lib/browser/workspace-service'); + + /** @type {import('inversify').Container} */ + const container = window['theia'].container; + const editorManager = container.get(EditorManager); + const workspaceService = container.get(WorkspaceService); + + before(() => editorManager.closeAll()); + + it('open', async () => { + const root = (await workspaceService.roots)[0]; + assert.equal(editorManager.all.length, 0); + await editorManager.open(new Uri.default(root.uri).resolve('package.json'), { + mode: 'reveal' + }); + assert.equal(editorManager.all.length, 1); + }); + +}); diff --git a/examples/api-tests/src/menus.spec.js b/examples/api-tests/src/menus.spec.js new file mode 100644 index 0000000000000..06ffb0c42178d --- /dev/null +++ b/examples/api-tests/src/menus.spec.js @@ -0,0 +1,55 @@ +/******************************************************************************** + * Copyright (C) 2020 TypeFox and others. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the Eclipse + * Public License v. 2.0 are satisfied: GNU General Public License, version 2 + * with the GNU Classpath Exception which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + ********************************************************************************/ + +// @ts-check +describe('Menus', function () { + + const { MenuBarWidget } = require('@theia/core/lib/browser/menu/browser-menu-plugin'); + const { ApplicationShell } = require('@theia/core/lib/browser/shell/application-shell'); + const { CallHierarchyContribution } = require('@theia/callhierarchy/lib/browser/callhierarchy-contribution'); + const { FileNavigatorContribution } = require('@theia/navigator/lib/browser/navigator-contribution'); + const { ScmContribution } = require('@theia/scm/lib/browser/scm-contribution'); + const { GitHistoryContribution } = require('@theia/git/lib/browser/history/git-history-contribution'); + const { OutlineViewContribution } = require('@theia/outline-view/lib/browser/outline-view-contribution'); + const { OutputContribution } = require('@theia/output/lib/browser/output-contribution'); + const { PluginFrontendViewContribution } = require('@theia/plugin-ext/lib/main/browser/plugin-frontend-view-contribution'); + const { ProblemContribution } = require('@theia/markers/lib/browser/problem/problem-contribution'); + const { SearchInWorkspaceFrontendContribution } = require('@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-contribution'); + + /** @type {import('inversify').Container} */ + const container = window['theia'].container; + const shell = container.get(ApplicationShell); + const menuBar = /** @type {MenuBarWidget} */ (shell.topPanel.widgets.find(w => w instanceof MenuBarWidget)); + + for (const contribution of [ + container.get(CallHierarchyContribution), + container.get(FileNavigatorContribution), + container.get(ScmContribution), + container.get(GitHistoryContribution), + container.get(OutlineViewContribution), + container.get(OutputContribution), + container.get(PluginFrontendViewContribution), + container.get(ProblemContribution), + container.get(SearchInWorkspaceFrontendContribution) + ]) { + it(`should toggle '${contribution.viewLabel}' view`, async () => { + await contribution.closeView(); + await menuBar.triggerMenuItem('View', contribution.viewLabel); + await shell.waitForActivation(contribution.viewId); + }); + } + +}); diff --git a/examples/browser/test/main-page/main-page.ui-spec.ts b/examples/api-tests/src/shell.spec.js similarity index 51% rename from examples/browser/test/main-page/main-page.ui-spec.ts rename to examples/api-tests/src/shell.spec.js index 2a2bf70cabe5d..aad0f0ab59394 100644 --- a/examples/browser/test/main-page/main-page.ui-spec.ts +++ b/examples/api-tests/src/shell.spec.js @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2017 Ericsson and others. + * Copyright (C) 2020 TypeFox and others. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -14,37 +14,29 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -/* tslint:disable:no-unused-expression*/ -import { MainPage } from './main-page'; -import { expect } from 'chai'; +// @ts-check +describe('Shell', function () { -let mainPage: MainPage; -let driver: WebdriverIO.Client; + const { assert } = chai; -describe('theia main page', () => { + const { ApplicationShell } = require('@theia/core/lib/browser/shell/application-shell'); + const { StatusBarImpl } = require('@theia/core/lib/browser/status-bar'); - before(() => { - const url = '/'; - driver = browser; - driver.url(url); - mainPage = new MainPage(driver); - // Make sure that the application shell is loaded - mainPage.waitForStartup(); - }); + /** @type {import('inversify').Container} */ + const container = window['theia'].container; + const shell = container.get(ApplicationShell); + const statusBar = container.get(StatusBarImpl); - it('should show the application shell', () => { - expect(mainPage.applicationShellExists()).to.be.true; + it('should be shown', () => { + assert.isTrue(shell.isAttached && shell.isVisible); }); it('should show the main content panel', () => { - expect(mainPage.mainContentPanelExists()).to.be.true; - }); - - it('should show the left and right sidebars', () => { - expect(mainPage.rightSideBarExists() && mainPage.leftSideBarExists()).to.be.true; + assert.isTrue(shell.mainPanel.isAttached && shell.mainPanel.isVisible); }); it('should show the status bar', () => { - expect(mainPage.statusBarExists()).to.be.true; + assert.isTrue(statusBar.isAttached && statusBar.isVisible); }); + }); diff --git a/examples/api-tests/src/views.spec.js b/examples/api-tests/src/views.spec.js new file mode 100644 index 0000000000000..57b5bc32674ac --- /dev/null +++ b/examples/api-tests/src/views.spec.js @@ -0,0 +1,63 @@ +/******************************************************************************** + * Copyright (C) 2020 TypeFox and others. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the Eclipse + * Public License v. 2.0 are satisfied: GNU General Public License, version 2 + * with the GNU Classpath Exception which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + ********************************************************************************/ + +// @ts-check +describe('Views', function () { + + const { assert } = chai; + + const { ApplicationShell } = require('@theia/core/lib/browser/shell/application-shell'); + const { FileNavigatorContribution } = require('@theia/navigator/lib/browser/navigator-contribution'); + const { ScmContribution } = require('@theia/scm/lib/browser/scm-contribution'); + const { OutlineViewContribution } = require('@theia/outline-view/lib/browser/outline-view-contribution'); + + /** @type {import('inversify').Container} */ + const container = window['theia'].container; + const shell = container.get(ApplicationShell); + const navigatorContribution = container.get(FileNavigatorContribution); + const scmContribution = container.get(ScmContribution); + const outlineContribution = container.get(OutlineViewContribution); + + before(() => { + shell.leftPanelHandler.collapse(); + }); + + for (const contribution of [navigatorContribution, scmContribution, outlineContribution]) { + it(`should toggle ${contribution.viewLabel}`, async () => { + let view = await contribution.closeView(); + if (view) { + assert.notEqual(shell.getAreaFor(view), contribution.defaultViewOptions.area); + assert.isFalse(view.isVisible); + assert.notEqual(view, shell.activeWidget); + } + + view = await contribution.toggleView(); + assert.notEqual(view, undefined); + assert.equal(shell.getAreaFor(view), contribution.defaultViewOptions.area); + assert.isDefined(shell.getTabBarFor(view)); + assert.isTrue(view.isVisible); + assert.equal(view, shell.activeWidget); + + view = await contribution.toggleView(); + assert.notEqual(view, undefined); + assert.isUndefined(shell.getAreaFor(view)); + assert.isUndefined(shell.getTabBarFor(view)); + assert.isFalse(view.isVisible); + assert.notEqual(view, shell.activeWidget); + }); + } + +}); diff --git a/examples/browser/compile.tsconfig.json b/examples/browser/compile.tsconfig.json deleted file mode 100644 index 89bf8fec966b4..0000000000000 --- a/examples/browser/compile.tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../configs/base.tsconfig", - "compilerOptions": { - "outDir": "lib/test" - }, - "include": [ - "test" - ] -} diff --git a/examples/browser/coverage-webpack.config.js b/examples/browser/coverage-webpack.config.js deleted file mode 100644 index 3fda9dc32962e..0000000000000 --- a/examples/browser/coverage-webpack.config.js +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************** - * Copyright (C) 2017 Ericsson and others. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v. 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the Eclipse - * Public License v. 2.0 are satisfied: GNU General Public License, version 2 - * with the GNU Classpath Exception which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - ********************************************************************************/ - -let baseConfig = require('./webpack.config'); - -/* Filter out the .js loader to replace it with the istanbul one. - This way the code will be instrumented. */ -let filteredRules = baseConfig.module.rules.filter((value) => { - if (value.test.toString() !== /\.js$/.toString()) { - return true; - } - else { - return false; - } -}); - -let istanbulRules = [...filteredRules, -{ - test: /\.js$/, - use: { loader: 'istanbul-instrumenter-loader' }, - exclude: /node_modules|\.spec\.js$/, -}]; - -module.exports = baseConfig; -module.exports.module.rules = istanbulRules; diff --git a/examples/browser/package.json b/examples/browser/package.json index f890769ca85f5..08f0ee978d7db 100644 --- a/examples/browser/package.json +++ b/examples/browser/package.json @@ -63,18 +63,17 @@ }, "scripts": { "prepare": "yarn run clean && yarn build", - "clean": "theia clean && rimraf errorShots", - "build": "theiaext compile && theia build --mode development", - "watch": "concurrently -n compile,bundle \"theiaext watch --preserveWatchOutput\" \"theia build --watch --mode development\"", + "clean": "theia clean", + "build": "theia build --mode development", + "watch": "yarn build --watch", "start": "theia start --plugins=local-dir:../../plugins", "start:debug": "yarn start --log-level=debug", - "test": "wdio wdio.conf.js", - "test-non-headless": "wdio wdio-non-headless.conf.js", - "coverage:compile": "yarn build --config coverage-webpack.config.js", + "test": "node test/cli.js .", + "test:debug": "node --inspect test/cli.js .", "coverage:remap": "remap-istanbul -i coverage/coverage.json -o coverage/coverage-final.json --exclude 'frontend/index.js' && rimraf coverage/coverage.json", "coverage:report:html": "istanbul report --root coverage --format html", "coverage:report:lcov": "istanbul report --root coverage --format lcov", - "coverage": "yarn coverage:compile && yarn test && yarn coverage:remap && yarn coverage:report:lcov && yarn coverage:report:html" + "coverage": "yarn test && yarn coverage:remap && yarn coverage:report:lcov && yarn coverage:report:html" }, "devDependencies": { "@theia/cli": "^0.14.0" diff --git a/examples/browser/test/bottom-panel/bottom-panel.ts b/examples/browser/test/bottom-panel/bottom-panel.ts deleted file mode 100644 index f4e0e790460a8..0000000000000 --- a/examples/browser/test/bottom-panel/bottom-panel.ts +++ /dev/null @@ -1,81 +0,0 @@ -/******************************************************************************** - * Copyright (C) 2018 TypeFox and others. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v. 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the Eclipse - * Public License v. 2.0 are satisfied: GNU General Public License, version 2 - * with the GNU Classpath Exception which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - ********************************************************************************/ - -import 'webdriverio'; - -export class BottomPanel { - - constructor(protected readonly driver: WebdriverIO.Client) { } - - doesTabExist(tabName: string): boolean { - return this.driver.element('#theia-bottom-content-panel .p-TabBar .p-TabBar-content').isExisting(`div=${tabName}`); - } - - isTabActive(tabName: string): boolean { - const tab = this.driver.element('#theia-bottom-content-panel .p-TabBar .p-TabBar-content').element(`div=${tabName}`); - /* Check if the parent li container has the p-mod-current class which makes it active*/ - return (tab.$('..').getAttribute('class').split(' ').indexOf('p-mod-current') > -1); - } - - openTab(tabName: string): void { - this.driver.element('#theia-bottom-content-panel .p-TabBar .p-TabBar-content').click(`div=${tabName}`); - } - - isTerminalVisible(): boolean { - return this.driver.isExisting('.p-Widget div.terminal.xterm'); - } - - waitForTerminal(): void { - this.driver.waitForExist('.p-Widget div.terminal.xterm'); - // Wait for animations to finish - this.driver.pause(300); - } - - isProblemsViewVisible(): boolean { - return this.driver.isExisting('.p-Widget div.theia-marker-container'); - } - - waitForProblemsView(): void { - this.driver.waitForExist('.p-Widget div.theia-marker-container'); - // Wait for animations to finish - this.driver.pause(300); - } - - isCallHierarchyViewVisible(): boolean { - return this.driver.isExisting('#callhierarchy'); - } - - waitForCallHierarchyView(): void { - this.driver.waitForExist('#callhierarchy'); - // Wait for animations to finish - this.driver.pause(300); - } - - isOutputViewVisible(): boolean { - return this.driver.isExisting('.p-Widget div.theia-output'); - } - - waitForOutputView(): void { - this.driver.waitForExist('.p-Widget div.theia-output'); - // Wait for animations to finish - this.driver.pause(300); - } - - closeCurrentView(): void { - this.driver.click('#theia-bottom-content-panel .p-TabBar-tab.p-mod-current .p-TabBar-tabCloseIcon'); - } - -} diff --git a/examples/browser/test/cli.js b/examples/browser/test/cli.js new file mode 100644 index 0000000000000..13910f1eb3d75 --- /dev/null +++ b/examples/browser/test/cli.js @@ -0,0 +1,11 @@ +// @ts-check +const { DEBUG_MODE } = require('@theia/core/lib/node/debug'); +require('./run-test')({ + launch: { + args: ['--no-sandbox'], + devtools: DEBUG_MODE + }, + collectFiles: { + spec: ['../api-tests/src/*.spec.js'] + } +}); diff --git a/examples/browser/test/left-panel/left-panel.ts b/examples/browser/test/left-panel/left-panel.ts deleted file mode 100644 index ae444495f5c0f..0000000000000 --- a/examples/browser/test/left-panel/left-panel.ts +++ /dev/null @@ -1,126 +0,0 @@ -/******************************************************************************** - * Copyright (C) 2017-2018 Ericsson and others. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v. 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the Eclipse - * Public License v. 2.0 are satisfied: GNU General Public License, version 2 - * with the GNU Classpath Exception which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - ********************************************************************************/ - -import 'webdriverio'; - -export class LeftPanel { - - constructor(protected readonly driver: WebdriverIO.Client) { } - - doesTabExist(tabName: string): boolean { - return this.driver.element('.p-TabBar.theia-app-left .p-TabBar-content').isExisting(`div*=${tabName}`); - } - - isTabActive(tabName: string): boolean { - const tab = this.driver.element('.p-TabBar.theia-app-left .p-TabBar-content').element(`div*=${tabName}`); - /* Check if the parent li container has the p-mod-current class which makes it active */ - return (tab.$('..').getAttribute('class').split(' ').indexOf('p-mod-current') !== -1); - } - - openCloseTab(tabName: string): void { - this.driver.element('.p-TabBar.theia-app-left .p-TabBar-content').element(`div*=${tabName}`).click('..'); - // Wait for animations to finish - this.driver.pause(300); - } - - collapseTab(tabName: string): void { - this.driver.element('.p-TabBar.theia-app-left .p-TabBar-content').rightClick(`div*=${tabName}`); - this.driver.element('.p-Widget.p-Menu .p-Menu-content').click('div=Collapse'); - } - - isFileTreeVisible(): boolean { - return (this.driver.isExisting('#files') && this.driver.element('#files').getAttribute('class').split(' ').indexOf('p-mod-hidden') === -1 - && this.isPanelVisible()); - } - - waitForFilesViewVisible(): void { - this.driver.waitForVisible('#files'); - // Wait for animations to finish - this.driver.pause(300); - } - - /** - * Click on the first node named `name` in the files view to expand or - * collapse it. No check is done to make sure this node actually exists or - * represents a directory. - */ - toggleDirectoryInFilesView(name: string): void { - this.waitForFilesViewVisible(); - const files = this.driver.element('#files'); - const element = files.element('div=' + name); - element.click(); - this.driver.pause(300); - } - - /** - * Double click on the first node named `name` in the files view to open - * it. Not check is done to make sure this node actually exists or - * represents a file. - */ - openFileInFilesView(name: string): void { - this.waitForFilesViewVisible(); - const files = this.driver.element('#files'); - const element = files.element('div=' + name); - element.doubleClick(); - this.driver.pause(300); - } - - isScmContainerVisible(): boolean { - return (this.driver.isExisting('#scm-view-container') && this.driver.element('#scm-view-container').getAttribute('class').split(' ').indexOf('p-mod-hidden') === -1 - && this.isPanelVisible()); - } - - waitForScmViewVisible(): void { - this.driver.waitForVisible('#scm-view-container'); - // Wait for animations to finish - this.driver.pause(300); - } - - isGitHistoryContainerVisible(): boolean { - return (this.driver.isExisting('#git-history') && this.driver.element('#git-history').getAttribute('class').split(' ').indexOf('p-mod-hidden') === -1 - && this.isPanelVisible()); - } - - waitForGitHistoryViewVisible(): void { - this.driver.waitForVisible('#git-history'); - // Wait for animations to finish - this.driver.pause(300); - } - - isPluginsViewVisible(): boolean { - return this.driver.isExisting('.p-Widget div.theia-output') && this.driver.element('#plugins').getAttribute('class').split(' ').indexOf('p-mod-hidden') === -1; - } - - waitForPluginsViewVisible(): void { - this.driver.waitForVisible('#plugins'); - // Wait for animations to finish - this.driver.pause(300); - } - - isSearchViewVisible(): boolean { - return this.driver.isExisting('#search-in-workspace') && this.driver.element('#search-in-workspace').getAttribute('class').split(' ').indexOf('p-mod-hidden') === -1; - } - - waitForSearchViewVisible(): void { - this.driver.waitForVisible('#search-in-workspace'); - // Wait for animations to finish - this.driver.pause(300); - } - - protected isPanelVisible(): boolean { - return (this.driver.element('#theia-left-side-panel').getAttribute('class').split(' ').indexOf('p-mod-hidden') === -1); - } -} diff --git a/examples/browser/test/left-panel/left-panel.ui-spec.ts b/examples/browser/test/left-panel/left-panel.ui-spec.ts deleted file mode 100644 index 4beae14bdb367..0000000000000 --- a/examples/browser/test/left-panel/left-panel.ui-spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -/******************************************************************************** - * Copyright (C) 2017 Ericsson and others. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v. 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the Eclipse - * Public License v. 2.0 are satisfied: GNU General Public License, version 2 - * with the GNU Classpath Exception which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - ********************************************************************************/ - -/* tslint:disable:no-unused-expression*/ -import { expect } from 'chai'; -import { LeftPanel } from './left-panel'; -import { MainPage } from '../main-page/main-page'; -let leftPanel: LeftPanel; -let mainPage: MainPage; - -before(() => { - const driver = browser; - const url = '/'; - - driver.url(url); - leftPanel = new LeftPanel(driver); - mainPage = new MainPage(driver); - // Make sure that the application shell is loaded - mainPage.waitForStartup(); -}); - -describe('theia left panel', () => { - it("should show 'Explorer' and 'SCM'", () => { - expect(leftPanel.doesTabExist('Explorer')).to.be.true; - expect(leftPanel.doesTabExist('Source Control')).to.be.true; - }); - - describe('files tab', () => { - it('should open/close the files tab', () => { - leftPanel.openCloseTab('Explorer'); - expect(leftPanel.isFileTreeVisible()).to.be.true; - expect(leftPanel.isTabActive('Explorer')).to.be.true; - - leftPanel.openCloseTab('Explorer'); - expect(leftPanel.isFileTreeVisible()).to.be.false; - expect(leftPanel.isTabActive('Explorer')).to.be.false; - }); - }); - - describe('SCM tab', () => { - it('should open/close the SCM tab', () => { - leftPanel.openCloseTab('Source Control'); - expect(leftPanel.isScmContainerVisible()).to.be.true; - expect(leftPanel.isTabActive('Source Control')).to.be.true; - - leftPanel.openCloseTab('Source Control'); - expect(leftPanel.isScmContainerVisible()).to.be.false; - expect(leftPanel.isTabActive('Source Control')).to.be.false; - }); - }); -}); diff --git a/examples/browser/test/main-page/main-page.ts b/examples/browser/test/main-page/main-page.ts deleted file mode 100644 index c573c5d4fb95d..0000000000000 --- a/examples/browser/test/main-page/main-page.ts +++ /dev/null @@ -1,66 +0,0 @@ -/******************************************************************************** - * Copyright (C) 2017 Ericsson and others. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v. 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the Eclipse - * Public License v. 2.0 are satisfied: GNU General Public License, version 2 - * with the GNU Classpath Exception which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - ********************************************************************************/ - -import 'webdriverio'; -import { TopPanel } from '../top-panel/top-panel'; -import { LeftPanel } from '../left-panel/left-panel'; - -export class MainPage { - - protected readonly topPanel: TopPanel; - protected readonly leftPanel: LeftPanel; - - constructor(protected readonly driver: WebdriverIO.Client) { - this.topPanel = new TopPanel(driver); - this.leftPanel = new LeftPanel(driver); - } - - applicationShellExists(): boolean { - return this.driver.waitForExist('#theia-app-shell'); - } - - waitForStartup(): void { - this.driver.waitUntil(() => !this.driver.isExisting('.theia-preload')); - } - - mainContentPanelExists(): boolean { - return this.driver.waitForExist('#theia-main-content-panel'); - } - - theiaTopPanelExists(): boolean { - return this.driver.waitForExist('#theia-top-panel'); - } - - rightSideBarExists(): boolean { - return this.driver.waitForExist('div.p-TabBar.theia-app-right'); - } - - leftSideBarExists(): boolean { - return this.driver.waitForExist('div.p-TabBar.theia-app-left'); - } - - statusBarExists(): boolean { - return this.driver.waitForExist('div#theia-statusBar'); - } - - closeAll(): void { - /* Make sure that all the "docked" layouts are closed */ - while (this.driver.isExisting('.p-Widget.p-TabBar .p-TabBar-tab.p-mod-closable')) { - this.driver.rightClick('.p-Widget.p-TabBar .p-TabBar-tab.p-mod-closable'); - this.driver.element('.p-Widget.p-Menu .p-Menu-content').click('div=Close All'); - } - } -} diff --git a/examples/browser/test/right-panel/right-panel.ts b/examples/browser/test/right-panel/right-panel.ts deleted file mode 100644 index 9e1852650e285..0000000000000 --- a/examples/browser/test/right-panel/right-panel.ts +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************** - * Copyright (C) 2018 Ericsson and others. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v. 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the Eclipse - * Public License v. 2.0 are satisfied: GNU General Public License, version 2 - * with the GNU Classpath Exception which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - ********************************************************************************/ - -import 'webdriverio'; - -export class RightPanel { - - constructor(protected readonly driver: WebdriverIO.Client) { } - - doesTabExist(tabName: string): boolean { - return this.driver.element('.p-TabBar.theia-app-right .p-TabBar-content').isExisting(`div=${tabName}`); - } - - isTabActive(tabName: string): boolean { - const tab = this.driver.element('.p-TabBar.theia-app-right .p-TabBar-content').element(`div=${tabName}`); - /* Check if the parent li container has the p-mod-current class which makes it active */ - return (tab.$('..').getAttribute('class').split(' ').indexOf('p-mod-current') !== -1); - } - - openCloseTab(tabName: string): void { - this.driver.element('.p-TabBar.theia-app-right .p-TabBar-content').element(`div=${tabName}`).click('..'); - // Wait for animations to finish - this.driver.pause(300); - } - - collapseTab(tabName: string): void { - this.driver.element('.p-TabBar.theia-app-right .p-TabBar-content').rightClick(`div=${tabName}`); - this.driver.element('.p-Widget.p-Menu .p-Menu-content').click('div=Collapse'); - } - - isOutlineViewVisible(): boolean { - return (this.isPanelVisible() && this.driver.isExisting('#outline-view')); - } - - waitForOutlineViewVisible(): void { - this.driver.waitForVisible('#outline-view'); - // Wait for animations to finish - this.driver.pause(300); - } - - protected isPanelVisible(): boolean { - return (this.driver.element('#theia-right-side-panel').getAttribute('class').split(' ').indexOf('p-mod-hidden') === -1); - } -} diff --git a/examples/browser/test/right-panel/right-panel.ui-spec.ts b/examples/browser/test/right-panel/right-panel.ui-spec.ts deleted file mode 100644 index ac6ce45d784e4..0000000000000 --- a/examples/browser/test/right-panel/right-panel.ui-spec.ts +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************** - * Copyright (C) 2018 Ericsson and others. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v. 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the Eclipse - * Public License v. 2.0 are satisfied: GNU General Public License, version 2 - * with the GNU Classpath Exception which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - ********************************************************************************/ - -/* tslint:disable:no-unused-expression*/ -import { expect } from 'chai'; -import { RightPanel } from './right-panel'; -import { MainPage } from '../main-page/main-page'; -let rightPanel: RightPanel; -let mainPage: MainPage; - -before(() => { - const driver = browser; - const url = '/'; - - driver.url(url); - rightPanel = new RightPanel(driver); - mainPage = new MainPage(driver); - // Make sure that the application shell is loaded - mainPage.waitForStartup(); -}); - -describe('theia right panel', () => { - it("should show 'Outline'", () => { - expect(rightPanel.doesTabExist('Outline')).to.be.true; - }); - - describe('outline tab', () => { - it('should open/close the outline tab', () => { - rightPanel.openCloseTab('Outline'); - expect(rightPanel.isOutlineViewVisible()).to.be.true; - expect(rightPanel.isTabActive('Outline')).to.be.true; - - rightPanel.openCloseTab('Outline'); - expect(rightPanel.isOutlineViewVisible()).to.be.false; - expect(rightPanel.isTabActive('Outline')).to.be.false; - }); - }); - -}); diff --git a/examples/browser/test/run-test.js b/examples/browser/test/run-test.js new file mode 100644 index 0000000000000..034310dfd7e19 --- /dev/null +++ b/examples/browser/test/run-test.js @@ -0,0 +1,115 @@ +// @ts-check + +/** + * @typedef {Object} TestOptions + * @property {import('puppeteer').LaunchOptions} launch + * @property {Partial[0]>} collectFiles + */ + +/** + * @param {Partial} [options] + */ +module.exports = async options => { + const launch = options && options.launch; + const collectFiles = { + ignore: options && options.collectFiles && options.collectFiles.ignore || [], + extension: options && options.collectFiles && options.collectFiles.extension || [], + file: options && options.collectFiles && options.collectFiles.file || [], + recursive: options && options.collectFiles && options.collectFiles.recursive || false, + sort: options && options.collectFiles && options.collectFiles.sort || false, + spec: options && options.collectFiles && options.collectFiles.spec || [] + }; + const exit = !(launch && launch.devtools); + + // quick check whether test files exist + require('mocha/lib/cli/collect-files')(collectFiles); + const puppeteer = require('puppeteer'); + + const address = await require('../src-gen/backend/main'); + const browser = await puppeteer.launch(launch); + + const page = await browser.newPage(); + page.on('dialog', dialog => dialog.dismiss()); + page.on('pageerror', console.error); + + let theiaLoaded = false; + page.exposeFunction('fireDidUnloadTheia', () => theiaLoaded = false); + const preLoad = () => { + if (theiaLoaded) { + return; + } + console.log('loading chai...'); + theiaLoaded = true; + page.addScriptTag({ path: require.resolve('chai/chai.js') }); + page.evaluate(() => + window.addEventListener('beforeunload', () => window['fireDidUnloadTheia']()) + ); + } + page.on('frameattached', preLoad); + page.on('framenavigated', preLoad); + + page.on('load', async () => { + console.log('loading mocha...'); + // replace console.log by theia logger for mocha + await page.waitForFunction(() => !!window['theia']['@theia/core/lib/common/logger'].logger, { + timeout: 30 * 1000 + }); + await page.addScriptTag({ path: require.resolve('mocha/mocha.js') }); + await page.waitForFunction(() => !!window['chai'] && !!window['mocha'] && !!window['theia'].container, { timeout: 30 * 1000 }); + + console.log('loading Theia...'); + await page.evaluate(async () => { + /** @type {import('@theia/core/lib/browser/frontend-application-state')} */ + const { FrontendApplicationStateService } = window['theia']['@theia/core/lib/browser/frontend-application-state']; + /** @type {import('@theia/core/lib/browser/preferences/preference-service')} */ + const { PreferenceService } = window['theia']['@theia/core/lib/browser/preferences/preference-service']; + /** @type {import('@theia/workspace/lib/browser/workspace-service')} */ + const { WorkspaceService } = window['theia']['@theia/workspace/lib/browser/workspace-service']; + + /** @type {import('inversify').Container} */ + const container = window['theia'].container; + const frontendApplicationState = container.get(FrontendApplicationStateService); + /** @type {import('@theia/core/lib/browser/preferences/preference-service').PreferenceService} */ + const preferenceService = container.get(PreferenceService); + const workspaceService = container.get(WorkspaceService); + + await Promise.all([ + frontendApplicationState.reachedState('ready'), + preferenceService.ready, + workspaceService.roots + ]); + }); + + console.log('loading test files...'); + await page.evaluate(async () => { + /** + * @param {string} moduleName + * @returns {any} + */ + function theiaRequire(moduleName) { + return window['theia'][moduleName]; + } + // replace require to load modules from theia namespace + window['require'] = theiaRequire; + mocha.setup({ + reporter: 'spec', + ui: 'bdd', + useColors: true + }); + }); + const files = require('mocha/lib/cli/collect-files')(collectFiles); + for (const file of files) { + await page.addScriptTag({ path: file }); + } + + console.log('running test files...'); + const failures = await page.evaluate(() => + new Promise(resolve => mocha.run(resolve)) + ); + if (exit) { + await page.close(); + process.exit(failures > 0 ? 1 : 0); + } + }); + page.goto(`http://${address.address}:${address.port}`); +} diff --git a/examples/browser/test/top-panel/top-panel.ts b/examples/browser/test/top-panel/top-panel.ts deleted file mode 100644 index ca2c8f377127b..0000000000000 --- a/examples/browser/test/top-panel/top-panel.ts +++ /dev/null @@ -1,116 +0,0 @@ -/******************************************************************************** - * Copyright (C) 2017-2018 Ericsson and others. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v. 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the Eclipse - * Public License v. 2.0 are satisfied: GNU General Public License, version 2 - * with the GNU Classpath Exception which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - ********************************************************************************/ - -import 'webdriverio'; - -export class TopPanel { - - public constructor(protected readonly driver: WebdriverIO.Client) { } - - exists(): boolean { - return this.driver.isExisting('div#theia-top-panel'); - } - - openNewTerminal(): void { - this.clickMenuTab('Terminal'); - this.clickSubMenu('New Terminal'); - } - - toggleCallHierarchyView(): void { - this.clickMenuTab('View'); - this.clickSubMenu('Call Hierarchy'); - } - - toggleFilesView(): void { - this.clickMenuTab('View'); - this.clickSubMenu('Explorer'); - } - - toggleScmView(): void { - this.clickMenuTab('View'); - this.clickSubMenu('SCM'); - } - - toggleGitHistoryView(): void { - this.clickMenuTab('View'); - this.clickSubMenu('Git History'); - } - - toggleOutlineView(): void { - this.clickMenuTab('View'); - this.clickSubMenu('Outline'); - } - - toggleOutputView(): void { - this.clickMenuTab('View'); - this.clickSubMenu('Output'); - } - - openPluginsView(): void { - this.clickMenuTab('View'); - this.clickSubMenu('Plugins'); - } - - openProblemsView(): void { - this.clickMenuTab('View'); - this.clickSubMenu('Problems'); - } - - toggleSearchView(): void { - this.clickMenuTab('View'); - this.clickSubMenu('Search'); - } - - waitForSubMenu(): void { - this.driver.waitForExist('div.p-Widget.p-Menu.p-MenuBar-menu'); - } - - isSubMenuVisible(): boolean { - return this.driver.isExisting('div.p-Widget.p-Menu.p-MenuBar-menu'); - } - - clickMenuTab(tab: number | string): void { - if (typeof tab === 'string') { - this.driver.element('ul.p-MenuBar-content').click(`div=${tab}`); - } else { - this.driver.click(`ul.p-MenuBar-content > .p-MenuBar-item:nth-child(${tab})`); - } - } - - clickSubMenu(subMenuItem: string): void { - this.driver.element('div.p-Widget.p-Menu.p-MenuBar-menu .p-Menu-content').click(`div=${subMenuItem}`); - } - - hoverMenuTab(tabNumber: number): void { - this.driver.moveToObject(`ul.p-MenuBar-content > .p-MenuBar-item:nth-child(${tabNumber})`); - } - - isTabActive(tabNumber: number): boolean { - return this.driver.isExisting(`ul.p-MenuBar-content > .p-mod-active.p-MenuBar-item:nth-child(${tabNumber}`); - } - - isMenuActive(): boolean { - return this.driver.isExisting('#theia\\:menubar.p-mod-active'); - } - - getxBarTabPosition(tabNumber: number): WebdriverIO.Client & number { - return this.driver.getLocation(`ul.p-MenuBar-content > .p-MenuBar-item:nth-child(${tabNumber}`, 'x'); - } - - getxSubMenuPosition(): number { - return this.driver.getLocation('div.p-Widget.p-Menu.p-MenuBar-menu', 'x'); - } -} diff --git a/examples/browser/test/top-panel/top-panel.ui-spec.ts b/examples/browser/test/top-panel/top-panel.ui-spec.ts deleted file mode 100644 index 40bb67a132719..0000000000000 --- a/examples/browser/test/top-panel/top-panel.ui-spec.ts +++ /dev/null @@ -1,244 +0,0 @@ -/******************************************************************************** - * Copyright (C) 2017-2018 Ericsson and others. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v. 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the Eclipse - * Public License v. 2.0 are satisfied: GNU General Public License, version 2 - * with the GNU Classpath Exception which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - ********************************************************************************/ - -/* tslint:disable:no-unused-expression*/ -import { expect } from 'chai'; -import { TopPanel } from './top-panel'; -import { BottomPanel } from '../bottom-panel/bottom-panel'; -import { RightPanel } from '../right-panel/right-panel'; -import { LeftPanel } from '../left-panel/left-panel'; -import { MainPage } from '../main-page/main-page'; -let topPanel: TopPanel; -let bottomPanel: BottomPanel; -let rightPanel: RightPanel; -let leftPanel: LeftPanel; -let mainPage: MainPage; - -before(() => { - const driver = browser; - const url = '/'; - - driver.url(url); - driver.localStorage('DELETE'); - driver.refresh(); - topPanel = new TopPanel(driver); - bottomPanel = new BottomPanel(driver); - rightPanel = new RightPanel(driver); - leftPanel = new LeftPanel(driver); - mainPage = new MainPage(driver); - // Make sure that the application shell is loaded - mainPage.waitForStartup(); -}); - -describe('theia top panel (menubar)', () => { - it('should show the top panel', () => { - expect(topPanel.exists()).to.be.true; - }); - - it('should set a menu item active when hovered', () => { - topPanel.hoverMenuTab(1); - expect(topPanel.isTabActive(1)).to.be.true; - - topPanel.hoverMenuTab(2); - expect(topPanel.isTabActive(1)).to.be.false; - expect(topPanel.isTabActive(2)).to.be.true; - }); - - it('should show menu correctly when clicked on a tab', () => { - /* No menu at the start */ - expect(topPanel.isSubMenuVisible()).to.be.false; - - /* Click on the first child */ - topPanel.clickMenuTab(1); - expect(topPanel.isSubMenuVisible()).to.be.true; - - /* Click again to make the menu disappear */ - topPanel.clickMenuTab(1); - expect(topPanel.isSubMenuVisible()).to.be.false; - - /* Make sure the menu location is directly under the bar tab */ - topPanel.clickMenuTab(1); - let tabX = topPanel.getxBarTabPosition(1); - let menuX = topPanel.getxSubMenuPosition(); - expect(tabX).to.be.equal(menuX); - - /* Test with the second tab by hovering to the second one */ - topPanel.hoverMenuTab(2); - tabX = topPanel.getxBarTabPosition(2); - menuX = topPanel.getxSubMenuPosition(); - expect(tabX).to.be.equal(menuX); - - topPanel.clickMenuTab(2); - expect(topPanel.isSubMenuVisible()).to.be.false; - - }); - - describe('terminal UI', () => { - it('should open a new terminal and then close it', () => { - if (!bottomPanel.isTerminalVisible()) { - topPanel.openNewTerminal(); - bottomPanel.waitForTerminal(); - } - expect(bottomPanel.isTerminalVisible()).to.be.true; - - bottomPanel.closeCurrentView(); - expect(bottomPanel.isTerminalVisible()).to.be.false; - }); - }); - - describe('call hierarchy view UI', () => { - it('should start with call hierarchy view not visible', () => { - expect(bottomPanel.isCallHierarchyViewVisible()).to.be.false; - }); - it('call hierarchy view should toggle-on then toggle-off', () => { - if (!bottomPanel.isCallHierarchyViewVisible()) { - topPanel.toggleCallHierarchyView(); - bottomPanel.waitForCallHierarchyView(); - } - expect(bottomPanel.isCallHierarchyViewVisible()).to.be.true; - topPanel.toggleCallHierarchyView(); - expect(bottomPanel.isCallHierarchyViewVisible()).to.be.false; - }); - }); - - describe('files view UI', () => { - it('should start with files view not visible', () => { - expect(leftPanel.isFileTreeVisible()).to.be.false; - }); - it('files view should toggle-on then toggle-off', () => { - if (!leftPanel.isFileTreeVisible()) { - topPanel.toggleFilesView(); - leftPanel.waitForFilesViewVisible(); - } - expect(leftPanel.isFileTreeVisible()).to.be.true; - topPanel.toggleFilesView(); - expect(leftPanel.isFileTreeVisible()).to.be.false; - }); - }); - - describe('scm view UI', () => { - // re-enable if/when we reset workbench layout between tests - // it('should start with scm view not visible', () => { - // expect(leftPanel.isScmContainerVisible()).to.be.false; - // }); - it('scm view should toggle-on then toggle-off', () => { - if (!leftPanel.isScmContainerVisible()) { - topPanel.toggleScmView(); - leftPanel.waitForScmViewVisible(); - } - expect(leftPanel.isScmContainerVisible()).to.be.true; - topPanel.toggleScmView(); - expect(leftPanel.isScmContainerVisible()).to.be.false; - }); - }); - - describe('git history view UI', () => { - it('should start with git history view not visible', () => { - expect(leftPanel.isGitHistoryContainerVisible()).to.be.false; - }); - it('git history view should toggle-on then toggle-off', () => { - if (!leftPanel.isGitHistoryContainerVisible()) { - topPanel.toggleGitHistoryView(); - leftPanel.waitForGitHistoryViewVisible(); - } - expect(leftPanel.isGitHistoryContainerVisible()).to.be.true; - topPanel.toggleGitHistoryView(); - expect(leftPanel.isGitHistoryContainerVisible()).to.be.false; - }); - }); - - describe('outline view UI', () => { - const tabName = 'Outline'; - it('should start with outline view tab already created', () => { - expect(rightPanel.doesTabExist(tabName)).to.be.true; - }); - it('should start with outline view not visible', () => { - expect(rightPanel.isOutlineViewVisible()).to.be.false; - }); - it('should start with outline view tab not active', () => { - expect(rightPanel.isTabActive(tabName)).to.be.false; - }); - it('outline view should toggle-on then toggle-off', () => { - if (!rightPanel.isOutlineViewVisible()) { - topPanel.toggleOutlineView(); - rightPanel.waitForOutlineViewVisible(); - } - expect(rightPanel.isOutlineViewVisible()).to.be.true; - - topPanel.toggleOutlineView(); - expect(rightPanel.isOutlineViewVisible()).to.be.false; - }); - }); - - describe('output view UI', () => { - it('should start with output view not visible', () => { - expect(leftPanel.isFileTreeVisible()).to.be.false; - }); - it('output view should toggle-on then toggle-off', () => { - if (!bottomPanel.isOutputViewVisible()) { - topPanel.toggleOutputView(); - bottomPanel.waitForOutputView(); - } - expect(bottomPanel.isOutputViewVisible()).to.be.true; - topPanel.toggleOutputView(); - expect(bottomPanel.isOutputViewVisible()).to.be.false; - }); - }); - - describe('plugins view UI', () => { - it('should start with plugins view not visible', () => { - expect(leftPanel.isFileTreeVisible()).to.be.false; - }); - it('plugins view should toggle-on then toggle-off', () => { - if (!bottomPanel.isOutputViewVisible()) { - topPanel.toggleOutputView(); - bottomPanel.waitForOutputView(); - } - expect(bottomPanel.isOutputViewVisible()).to.be.true; - topPanel.toggleOutputView(); - expect(bottomPanel.isOutputViewVisible()).to.be.false; - }); - }); - - describe('problems view UI', () => { - it('should open a new problems view and then close it', () => { - if (!bottomPanel.isProblemsViewVisible()) { - topPanel.openProblemsView(); - bottomPanel.waitForProblemsView(); - } - expect(bottomPanel.isProblemsViewVisible()).to.be.true; - - bottomPanel.closeCurrentView(); - expect(bottomPanel.isProblemsViewVisible()).to.be.false; - }); - }); - - describe('search view UI', () => { - it('should start with search view visible', () => { - expect(leftPanel.isSearchViewVisible()).to.be.true; - }); - it('search view should toggle-on then toggle-off', () => { - if (!leftPanel.isSearchViewVisible()) { - topPanel.toggleSearchView(); - leftPanel.waitForSearchViewVisible(); - } - expect(leftPanel.isSearchViewVisible()).to.be.true; - topPanel.toggleSearchView(); - expect(leftPanel.isSearchViewVisible()).to.be.false; - }); - }); - -}); diff --git a/examples/browser/test/utils.ts b/examples/browser/test/utils.ts deleted file mode 100644 index 5fd418012b1ec..0000000000000 --- a/examples/browser/test/utils.ts +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************** - * Copyright (C) 2018 Ericsson and others. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v. 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the Eclipse - * Public License v. 2.0 are satisfied: GNU General Public License, version 2 - * with the GNU Classpath Exception which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - ********************************************************************************/ - -/** - * Get the workspace root from the process' arguments. - */ -export function getWorkspaceRoot(): string { - const rootDirFlagIndex = process.argv.indexOf('--theia-root-dir'); - if (rootDirFlagIndex === -1) { - throw new Error('--theia-root-dir argument not specified.'); - } - - const rootDirValIndex = rootDirFlagIndex + 1; - if (rootDirFlagIndex >= process.argv.length) { - throw new Error('Missing argument to --theia-root-dir'); - } - - return process.argv[rootDirValIndex]; -} diff --git a/examples/browser/wdio-non-headless.conf.js b/examples/browser/wdio-non-headless.conf.js deleted file mode 100644 index 887263d91c8de..0000000000000 --- a/examples/browser/wdio-non-headless.conf.js +++ /dev/null @@ -1,3 +0,0 @@ -const wdio = require('./wdio.base.conf.js'); - -exports.config = wdio.makeConfig(false); diff --git a/examples/browser/wdio.base.conf.js b/examples/browser/wdio.base.conf.js deleted file mode 100644 index a21116b3e81e2..0000000000000 --- a/examples/browser/wdio.base.conf.js +++ /dev/null @@ -1,288 +0,0 @@ -// @ts-check  -const http = require('http'); -const path = require('path'); -const temp = require('temp'); - -const wdioRunnerScript = require.resolve('webdriverio/build/lib/runner.js'); - -// Remove .track() if you'd like to keep the workspace and other temporary -// files after running the tests. -const temptrack = temp.track(); - -/** - * WebdriverIO will execute this current script first to setup the tests, - * and it will re-execute it for every test workers (subprocesses). - * This means that if we are to set a random port for Theia's backend in the master process, - * we have to pass the port value to the child processes. - * This is done via command line arguments: the following lines fetch the port passed - * to the script, it should be set by the master process for the children, - * but you can also specify it manually by doing `yarn test --theia-port 4000` from - * `examples/browser`. - */ -const cliPortKey = '--theia-port'; -const cliPortIndex = process.argv.indexOf(cliPortKey); -const masterPort = cliPortIndex > -1 ? process.argv[cliPortIndex + 1] : 0; // 0 if master -if (typeof masterPort === 'undefined') { - throw new Error(`${cliPortKey} expects a number as following argument`); -} - -const port = masterPort; -const host = 'localhost'; - -function makeConfig(headless) { - return { - // - // ================== - // Specify Test Files - // ================== - // Define which test specs should run. The pattern is relative to the directory - // from which `wdio` was called. Notice that, if you are calling `wdio` from an - // NPM script (see https://docs.npmjs.com/cli/run-script) then the current working - // directory is where your package.json resides, so `wdio` will be called from there. - // - specs: [ - './lib/test/**/*spec.js' - ], - // Patterns to exclude. - exclude: [ - // 'path/to/excluded/files' - ], - // - // ============ - // Capabilities - // ============ - // Define your capabilities here. WebdriverIO can run multiple capabilities at the same - // time. Depending on the number of capabilities, WebdriverIO launches several test - // sessions. Within your capabilities you can overwrite the spec and exclude options in - // order to group specific specs to a specific capability. - // - // First, you can define how many instances should be started at the same time. Let's - // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have - // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec - // files and you set maxInstances to 10, all spec files will get tested at the same time - // and 30 processes will get spawned. The property handles how many capabilities - // from the same test should run tests. - // - maxInstances: 10, - // - // If you have trouble getting all important capabilities together, check out the - // Sauce Labs platform configurator - a great tool to configure your capabilities: - // https://docs.saucelabs.com/reference/platforms-configurator - // - capabilities: [{ - // maxInstances can get overwritten per capability. So if you have an in-house Selenium - // grid with only 5 firefox instances available you can make sure that not more than - // 5 instances get started at a time. - maxInstances: 5, - browserName: 'chrome', - chromeOptions: { - args: headless ? ['--headless', '--disable-gpu'] : [], - }, - }], - // - // =================== - // Test Configurations - // =================== - // Define all options that are relevant for the WebdriverIO instance here - // - // By default WebdriverIO commands are executed in a synchronous way using - // the wdio-sync package. If you still want to run your tests in an async way - // e.g. using promises you can set the sync option to false. - sync: true, - // - // Level of logging verbosity: silent | verbose | command | data | result | error - logLevel: 'error', - // - // Enables colors for log output. - coloredLogs: true, - // - // If you only want to run your tests until a specific amount of tests have failed use - // bail (default is 0 - don't bail, run all tests). - bail: 0, - // - // Saves a screenshot to a given path if a command fails. - screenshotPath: './errorShots/', - // - // Dismiss deprecation warning messages when running tests. - deprecationWarnings: false, - // - // Set a base URL in order to shorten url command calls. If your url parameter starts - // with "/", then the base url gets prepended. - baseUrl: `http://${host}:${port}`, - // - // Default timeout for all waitFor* commands. - waitforTimeout: 60000, - // - // Default timeout in milliseconds for request - // if Selenium Grid doesn't send response - connectionRetryTimeout: 90000, - // - // Default request retries count - connectionRetryCount: 3, - // - // Initialize the browser instance with a WebdriverIO plugin. The object should have the - // plugin name as key and the desired plugin options as properties. Make sure you have - // the plugin installed before running any tests. The following plugins are currently - // available: - // WebdriverCSS: https://github.com/webdriverio/webdrivercss - // WebdriverRTC: https://github.com/webdriverio/webdriverrtc - // Browserevent: https://github.com/webdriverio/browserevent - // plugins: { - // webdrivercss: { - // screenshotRoot: 'my-shots', - // failedComparisonsRoot: 'diffs', - // misMatchTolerance: 0.05, - // screenWidth: [320,480,640,1024] - // }, - // webdriverrtc: {}, - // browserevent: {} - // }, - // - // Test runner services - // Services take over a specific job you don't want to take care of. They enhance - // your test setup with almost no effort. Unlike plugins, they don't add new - // commands. Instead, they hook themselves up into the test process. - services: ['selenium-standalone'], - seleniumArgs: { - seleniumArgs: ["-port", "4444"], - javaArgs: ["-Xmx1024m", "-Djna.nosys=true"], - drivers: { - chrome: { - version: '2.35' - } - } - }, - seleniumInstallArgs: { - drivers: { - chrome: { - version: '2.35' - } - } - }, - // - // Framework you want to run your specs with. - // The following are supported: Mocha, Jasmine, and Cucumber - // see also: http://webdriver.io/guide/testrunner/frameworks.html - // - // Make sure you have the wdio adapter package for the specific framework installed - // before running any tests. - framework: 'mocha', - // - // Test reporter for stdout. - // The only one supported by default is 'dot' - // see also: http://webdriver.io/guide/testrunner/reporters.html - reporters: ['spec'], - - // - // Options to be passed to Mocha. - // See the full list at http://mochajs.org/ - mochaOpts: { - ui: 'bdd', - requires: ['reflect-metadata/Reflect'], - watch: 'js', - timeout: 60000, - }, - // - // ===== - // Hooks - // ===== - // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance - // it and to build services around it. You can either apply a single function or an array of - // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got - // resolved to continue. - // - // Gets executed once before all workers get launched. - onPrepare: function (config, capabilities) { - // Modify process.argv so that the server (which is in the - // master process) starts with a temporary directory as the - // workspace. - const rootDir = temptrack.mkdirSync(); - const argv = [process.argv[0], 'src-gen/backend/server.js', '--root-dir=' + rootDir]; - return require('./src-gen/backend/server')(port, host, argv).then(created => { - this.execArgv = [wdioRunnerScript, cliPortKey, created.address().port, - '--theia-root-dir', rootDir - ]; - this.server = created; - }); - }, - // Gets executed after all workers got shut down and the process is about to exit. It is not - // possible to defer the end of the process using a promise. - onComplete: function (exitCode) { - if (this.server) { - this.server.close(); - } - }, - // - // Gets executed just before initialising the webdriver session and test framework. It allows you - // to manipulate configurations depending on the capability or spec. - // beforeSession: function (config, capabilities, specs) { - // }, - // - // Gets executed before test execution begins. At this point you can access all global - // variables, such as `browser`. It is the perfect place to define custom commands. - // before: function (capabilities, specs) { - // }, - // - // Hook that gets executed before the suite starts - // beforeSuite: function (suite) { - // }, - // - // Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling - // beforeEach in Mocha) - // beforeHook: function () { - // }, - // - // Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling - // afterEach in Mocha) - // afterHook: function () { - // }, - // - // Function to be executed before a test (in Mocha/Jasmine) or a step (in Cucumber) starts. - // beforeTest: function (test) { - // }, - // - // Runs before a WebdriverIO command gets executed. - // beforeCommand: function (commandName, args) { - // }, - // - // Runs after a WebdriverIO command gets executed - // afterCommand: function (commandName, args, result, error) { - // }, - // - // Function to be executed after a test (in Mocha/Jasmine) or a step (in Cucumber) starts. - // afterTest: function (test) { - // }, - // - // Hook that gets executed after the suite has ended - afterSuite: function (suite) { - require("webdriverio"); - var fs = require("fs"); - let result; - try { - result = browser.execute("return window.__coverage__;"); - } catch (error) { - console.error(`Error retrieving the coverage: ${error}`); - return; - } - try { - if (!fs.existsSync('coverage')) { - fs.mkdirSync('coverage'); - } - fs.writeFileSync('coverage/coverage.json', JSON.stringify(result.value)); - } catch (err) { - console.error(`Error writing coverage ${err}`); - }; - }, - // - // Gets executed after all tests are done. You still have access to all global variables from - // the test. - // after: function (result, capabilities, specs) { - // }, - // - // Gets executed right after terminating the webdriver session. - // afterSession: function (config, capabilities, specs) { - // }, - } -} - -exports.makeConfig = makeConfig; diff --git a/examples/browser/wdio.conf.js b/examples/browser/wdio.conf.js deleted file mode 100644 index 06cd1f11772f3..0000000000000 --- a/examples/browser/wdio.conf.js +++ /dev/null @@ -1,3 +0,0 @@ -const wdio = require('./wdio.base.conf.js'); - -exports.config = wdio.makeConfig(true); diff --git a/examples/browser/webpack.config.js b/examples/browser/webpack.config.js new file mode 100644 index 0000000000000..ca9b17a91fd5d --- /dev/null +++ b/examples/browser/webpack.config.js @@ -0,0 +1,18 @@ +/** + * This file can be edited to customize webpack configuration. + * In to reset delete this file and rerun yarn build again. + */ +// @ts-check +const config = require('/workspace/theia/examples/browser/gen-webpack.config.js'); + +/** + * Expose bundled modules on window.theia.moduleName namespace, e.g. + * window['theia']['@theia/core/lib/common/uri']. + * Such syntax can be used by external code, for instance, for testing. + */ +config.module.rules.push({ + test: /\.js$/, + loader: require.resolve('@theia/application-manager/lib/expose-loader') +}); + +module.exports = config; diff --git a/examples/electron/package.json b/examples/electron/package.json index cff097033782b..db0347ce02843 100644 --- a/examples/electron/package.json +++ b/examples/electron/package.json @@ -64,8 +64,7 @@ "watch": "concurrently -n compile,bundle \"theiaext watch --preserveWatchOutput\" \"theia build --watch --mode development\"", "start": "theia start --plugins=local-dir:../../plugins", "start:debug": "yarn start --log-level=debug", - "test": "electron-mocha --timeout 60000 \"./lib/test/**/*.espec.js\"", - "test:ui": "wdio wdio.conf.js" + "test": "electron-mocha --timeout 60000 \"./lib/test/**/*.espec.js\"" }, "devDependencies": { "@theia/cli": "^0.14.0" diff --git a/examples/electron/webpack.config.js b/examples/electron/webpack.config.js new file mode 100644 index 0000000000000..54131df9e758f --- /dev/null +++ b/examples/electron/webpack.config.js @@ -0,0 +1,17 @@ +/** + * This file can be edited to customize webpack configuration. + * In to reset delete this file and rerun yarn build again. + */ +// @ts-check +const config = require('/workspace/theia/examples/electron/gen-webpack.config.js'); + +/** + * Expose bundled modules on window.theia.moduleName namespace, e.g. + * window['theia']['@theia/core/lib/common/uri']. + * Such syntax can be used by external code, for instance, for testing. +config.module.rules.push({ + test: /\.js$/, + loader: require.resolve('@theia/application-manager/lib/expose-loader') +}); */ + +module.exports = config; \ No newline at end of file diff --git a/package.json b/package.json index 45919cd515932..c9e9dc5ee1f30 100644 --- a/package.json +++ b/package.json @@ -11,16 +11,16 @@ "**/vscode-json-languageserver/**/vscode-languageserver": "6.0.0-next.1" }, "devDependencies": { - "@types/chai": "^4.0.1", + "@types/chai": "^4.2.7", "@types/chai-string": "^1.4.0", "@types/jsdom": "^11.0.4", - "@types/mocha": "^2.2.41", + "@types/mocha": "^5.2.7", "@types/node": "~10.3.6", + "@types/puppeteer": "^2.0.0", "@types/sinon": "^2.3.5", "@types/temp": "^0.8.29", "@types/uuid": "^3.4.3", - "@types/webdriverio": "^4.7.0", - "chai": "^4.1.0", + "chai": "^4.2.0", "chai-string": "^1.4.0", "concurrently": "^3.5.0", "electron-mocha": "~3.5.0", @@ -29,8 +29,9 @@ "istanbul-instrumenter-loader": "^3.0.1", "jsdom": "^11.5.1", "lerna": "^2.2.0", - "mocha": "^3.4.2", + "mocha": "^7.0.0", "nyc": "^11.0.3", + "puppeteer": "^2.0.0", "remap-istanbul": "^0.9.5", "rimraf": "^2.6.1", "sinon": "^3.3.0", @@ -40,11 +41,7 @@ "typedoc": "^0.15.0-0", "typedoc-plugin-external-module-map": "^1.0.0", "typescript": "~3.5.3", - "uuid": "^3.2.1", - "wdio-mocha-framework": "0.6.4", - "wdio-selenium-standalone-service": "0.0.12", - "wdio-spec-reporter": "0.1.5", - "webdriverio": "4.14.1" + "uuid": "^3.2.1" }, "scripts": { "postinstall": "node scripts/post-install.js", diff --git a/packages/core/src/browser/menu/browser-menu-plugin.ts b/packages/core/src/browser/menu/browser-menu-plugin.ts index 6b8d1bf388fc1..4459f8baddfbc 100644 --- a/packages/core/src/browser/menu/browser-menu-plugin.ts +++ b/packages/core/src/browser/menu/browser-menu-plugin.ts @@ -17,7 +17,7 @@ // tslint:disable:no-any import { injectable, inject } from 'inversify'; -import { MenuBar as MenuBarWidget, Menu as MenuWidget, Widget } from '@phosphor/widgets'; +import { MenuBar, Menu as MenuWidget, Widget } from '@phosphor/widgets'; import { CommandRegistry as PhosphorCommandRegistry } from '@phosphor/commands'; import { CommandRegistry, ActionMenuNode, CompositeMenuNode, @@ -27,6 +27,12 @@ import { KeybindingRegistry } from '../keybinding'; import { FrontendApplicationContribution, FrontendApplication } from '../frontend-application'; import { ContextKeyService } from '../context-key-service'; import { ContextMenuContext } from './context-menu-context'; +import { waitForRevealed } from '../widgets'; + +export abstract class MenuBarWidget extends MenuBar { + abstract activateMenu(label: string, ...labels: string[]): Promise; + abstract triggerMenuItem(label: string, ...labels: string[]): Promise; +} @injectable() export class BrowserMainMenuFactory { @@ -145,6 +151,46 @@ class DynamicMenuBarWidget extends MenuBarWidget { }; } + async activateMenu(label: string, ...labels: string[]): Promise { + const menu = this.menus.find(m => m.title.label === label); + if (!menu) { + throw new Error(`could not find '${label}' menu`); + } + this.activeMenu = menu; + this.openActiveMenu(); + await waitForRevealed(menu); + + const menuPath = [label]; + + let current = menu; + for (const itemLabel of labels) { + const item = current.items.find(i => i.label === itemLabel); + if (!item || !item.submenu) { + throw new Error(`could not find '${label}' submenu in ${menuPath.map(l => "'" + l + "'").join(' -> ')} menu`); + } + current.activeItem = item; + current.triggerActiveItem(); + current = item.submenu; + await waitForRevealed(current); + } + return current; + } + + async triggerMenuItem(label: string, ...labels: string[]): Promise { + if (!labels.length) { + throw new Error('menu item label is not specified'); + } + const menuPath = [label, ...labels.slice(0, labels.length - 1)]; + const menu = await this.activateMenu(menuPath[0], ...menuPath.slice(1)); + const item = menu.items.find(i => i.label === labels[labels.length - 1]); + if (!item) { + throw new Error(`could not find '${label}' item in ${menuPath.map(l => "'" + l + "'").join(' -> ')} menu`); + } + menu.activeItem = item; + menu.triggerActiveItem(); + return item; + } + } /** * A menu widget that would recompute its items on update diff --git a/packages/core/src/browser/preferences/preference-service.spec.ts b/packages/core/src/browser/preferences/preference-service.spec.ts index 4f47ecec3a563..601c41478f96b 100644 --- a/packages/core/src/browser/preferences/preference-service.spec.ts +++ b/packages/core/src/browser/preferences/preference-service.spec.ts @@ -101,9 +101,11 @@ describe('Preference Service', () => { if (pref) { expect(pref.preferenceName).eq('testPref'); expect(pref.newValue).eq('newVal'); - return done(); + done(); + return; } - return done(new Error('onPreferenceChanged() fails to return any preference change infomation')); + done(new Error('onPreferenceChanged() fails to return any preference change infomation')); + return; }); userProvider.emitPreferencesChangedEvent({ diff --git a/packages/core/src/browser/shell/application-shell.ts b/packages/core/src/browser/shell/application-shell.ts index 27f63b3034c98..dc614b4c0b69a 100644 --- a/packages/core/src/browser/shell/application-shell.ts +++ b/packages/core/src/browser/shell/application-shell.ts @@ -34,6 +34,7 @@ import { FrontendApplicationStateService } from '../frontend-application-state'; import { TabBarToolbarRegistry, TabBarToolbarFactory, TabBarToolbar } from './tab-bar-toolbar'; import { ContextKeyService } from '../context-key-service'; import { Emitter } from '../../common/event'; +import { waitForRevealed, waitForClosed } from '../widgets'; /** The class name added to ApplicationShell instances. */ const APPLICATION_SHELL_CLASS = 'theia-ApplicationShell'; @@ -155,7 +156,7 @@ export class ApplicationShell extends Widget { /** * The fixed-size panel shown on top. This one usually holds the main menu. */ - protected topPanel: Panel; + readonly topPanel: Panel; /** * The current state of the bottom panel. @@ -942,7 +943,7 @@ export class ApplicationShell extends Widget { * * @returns the activated widget if it was found */ - activateWidget(id: string): Widget | undefined { + async activateWidget(id: string): Promise { const stack = this.toTrackedStack(id); let current = stack.pop(); if (current && !this.doActivateWidget(current.id)) { @@ -957,9 +958,31 @@ export class ApplicationShell extends Widget { current = child; } } + if (!current) { + return undefined; + } + await Promise.all([ + this.waitForActivation(current.id), + waitForRevealed(current), + this.pendingUpdates + ]); return current; } + waitForActivation(id: string): Promise { + if (this.activeWidget && this.activeWidget.id === id) { + return Promise.resolve(); + } + return new Promise(resolve => { + const toDispose = this.onDidChangeActiveWidget(() => { + if (this.activeWidget && this.activeWidget.id === id) { + toDispose.dispose(); + resolve(); + } + }); + }); + } + /** * Activate top-level area widget. */ @@ -1035,7 +1058,7 @@ export class ApplicationShell extends Widget { * * @returns the revealed widget if it was found */ - revealWidget(id: string): Widget | undefined { + async revealWidget(id: string): Promise { const stack = this.toTrackedStack(id); let current = stack.pop(); if (current && !this.doRevealWidget(current.id)) { @@ -1049,6 +1072,13 @@ export class ApplicationShell extends Widget { current = child; } } + if (!current) { + return undefined; + } + await Promise.all([ + waitForRevealed(current), + this.pendingUpdates + ]); return current; } @@ -1266,6 +1296,20 @@ export class ApplicationShell extends Widget { } } + async closeWidget(id: string): Promise { + const stack = this.toTrackedStack(id); + const widget = this.toTrackedStack(id).pop(); + if (!widget) { + return undefined; + } + widget.close(); + await Promise.all([ + waitForClosed(widget), + this.pendingUpdates + ]); + return stack[0] || widget; + } + /** * The shell area name of the currently active tab, or undefined. */ @@ -1280,7 +1324,11 @@ export class ApplicationShell extends Widget { * Determine the name of the shell area where the given widget resides. The result is * undefined if the widget does not reside directly in the shell. */ - getAreaFor(widget: Widget): ApplicationShell.Area | undefined { + getAreaFor(input: Widget): ApplicationShell.Area | undefined { + const widget = this.toTrackedStack(input.id).pop(); + if (!widget) { + return undefined; + } if (widget instanceof TabBar) { if (find(this.mainPanel.tabBars(), tb => tb === widget)) { return 'main'; @@ -1314,7 +1362,11 @@ export class ApplicationShell extends Widget { return undefined; } - protected getAreaPanelFor(widget: Widget): DockPanel | undefined { + protected getAreaPanelFor(input: Widget): DockPanel | undefined { + const widget = this.toTrackedStack(input.id).pop(); + if (!widget) { + return undefined; + } const title = widget.title; const mainPanelTabBar = this.mainPanel.findTabBar(title); if (mainPanelTabBar) { @@ -1360,25 +1412,29 @@ export class ApplicationShell extends Widget { default: throw new Error('Illegal argument: ' + widgetOrArea); } - } else if (widgetOrArea && widgetOrArea.isAttached) { - const widgetTitle = widgetOrArea.title; - const mainPanelTabBar = this.mainPanel.findTabBar(widgetTitle); - if (mainPanelTabBar) { - return mainPanelTabBar; - } - const bottomPanelTabBar = this.bottomPanel.findTabBar(widgetTitle); - if (bottomPanelTabBar) { - return bottomPanelTabBar; - } - const leftPanelTabBar = this.leftPanelHandler.tabBar; - if (ArrayExt.firstIndexOf(leftPanelTabBar.titles, widgetTitle) > -1) { - return leftPanelTabBar; - } - const rightPanelTabBar = this.rightPanelHandler.tabBar; - if (ArrayExt.firstIndexOf(rightPanelTabBar.titles, widgetTitle) > -1) { - return rightPanelTabBar; - } } + const widget = this.toTrackedStack(widgetOrArea.id).pop(); + if (!widget) { + return undefined; + } + const widgetTitle = widget.title; + const mainPanelTabBar = this.mainPanel.findTabBar(widgetTitle); + if (mainPanelTabBar) { + return mainPanelTabBar; + } + const bottomPanelTabBar = this.bottomPanel.findTabBar(widgetTitle); + if (bottomPanelTabBar) { + return bottomPanelTabBar; + } + const leftPanelTabBar = this.leftPanelHandler.tabBar; + if (ArrayExt.firstIndexOf(leftPanelTabBar.titles, widgetTitle) > -1) { + return leftPanelTabBar; + } + const rightPanelTabBar = this.rightPanelHandler.tabBar; + if (ArrayExt.firstIndexOf(rightPanelTabBar.titles, widgetTitle) > -1) { + return rightPanelTabBar; + } + return undefined; } /** diff --git a/packages/core/src/browser/shell/view-contribution.ts b/packages/core/src/browser/shell/view-contribution.ts index 64be46aead525..9670c2a43ee36 100644 --- a/packages/core/src/browser/shell/view-contribution.ts +++ b/packages/core/src/browser/shell/view-contribution.ts @@ -70,39 +70,51 @@ export abstract class AbstractViewContribution implements Comm if (options.toggleCommandId) { this.toggleCommand = { id: options.toggleCommandId, - label: 'Toggle ' + options.widgetName + ' View' + label: 'Toggle ' + this.viewLabel + ' View' }; } } + get viewId(): string { + return this.options.widgetId; + } + + get viewLabel(): string { + return this.options.widgetName; + } + + get defaultViewOptions(): ApplicationShell.WidgetOptions { + return this.options.defaultWidgetOptions; + } + get widget(): Promise { - return this.widgetManager.getOrCreateWidget(this.options.widgetId); + return this.widgetManager.getOrCreateWidget(this.viewId); } tryGetWidget(): T | undefined { - return this.widgetManager.tryGetWidget(this.options.widgetId); + return this.widgetManager.tryGetWidget(this.viewId); } async openView(args: Partial = {}): Promise { const shell = this.shell; - const widget = await this.widgetManager.getOrCreateWidget(this.options.viewContainerId || this.options.widgetId); + const widget = await this.widgetManager.getOrCreateWidget(this.options.viewContainerId || this.viewId); const tabBar = shell.getTabBarFor(widget); const area = shell.getAreaFor(widget); if (!tabBar) { // The widget is not attached yet, so add it to the shell const widgetArgs: OpenViewArguments = { - ...this.options.defaultWidgetOptions, + ...this.defaultViewOptions, ...args }; await shell.addWidget(widget, widgetArgs); } else if (args.toggle && area && shell.isExpanded(area) && tabBar.currentTitle === widget.title) { // The widget is attached and visible, so close it (toggle) - widget.close(); + await this.closeView(); } if (widget.isAttached && args.activate) { - shell.activateWidget(this.options.widgetId); + await shell.activateWidget(this.viewId); } else if (widget.isAttached && args.reveal) { - shell.revealWidget(this.options.widgetId); + await shell.revealWidget(this.viewId); } return this.widget; } @@ -110,23 +122,32 @@ export abstract class AbstractViewContribution implements Comm registerCommands(commands: CommandRegistry): void { if (this.toggleCommand) { commands.registerCommand(this.toggleCommand, { - execute: () => this.openView({ - toggle: true, - activate: true - }) + execute: () => this.toggleView() }); } this.quickView.registerItem({ - label: this.options.widgetName, + label: this.viewLabel, open: () => this.openView({ activate: true }) }); } + async closeView(): Promise { + const widget = await this.shell.closeWidget(this.viewId); + return widget as T | undefined; + } + + toggleView(): Promise { + return this.openView({ + toggle: true, + activate: true + }); + } + registerMenus(menus: MenuModelRegistry): void { if (this.toggleCommand) { menus.registerMenuAction(CommonMenus.VIEW_VIEWS, { commandId: this.toggleCommand.id, - label: this.options.widgetName + label: this.viewLabel }); } } diff --git a/packages/core/src/browser/widget-open-handler.ts b/packages/core/src/browser/widget-open-handler.ts index 02440e74ef988..bfe00ba905ba7 100644 --- a/packages/core/src/browser/widget-open-handler.ts +++ b/packages/core/src/browser/widget-open-handler.ts @@ -15,7 +15,6 @@ ********************************************************************************/ import { inject, postConstruct, injectable } from 'inversify'; -import { Widget, FocusTracker } from '@phosphor/widgets'; import URI from '../common/uri'; import { MaybePromise, Emitter, Event } from '../common'; import { BaseWidget } from './widgets'; @@ -90,45 +89,11 @@ export abstract class WidgetOpenHandler implements OpenHan if (!widget.isAttached) { this.shell.addWidget(widget, op.widgetOptions || { area: 'main' }); } - const promises: Promise[] = []; if (op.mode === 'activate') { - promises.push(this.onActive(widget)); - promises.push(this.onReveal(widget)); - this.shell.activateWidget(widget.id); + await this.shell.activateWidget(widget.id); } else if (op.mode === 'reveal') { - promises.push(this.onReveal(widget)); - this.shell.revealWidget(widget.id); + await this.shell.revealWidget(widget.id); } - await Promise.all(promises); - } - protected onActive(widget: W): Promise { - if (this.shell.activeWidget === widget) { - return Promise.resolve(); - } - return new Promise(resolve => { - const listener = (shell: ApplicationShell, args: FocusTracker.IChangedArgs) => { - if (args.newValue === widget) { - this.shell.activeChanged.disconnect(listener); - resolve(); - } - }; - this.shell.activeChanged.connect(listener); - }); - } - protected onReveal(widget: W): Promise { - if (widget.isVisible) { - return new Promise(resolve => window.requestAnimationFrame(() => resolve())); - } - return new Promise(resolve => { - const waitForVisible = () => window.requestAnimationFrame(() => { - if (widget.isVisible) { - window.requestAnimationFrame(() => resolve()); - } else { - waitForVisible(); - } - }); - waitForVisible(); - }); } /** @@ -166,4 +131,17 @@ export abstract class WidgetOpenHandler implements OpenHan protected abstract createWidgetOptions(uri: URI, options?: WidgetOpenerOptions): Object; + async closeAll(): Promise { + const allClosed: W[] = []; + await Promise.all( + [this.all.map(async widget => { + const closed = await this.shell.closeWidget(widget.id); + if (closed) { + allClosed.push(closed as W); + } + })] + ); + return allClosed; + } + } diff --git a/packages/core/src/browser/widgets/widget.ts b/packages/core/src/browser/widgets/widget.ts index b06ef9ef50984..249a8b82849d0 100644 --- a/packages/core/src/browser/widgets/widget.ts +++ b/packages/core/src/browser/widgets/widget.ts @@ -255,3 +255,27 @@ export function addClipboardListener(element document.removeEventListener(type, documentListener) ); } + +export function waitForClosed(widget: Widget): Promise { + return waitForVisible(widget, false); +} + +export function waitForRevealed(widget: Widget): Promise { + return waitForVisible(widget, true); +} + +function waitForVisible(widget: Widget, visible: boolean): Promise { + if (widget.isAttached === visible && (widget.isVisible === visible || (widget.node.style.visibility !== 'hidden') === visible)) { + return new Promise(resolve => window.requestAnimationFrame(() => resolve())); + } + return new Promise(resolve => { + const waitFor = () => window.requestAnimationFrame(() => { + if (widget.isAttached === visible && (widget.isVisible === visible || (widget.node.style.visibility !== 'hidden') === visible)) { + window.requestAnimationFrame(() => resolve()); + } else { + waitFor(); + } + }); + waitFor(); + }); +} diff --git a/packages/scm/src/browser/scm-amend-component.tsx b/packages/scm/src/browser/scm-amend-component.tsx index c7921075e4cc7..c6bc68981267f 100644 --- a/packages/scm/src/browser/scm-amend-component.tsx +++ b/packages/scm/src/browser/scm-amend-component.tsx @@ -19,7 +19,7 @@ import '../../src/browser/style/scm-amend-component.css'; import * as React from 'react'; import { ScmAvatarService } from './scm-avatar-service'; import { StorageService } from '@theia/core/lib/browser'; -import { DisposableCollection } from '@theia/core'; +import { Disposable, DisposableCollection } from '@theia/core'; import { ScmRepository } from './scm-repository'; import { ScmAmendSupport, ScmCommit } from './scm-provider'; @@ -80,14 +80,26 @@ export class ScmAmendComponent extends React.Component { + if (!this.toDisposeOnUnmount.disposed) { + setState(newState); + } + }; } protected readonly toDisposeOnUnmount = new DisposableCollection(); async componentDidMount(): Promise { + this.toDisposeOnUnmount.push(Disposable.create(() => { /* mark as mounted */ })); + const lastCommit = await this.getLastCommit(); this.setState({ amendingCommits: await this.buildAmendingList(lastCommit ? lastCommit.commit : undefined), lastCommit }); + if (this.toDisposeOnUnmount.disposed) { + return; + } this.toDisposeOnUnmount.push( this.props.repository.provider.onDidChange(() => this.fetchStatusAndSetState()) ); diff --git a/packages/scm/src/browser/scm-widget.tsx b/packages/scm/src/browser/scm-widget.tsx index d0c961a45ad59..284e0e0bf9823 100644 --- a/packages/scm/src/browser/scm-widget.tsx +++ b/packages/scm/src/browser/scm-widget.tsx @@ -399,6 +399,21 @@ export abstract class ScmElement

this.state = { hover: false }; + + const setState = this.setState.bind(this); + this.setState = newState => { + if (!this.toDisposeOnUnmount.disposed) { + setState(newState); + } + }; + } + + protected readonly toDisposeOnUnmount = new DisposableCollection(); + componentDidMount(): void { + this.toDisposeOnUnmount.push(Disposable.create(() => { /* mark as mounted */ })); + } + componentWillUnmount(): void { + this.toDisposeOnUnmount.dispose(); } protected detectHover = (element: HTMLElement | null) => { diff --git a/yarn.lock b/yarn.lock index c3db0d5e9882b..0884a50f9eb41 100644 --- a/yarn.lock +++ b/yarn.lock @@ -861,6 +861,11 @@ resolved "https://registry.yarnpkg.com/@typefox/monaco-editor-core/-/monaco-editor-core-0.18.0-next.1.tgz#c31d3361215703b524065f460e1b4b6b714699db" integrity sha512-l7uZbyLfXwh5b5YHv1U2T5KQAVrPTnUqklRd1HEI6ZBWGqw5ukXa5L17ATaVYRpCsy7ZtqyOQS2viWSS/goNFA== +"@types/anymatch@*": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" + integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== + "@types/base64-arraybuffer@0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@types/base64-arraybuffer/-/base64-arraybuffer-0.1.0.tgz#739eea0a974d13ae831f96d97d882ceb0b187543" @@ -886,11 +891,16 @@ dependencies: "@types/chai" "*" -"@types/chai@*", "@types/chai@^4.0.1": +"@types/chai@*": version "4.2.4" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.4.tgz#8936cffad3c96ec470a2dc26a38c3ba8b9b6f619" integrity sha512-7qvf9F9tMTzo0akeswHPGqgUx/gIaJqrOEET/FCD8CFRkSUHlygQiM5yB6OvjrtdxBVLSyw7COJubsFYs0683g== +"@types/chai@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.7.tgz#1c8c25cbf6e59ffa7d6b9652c78e547d9a41692d" + integrity sha512-luq8meHGYwvky0O7u0eQZdA7B4Wd9owUCqvbw2m3XCrCU8mplYOujMBbvyS547AxJkC+pGnd0Cm15eNxEUNU8g== + "@types/connect@*", "@types/connect@^3.4.32": version "3.4.32" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" @@ -1058,10 +1068,10 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/mocha@^2.2.41": - version "2.2.48" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.48.tgz#3523b126a0b049482e1c3c11877460f76622ffab" - integrity sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw== +"@types/mocha@^5.2.7": + version "5.2.7" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" + integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== "@types/node@*", "@types/node@^10.12.18", "@types/node@^10.14.22", "@types/node@~10.3.6": version "10.3.6" @@ -1090,6 +1100,13 @@ resolved "https://registry.yarnpkg.com/@types/ps-tree/-/ps-tree-1.1.0.tgz#7e2034e8ccdc16f6b0ced7a88529ebcb3b1dc424" integrity sha512-rm5GU5sefQpg2d/DQ+fMDZnl9aPiJjJ9FYA12isIocNTZqu9VDZRgCRBx3oYFEdmDpmPmY4hxxmY/+1a84Rtzg== +"@types/puppeteer@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-2.0.0.tgz#82c04f93367e2d3396e371a71be1167332148838" + integrity sha512-QPHXIcaPcijMbvizoM7PRL97Rm+aM8J2DmgTz2tt79b15PqbyeaCppYonvPLHQ/Q5ea92BUHDpv4bsqtiTy8kQ== + dependencies: + "@types/node" "*" + "@types/range-parser@*": version "1.2.3" resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" @@ -1171,6 +1188,16 @@ resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-2.3.7.tgz#e92c2fed3297eae078d78d1da032b26788b4af86" integrity sha512-w+LjztaZbgZWgt/y/VMP5BUAWLtSyoIJhXyW279hehLPyubDoBNwvhcj3WaSptcekuKYeTCVxrq60rdLc6ImJA== +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/tapable@*": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.4.tgz#b4ffc7dc97b498c969b360a41eee247f82616370" + integrity sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ== + "@types/tar-fs@^1.16.1": version "1.16.1" resolved "https://registry.yarnpkg.com/@types/tar-fs/-/tar-fs-1.16.1.tgz#6e3fba276c173e365ae91e55f7b797a0e64298e5" @@ -1202,6 +1229,13 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.5.tgz#9da44ed75571999b65c37b60c9b2b88db54c585d" integrity sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg== +"@types/uglify-js@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.4.tgz#96beae23df6f561862a830b4288a49e86baac082" + integrity sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ== + dependencies: + source-map "^0.6.1" + "@types/uuid@^3.4.3": version "3.4.6" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.6.tgz#d2c4c48eb85a757bf2927f75f939942d521e3016" @@ -1209,12 +1243,26 @@ dependencies: "@types/node" "*" -"@types/webdriverio@^4.7.0": - version "4.13.3" - resolved "https://registry.yarnpkg.com/@types/webdriverio/-/webdriverio-4.13.3.tgz#c1571c4e62724135c0b11e7d7e36b07af5168856" - integrity sha512-AfSQM1xTO9Ax+u9uSQPDuw69DQ0qA2RMoKHn86jCgWNcwKVUjGMSP4sfSl3JOfcZN8X/gWvn7znVPp2/g9zcJA== +"@types/webpack-sources@*": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.5.tgz#be47c10f783d3d6efe1471ff7f042611bd464a92" + integrity sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.6.1" + +"@types/webpack@^4.41.2": + version "4.41.2" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.2.tgz#c6faf0111de27afdffe1158dac559e447c273516" + integrity sha512-DNMQOfEvwzWRRyp6Wy9QVCgJ3gkelZsuBE2KUD318dg95s9DKGiT5CszmmV58hq8jk89I9NClre48AEy1MWAJA== dependencies: + "@types/anymatch" "*" "@types/node" "*" + "@types/tapable" "*" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + source-map "^0.6.0" "@types/which@^1.3.2": version "1.3.2" @@ -1506,6 +1554,11 @@ anser@^1.4.7: resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + ansi-escapes@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -1573,6 +1626,14 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + append-transform@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" @@ -1585,32 +1646,6 @@ aproba@^1.0.3, aproba@^1.1.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -archiver-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" - integrity sha1-5QtMCccL89aA4y/xt5lOn52JUXQ= - dependencies: - glob "^7.0.0" - graceful-fs "^4.1.0" - lazystream "^1.0.0" - lodash "^4.8.0" - normalize-path "^2.0.0" - readable-stream "^2.0.0" - -archiver@~2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-2.1.1.tgz#ff662b4a78201494a3ee544d3a33fe7496509ebc" - integrity sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw= - dependencies: - archiver-utils "^1.3.0" - async "^2.0.0" - buffer-crc32 "^0.2.1" - glob "^7.0.0" - lodash "^4.8.0" - readable-stream "^2.0.0" - tar-stream "^1.5.0" - zip-stream "^1.2.0" - archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -1789,7 +1824,7 @@ async@1.x, async@^1.5.0, async@^1.5.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.0.0, async@^2.5.0, async@^2.6.0, async@^2.6.1, async@^2.6.2: +async@^2.5.0, async@^2.6.0, async@^2.6.1: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -2458,7 +2493,7 @@ babel-register@^6.26.0, babel-register@^6.9.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0, babel-runtime@~6.26.0: +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -2589,6 +2624,11 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + binary@^0.3.0, binary@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" @@ -2622,14 +2662,6 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" -bl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.0.tgz#e1a574cdf528e4053019bb800b041c0ac88da493" - integrity sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -2701,6 +2733,13 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -2810,7 +2849,7 @@ buffer-alloc@^1.1.0, buffer-alloc@^1.2.0: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" -buffer-crc32@^0.2.1, buffer-crc32@~0.2.3: +buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= @@ -2844,7 +2883,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.1.0, buffer@^5.2.1: +buffer@^5.2.1: version "5.4.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== @@ -3069,7 +3108,7 @@ chai-string@^1.4.0: resolved "https://registry.yarnpkg.com/chai-string/-/chai-string-1.5.0.tgz#0bdb2d8a5f1dbe90bc78ec493c1c1c180dd4d3d2" integrity sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw== -chai@^4.1.0: +chai@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== @@ -3154,6 +3193,21 @@ checksum@^0.1.1: dependencies: optimist "~0.3.5" +chokidar@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.2.0" + optionalDependencies: + fsevents "~2.1.1" + chokidar@^2.0.2: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -3493,11 +3547,6 @@ command-join@^2.0.0: dependencies: "@improved/node" "^1.0.0" -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== - commander@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" @@ -3540,16 +3589,6 @@ component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -compress-commons@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f" - integrity sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8= - dependencies: - buffer-crc32 "^0.2.1" - crc32-stream "^2.0.0" - normalize-path "^2.0.0" - readable-stream "^2.0.0" - computed-style@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/computed-style/-/computed-style-0.1.4.tgz#7f344fd8584b2e425bedca4a1afc0e300bb05d74" @@ -3866,21 +3905,6 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -crc32-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" - integrity sha1-483TtN8xaN10494/u8t7KX/pCPQ= - dependencies: - crc "^3.4.4" - readable-stream "^2.0.0" - -crc@^3.4.4: - version "3.8.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" - integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== - dependencies: - buffer "^5.1.0" - create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -4025,13 +4049,6 @@ css-loader@~0.26.1: postcss-modules-values "^1.1.0" source-list-map "^0.1.7" -css-parse@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" - integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= - dependencies: - css "^2.0.0" - css-selector-tokenizer@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" @@ -4041,21 +4058,6 @@ css-selector-tokenizer@^0.7.0: fastparse "^1.1.1" regexpu-core "^1.0.0" -css-value@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/css-value/-/css-value-0.0.1.tgz#5efd6c2eea5ea1fd6b6ac57ec0427b18452424ea" - integrity sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo= - -css@^2.0.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== - dependencies: - inherits "^2.0.3" - source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" - cssesc@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" @@ -4226,7 +4228,7 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.1.0, debug@^3.2.6: +debug@3.2.6, debug@^3.0.0, debug@^3.1.0, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -4345,7 +4347,7 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deepmerge@2.0.1, deepmerge@~2.0.1: +deepmerge@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.0.1.tgz#25c1c24f110fb914f80001b925264dd77f3f4312" integrity sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ== @@ -4369,7 +4371,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-properties@^1.1.2: +define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -4671,11 +4673,6 @@ ejs@^2.5.9: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.1.tgz#5b5ab57f718b79d4aca9254457afecd36fa80228" integrity sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ== -ejs@~2.5.6: - version "2.5.9" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.9.tgz#7ba254582a560d267437109a68354112475b0ce5" - integrity sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ== - electron-download@^4.1.0, electron-download@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-4.1.1.tgz#02e69556705cc456e520f9e035556ed5a015ebe8" @@ -4785,7 +4782,7 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: 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== @@ -4849,6 +4846,32 @@ error@^7.0.2: dependencies: string-template "~0.2.1" +es-abstract@^1.17.0-next.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + es6-promise@^4.0.3, es6-promise@^4.2.4: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -5191,7 +5214,7 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@^1.0.3: +extract-zip@^1.0.3, extract-zip@^1.6.6: version "1.6.7" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= @@ -5287,13 +5310,6 @@ fecha@^2.3.3: resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" integrity sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg== -fibers@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fibers/-/fibers-3.1.1.tgz#0238902ca938347bd779523692fbeefdf4f688ab" - integrity sha512-dl3Ukt08rHVQfY8xGD0ODwyjwrRALtaghuqGH2jByYX1wpY+nAnRQjJ6Dbqq0DnVgNVQ9yibObzbF4IlPyiwPw== - dependencies: - detect-libc "^1.0.3" - figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -5378,6 +5394,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + finalhandler@1.1.2, finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -5443,6 +5466,13 @@ find-git-repositories@^0.1.0: dependencies: nan "^2.0.0" +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -5458,13 +5488,6 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - find-up@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -5487,6 +5510,13 @@ fix-path@^2.1.0: dependencies: shell-path "^2.0.0" +flat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + dependencies: + is-buffer "~2.0.3" + flatten@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" @@ -5681,6 +5711,11 @@ fsevents@^1.2.7: nan "^2.12.1" node-pre-gyp "^0.12.0" +fsevents@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + fstream@^1.0.0, fstream@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" @@ -5715,13 +5750,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gaze@~1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" - generate-function@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-1.1.0.tgz#54c21b080192b16d9877779c5bb81666e772365f" @@ -5887,6 +5915,13 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" @@ -5904,10 +5939,10 @@ glob@7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5938,7 +5973,7 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -6016,15 +6051,6 @@ globby@^8.0.1: pify "^3.0.0" slash "^1.0.0" -globule@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" - integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - glogg@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" @@ -6092,7 +6118,7 @@ got@^8.2.0: url-parse-lax "^3.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: +graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== @@ -6102,11 +6128,6 @@ graceful-fs@^4.1.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.1 resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= -grapheme-splitter@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - grouped-queue@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.3.tgz#c167d2a5319c5a0e0964ef6a25b7c2df8996c85c" @@ -6196,11 +6217,6 @@ has-flag@^1.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -6223,6 +6239,11 @@ has-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + has-to-string-tag-x@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" @@ -6266,7 +6287,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1: +has@^1.0.1, 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== @@ -6294,6 +6315,11 @@ he@1.1.1: resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + highlight.js@^9.12.0, highlight.js@^9.15.8: version "9.16.2" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.16.2.tgz#68368d039ffe1c6211bcc07e483daf95de3e403e" @@ -6419,10 +6445,13 @@ https-proxy-agent@^2.2.3: agent-base "^4.3.0" debug "^3.1.0" -humanize-duration@~3.15.0: - version "3.15.3" - resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.15.3.tgz#600a939bd9d9a16b696e907b3fc08d1a4f15e8c9" - integrity sha512-BMz6w8p3NVa6QP9wDtqUkXfwgBqDaZ5z/np0EYdoWrLqL849Onp6JWMXMhbHtuvO9jUThLN5H1ThRQ8dUWnYkA== +https-proxy-agent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81" + integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" iconv-lite@0.4.23: version "0.4.23" @@ -6547,7 +6576,7 @@ ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^3.2.2, inquirer@~3.3.0: +inquirer@^3.2.2: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== @@ -6688,11 +6717,28 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-buffer@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + is-ci@^1.0.10: version "1.2.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" @@ -6714,6 +6760,11 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -6809,7 +6860,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -6840,6 +6891,11 @@ is-number@^4.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -6894,6 +6950,13 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" @@ -6923,6 +6986,13 @@ is-svg@^2.0.0: dependencies: html-comment-regex "^1.1.0" +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + is-text-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" @@ -7119,7 +7189,7 @@ js-yaml@0.3.x: resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-0.3.7.tgz#d739d8ee86461e54b354d6a7d7d1f2ad9a167f62" integrity sha1-1znY7oZGHlSzVNan19HyrZoWf2I= -js-yaml@3.x, js-yaml@^3.13.1: +js-yaml@3.13.1, js-yaml@3.x, js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -7401,13 +7471,6 @@ kuler@1.0.x: dependencies: colornames "^1.1.1" -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= - dependencies: - readable-stream "^2.0.5" - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -7863,11 +7926,18 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.8.0, lodash@~4.17.10: +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +log-symbols@2.2.0, log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -7875,13 +7945,6 @@ log-symbols@^1.0.2: dependencies: chalk "^1.0.0" -log-symbols@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - log-update@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" @@ -8295,7 +8358,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -8410,22 +8473,35 @@ mocha@^3.4.2: mkdirp "0.5.1" supports-color "3.1.2" -mocha@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== +mocha@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.0.0.tgz#c60d14bf3de9601f549b3ff5be657eb8381c54bf" + integrity sha512-CirsOPbO3jU86YKjjMzFLcXIb5YiGLUrjrXFHoJ3e2z9vWiaZVCZQ2+gtRGMPWF+nFhN6AWwLM/juzAQ6KRkbA== dependencies: + ansi-colors "3.2.3" browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" + chokidar "3.3.0" + debug "3.2.6" diff "3.5.0" escape-string-regexp "1.0.5" - glob "7.1.2" + find-up "3.0.0" + glob "7.1.3" growl "1.10.5" - he "1.1.1" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "2.2.0" minimatch "3.0.4" mkdirp "0.5.1" - supports-color "5.4.0" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.0" + yargs-parser "13.1.1" + yargs-unparser "1.6.0" mock-require@^2.0.2: version "2.0.2" @@ -8644,6 +8720,14 @@ node-dir@0.1.8: resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d" integrity sha1-VfuN62mQcHB/tn+RpGDwRIKUx30= +node-environment-flags@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + node-gyp@^3.6.0: version "3.8.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" @@ -8776,14 +8860,14 @@ normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -8817,11 +8901,6 @@ npm-bundled@^1.0.1: resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== -npm-install-package@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/npm-install-package/-/npm-install-package-2.1.0.tgz#d7efe3cfcd7ab00614b896ea53119dc9ab259125" - integrity sha1-1+/jz816sAYUuJbqUxGdyaslkSU= - npm-packlist@^1.1.6: version "1.4.6" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" @@ -8949,7 +9028,12 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-keys@^1.0.11, object-keys@^1.0.12: +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -8966,7 +9050,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.0.3, object.assign@^4.1.0: +object.assign@4.1.0, object.assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== @@ -8976,6 +9060,14 @@ object.assign@^4.0.3, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.getownpropertydescriptors@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -9043,7 +9135,7 @@ oniguruma@^7.2.0: dependencies: nan "^2.14.0" -optimist@^0.6.1, optimist@~0.6.1: +optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= @@ -9475,6 +9567,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picomatch@^2.0.4: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -9922,7 +10019,7 @@ progress-stream@^1.1.0: speedometer "~0.1.2" through2 "~0.2.3" -progress@2.0.3, progress@^2.0.0, progress@^2.0.3: +progress@^2.0.0, progress@^2.0.1, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -9968,6 +10065,11 @@ proxy-addr@~2.0.5: forwarded "~0.1.2" ipaddr.js "1.9.0" +proxy-from-env@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -10058,7 +10160,21 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -q@^1.1.2, q@^1.4.1, q@^1.5.1, q@~1.5.0: +puppeteer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-2.0.0.tgz#0612992e29ec418e0a62c8bebe61af1a64d7ec01" + integrity sha512-t3MmTWzQxPRP71teU6l0jX47PHXlc4Z52sQv4LJQSZLq1ttkKS2yGM3gaI57uQwZkNaoGd0+HPPMELZkcyhlqA== + dependencies: + debug "^4.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^3.0.0" + mime "^2.0.3" + progress "^2.0.1" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + ws "^6.1.0" + +q@^1.1.2, q@^1.4.1, q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= @@ -10278,7 +10394,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -10341,6 +10457,13 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +readdirp@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== + dependencies: + picomatch "^2.0.4" + recast@^0.11.17: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" @@ -10612,7 +10735,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@2.88.0, request@^2.45.0, request@^2.82.0, request@^2.83.0, request@^2.86.0, request@^2.87.0: +request@^2.45.0, request@^2.82.0, request@^2.83.0, request@^2.86.0, request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -10732,11 +10855,6 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rgb2hex@^0.1.9: - version "0.1.9" - resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.9.tgz#5d3e0e14b0177b568e6f0d5b43e34fbfdb670346" - integrity sha512-32iuQzhOjyT+cv9aAFRBJ19JgHwzQwbjUhH3Fj2sWW2EEGAW8fpFrDFP5ndoKDxJaLO06x1hE3kyuIFrUQtybQ== - rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -10920,26 +11038,7 @@ seek-bzip@^1.0.5: dependencies: commander "~2.8.1" -selenium-standalone@^6.15.4: - version "6.16.0" - resolved "https://registry.yarnpkg.com/selenium-standalone/-/selenium-standalone-6.16.0.tgz#ffcf02665c58ff7a7472427ae819ba79c15967ac" - integrity sha512-tl7HFH2FOxJD1is7Pzzsl0pY4vuePSdSWiJdPn+6ETBkpeJDiuzou8hBjvWYWpD+eIVcOrmy3L0R3GzkdHLzDw== - dependencies: - async "^2.6.2" - commander "^2.19.0" - cross-spawn "^6.0.5" - debug "^4.1.1" - lodash "^4.17.11" - minimist "^1.2.0" - mkdirp "^0.5.1" - progress "2.0.3" - request "2.88.0" - tar-stream "2.0.0" - urijs "^1.19.1" - which "^1.3.1" - yauzl "^2.10.0" - -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -11205,7 +11304,7 @@ source-map-loader@^0.2.1: async "^2.5.0" loader-utils "^1.1.0" -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: +source-map-resolve@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== @@ -11495,6 +11594,22 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -11584,7 +11699,7 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= -strip-json-comments@~2.0.1: +strip-json-comments@2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -11629,10 +11744,10 @@ supports-color@3.1.2: dependencies: has-flag "^1.0.0" -supports-color@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== dependencies: has-flag "^3.0.0" @@ -11662,13 +11777,6 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-color@~5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.0.1.tgz#1c5331f22250c84202805b2f17adf16699f3a39a" - integrity sha512-7FQGOlSQ+AQxBNXJpVDj8efTA/FtyB5wcNE1omXXJ0cq6jm1jjDwuROlYDbnzHqdNPqliWFhcioCWSyav+xBnA== - dependencies: - has-flag "^2.0.0" - svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -11712,18 +11820,7 @@ tar-fs@^1.13.0, tar-fs@^1.16.2: pump "^1.0.0" tar-stream "^1.1.2" -tar-stream@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.0.0.tgz#8829bbf83067bc0288a9089db49c56be395b6aea" - integrity sha512-n2vtsWshZOVr/SY4KtslPoUlyNh06I2SGgAOCZmquCEjlbV/LjY2CY80rDtdQRHFOYXNlgBDo6Fr3ww2CWPOtA== - dependencies: - bl "^2.2.0" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tar-stream@^1.1.2, tar-stream@^1.5.0, tar-stream@^1.5.2: +tar-stream@^1.1.2, tar-stream@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== @@ -11977,6 +12074,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +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" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -12379,11 +12483,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urijs@^1.19.1: - version "1.19.2" - resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.2.tgz#f9be09f00c4c5134b7cb3cf475c1dd394526265a" - integrity sha512-s/UIq9ap4JPZ7H1EB5ULo/aOUbWqfDi7FKzMC2Nz+0Si8GiT1rIEaprt8hy3Vy2Ex2aJPpOQv4P4DuOZ+K1c6w== - urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -12417,7 +12516,7 @@ url-to-options@^1.0.1: resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= -url@^0.11.0, url@~0.11.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= @@ -12711,74 +12810,6 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -wdio-dot-reporter@~0.0.8: - version "0.0.10" - resolved "https://registry.yarnpkg.com/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz#facfb7c9c5984149951f59cbc3cd0752101cf0e0" - integrity sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg== - -wdio-mocha-framework@0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/wdio-mocha-framework/-/wdio-mocha-framework-0.6.4.tgz#291b05b5f8735716023e1228e461f66ff2e7e1c9" - integrity sha512-GZsXwoW60/fkkfqZJR/ZAdiALaM+hW+BbnTT9x214qPR4Pe5XeyYxhJNEdyf0dNI9625cMdkyZYaWoFHN5zDcA== - dependencies: - babel-runtime "^6.23.0" - mocha "^5.2.0" - wdio-sync "0.7.3" - -wdio-selenium-standalone-service@0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/wdio-selenium-standalone-service/-/wdio-selenium-standalone-service-0.0.12.tgz#f472d00d3a7800b2dbedb781bff0f5e726a21e9d" - integrity sha512-R8iUL30SkFfZictAG5wRofeCsHQ4bIucDtaArCQWZkUqS+DlGTStIk3TaIOCaX7dS7UW1YN/lJt9Vsn4Ekmoxg== - dependencies: - fs-extra "^0.30.0" - selenium-standalone "^6.15.4" - -wdio-spec-reporter@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/wdio-spec-reporter/-/wdio-spec-reporter-0.1.5.tgz#6d6f865deac6b36f96988c1204cc81099b75fc7e" - integrity sha512-MqvgTow8hFwhFT47q67JwyJyeynKodGRQCxF7ijKPGfsaG1NLssbXYc0JhiL7SiAyxnQxII0UxzTCd3I6sEdkg== - dependencies: - babel-runtime "~6.26.0" - chalk "^2.3.0" - humanize-duration "~3.15.0" - -wdio-sync@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/wdio-sync/-/wdio-sync-0.7.3.tgz#858c7439c18c0dbdcd2e25e29db8a0ea2f34bc04" - integrity sha512-ukASSHOQmOxaz5HTILR0jykqlHBtAPsBpMtwhpiG0aW9uc7SO7PF+E5LhVvTG4ypAh+UGmY3rTjohOsqDr39jw== - dependencies: - babel-runtime "^6.26.0" - fibers "^3.0.0" - object.assign "^4.0.3" - -webdriverio@4.14.1: - version "4.14.1" - resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.14.1.tgz#50fdb010d37233c77c48e5f0497a63ab875cdfc1" - integrity sha512-Gjb5ft6JtO7WdoZifedeM6U941UZi03IlG0t3Xq9M9SxSm6FuyqMEmNZ4HI3UcBRkSbWxdOWGAvpFShYxVr7iA== - dependencies: - archiver "~2.1.0" - babel-runtime "^6.26.0" - css-parse "^2.0.0" - css-value "~0.0.1" - deepmerge "~2.0.1" - ejs "~2.5.6" - gaze "~1.1.2" - glob "~7.1.1" - grapheme-splitter "^1.0.2" - inquirer "~3.3.0" - json-stringify-safe "~5.0.1" - mkdirp "~0.5.1" - npm-install-package "~2.1.0" - optimist "~0.6.1" - q "~1.5.0" - request "^2.83.0" - rgb2hex "^0.1.9" - safe-buffer "~5.1.1" - supports-color "~5.0.0" - url "~0.11.0" - wdio-dot-reporter "~0.0.8" - wgxpath "~1.0.0" - webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -12859,11 +12890,6 @@ webpack@^4.0.0: watchpack "^1.6.0" webpack-sources "^1.4.1" -wgxpath@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wgxpath/-/wgxpath-1.0.0.tgz#eef8a4b9d558cc495ad3a9a2b751597ecd9af690" - integrity sha1-7vikudVYzEla06mit1FZfs2a9pA= - whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -12914,7 +12940,7 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@1, which@^1.1.1, which@^1.2.14, which@^1.2.8, which@^1.2.9, which@^1.3.0, which@^1.3.1: +which@1, which@1.3.1, which@^1.1.1, which@^1.2.14, which@^1.2.8, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -12928,7 +12954,7 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: +wide-align@1.1.3, wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== @@ -13060,6 +13086,13 @@ ws@^5.2.0: dependencies: async-limiter "~1.0.0" +ws@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + ws@^7.1.2: version "7.2.0" resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.0.tgz#422eda8c02a4b5dba7744ba66eebbd84bcef0ec7" @@ -13127,7 +13160,7 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yargs-parser@^13.1.1: +yargs-parser@13.1.1, yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== @@ -13164,6 +13197,15 @@ yargs-parser@^9.0.2: dependencies: camelcase "^4.1.0" +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" + yargs@11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" @@ -13182,6 +13224,22 @@ yargs@11.1.0: y18n "^3.2.1" yargs-parser "^9.0.2" +yargs@13.3.0, yargs@^13.2.4, yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + yargs@^11.0.0, yargs@^11.1.0: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" @@ -13200,22 +13258,6 @@ yargs@^11.0.0, yargs@^11.1.0: y18n "^3.2.1" yargs-parser "^9.0.2" -yargs@^13.2.4: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.1" - yargs@^14.2: version "14.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.0.tgz#f116a9242c4ed8668790b40759b4906c276e76c3" @@ -13266,7 +13308,7 @@ yauzl@2.4.1: dependencies: fd-slicer "~1.0.1" -yauzl@^2.10.0, yauzl@^2.4.2: +yauzl@^2.4.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= @@ -13333,13 +13375,3 @@ zip-dir@^1.0.2: dependencies: async "^1.5.2" jszip "^2.4.0" - -zip-stream@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" - integrity sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ= - dependencies: - archiver-utils "^1.3.0" - compress-commons "^1.2.0" - lodash "^4.8.0" - readable-stream "^2.0.0"