From cb1a15bc4e27d1e4904b9af94a9cadf6fb784bf3 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Wed, 13 Oct 2021 16:17:19 +0200 Subject: [PATCH 01/51] first tests --- .circleci/config.yml | 27 + .vscode/settings.json | 6 + .../src/local-plugin/.testcaferc.js | 11 + .../src/local-plugin/src/app/Client.ts | 540 ++++++ .../src/local-plugin/src/app/app.tsx | 98 +- .../src/local-plugin/src/app/logger.tsx | 12 + .../src/app/usesubscribe/index.ts | 1 + .../src/app/usesubscribe/use-observable.ts | 32 + .../src/local-plugin/tests/plugin-api.test.ts | 125 ++ apps/remix-ide/ci/browser_tests_plugin_api.sh | 20 + package-lock.json | 1496 +++++++++++++++++ package.json | 2 + 12 files changed, 2344 insertions(+), 26 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 apps/remix-ide-e2e/src/local-plugin/.testcaferc.js create mode 100644 apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts create mode 100644 apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx create mode 100644 apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/index.ts create mode 100644 apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/use-observable.ts create mode 100644 apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts create mode 100755 apps/remix-ide/ci/browser_tests_plugin_api.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 7fcd0cd3d1..26d6cc31c4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,6 +54,33 @@ jobs: - run: cd dist/libs/remix-tests && npm install - run: npm run test:libs + remix-ide-plugin-api: + docker: + # specify the version you desire here + - image: circleci/node:14.17.6-browsers + + # Specify service dependencies here if necessary + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.0/circleci-images/ + resource_class: xlarge + # - image: circleci/mongo:3.4.4 + environment: + - COMMIT_AUTHOR_EMAIL: "yann@ethereum.org" + - COMMIT_AUTHOR: "Circle CI" + - FILES_TO_PACKAGE: "dist/apps/remix-ide/assets dist/apps/remix-ide/index.html dist/apps/remix-ide/main.js dist/apps/remix-ide/polyfills.js dist/apps/remix-ide/runtime.js dist/apps/remix-ide/vendor.js dist/apps/remix-ide/favicon.ico" + working_directory: ~/remix-project + + steps: + - checkout + - run: npm install + - run: npx nx build remix-ide --with-deps + - run: npx nx build remix-ide-e2e-src-local-plugin + - run: ./apps/remix-ide/ci/browser_tests_plugin_api.sh + - store_test_results: + path: /tmp/test-results + - store_artifacts: + path: /tmp/artifacts + remix-ide-chrome-1: docker: # specify the version you desire here diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..3e64e3594f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "eslint.validate": ["javascript"] + } \ No newline at end of file diff --git a/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js b/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js new file mode 100644 index 0000000000..1eec0712f7 --- /dev/null +++ b/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js @@ -0,0 +1,11 @@ +let os = require("os"); + +module.exports = { + skipJsErrors: true, + browsers: ['chrome'], + screenshots: { + "path": "/tmp/artifacts", + "takeOnFails": true, + "pathPattern": "${DATE}_${TIME}/test-${TEST_INDEX}/${USERAGENT}/${FILE_INDEX}.png" + } +} \ No newline at end of file diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts new file mode 100644 index 0000000000..4a38d8e49f --- /dev/null +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts @@ -0,0 +1,540 @@ +import { PluginClient } from '@remixproject/plugin' +import { customAction } from '@remixproject/plugin-api/lib/file-system/file-panel' +import { createClient } from '@remixproject/plugin-webview' +import { BehaviorSubject } from 'rxjs' +import axios from 'axios' + +const simpleContract = `pragma solidity >=0.4.22 <0.7.0; +/** +* @title Storage +* @dev Store & retreive value in a variable +*/ +contract StorageTestUpdateConfiguration { + uint256 number; + /** + * @dev Store value in variable + * @param num value to store + */ + function store(uint256 num) public { + number = num; + } + /** + * @dev Return value + * @return value of 'number' + */ + function retreive() public view returns (uint256){ + return number; + } +} + + ` + +export class WorkSpacePlugin extends PluginClient { + callBackEnabled: boolean = true; + feedback = new BehaviorSubject(''); + + constructor () { + super() + console.log('CONSTRUCTOR') + createClient(this) + + this.methods = ['qr', 'dismiss', 'customAction'] + + this.onload() + .then(async (x) => { + // console.log("client loaded", JSON.stringify(this)); + try { + // await this.call("solidityUnitTesting", "testFromSource", ""); + } catch (e) { + // console.log("not available"); + } + /* + let acc = await this.call("udapp","getSettings") + console.log(acc) + let ac2 = await this.call("udapp","getAccounts") + console.log(ac2) + const privateKey = "71975fbf7fe448e004ac7ae54cad0a383c3906055a75468714156a07385e96ce" + const balance = "0x56BC75E2D63100000" + let na = await this.call("udapp","createVMAccount",{ privateKey, balance }) + console.log(na) + + this.on('udapp', 'newTransaction', (tx: any) => { + // Do something + console.log("new transaction", tx) + }) + + this.on("solidity","compilationFinished",function(x){ + console.log("comp fin",x) + }) + */ + await this.setCallBacks() + + this.on( + 'solidity', + 'compilationFinished', + function (target, source, version, data) { + console.log('compile finished', target, source, version, data) + } + ) + }) + .catch(async (e) => { + console.log('ERROR CONNECTING', e) + }) + } + + async setCallBacks () { + const cmd: customAction = { + id: this.name, + name: 'customAction', + type: ['file', 'folder'], + extension: [], + path: [], + pattern: [] + // sticky: true + } + + const cmd2: customAction = { + id: this.name, + name: 'myAction2', + type: ['file', 'folder'], + extension: [], + path: [], + pattern: [] + } + + this.call('filePanel', 'registerContextMenuItem', cmd) + this.call('filePanel', 'registerContextMenuItem', cmd2) + + console.log('set listeners') + const me = this + this.on('fileManager', 'currentFileChanged', function (x) { + me.setFeedback({ + event: 'currentFileChanged', + result: x + }) + }) + + this.on('filePanel', 'customAction', function (x) { + console.log('custom ACTION', x) + }) + + this.on('fileManager', 'fileRemoved', function (x) { + me.setFeedback(`fileRemoved:${x}`) + }) + + this.on( + 'solidity', + 'compilationFinished', + function (target, source, version, data) { + console.log('compile finished', target, source, version, data) + } + ) + + this.on('fileManager', 'fileAdded', function (x) { + console.log('added file', x) + me.log(x) + }) + + /* this.on("fileExplorers", "createWorkspace", function (x) { + console.log("ws create", x); + me.log(x); + }); + + this.on("fileExplorers", "setWorkspace", function (x) { + console.log("ws set", x); + me.log(x); + }); + + this.on("fileExplorers", "deleteWorkspace", function (x) { + console.log("wS DELETE", x); + me.log(x); + }); + + this.on("fileExplorers", "renameWorkspace", function (x) { + console.log("wS rn", x); + me.log(x); + }); */ + } + + setFeedback (ob: any) { + this.feedback.next(ob) + console.log(ob) + } + + async customAction (o:customAction) { + console.log('custom action called', o) + } + + async log (message: string) { + // console.log(message) + this.call('terminal', 'log', { type: 'info', value: 'Name\r\nAniket' }) + this.call('terminal', 'log', { type: 'html', value: '
test
' }) + } + + async changetoinjected () { + this.call('udapp', 'setEnvironmentMode', 'injected') + } + + async test (p: string) {} + + async activate () { + this.call('manager', 'activatePlugin', 'remixd') + } + + async deactivate () { + this.call('manager', 'deactivatePlugin', '111') + } + + async getresult () { + const r = await this.call('solidity', 'getCompilationResult') + console.log('RESULT', r) + } + + async gitbranches () { + // let r = await this.call("dGitProvider","branches") + // console.log("branches", r) + } + + async gitbranch (dir: string) { + // let r = await this.call("dGitProvider","branch",dir) + } + + async gitcurrentbranch () { + try { + const r = await this.call('dGitProvider', 'currentbranch') + this.setFeedback(r) + } catch (e) { + this.setFeedback(e.message) + } + } + + async gitcheckout (dir: string) { + // let r = await this.call("dGitProvider","checkout",dir) + } + + async gitinit (dir: string) { + // let s = await this.call("fileExplorers","getCurrentWorkspace") + // let r = await this.call("dGitProvider","init") + } + + async gitstatus (dir: string) { + // let r = await this.call("dGitProvider","status",'HEAD') + // console.log("git status ", r) + } + + async gitadd (dir: string) { + // let r = await this.call("dGitProvider","add",dir) + // console.log("git add ", r) + } + + async gitremove (dir: string) { + // let r = await this.call("dGitProvider","rm",dir) + // console.log("git rm ", r) + } + + async gitlog () { + // let r = await this.call("dGitProvider","log",'HEAD') + // console.log("git log ", r) + } + + async gitcommit () { + // let r = await this.call("dGitProvider","commit",{}) + // console.log("git log ", r) + } + + async gitlsfiles () { + // let r = await this.call("dGitProvider","lsfiles",'HEAD') + // console.log("git log ", r) + } + + async gitresolveref () { + // let r = await this.call("dGitProvider","resolveref",'HEAD') + // console.log("git resolve ", r) + } + + async gitreadblob (file: string) { + // let c = await this.call("dGitProvider","log",'HEAD') + // console.log(c[c.length-1].oid) + // let r = await this.call("dGitProvider","readblob",{oid:c[c.length-1].oid, filepath:"README.txt"}) + // console.log("git blob ", r) + } + + async ipfspush () { + console.log(await this.call('dGitProvider', 'push')) + } + + async pinatapush () { + try { + const r = await this.call('dGitProvider' as any, 'pin', '124def6d9115e0c2c521', '130c1a8b18fd0c77f9ee8c1614146d277c3def661506dbf1c78618325cc53c8b') + console.log(r) + } catch (err) { + console.log(err) + } + } + + async pinlist () { + try { + const r = await this.call('dGitProvider' as any, 'pinList', '124def6d9115e0c2c521', '130c1a8b18fd0c77f9ee8c1614146d277c3def661506dbf1c78618325cc53c8b') + console.log(r) + } catch (err) { + console.log(err) + } + } + + async ipfspull (cid: string) { + try { + await this.call('dGitProvider', 'pull', cid) + } catch (e) {} + } + + async ipfsConfig () { + /* try{ + let r = await this.call("dGitProvider", "setIpfsConfig", { + host: 'localhost', + port: 5002, + protocol: 'http', + ipfsurl: 'https://ipfsgw.komputing.org/ipfs/' + }); + console.log(r) + }catch(e){ + console.log(e) + } */ + } + + async readddir (dir: string) { + try { + const files = await this.call('fileManager', 'readdir', dir) + this.setFeedback(files) + } catch (e) { + this.setFeedback(e.message) + } + } + + async write (dir: string) { + this.call('fileManager', 'setFile', dir, simpleContract) + } + + async getcurrentfile () { + try { + const files = await this.call('fileManager', 'getCurrentFile') + this.setFeedback(files) + } catch (e) { + this.setFeedback(e.message) + } + } + + async switchfile (dir: string) { + var files = await this.call('fileManager', 'switchFile', dir) + } + + async zip () { + const r = await this.call('dGitProvider', 'zip') + } + + async fetch (dir: string) { + try { + var files = await fetch(dir) + console.log(files) + console.log(files.toString()) + } catch (e) { + console.error(e) + } + } + + async axios (dir: string) { + try { + var files = await axios.get(dir) + console.log(files) + console.log(files.toString()) + } catch (e) { + console.error(e) + } + } + + async getcompilerconfig () { + // let config = await this.call("solidity","getCompilerConfig") + // console.log(config) + } + + async getWorkSpace () { + try { + const s = await this.call('filePanel' as any, 'getCurrentWorkspace') + this.setFeedback(s) + } catch (e) { + this.setFeedback(e.message) + } + } + + async getWorkSpaces () { + // let s = await this.call("fileExplorers","getWorkspaces") + // console.log(s) + } + + async createWorkSpace (name: string) { + try { + const s = await this.call('filePanel', 'createWorkspace', name) + } catch (e) { + this.setFeedback(e.message) + } + } + + async importcontent (dir: string) { + console.log('import content') + var content = await this.call( + 'contentImport', + 'resolve', + 'ipfs://Qmd1gr9VeQaYNA8wVDq86RwdeMZkfF93JZhhWgfCVewYtc' + ) + console.log('content', content) + } + + async open (dir: string) { + await this.call('fileManager', 'open', dir) + } + + async highlight (f: string) { + this.call( + 'editor', + 'highlight', + { + start: { + line: 0, + column: 1 + }, + end: { + line: 1, + column: 10 + } + }, + f, + '#ffffff' + ) + } + + async addAnnotation (f: string) { + this.call('editor', 'addAnnotation', { + row: 1, + column: 1, + text: 'annotation', + type: 'error' + }) + this.call('editor', 'addAnnotation', { + row: 10, + column: 2, + text: 'annotation', + type: 'info' + }) + this.call('editor', 'addAnnotation', { + row: 12, + column: 1, + text: 'annotation', + type: 'warning' + }) + } + + async clearAnnotations (f: string) { + this.call('editor', 'clearAnnotations') + } + + async activatePlugin (f:string) { + try { + await this.call('manager', 'activatePlugin', f) + this.setFeedback(await this.call('manager', 'isActive', f)) + } catch (e) { + this.setFeedback(e.message) + } + } + + async deActivatePlugin (f:string) { + try { + await this.call('manager', 'deactivatePlugin', f) + this.setFeedback(await this.call('manager', 'isActive', f)) + } catch (e) { + this.setFeedback(e.message) + } + } + + async getSettings () { + try { + const settings = await this.call('udapp', 'getSettings') + this.setFeedback(settings) + } catch (e) { + this.setFeedback(e.message) + } + } + + async setSettings () { + const settings = await this.call('udapp', 'setEnvironmentMode', 'injected') + await this.getSettings() + } + + async debug (hash:string) { + const settings = await this.call('remixdprovider' as any, 'debug', hash) + } + + async getAccounts () { + try { + const settings = await this.call('udapp', 'getAccounts') + this.setFeedback(settings) + } catch (e) { + this.setFeedback(e.message) + } + } + + async soltest () { + const f = `pragma solidity >=0.4.0 <0.7.0; + + contract SimpleStorage { + uint storedData; + + // a public function named set that returns a uint goes here + function set(uint _p1) public returns (uint) { + storedData = _p1; + } + + function get() public view returns (uint) { + return storedData; + } + } + ` + + const t = `pragma solidity >=0.4.0 <0.7.0; + import "remix_tests.sol"; // this import is automatically injected by Remix. + import "./modifyVariable.sol"; + + contract test3 { + + SimpleStorage storageToTest; + function beforeAll () public { + storageToTest = new SimpleStorage(); + } + + function checkSetFunction () public { + storageToTest.set(12345); + Assert.equal(storageToTest.get(), uint(12345), "the contract should contain the function set"); + } + } + ` + + console.log(f) + console.log(t) + + await this.call('fileManager', 'setFile', '/modifyVariable.sol', f) + await this.call('fileManager', 'switchFile', '/modifyVariable.sol') + await this.call('fileManager', 'setFile', '/modifyVariable_test.sol', t) + const result = await this.call( + 'solidityUnitTesting', + 'testFromPath', + 'modifyVariable_test.sol' + ) + return result.errors + } + + async disableCallBacks () { + this.callBackEnabled = false + } + + async enableCallBacks () { + this.callBackEnabled = true + } +} diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index 60f4f024df..f9d8c5c954 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -1,37 +1,83 @@ -import React, { useEffect, useState } from 'react' -import { PluginClient } from '@remixproject/plugin' -import { createClient } from '@remixproject/plugin-webview' -import './app.css' +import React, { useState } from 'react' +import './App.css' +import { WorkSpacePlugin } from './Client' +import { Logger } from './logger' -import { ReactComponent as Logo } from './logo.svg' +export const client = new WorkSpacePlugin() -export const App = () => { - const [remixClient, setRemixClient] = useState(null) +function App () { + const [payload, setPayload] = useState('') + const [result, setResult] = useState() - useEffect(() => { - (async () => { - const client = createClient(new PluginClient()) - - await client.onload() - console.log('Local plugin loaded') - setRemixClient(client) - })() - }, []) + const handleChange = ({ target }: any) => { + setPayload(target.value) + } - const handleClick = () => { - remixClient.call('manager', 'activatePlugin', 'LearnEth') + const test = async () => { + setResult('') + const r = await client.soltest() + setResult('test done') } return ( -
-
- -

Welcome to local-plugin!

-
-
- -
+
+
v5
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
) } diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx new file mode 100644 index 0000000000..949f2baae8 --- /dev/null +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import { useBehaviorSubject } from './usesubscribe/index' +import { client } from './app' + +interface loggerProps { + +} + +export const Logger: React.FC = ({}) => { + const log = useBehaviorSubject(client.feedback) + return (
{typeof log === 'string' ? log : JSON.stringify(log)}
) +} diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/index.ts b/apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/index.ts new file mode 100644 index 0000000000..d23b13c425 --- /dev/null +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/index.ts @@ -0,0 +1 @@ +export * from './use-observable' diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/use-observable.ts b/apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/use-observable.ts new file mode 100644 index 0000000000..27dd854414 --- /dev/null +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/use-observable.ts @@ -0,0 +1,32 @@ +import { useState, useEffect } from 'react' +import { Subscribable, BehaviorSubject, Observable, Subject } from 'rxjs' + +export const useSubscribable = ( + s: Subscribable, + defaultValue?: T +) => { + const [value, setValue] = useState(defaultValue) + useEffect( + () => { + const subscription = s.subscribe(setValue) + return () => subscription.unsubscribe() + }, + [s] + ) + return value +} +export const useRx = useSubscribable + +export const useObservable = ( + o: Observable, + defaultValue?: T +) => useSubscribable(o, defaultValue) + +export const useSubject = ( + s: Subject, + defaultValue?: T +) => useSubscribable(s, defaultValue) + +export const useBehaviorSubject = ( + s: BehaviorSubject +) => useSubscribable(s, s.value) diff --git a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts new file mode 100644 index 0000000000..8369b5aa1c --- /dev/null +++ b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts @@ -0,0 +1,125 @@ +import { Selector, RequestLogger, Role } from 'testcafe' +import { Profile, LocationProfile, ExternalProfile } from '@remixproject/plugin-utils' + +const logger = RequestLogger() + +const role = Role(process.env.TEST_URL || 'http://localhost:8080', async t => { + +}) + +fixture`DGIT production tests` + .page(process.env.TEST_URL || 'http://localhost:8080') + .beforeEach(async t => { + + }) +const openPlugin = async (t: TestController, plugin: string) => { + await t.click(`#icon-panel div[plugin="${plugin}"]`) +} + +interface dataIdSelectorInterface extends Selector { + select(id: string): Promise +} + +const dataIdSelector = async (id:string) => { return Selector(`[data-id="${id}"]`) } + +const installPlugin = async (t: TestController, profile: Profile & LocationProfile & ExternalProfile) => { + await t.click('*[plugin="pluginManager"]') + .click('*[data-id="pluginManagerComponentPluginSearchButton') + // cy.get(`*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalTitle-react`).should('be.visible') + .typeText('*[data-id="localPluginName', profile.name) + .typeText('*[data-id="localPluginDisplayName', profile.displayName) + .typeText('*[data-id="localPluginUrl', profile.url) + .typeText('*[data-id="localPluginCanActivate', profile.canActivate && profile.canActivate.join(',')) + .click('*[data-id="pluginManagerLocalPluginModalDialog-modal-footer-ok-react"').click('*[plugin="pluginManager"]') +} + +const expectLogMessage = async (t: TestController, msg: any) => { + if (typeof msg !== 'string') msg = JSON.stringify(msg) + const message = await Selector('#log').textContent + console.log(message) + await t.expect(message.includes(msg)).ok() +} + +const localPluginData = { + name: 'localplugin', + displayName: 'localplugin', + location: 'sidePanel', + url: 'http://localhost:2020', + canActivate: [ + 'dGitProvider,flattener' + ] +} + +test('install plugin', async t => { + // exists doesn't wait with timeouts, this is a hack but it works, it will wait for buttons to appear + // https://testcafe.io/documentation/402829/guides/basic-guides/select-page-elements#selector-timeout + await Selector('Button', { timeout: 120000 }).innerText + if (await Selector('Button').withText('Sure').exists) { + await t.click(Selector('Button').withText('Sure')) + } + await t.click('.introjs-skipbutton') + await installPlugin(t, localPluginData) +}) + +test.disablePageReloads('switch to plugin', async t => { + await t + .click('#verticalIconsKindpluginManager') + // .click('[data-id="pluginManagerComponentActivateButtondgittest"]') + .click('[data-id="verticalIconsKindlocalplugin"]') + .switchToIframe('#plugin-localplugin') +}) + +test.disablePageReloads('not be able to get current file', async t => { + await t + .click(Selector('Button').withText('getcurrentfile')) + await expectLogMessage(t, 'Error from IDE : Error: No such file or directory No file selected') +}) + +test.disablePageReloads('be able to get current file', async t => { + await t + .switchToMainWindow() + + await openPlugin(t, 'filePanel') + await t.click(await dataIdSelector('treeViewLitreeViewItemREADME.txt')) + await openPlugin(t, localPluginData.name) + await t.switchToIframe('#plugin-localplugin') + .click(Selector('Button') + .withText('getcurrentfile')) + + await expectLogMessage(t, 'README.txt') +}) + +test.disablePageReloads('gets the current workspace', async t => { + await t.click(Selector('Button') + .withText('get workspace')) + await expectLogMessage(t, { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }) +}) + +test.disablePageReloads('creates a workspace', async t => { + await t.typeText('#payload', 'testing') + .click(Selector('Button') + .withText('create workspace')).wait(2000).click(Selector('Button') + .withText('get workspace')) + await expectLogMessage(t, { name: 'testing', isLocalhost: false, absolutePath: '.workspaces/testing' }) +}) + +test.disablePageReloads('get file list', async t => { + await t.typeText('#payload', '/', { replace: true }) + .click(Selector('Button') + .withText('readdir')) + await expectLogMessage(t, { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }) +}) + +test.disablePageReloads('open a file', async t => { + const file = 'contracts/2_Owner.sol' + await t.typeText('#payload', file, { replace: true }) + .click(Selector('Button') + .withText('openfile')) + + await expectLogMessage(t, { event: 'currentFileChanged', result: file }) + + await t.click(Selector('Button') + .withText('getcurrentfile')) + + await expectLogMessage(t, file) +}) diff --git a/apps/remix-ide/ci/browser_tests_plugin_api.sh b/apps/remix-ide/ci/browser_tests_plugin_api.sh new file mode 100755 index 0000000000..3bc2d479a9 --- /dev/null +++ b/apps/remix-ide/ci/browser_tests_plugin_api.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -e + +BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} +echo "$BUILD_ID" +TEST_EXITCODE=0 + +npm run serve & +npx nx serve remix-ide-e2e-src-local-plugin & + +sleep 5 + +npm run testcafe_local_pluginApi || TEST_EXITCODE=1 + +echo "$TEST_EXITCODE" +if [ "$TEST_EXITCODE" -eq 1 ] +then + exit 1 +fi diff --git a/package-lock.json b/package-lock.json index 96c4924831..fd5de4c2c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -839,6 +839,15 @@ "@babel/helper-plugin-utils": "^7.8.3" } }, + "@babel/plugin-syntax-flow": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz", + "integrity": "sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, "@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -1047,6 +1056,16 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.14.5.tgz", + "integrity": "sha512-KhcolBKfXbvjwI3TV7r7TkYm8oNXHNBqGOy6JDVwtecFaRoKYsUUqJdS10q0YDKW1c6aZQgO+Ys3LfGkox8pXA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-flow": "^7.14.5" + } + }, "@babel/plugin-transform-for-of": { "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", @@ -2163,6 +2182,17 @@ } } }, + "@babel/preset-flow": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.14.5.tgz", + "integrity": "sha512-pP5QEb4qRUSVGzzKx9xqRuHUrM/jEzMqdrZpdMA+oUCRgd5zM1qGr5y5+ZgAL/1tVv1H0dyk5t4SKJntqyiVtg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-flow-strip-types": "^7.14.5" + } + }, "@babel/preset-modules": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", @@ -10488,6 +10518,12 @@ "integrity": "sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ==", "dev": true }, + "@types/error-stack-parser": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@types/error-stack-parser/-/error-stack-parser-1.3.18.tgz", + "integrity": "sha1-4ByfjIXKg7YQMgxiJYsMkCat4Pc=", + "dev": true + }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -11641,6 +11677,23 @@ } } }, + "acorn-hammerhead": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/acorn-hammerhead/-/acorn-hammerhead-0.5.0.tgz", + "integrity": "sha512-TI9TFfJBfduhcM2GggayNhdYvdJ3UgS/Bu3sB7FB2AUmNCmCJ+TSOT6GXu+bodG5/xL74D5zE4XRaqyjgjsYVQ==", + "dev": true, + "requires": { + "@types/estree": "0.0.46" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", + "dev": true + } + } + }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -12056,6 +12109,12 @@ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "dev": true }, + "array-find": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", + "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", + "dev": true + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -12227,6 +12286,22 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", "dev": true }, + "asar": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-2.1.0.tgz", + "integrity": "sha512-d2Ovma+bfqNpvBzY/KU8oPY67ZworixTpkjSx0PCXnQi67c2cXmssaTxpFDUM0ttopXoGx/KRxNg/GDThYbXQA==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "chromium-pickle-js": "^0.2.0", + "commander": "^2.20.0", + "cuint": "^0.2.2", + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "tmp-promise": "^1.0.5" + } + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -12350,6 +12425,12 @@ "async": "^2.4.0" } }, + "async-exit-hook": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-1.1.2.tgz", + "integrity": "sha1-gJXXXkiMKazuBVH+hyUhadeJz7o=", + "dev": true + }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -13798,6 +13879,12 @@ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" }, + "bin-v8-flags-filter": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bin-v8-flags-filter/-/bin-v8-flags-filter-1.2.0.tgz", + "integrity": "sha512-g8aeYkY7GhyyKRvQMBsJQZjhm2iCX3dKYvfrMpwVR8IxmUGrkpCBFoKbB9Rh0o3sTLCjU/1tFpZ4C7j3f+D+3g==", + "dev": true + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -13912,6 +13999,12 @@ "readable-stream": "^3.6.0" } }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "dev": true + }, "boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", @@ -14068,6 +14161,15 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, + "brotli": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", + "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", + "dev": true, + "requires": { + "base64-js": "^1.1.2" + } + }, "brotli-size": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/brotli-size/-/brotli-size-4.0.0.tgz", @@ -14924,6 +15026,45 @@ "caller-callsite": "^2.0.0" } }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsite-record": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/callsite-record/-/callsite-record-4.1.3.tgz", + "integrity": "sha512-otAcPmu8TiHZ38cIL3NjQa1nGoSQRRe8WDDUgj5ZUwJWn1wzOYBwVSJbpVyzZ0sesQeKlYsPu9DG70fhh6AK9g==", + "dev": true, + "requires": { + "@types/error-stack-parser": "^1.3.18", + "@types/lodash": "^4.14.72", + "callsite": "^1.0.0", + "chalk": "^2.4.0", + "error-stack-parser": "^1.3.3", + "highlight-es": "^1.0.0", + "lodash": "4.6.1 || ^4.16.1", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "error-stack-parser": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz", + "integrity": "sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI=", + "dev": true, + "requires": { + "stackframe": "^0.3.1" + } + }, + "stackframe": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", + "integrity": "sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ=", + "dev": true + } + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -15021,6 +15162,31 @@ "lazy-cache": "^1.0.3" } }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "dependencies": { + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + } + } + }, "chai-nightwatch": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/chai-nightwatch/-/chai-nightwatch-0.4.1.tgz", @@ -15080,6 +15246,12 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, "check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -15110,12 +15282,36 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, + "chrome-remote-interface": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.30.1.tgz", + "integrity": "sha512-emKaqCjYAgrT35nm6PvTUKJ++2NX9qAmrcNRPRGyryG9Kc7wlkvO0bmvEdNMrr8Bih2e149WctJZFzUiM1UNwg==", + "dev": true, + "requires": { + "commander": "2.11.x", + "ws": "^7.2.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + } + } + }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "dev": true + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -15507,6 +15703,12 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "coffeescript": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.6.1.tgz", + "integrity": "sha512-GG5nkF93qII8HmHqnnibkgpp/SV7PSnSPiWsbinwya7nNOe95aE/x2xrKZJFks8Qpko3TNrC+/LahaKgrz5YCg==", + "dev": true + }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -16571,6 +16773,12 @@ "randomfill": "^1.0.3" } }, + "crypto-md5": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-md5/-/crypto-md5-1.0.0.tgz", + "integrity": "sha1-zMjadQx1PH7curxUKWdHKjhOhrs=", + "dev": true + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -16593,6 +16801,29 @@ "insert-css": "^0.2.0" } }, + "css": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", + "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "source-map": "^0.1.38", + "source-map-resolve": "^0.5.1", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, "css-box-model": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", @@ -16846,6 +17077,12 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -17508,6 +17745,12 @@ "minimist": "^1.1.1" } }, + "device-specs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/device-specs/-/device-specs-1.0.0.tgz", + "integrity": "sha512-fYXbFSeilT7bnKWFi4OERSPHdtaEoDGn4aUhV5Nly6/I+Tp6JZ/6Icmd7LVIF5euyodGpxz2e/bfUmDnIdSIDw==", + "dev": true + }, "dezalgo": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", @@ -18033,6 +18276,33 @@ "once": "^1.4.0" } }, + "endpoint-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/endpoint-utils/-/endpoint-utils-1.0.2.tgz", + "integrity": "sha1-CAjDNppyfNeWejn/NOvJJriBRqg=", + "dev": true, + "requires": { + "ip": "^1.1.3", + "pinkie-promise": "^1.0.0" + }, + "dependencies": { + "pinkie": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", + "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=", + "dev": true + }, + "pinkie-promise": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", + "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", + "dev": true, + "requires": { + "pinkie": "^1.0.0" + } + } + } + }, "enhanced-resolve": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", @@ -18816,6 +19086,29 @@ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true + }, + "esotope-hammerhead": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/esotope-hammerhead/-/esotope-hammerhead-0.6.1.tgz", + "integrity": "sha512-RG4orJ1xy+zD6fTEKuDYaqCuL1ymYa1/Bp+j9c7b/u7B8yI6+Qgg8o4lT1EDAOG9eBzBtwtTWR0chqt3hr0hZw==", + "dev": true, + "requires": { + "@types/estree": "0.0.46" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", + "dev": true + } + } + }, "espree": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", @@ -21359,6 +21652,12 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -22336,6 +22635,15 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, + "graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -22853,6 +23161,25 @@ "tslib": "^2.0.3" } }, + "highlight-es": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/highlight-es/-/highlight-es-1.0.3.tgz", + "integrity": "sha512-s/SIX6yp/5S1p8aC/NRDC1fwEb+myGIfp8/TzZz0rtAv8fzsdX7vGl3Q1TrXCsczFq8DI3CBFBCySPClfBSdbg==", + "dev": true, + "requires": { + "chalk": "^2.4.0", + "is-es2016-keyword": "^1.0.0", + "js-tokens": "^3.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + } + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -23150,6 +23477,12 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "humanize-duration": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.27.0.tgz", + "integrity": "sha512-qLo/08cNc3Tb0uD7jK0jAcU5cnqCM0n568918E7R2XhMr/+7F37p4EY062W/stg7tmzvknNn9b/1+UhVRzsYrQ==", + "dev": true + }, "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -24567,6 +24900,12 @@ "is-primitive": "^2.0.0" } }, + "is-es2016-keyword": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-es2016-keyword/-/is-es2016-keyword-1.0.0.tgz", + "integrity": "sha1-9uVOEQxeT40mXmnS7Q6vjPX0dxg=", + "dev": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -24662,6 +25001,12 @@ } } }, + "is-jquery-obj": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-jquery-obj/-/is-jquery-obj-0.1.1.tgz", + "integrity": "sha512-18toSebUVF7y717dgw/Dzn6djOCqrkiDp3MhB8P6TdKyCVkbD1ZwE7Uz8Hwx6hUPTvKjbyYH9ncXT4ts4qLaSA==", + "dev": true + }, "is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -29968,6 +30313,15 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, + "linux-platform-info": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/linux-platform-info/-/linux-platform-info-0.0.3.tgz", + "integrity": "sha1-La4yQ4Xmbj11W+yD+Gx77qYc64M=", + "dev": true, + "requires": { + "os-family": "^1.0.0" + } + }, "listr": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", @@ -30488,6 +30842,86 @@ } } }, + "log-update-async-hook": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/log-update-async-hook/-/log-update-async-hook-2.0.2.tgz", + "integrity": "sha512-HQwkKFTZeUOrDi1Duf2CSUa/pSpcaCHKLdx3D/Z16DsipzByOBffcg5y0JZA1q0n80dYgLXe2hFM9JGNgBsTDw==", + "dev": true, + "requires": { + "ansi-escapes": "^2.0.0", + "async-exit-hook": "^1.1.2", + "onetime": "^2.0.1", + "wrap-ansi": "^2.1.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + } + } + }, "logform": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz", @@ -30753,6 +31187,15 @@ } } }, + "match-url-wildcard": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/match-url-wildcard/-/match-url-wildcard-0.0.4.tgz", + "integrity": "sha512-R1XhQaamUZPWLOPtp4ig5j+3jctN+skhgRmEQTUamMzmNtRG69QEirQs0NZKLtHMR7tzWpmtnS4Eqv65DcgXUA==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, "matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", @@ -32157,6 +32600,12 @@ "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", "dev": true }, + "moment-duration-format-commonjs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/moment-duration-format-commonjs/-/moment-duration-format-commonjs-1.0.1.tgz", + "integrity": "sha512-KhKZRH21/+ihNRWrmdNFOyBptFi7nAWZFeFsRRpXkzgk/Yublb4fxyP0jU6EY1VDxUL/VUPdCmm/wAnpbfXdfw==", + "dev": true + }, "morphdom": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.6.1.tgz", @@ -32455,6 +32904,12 @@ "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", "dev": true }, + "mustache": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", + "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==", + "dev": true + }, "mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", @@ -38209,6 +38664,12 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, + "os-family": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/os-family/-/os-family-1.1.0.tgz", + "integrity": "sha512-E3Orl5pvDJXnVmpaAA2TeNNpNhTMl4o5HghuWhOivBjEiTnJSrMYSa5uZMek1lBEvu8kKEsa2YgVcGFVDqX/9w==", + "dev": true + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -38912,6 +39373,12 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, "pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", @@ -39116,6 +39583,12 @@ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "dev": true + }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -39875,6 +40348,15 @@ "integrity": "sha1-LMfr6Vn8OmYZwEq029yeRS2GS70=", "dev": true }, + "promisify-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/promisify-event/-/promisify-event-1.0.0.tgz", + "integrity": "sha1-vXUj6ga3AWLzcJeQFrU6aGxg6Q8=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, "prompts": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", @@ -40116,6 +40598,12 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, + "qrcode-terminal": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.10.0.tgz", + "integrity": "sha1-p2pI4mEKGPl/o6K9UytoKs/4bFM=", + "dev": true + }, "qs": { "version": "6.10.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", @@ -40435,6 +40923,15 @@ "graceful-fs": "^4.1.2" } }, + "read-file-relative": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/read-file-relative/-/read-file-relative-1.2.0.tgz", + "integrity": "sha1-mPfZbqoh0rTHov69Y9L8jPNen5s=", + "dev": true, + "requires": { + "callsite": "^1.0.0" + } + }, "read-only-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", @@ -40897,6 +41394,12 @@ "remove-trailing-separator": "^1.1.0" } }, + "replicator": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/replicator/-/replicator-1.0.5.tgz", + "integrity": "sha512-saxS4y7NFkLMa92BR4bPHR41GD+f/qoDAwD2xZmN+MpDXgibkxwLO2qk7dCHYtskSkd/bWS8Jy6kC5MZUkg1tw==", + "dev": true + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -44879,6 +45382,932 @@ "minimatch": "^3.0.4" } }, + "testcafe": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/testcafe/-/testcafe-1.16.1.tgz", + "integrity": "sha512-efb4S7YIyu8BpG4dZQBCgPE3V1YWU8J32v7/cPr1zW1yY/9F2B0y1lMTpeFJ3rUMdHSZpwYi6y00dEfEnNeN/Q==", + "dev": true, + "requires": { + "@babel/core": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-decorators": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-runtime": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-flow": "^7.12.1", + "@babel/preset-react": "^7.12.1", + "@babel/runtime": "^7.12.5", + "@types/node": "^12.20.10", + "async-exit-hook": "^1.1.2", + "babel-plugin-module-resolver": "^4.0.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "bin-v8-flags-filter": "^1.1.2", + "bowser": "^2.8.1", + "callsite": "^1.0.0", + "callsite-record": "^4.0.0", + "chai": "^4.1.2", + "chalk": "^2.3.0", + "chrome-remote-interface": "^0.30.0", + "coffeescript": "^2.3.1", + "commander": "^8.0.0", + "debug": "^4.3.1", + "dedent": "^0.4.0", + "del": "^3.0.0", + "device-specs": "^1.0.0", + "diff": "^4.0.2", + "elegant-spinner": "^1.0.1", + "emittery": "^0.4.1", + "endpoint-utils": "^1.0.2", + "error-stack-parser": "^1.3.6", + "esm": "^3.2.25", + "execa": "^4.0.3", + "globby": "^11.0.4", + "graceful-fs": "^4.1.11", + "graphlib": "^2.1.5", + "humanize-duration": "^3.25.0", + "import-lazy": "^3.1.0", + "indent-string": "^1.2.2", + "is-ci": "^1.0.10", + "is-docker": "^2.0.0", + "is-glob": "^2.0.1", + "is-stream": "^2.0.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "log-update-async-hook": "^2.0.2", + "make-dir": "^3.0.0", + "mime-db": "^1.41.0", + "moment": "^2.10.3", + "moment-duration-format-commonjs": "^1.0.0", + "mustache": "^2.1.2", + "nanoid": "^1.0.1", + "os-family": "^1.0.0", + "parse5": "^1.5.0", + "pify": "^2.3.0", + "pinkie": "^2.0.4", + "pngjs": "^3.3.1", + "pretty-hrtime": "^1.0.3", + "promisify-event": "^1.0.0", + "qrcode-terminal": "^0.10.0", + "read-file-relative": "^1.2.0", + "replicator": "^1.0.5", + "resolve-cwd": "^1.0.0", + "resolve-from": "^4.0.0", + "sanitize-filename": "^1.6.0", + "semver": "^5.6.0", + "source-map-support": "^0.5.16", + "strip-bom": "^2.0.0", + "testcafe-browser-tools": "2.0.16", + "testcafe-hammerhead": "24.5.4", + "testcafe-legacy-api": "5.1.1", + "testcafe-reporter-json": "^2.1.0", + "testcafe-reporter-list": "^2.1.0", + "testcafe-reporter-minimal": "^2.1.0", + "testcafe-reporter-spec": "^2.1.1", + "testcafe-reporter-xunit": "^2.1.0", + "time-limit-promise": "^1.0.2", + "tmp": "0.0.28", + "tree-kill": "^1.2.2", + "typescript": "^3.3.3", + "unquote": "^1.1.1" + }, + "dependencies": { + "@babel/preset-react": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + } + }, + "@types/node": { + "version": "12.20.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.29.tgz", + "integrity": "sha512-dU2ypz+gO5va1OBvs0iT3BNHG5SgTqRvq8r+kU3e/LAseKapUJ8zTUE9Ve9fTpi27tN/7ahOAhCJwQWsffvsyw==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "commander": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.2.0.tgz", + "integrity": "sha512-LLKxDvHeL91/8MIyTAD5BFMNtoIwztGPMiM/7Bl8rIPmHCZXRxmSWr91h57dpOpnQ6jIUqEWdXE/uBYMfiVZDA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "dedent": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.4.0.tgz", + "integrity": "sha1-h979BAvUwVldljKC7FfzwqhSVkI=", + "dev": true + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "emittery": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.4.1.tgz", + "integrity": "sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ==", + "dev": true + }, + "error-stack-parser": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz", + "integrity": "sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI=", + "dev": true, + "requires": { + "stackframe": "^0.3.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true + }, + "indent-string": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-1.2.2.tgz", + "integrity": "sha1-25m8xYPrarux5I3LsZmamGBBy2s=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nanoid": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-1.3.4.tgz", + "integrity": "sha512-4ug4BsuHxiVHoRUe1ud6rUFT3WUMmjXt1W0quL0CviZQANdan7D8kqN5/maw53hmAApY/jfzMRkC57BNNs60ZQ==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-1.0.0.tgz", + "integrity": "sha1-Tq7qQe0EDRcCRX32SkKysH0kb58=", + "dev": true, + "requires": { + "resolve-from": "^2.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "stackframe": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", + "integrity": "sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "tmp": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", + "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "testcafe-browser-tools": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/testcafe-browser-tools/-/testcafe-browser-tools-2.0.16.tgz", + "integrity": "sha512-JljbS0FboABksIMEH1L7P4ZdI82AQ8saWb/7WsxkDCOtDuHID5ZSEb/w9tqLN1+4BQaCgS5veN3lWUnfb0saEA==", + "dev": true, + "requires": { + "array-find": "^1.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "del": "^5.1.0", + "execa": "^3.3.0", + "graceful-fs": "^4.1.11", + "linux-platform-info": "^0.0.3", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "mustache": "^2.1.2", + "nanoid": "^2.1.3", + "os-family": "^1.0.0", + "pify": "^2.3.0", + "pinkie": "^2.0.1", + "read-file-relative": "^1.2.0", + "which-promise": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "requires": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + } + }, + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nanoid": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "testcafe-hammerhead": { + "version": "24.5.4", + "resolved": "https://registry.npmjs.org/testcafe-hammerhead/-/testcafe-hammerhead-24.5.4.tgz", + "integrity": "sha512-ve2rgOQEh4R48L8eu945DDeLOH/Owj8ZmJL0lQBnsLrZA60vsSxpvOczuj98f2u1jtgGjcxOeRTIkNypcRZAyA==", + "dev": true, + "requires": { + "acorn-hammerhead": "0.5.0", + "asar": "^2.0.1", + "bowser": "1.6.0", + "brotli": "^1.3.1", + "crypto-md5": "^1.0.0", + "css": "2.2.3", + "debug": "4.3.1", + "esotope-hammerhead": "0.6.1", + "http-cache-semantics": "^4.1.0", + "iconv-lite": "0.5.1", + "lodash": "^4.17.20", + "lru-cache": "2.6.3", + "match-url-wildcard": "0.0.4", + "merge-stream": "^1.0.1", + "mime": "~1.4.1", + "mustache": "^2.1.1", + "nanoid": "^3.1.12", + "os-family": "^1.0.0", + "parse5": "2.2.3", + "pinkie": "2.0.4", + "read-file-relative": "^1.2.0", + "semver": "5.5.0", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "webauth": "^1.1.0" + }, + "dependencies": { + "bowser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.6.0.tgz", + "integrity": "sha1-N/w4e2Fstq7zcNq01r1AK3TFxU0=", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "iconv-lite": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.1.tgz", + "integrity": "sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "lru-cache": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.3.tgz", + "integrity": "sha1-UczQtPwMhDWH16VwnOTTt2Kb7cU=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "parse5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz", + "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "^1.4.1" + } + } + } + }, + "testcafe-legacy-api": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/testcafe-legacy-api/-/testcafe-legacy-api-5.1.1.tgz", + "integrity": "sha512-WRy9XvH/u+HE19oXs70xuxlcC+x4Yhydhhy5PadK/Ro9ssupSjEFxc/gzTWWcvdxAXO8JWgsXl/x4v5RMYtMow==", + "dev": true, + "requires": { + "async": "0.2.6", + "dedent": "^0.6.0", + "highlight-es": "^1.0.0", + "is-jquery-obj": "^0.1.0", + "lodash": "^4.14.0", + "moment": "^2.14.1", + "mustache": "^2.2.1", + "os-family": "^1.0.0", + "parse5": "^2.1.5", + "pify": "^2.3.0", + "pinkie": "^2.0.1", + "read-file-relative": "^1.2.0", + "strip-bom": "^2.0.0", + "testcafe-hammerhead": ">=19.4.0" + }, + "dependencies": { + "async": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.6.tgz", + "integrity": "sha1-rT83PZJJrjJIgVZVgryQ4VKrvWg=", + "dev": true + }, + "dedent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.6.0.tgz", + "integrity": "sha1-Dm2o8M5Sg471zsXI+TlrDBtko8s=", + "dev": true + }, + "parse5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz", + "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "testcafe-reporter-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/testcafe-reporter-json/-/testcafe-reporter-json-2.2.0.tgz", + "integrity": "sha512-wfpNaZgGP2WoqdmnIXOyxcpwSzdH1HvzXSN397lJkXOrQrwhuGUThPDvyzPnZqxZSzXdDUvIPJm55tCMWbfymQ==", + "dev": true + }, + "testcafe-reporter-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/testcafe-reporter-list/-/testcafe-reporter-list-2.1.0.tgz", + "integrity": "sha1-n6ifcbl9Pf5ktDAtXiJ97mmuxrk=", + "dev": true + }, + "testcafe-reporter-minimal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/testcafe-reporter-minimal/-/testcafe-reporter-minimal-2.1.0.tgz", + "integrity": "sha1-Z28DVHY0FDxurzq1KGgnOkvr9CE=", + "dev": true + }, + "testcafe-reporter-spec": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/testcafe-reporter-spec/-/testcafe-reporter-spec-2.1.1.tgz", + "integrity": "sha1-gVb87Q9RMkhlWa1WC8gGdkaSdew=", + "dev": true + }, + "testcafe-reporter-xunit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/testcafe-reporter-xunit/-/testcafe-reporter-xunit-2.1.0.tgz", + "integrity": "sha1-5tZsVyzhWvJmcGrw/WELKoQd1EM=", + "dev": true + }, "text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", @@ -44990,6 +46419,12 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "time-limit-promise": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/time-limit-promise/-/time-limit-promise-1.0.4.tgz", + "integrity": "sha512-FLHDDsIDducw7MBcRWlFtW2Tm50DoKOSFf0Nzx17qwXj8REXCte0eUkHrJl9QU3Bl9arG3XNYX0PcHpZ9xyuLw==", + "dev": true + }, "time-stamp": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", @@ -45029,6 +46464,27 @@ "os-tmpdir": "~1.0.2" } }, + "tmp-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.1.0.tgz", + "integrity": "sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "tmp": "0.1.0" + }, + "dependencies": { + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "dev": true, + "requires": { + "rimraf": "^2.6.3" + } + } + } + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -47117,6 +48573,12 @@ } } }, + "webauth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webauth/-/webauth-1.1.0.tgz", + "integrity": "sha1-ZHBPa4AmmGYFvDymKZUubib90QA=", + "dev": true + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -47613,6 +49075,40 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "which-promise": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-promise/-/which-promise-1.0.0.tgz", + "integrity": "sha1-ILch3wWzW3Bhdv+hCwkJq6RgMDU=", + "dev": true, + "requires": { + "pify": "^2.2.0", + "pinkie-promise": "^1.0.0", + "which": "^1.1.2" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", + "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=", + "dev": true + }, + "pinkie-promise": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", + "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", + "dev": true, + "requires": { + "pinkie": "^1.0.0" + } + } + } + }, "which-typed-array": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", diff --git a/package.json b/package.json index 1ec51a58e7..e0ef5e476e 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,7 @@ "nightwatch_local_runAndDeploy": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/runAndDeploy.js --env=chrome-runAndDeploy", "nightwatch_local_url": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/url.spec.js --env=chrome", "nightwatch_local_verticalIconscontextmenu": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/verticalIconsPanel.spec.js --env=chrome", + "testcafe_local_pluginApi": "testcafe --config-file apps/remix-ide-e2e/src/local-plugin/.testcaferc.js apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts", "onchange": "onchange apps/remix-ide/build/app.js -- npm-run-all lint", "remixd": "nx build remixd && nx serve remixd --folder=./apps/remix-ide/contracts --remixide=http://127.0.0.1:8080", "selenium": "selenium-standalone start", @@ -294,6 +295,7 @@ "tap-spec": "^5.0.0", "tape": "^4.13.3", "terser-webpack-plugin": "^4.2.3", + "testcafe": "^1.16.1", "ts-jest": "^27.0.5", "ts-node": "^7.0.1", "tslint": "~6.0.0", From 333a7bf07371d4d751cb5e4486a1cc5b7cf69878 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Wed, 13 Oct 2021 16:20:42 +0200 Subject: [PATCH 02/51] rm vscode --- .gitignore | 1 + .vscode/settings.json | 6 ------ 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index d0429e2909..6acb0b3156 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,4 @@ testem.log # System Files .DS_Store +.vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 3e64e3594f..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "editor.codeActionsOnSave": { - "source.fixAll.eslint": true - }, - "eslint.validate": ["javascript"] - } \ No newline at end of file From 60a44fafc409bd7f40d4807186c351bca8ec63a4 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Wed, 13 Oct 2021 16:21:13 +0200 Subject: [PATCH 03/51] lint --- apps/remix-ide-e2e/src/local-plugin/.testcaferc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js b/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js index 1eec0712f7..afe5b0e8dc 100644 --- a/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js +++ b/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js @@ -8,4 +8,4 @@ module.exports = { "takeOnFails": true, "pathPattern": "${DATE}_${TIME}/test-${TEST_INDEX}/${USERAGENT}/${FILE_INDEX}.png" } -} \ No newline at end of file +} From 3ba047904757cf77cf0c9990e32f4347488df891 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Wed, 13 Oct 2021 16:24:36 +0200 Subject: [PATCH 04/51] add api job --- .circleci/config.yml | 55 ++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 26d6cc31c4..0d757bf9f0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,33 +54,6 @@ jobs: - run: cd dist/libs/remix-tests && npm install - run: npm run test:libs - remix-ide-plugin-api: - docker: - # specify the version you desire here - - image: circleci/node:14.17.6-browsers - - # Specify service dependencies here if necessary - # CircleCI maintains a library of pre-built images - # documented at https://circleci.com/docs/2.0/circleci-images/ - resource_class: xlarge - # - image: circleci/mongo:3.4.4 - environment: - - COMMIT_AUTHOR_EMAIL: "yann@ethereum.org" - - COMMIT_AUTHOR: "Circle CI" - - FILES_TO_PACKAGE: "dist/apps/remix-ide/assets dist/apps/remix-ide/index.html dist/apps/remix-ide/main.js dist/apps/remix-ide/polyfills.js dist/apps/remix-ide/runtime.js dist/apps/remix-ide/vendor.js dist/apps/remix-ide/favicon.ico" - working_directory: ~/remix-project - - steps: - - checkout - - run: npm install - - run: npx nx build remix-ide --with-deps - - run: npx nx build remix-ide-e2e-src-local-plugin - - run: ./apps/remix-ide/ci/browser_tests_plugin_api.sh - - store_test_results: - path: /tmp/test-results - - store_artifacts: - path: /tmp/artifacts - remix-ide-chrome-1: docker: # specify the version you desire here @@ -282,7 +255,32 @@ jobs: - store_artifacts: path: ./reports/screenshots + remix-ide-plugin-api: + docker: + # specify the version you desire here + - image: circleci/node:14.17.6-browsers + # Specify service dependencies here if necessary + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.0/circleci-images/ + resource_class: xlarge + # - image: circleci/mongo:3.4.4 + environment: + - COMMIT_AUTHOR_EMAIL: "yann@ethereum.org" + - COMMIT_AUTHOR: "Circle CI" + - FILES_TO_PACKAGE: "dist/apps/remix-ide/assets dist/apps/remix-ide/index.html dist/apps/remix-ide/main.js dist/apps/remix-ide/polyfills.js dist/apps/remix-ide/runtime.js dist/apps/remix-ide/vendor.js dist/apps/remix-ide/favicon.ico" + working_directory: ~/remix-project + + steps: + - checkout + - run: npm install + - run: npx nx build remix-ide --with-deps + - run: npx nx build remix-ide-e2e-src-local-plugin + - run: ./apps/remix-ide/ci/browser_tests_plugin_api.sh + - store_test_results: + path: /tmp/test-results + - store_artifacts: + path: /tmp/artifacts deploy-remix-live: docker: # specify the version you desire here @@ -402,6 +400,9 @@ workflows: - remix-libs: requires: - lint + - remix-ide-plugin-api: + requires: + - lint - remix-ide-chrome-1: requires: - lint From 0e50448477606647aa93fbab8e486658f4aaae11 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Wed, 13 Oct 2021 16:51:16 +0200 Subject: [PATCH 05/51] fix no css --- apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index f9d8c5c954..958e76756e 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -1,6 +1,5 @@ import React, { useState } from 'react' -import './App.css' import { WorkSpacePlugin } from './Client' import { Logger } from './logger' From 0201621d6699e4ae88b5405742890072d8396048 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Wed, 13 Oct 2021 18:58:22 +0200 Subject: [PATCH 06/51] more tests --- .gitignore | 1 + .../src/local-plugin/src/app/Client.ts | 13 +++----- .../src/local-plugin/src/app/app.tsx | 13 ++++---- .../src/local-plugin/src/app/logger.tsx | 17 +++++++--- .../src/local-plugin/tests/plugin-api.test.ts | 33 ++++++++++++------- apps/remix-ide/ci/browser_tests_plugin_api.sh | 4 +-- 6 files changed, 48 insertions(+), 33 deletions(-) diff --git a/.gitignore b/.gitignore index 6acb0b3156..ec20f02b2e 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ testem.log # System Files .DS_Store .vscode/settings.json +.vscode/launch.json diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts index 4a38d8e49f..25fefb8eb8 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts @@ -35,10 +35,9 @@ export class WorkSpacePlugin extends PluginClient { constructor () { super() - console.log('CONSTRUCTOR') createClient(this) - this.methods = ['qr', 'dismiss', 'customAction'] + this.methods = ['customAction'] this.onload() .then(async (x) => { @@ -482,7 +481,7 @@ export class WorkSpacePlugin extends PluginClient { } async soltest () { - const f = `pragma solidity >=0.4.0 <0.7.0; + const f = `pragma solidity >=0.4.0; contract SimpleStorage { uint storedData; @@ -498,7 +497,7 @@ export class WorkSpacePlugin extends PluginClient { } ` - const t = `pragma solidity >=0.4.0 <0.7.0; + const t = `pragma solidity >=0.4.0; import "remix_tests.sol"; // this import is automatically injected by Remix. import "./modifyVariable.sol"; @@ -515,10 +514,6 @@ export class WorkSpacePlugin extends PluginClient { } } ` - - console.log(f) - console.log(t) - await this.call('fileManager', 'setFile', '/modifyVariable.sol', f) await this.call('fileManager', 'switchFile', '/modifyVariable.sol') await this.call('fileManager', 'setFile', '/modifyVariable_test.sol', t) @@ -527,7 +522,7 @@ export class WorkSpacePlugin extends PluginClient { 'testFromPath', 'modifyVariable_test.sol' ) - return result.errors + this.setFeedback(result) } async disableCallBacks () { diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index 958e76756e..0353f36d47 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -8,21 +8,22 @@ export const client = new WorkSpacePlugin() function App () { const [payload, setPayload] = useState('') const [result, setResult] = useState() + const [append, setAppend] = useState(false) const handleChange = ({ target }: any) => { setPayload(target.value) } - const test = async () => { - setResult('') - const r = await client.soltest() - setResult('test done') + const setAppendChange = ({ target }: any) => { + console.log('append', target.checked) + setAppend(target.checked) } return (
v5
- + + @@ -30,7 +31,7 @@ function App () { - + diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx index 949f2baae8..91712ecf82 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx @@ -1,12 +1,21 @@ -import React from 'react' +import React, { useEffect, useState } from 'react' import { useBehaviorSubject } from './usesubscribe/index' import { client } from './app' interface loggerProps { - + append: boolean } -export const Logger: React.FC = ({}) => { +export const Logger: React.FC = (props) => { const log = useBehaviorSubject(client.feedback) - return (
{typeof log === 'string' ? log : JSON.stringify(log)}
) + const [value, setValue] = useState('') + + useEffect(() => { + setValue(value => { + const addValue = typeof log === 'string' ? log : JSON.stringify(log) + return props.append ? `${value} ${addValue}` : addValue + }) + }, [log]) + + return (
{value}
) } diff --git a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts index 8369b5aa1c..c2197099e6 100644 --- a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts +++ b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts @@ -1,16 +1,12 @@ import { Selector, RequestLogger, Role } from 'testcafe' import { Profile, LocationProfile, ExternalProfile } from '@remixproject/plugin-utils' -const logger = RequestLogger() - -const role = Role(process.env.TEST_URL || 'http://localhost:8080', async t => { - -}) - -fixture`DGIT production tests` - .page(process.env.TEST_URL || 'http://localhost:8080') +fixture`Plugin API tests` + .page(process.env.TEST_URL || 'http://127.0.0.1:8080') .beforeEach(async t => { + }).afterEach(async t => { + console.log(await t.getBrowserConsoleMessages()) }) const openPlugin = async (t: TestController, plugin: string) => { await t.click(`#icon-panel div[plugin="${plugin}"]`) @@ -20,7 +16,7 @@ interface dataIdSelectorInterface extends Selector { select(id: string): Promise } -const dataIdSelector = async (id:string) => { return Selector(`[data-id="${id}"]`) } +const dataIdSelector = async (id: string) => { return Selector(`[data-id="${id}"]`) } const installPlugin = async (t: TestController, profile: Profile & LocationProfile & ExternalProfile) => { await t.click('*[plugin="pluginManager"]') @@ -46,7 +42,7 @@ const localPluginData = { location: 'sidePanel', url: 'http://localhost:2020', canActivate: [ - 'dGitProvider,flattener' + 'dGitProvider,flattener,solidityUnitTesting' ] } @@ -64,7 +60,7 @@ test('install plugin', async t => { test.disablePageReloads('switch to plugin', async t => { await t .click('#verticalIconsKindpluginManager') - // .click('[data-id="pluginManagerComponentActivateButtondgittest"]') + // .click('[data-id="pluginManagerComponentActivateButtondgittest"]') .click('[data-id="verticalIconsKindlocalplugin"]') .switchToIframe('#plugin-localplugin') }) @@ -123,3 +119,18 @@ test.disablePageReloads('open a file', async t => { await expectLogMessage(t, file) }) + +test.disablePageReloads('run a test file', async t => { + await t + .click('#appendToLog') + .click(Selector('Button') + .withText('run sol test')) + .switchToMainWindow() + .click('#remember') + .click(Selector('span').withText('Accept')) + .switchToIframe('#plugin-localplugin') + .click(Selector('Button') + .withText('run sol test')).wait(5000) + + await expectLogMessage(t, '"totalPassing":1,"totalFailing":0') +}) diff --git a/apps/remix-ide/ci/browser_tests_plugin_api.sh b/apps/remix-ide/ci/browser_tests_plugin_api.sh index 3bc2d479a9..a5142b716b 100755 --- a/apps/remix-ide/ci/browser_tests_plugin_api.sh +++ b/apps/remix-ide/ci/browser_tests_plugin_api.sh @@ -8,9 +8,7 @@ TEST_EXITCODE=0 npm run serve & npx nx serve remix-ide-e2e-src-local-plugin & - -sleep 5 - +sleep 5 & npm run testcafe_local_pluginApi || TEST_EXITCODE=1 echo "$TEST_EXITCODE" From 92c7f37ff58ca9bbae9cd988151db31856f8df2c Mon Sep 17 00:00:00 2001 From: filip mertens Date: Wed, 13 Oct 2021 19:15:50 +0200 Subject: [PATCH 07/51] run tests --- apps/remix-ide-e2e/src/local-plugin/.testcaferc.js | 2 +- apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js b/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js index afe5b0e8dc..c3649654c2 100644 --- a/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js +++ b/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js @@ -2,7 +2,7 @@ let os = require("os"); module.exports = { skipJsErrors: true, - browsers: ['chrome'], + browsers: ['chrome -incognito'], screenshots: { "path": "/tmp/artifacts", "takeOnFails": true, diff --git a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts index c2197099e6..7bc2607cef 100644 --- a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts +++ b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts @@ -129,8 +129,11 @@ test.disablePageReloads('run a test file', async t => { .click('#remember') .click(Selector('span').withText('Accept')) .switchToIframe('#plugin-localplugin') + .typeText('#payload', '/', { replace: true }) .click(Selector('Button') - .withText('run sol test')).wait(5000) + .withText('readdir')) + .click(Selector('Button') + .withText('run sol test')) await expectLogMessage(t, '"totalPassing":1,"totalFailing":0') }) From 266359cc341494ca296235891e5ae0a24aa3747b Mon Sep 17 00:00:00 2001 From: filip mertens Date: Wed, 13 Oct 2021 19:17:04 +0200 Subject: [PATCH 08/51] chrome --- apps/remix-ide-e2e/src/local-plugin/.testcaferc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js b/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js index c3649654c2..afe5b0e8dc 100644 --- a/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js +++ b/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js @@ -2,7 +2,7 @@ let os = require("os"); module.exports = { skipJsErrors: true, - browsers: ['chrome -incognito'], + browsers: ['chrome'], screenshots: { "path": "/tmp/artifacts", "takeOnFails": true, From 7826f04469025c29c987dc3aabad26f416f4d534 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Wed, 13 Oct 2021 19:19:45 +0200 Subject: [PATCH 09/51] rm learneth activate test --- apps/remix-ide-e2e/src/tests/pluginManager.ts | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/pluginManager.ts b/apps/remix-ide-e2e/src/tests/pluginManager.ts index f1c35100b5..689cab23a2 100644 --- a/apps/remix-ide-e2e/src/tests/pluginManager.ts +++ b/apps/remix-ide-e2e/src/tests/pluginManager.ts @@ -154,33 +154,6 @@ module.exports = { .assert.containsText('*[data-shared="tooltipPopup"]', 'Cannot create Plugin : This name has already been used') }, - 'Local plugin should activate LearnEth plugin': function (browser: NightwatchBrowser) { - browser - .waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') - .click('*[data-id="pluginManagerComponentPluginSearchButton"]') - .waitForElementVisible('*[data-id="pluginManagerLocalPluginModalDialogModalDialogContainer-react"]') - .click('*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalBody-react"]') - .waitForElementVisible('*[data-id="localPluginName"]') - .clearValue('*[data-id="localPluginName"]').setValue('*[data-id="localPluginName"]', localPluginData.pluginName) - .clearValue('*[data-id="localPluginDisplayName"]').setValue('*[data-id="localPluginDisplayName"]', localPluginData.pluginDisplayName) - .clearValue('*[data-id="localPluginCanActivate"]').setValue('*[data-id="localPluginCanActivate"]', localPluginData.pluginCanActivate) - .clearValue('*[data-id="localPluginUrl"]').setValue('*[data-id="localPluginUrl"]', localPluginData.pluginUrl) - .click('*[data-id="localPluginRadioButtoniframe"]') - .click('*[data-id="localPluginRadioButtonsidePanel"]') - .click('*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalFooter-react"]') - .click('*[data-id="pluginManagerLocalPluginModalDialog-modal-footer-ok-react') - .waitForElementVisible('[data-id="verticalIconsKindlocalPlugin"]') - .click('[data-id="verticalIconsKindlocalPlugin"]') - .waitForElementNotPresent('[data-id="verticalIconsKindLearnEth"]') - .pause(2000) - // @ts-ignore - .frame('plugin-localPlugin') - .useXpath().click("//button[text()='Activate Learneth']") - .pause(2000) - .frameParent() - .useCss().waitForElementPresent('[data-id="verticalIconsKindLearnEth"]') - }, - 'Should load back installed plugins after reload': function (browser: NightwatchBrowser) { browser .waitForElementVisible('*[data-id="remixIdeSidePanel"]') From a6341f36e0d8fe787430e2e25112ee3d4a426c30 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Wed, 13 Oct 2021 19:30:26 +0200 Subject: [PATCH 10/51] wait a bit --- apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts index 7bc2607cef..342bcf844c 100644 --- a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts +++ b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts @@ -133,7 +133,7 @@ test.disablePageReloads('run a test file', async t => { .click(Selector('Button') .withText('readdir')) .click(Selector('Button') - .withText('run sol test')) + .withText('run sol test')).wait(5000) await expectLogMessage(t, '"totalPassing":1,"totalFailing":0') }) From 7aeb5a7500ae86ee89487162a38a11e51e06dc81 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Wed, 13 Oct 2021 20:10:15 +0200 Subject: [PATCH 11/51] compilerversion --- .../src/local-plugin/tests/plugin-api.test.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts index 342bcf844c..9f723f0f82 100644 --- a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts +++ b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts @@ -16,6 +16,16 @@ interface dataIdSelectorInterface extends Selector { select(id: string): Promise } +const setCompilerVersion = async (t: TestController, version: string) => { + const citySelect = Selector('#versionSelector') + const cityOption = citySelect.find('option') + await t.click(citySelect).click(cityOption.withAttribute('value', 'builtin')) +} + +const ClickLaunchIcon = async (t: TestController, icon: string) => { + await t.click('#icon-panel div[plugin="' + icon + '"]')// .click('#icon-panel div[plugin="' + icon + '"]') +} + const dataIdSelector = async (id: string) => { return Selector(`[data-id="${id}"]`) } const installPlugin = async (t: TestController, profile: Profile & LocationProfile & ExternalProfile) => { @@ -54,6 +64,8 @@ test('install plugin', async t => { await t.click(Selector('Button').withText('Sure')) } await t.click('.introjs-skipbutton') + // await ClickLaunchIcon(t, 'solidity') + // await setCompilerVersion(t, 'builtin') await installPlugin(t, localPluginData) }) From d227e4bc717992561e02454b547618b60ec794b5 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sat, 16 Oct 2021 13:45:41 +0200 Subject: [PATCH 12/51] e2e --- .../src/local-plugin/src/app/Client.ts | 8 +- .../src/local-plugin/src/app/app.tsx | 4 +- .../src/local-plugin/tests/plugin-api.test.ts | 15 ++-- .../src/tests/plugin_api.test.ts | 86 +++++++++++++++++++ .../src/assets/js/workspace_1632313874650 | 1 + package-lock.json | 49 ++++++++++- package.json | 6 +- 7 files changed, 151 insertions(+), 18 deletions(-) create mode 100644 apps/remix-ide-e2e/src/tests/plugin_api.test.ts create mode 160000 apps/remix-ide/src/assets/js/workspace_1632313874650 diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts index 25fefb8eb8..169af33c8d 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts @@ -176,12 +176,12 @@ export class WorkSpacePlugin extends PluginClient { async test (p: string) {} - async activate () { - this.call('manager', 'activatePlugin', 'remixd') + async activate (id: string) { + this.call('manager', 'activatePlugin', id) } - async deactivate () { - this.call('manager', 'deactivatePlugin', '111') + async deactivate (id: string) { + this.call('manager', 'deactivatePlugin', id) } async getresult () { diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index 0353f36d47..b26a5297b2 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -43,8 +43,8 @@ function App () { - - + + diff --git a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts index 9f723f0f82..7a489dadf9 100644 --- a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts +++ b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts @@ -17,9 +17,9 @@ interface dataIdSelectorInterface extends Selector { } const setCompilerVersion = async (t: TestController, version: string) => { - const citySelect = Selector('#versionSelector') + const citySelect = Selector('#evmVersionSelector') const cityOption = citySelect.find('option') - await t.click(citySelect).click(cityOption.withAttribute('value', 'builtin')) + await t.click(citySelect).click(cityOption.withAttribute('value', 'london')) } const ClickLaunchIcon = async (t: TestController, icon: string) => { @@ -56,7 +56,7 @@ const localPluginData = { ] } -test('install plugin', async t => { +test.only('install plugin', async t => { // exists doesn't wait with timeouts, this is a hack but it works, it will wait for buttons to appear // https://testcafe.io/documentation/402829/guides/basic-guides/select-page-elements#selector-timeout await Selector('Button', { timeout: 120000 }).innerText @@ -64,9 +64,14 @@ test('install plugin', async t => { await t.click(Selector('Button').withText('Sure')) } await t.click('.introjs-skipbutton') - // await ClickLaunchIcon(t, 'solidity') + await ClickLaunchIcon(t, 'solidity') + + await t.click(Selector("#optimize")) + await setCompilerVersion(t, 'builtin') + await t.wait(10000) // await setCompilerVersion(t, 'builtin') - await installPlugin(t, localPluginData) + + // await installPlugin(t, localPluginData) }) test.disablePageReloads('switch to plugin', async t => { diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.test.ts b/apps/remix-ide-e2e/src/tests/plugin_api.test.ts new file mode 100644 index 0000000000..5129345e31 --- /dev/null +++ b/apps/remix-ide-e2e/src/tests/plugin_api.test.ts @@ -0,0 +1,86 @@ +'use strict' +import { NightwatchBrowser } from 'nightwatch' +import init from '../helpers/init' + +declare global { + interface Window { testmode: boolean; } +} + +const localPluginData = { + pluginName: 'localPlugin', + pluginDisplayName: 'Local Plugin', + pluginCanActivate: 'dGitProvider,flattener,solidityUnitTesting', + pluginUrl: 'http://localhost:2020' +} + +const assertLog = function (browser: NightwatchBrowser, buttonText: string, msg: any, payload: string) { + if (payload) { + browser.clearValue('//*[@id="payload"]').setValue('//*[@id="payload"]', payload).pause(1000) + } + if (msg && typeof msg !== 'string') msg = JSON.stringify(msg) + browser + .useXpath().waitForElementVisible(`//*[text()='${buttonText}']`).click(`//*[text()='${buttonText}']`) + .pause(2000) + + if (msg) { + browser.waitForElementVisible('//*[@id="log"]').assert.containsText('//*[@id="log"]', msg) + } +} + +module.exports = { + before: function (browser: NightwatchBrowser, done: VoidFunction) { + init(browser, done, 'http://127.0.0.1:8080', false) + }, + + 'Should Load Plugin Manager': function (browser: NightwatchBrowser) { + browser.waitForElementVisible('*[data-id="remixIdeSidePanel"]') + .pause(3000) + .click('*[plugin="pluginManager"]') + .pause(3000) + .waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') + .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'PLUGIN MANAGER') + }, + + 'Should connect a local plugin': function (browser: NightwatchBrowser) { + browser.waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') + .execute(function () { + window.testmode = true + }) + .click('*[data-id="pluginManagerComponentPluginSearchButton"]') + .waitForElementVisible('*[data-id="pluginManagerLocalPluginModalDialogModalDialogContainer-react"]') + .click('*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalBody-react"]') + .waitForElementVisible('*[data-id="localPluginName"]') + .clearValue('*[data-id="localPluginName"]').setValue('*[data-id="localPluginName"]', localPluginData.pluginName) + .clearValue('*[data-id="localPluginDisplayName"]').setValue('*[data-id="localPluginDisplayName"]', localPluginData.pluginDisplayName) + .clearValue('*[data-id="localPluginUrl"]').setValue('*[data-id="localPluginUrl"]', localPluginData.pluginUrl) + .clearValue('*[data-id="localPluginCanActivate"]').setValue('*[data-id="localPluginCanActivate"]', localPluginData.pluginCanActivate) + .click('*[data-id="localPluginRadioButtoniframe"]') + .click('*[data-id="localPluginRadioButtonsidePanel"]') + .click('*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalFooter-react"]') + .click('*[data-id="pluginManagerLocalPluginModalDialog-modal-footer-ok-react') + .waitForElementVisible('[data-id="verticalIconsKindlocalPlugin"]') + .click('[data-id="verticalIconsKindlocalPlugin"]') + // @ts-ignore + .frame(0) + }, + + 'Should get current workspace': function (browser: NightwatchBrowser) { + assertLog(browser, 'get workspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null) + }, + 'Should get current files': function (browser: NightwatchBrowser) { + assertLog(browser, 'readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null) + }, + 'Should throw error on current file': function (browser: NightwatchBrowser) { + assertLog(browser, 'getcurrentfile', 'Error from IDE : Error: No such file or directory No file selected', null) + }, + 'Should open readme.txt': function (browser: NightwatchBrowser) { + assertLog(browser, 'openfile', null, 'README.txt') + }, + 'Should have current file': function (browser: NightwatchBrowser) { + assertLog(browser, 'getcurrentfile', 'README.txt', null) + }, + 'Should activate solidityUnitTesting': function (browser: NightwatchBrowser) { + assertLog(browser, 'activate', null, 'solidityUnitTesting') + } + +} diff --git a/apps/remix-ide/src/assets/js/workspace_1632313874650 b/apps/remix-ide/src/assets/js/workspace_1632313874650 new file mode 160000 index 0000000000..6af4ed6169 --- /dev/null +++ b/apps/remix-ide/src/assets/js/workspace_1632313874650 @@ -0,0 +1 @@ +Subproject commit 6af4ed6169ee4165ce86457f98c0a568bd9d7491 diff --git a/package-lock.json b/package-lock.json index fd5de4c2c2..226eda8245 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25119,6 +25119,12 @@ "isobject": "^3.0.1" } }, + "is-port-reachable": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-3.1.0.tgz", + "integrity": "sha512-vjc0SSRNZ32s9SbZBzGaiP6YVB+xglLShhgZD/FHMZUXBvQWaV9CtzgeVhjccFJrI6RAMV+LX7NYxueW/A8W5A==", + "dev": true + }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", @@ -42384,15 +42390,17 @@ "integrity": "sha1-9RWxoWLek8LM7y/AyjPztVQ+OMg=" }, "selenium-standalone": { - "version": "6.24.0", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.24.0.tgz", - "integrity": "sha512-Dun2XgNAgCfJNrrSzuv7Z7Wj7QTvBKpqx0VXFz7bW9T9FUe5ytzgzoCEEshwDVMh0Dv6sCgdZg7VDhM/q2yPPQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-7.1.0.tgz", + "integrity": "sha512-Pc7U48qwB4LVy/XczBrPPXwUhEPl3XQSik8SjLfj2qzBEtZqrjyzOlnnXq4aVCdr5wH9FiFJm8LwheJbK2+/oQ==", "dev": true, "requires": { - "commander": "^2.20.3", + "commander": "^7.2.0", "cross-spawn": "^7.0.3", "debug": "^4.3.1", + "fs-extra": "^10.0.0", "got": "^11.8.2", + "is-port-reachable": "^3.0.0", "lodash.mapvalues": "^4.6.0", "lodash.merge": "^4.6.2", "minimist": "^1.2.5", @@ -42433,6 +42441,12 @@ "responselike": "^2.0.0" } }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -42468,6 +42482,17 @@ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -42502,6 +42527,16 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, "keyv": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", @@ -42577,6 +42612,12 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index e0ef5e476e..ad8a7d9ab8 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "nightwatch_local_runAndDeploy": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/runAndDeploy.js --env=chrome-runAndDeploy", "nightwatch_local_url": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/url.spec.js --env=chrome", "nightwatch_local_verticalIconscontextmenu": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/verticalIconsPanel.spec.js --env=chrome", - "testcafe_local_pluginApi": "testcafe --config-file apps/remix-ide-e2e/src/local-plugin/.testcaferc.js apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts", + "testcafe_local_pluginApi": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/plugin_api.test.js --env=chrome", "onchange": "onchange apps/remix-ide/build/app.js -- npm-run-all lint", "remixd": "nx build remixd && nx serve remixd --folder=./apps/remix-ide/contracts --remixide=http://127.0.0.1:8080", "selenium": "selenium-standalone start", @@ -276,7 +276,7 @@ "mkdirp": "^0.5.1", "mocha": "^8.0.1", "nanohtml": "^1.6.3", - "nightwatch": "^1.5.1", + "nightwatch": "^1.7.11", "nodemon": "^2.0.4", "notify-error": "^1.2.0", "npm-link-local": "^1.1.0", @@ -288,7 +288,7 @@ "remix-tabs": "1.1.3", "request": "^2.83.0", "rimraf": "^2.6.1", - "selenium-standalone": "^6.17.0", + "selenium-standalone": "^7.1.0", "semver": "^6.3.0", "solc": "0.7.4", "swarmgw": "^0.3.1", From 9ee285cb12834463c19bd2e14cfa047e4853fbac Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sat, 16 Oct 2021 15:18:48 +0200 Subject: [PATCH 13/51] e2e --- .../src/local-plugin/src/app/Client.ts | 23 +++++++++---- .../src/tests/plugin_api.test.ts | 33 ++++++++++++++++++- apps/remix-ide/ci/browser_tests_plugin_api.sh | 2 +- package.json | 2 +- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts index 169af33c8d..3fbe6fe6c0 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts @@ -310,7 +310,11 @@ export class WorkSpacePlugin extends PluginClient { } async write (dir: string) { - this.call('fileManager', 'setFile', dir, simpleContract) + try { + this.call('fileManager', 'setFile', dir, 'simple readme') + } catch (e) { + this.setFeedback(e.message) + } } async getcurrentfile () { @@ -322,8 +326,13 @@ export class WorkSpacePlugin extends PluginClient { } } - async switchfile (dir: string) { - var files = await this.call('fileManager', 'switchFile', dir) + async switchfile(dir: string) { + + try { + const files = await this.call('fileManager', 'switchFile', dir) + } catch (e) { + this.setFeedback(e.message) + } } async zip () { @@ -514,13 +523,13 @@ export class WorkSpacePlugin extends PluginClient { } } ` - await this.call('fileManager', 'setFile', '/modifyVariable.sol', f) - await this.call('fileManager', 'switchFile', '/modifyVariable.sol') - await this.call('fileManager', 'setFile', '/modifyVariable_test.sol', t) + //await this.call('fileManager', 'setFile', '/modifyVariable.sol', f) + await this.call('fileManager', 'switchFile', 'tests/4_Ballot_test.sol') + //await this.call('fileManager', 'setFile', '/modifyVariable_test.sol', t) const result = await this.call( 'solidityUnitTesting', 'testFromPath', - 'modifyVariable_test.sol' + 'tests/4_Ballot_test.sol' ) this.setFeedback(result) } diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.test.ts b/apps/remix-ide-e2e/src/tests/plugin_api.test.ts index 5129345e31..8ade0fec9b 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.test.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.test.ts @@ -13,6 +13,12 @@ const localPluginData = { pluginUrl: 'http://localhost:2020' } +const getBrowserLogs = function (browser: NightwatchBrowser) { + browser.getLog('browser', (logEntries) => { + console.log(logEntries) + }) +} + const assertLog = function (browser: NightwatchBrowser, buttonText: string, msg: any, payload: string) { if (payload) { browser.clearValue('//*[@id="payload"]').setValue('//*[@id="payload"]', payload).pause(1000) @@ -22,16 +28,27 @@ const assertLog = function (browser: NightwatchBrowser, buttonText: string, msg: .useXpath().waitForElementVisible(`//*[text()='${buttonText}']`).click(`//*[text()='${buttonText}']`) .pause(2000) + getBrowserLogs(browser) if (msg) { - browser.waitForElementVisible('//*[@id="log"]').assert.containsText('//*[@id="log"]', msg) + browser.waitForElementVisible('//*[@id="log"]').verify.containsText('//*[@id="log"]', msg) } } +const assertPluginIsActive = function (browser: NightwatchBrowser, id: string) { + browser.waitForElementVisible(`//*[@data-id="verticalIconsKind${id}"]`) +} + module.exports = { before: function (browser: NightwatchBrowser, done: VoidFunction) { init(browser, done, 'http://127.0.0.1:8080', false) }, + afterEach: function (browser: NightwatchBrowser) { + browser.getLog('browser', (logEntries) => { + console.log(logEntries) + }) + }, + 'Should Load Plugin Manager': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="remixIdeSidePanel"]') .pause(3000) @@ -81,6 +98,20 @@ module.exports = { }, 'Should activate solidityUnitTesting': function (browser: NightwatchBrowser) { assertLog(browser, 'activate', null, 'solidityUnitTesting') + browser.frameParent() + assertPluginIsActive(browser, 'solidityUnitTesting') + // @ts-ignore + browser.frame(0) + }, + + 'Should switch to file': function (browser: NightwatchBrowser) { + assertLog(browser, 'switch to file', null, 'contracts/1_Storage.sol') + assertLog(browser, 'getcurrentfile', 'contracts/1_Storage.sol', null) + assertLog(browser, 'switch to file', null, 'README.txt') + assertLog(browser, 'getcurrentfile', 'README.txt', null) + }, + 'Should write to file': function (browser: NightwatchBrowser) { + assertLog(browser, 'write', 'README.txt', null) } } diff --git a/apps/remix-ide/ci/browser_tests_plugin_api.sh b/apps/remix-ide/ci/browser_tests_plugin_api.sh index a5142b716b..e024d72c31 100755 --- a/apps/remix-ide/ci/browser_tests_plugin_api.sh +++ b/apps/remix-ide/ci/browser_tests_plugin_api.sh @@ -9,7 +9,7 @@ TEST_EXITCODE=0 npm run serve & npx nx serve remix-ide-e2e-src-local-plugin & sleep 5 & -npm run testcafe_local_pluginApi || TEST_EXITCODE=1 +npm run nightwatch_local_pluginApi || TEST_EXITCODE=1 echo "$TEST_EXITCODE" if [ "$TEST_EXITCODE" -eq 1 ] diff --git a/package.json b/package.json index ad8a7d9ab8..93f35b8579 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "nightwatch_local_runAndDeploy": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/runAndDeploy.js --env=chrome-runAndDeploy", "nightwatch_local_url": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/url.spec.js --env=chrome", "nightwatch_local_verticalIconscontextmenu": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/verticalIconsPanel.spec.js --env=chrome", - "testcafe_local_pluginApi": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/plugin_api.test.js --env=chrome", + "nightwatch_local_pluginApi": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/plugin_api.test.js --env=chrome", "onchange": "onchange apps/remix-ide/build/app.js -- npm-run-all lint", "remixd": "nx build remixd && nx serve remixd --folder=./apps/remix-ide/contracts --remixide=http://127.0.0.1:8080", "selenium": "selenium-standalone start", From 4a9a9c28a083639ed5ca066eb69b35215898d0e1 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sat, 16 Oct 2021 15:23:14 +0200 Subject: [PATCH 14/51] add required --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0d757bf9f0..2ba31888ac 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -432,6 +432,7 @@ workflows: - remix-ide-firefox-2 - remix-ide-run-deploy - remix-ide-plugin-manager + - remix-ide-plugin-api filters: branches: only: remix_live @@ -443,6 +444,7 @@ workflows: - remix-ide-firefox-2 - remix-ide-run-deploy - remix-ide-plugin-manager + - remix-ide-plugin-api filters: branches: only: master @@ -454,6 +456,7 @@ workflows: - remix-ide-firefox-2 - remix-ide-run-deploy - remix-ide-plugin-manager + - remix-ide-plugin-api filters: branches: only: remix_beta From c1c76dca7cccbde478cbeb56e8576ebba8a889ac Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sat, 16 Oct 2021 15:32:21 +0200 Subject: [PATCH 15/51] lint --- apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts index 3fbe6fe6c0..dea17d9292 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts @@ -326,10 +326,9 @@ export class WorkSpacePlugin extends PluginClient { } } - async switchfile(dir: string) { - + async switchfile (dir: string) { try { - const files = await this.call('fileManager', 'switchFile', dir) + await this.call('fileManager', 'switchFile', dir) } catch (e) { this.setFeedback(e.message) } @@ -380,7 +379,7 @@ export class WorkSpacePlugin extends PluginClient { async createWorkSpace (name: string) { try { - const s = await this.call('filePanel', 'createWorkspace', name) + await this.call('filePanel', 'createWorkspace', name) } catch (e) { this.setFeedback(e.message) } @@ -523,9 +522,9 @@ export class WorkSpacePlugin extends PluginClient { } } ` - //await this.call('fileManager', 'setFile', '/modifyVariable.sol', f) + // await this.call('fileManager', 'setFile', '/modifyVariable.sol', f) await this.call('fileManager', 'switchFile', 'tests/4_Ballot_test.sol') - //await this.call('fileManager', 'setFile', '/modifyVariable_test.sol', t) + // await this.call('fileManager', 'setFile', '/modifyVariable_test.sol', t) const result = await this.call( 'solidityUnitTesting', 'testFromPath', From ff596b545ea67edcf3b0503b1f695e4b059a7e6b Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sat, 16 Oct 2021 15:32:55 +0200 Subject: [PATCH 16/51] lint --- .../remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts index 7a489dadf9..bdfddbeaf8 100644 --- a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts +++ b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts @@ -65,12 +65,12 @@ test.only('install plugin', async t => { } await t.click('.introjs-skipbutton') await ClickLaunchIcon(t, 'solidity') - - await t.click(Selector("#optimize")) + + await t.click(Selector('#optimize')) await setCompilerVersion(t, 'builtin') await t.wait(10000) // await setCompilerVersion(t, 'builtin') - + // await installPlugin(t, localPluginData) }) From d1ca0018d1b0f6c59aa03427c0244b5aa65876ad Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sat, 16 Oct 2021 15:48:56 +0200 Subject: [PATCH 17/51] ci cnfig --- .circleci/config.yml | 11 +++++++++-- apps/remix-ide/ci/browser_tests_plugin_api.sh | 5 ++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2ba31888ac..756829d2f2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -276,11 +276,18 @@ jobs: - run: npm install - run: npx nx build remix-ide --with-deps - run: npx nx build remix-ide-e2e-src-local-plugin + - run: + name: Download Selenium + command: ./node_modules/.bin/selenium-standalone install --drivers.chrome.version=2.39 --drivers.chrome.baseURL=https://chromedriver.storage.googleapis.com + - run: + name: Start Selenium + command: ./node_modules/.bin/selenium-standalone start --drivers.chrome.version=2.39 --drivers.chrome.baseURL=https://chromedriver.storage.googleapis.com + background: true - run: ./apps/remix-ide/ci/browser_tests_plugin_api.sh - store_test_results: - path: /tmp/test-results + path: ./reports/tests - store_artifacts: - path: /tmp/artifacts + path: ./reports/screenshots deploy-remix-live: docker: # specify the version you desire here diff --git a/apps/remix-ide/ci/browser_tests_plugin_api.sh b/apps/remix-ide/ci/browser_tests_plugin_api.sh index e024d72c31..8b3ef4eeb3 100755 --- a/apps/remix-ide/ci/browser_tests_plugin_api.sh +++ b/apps/remix-ide/ci/browser_tests_plugin_api.sh @@ -8,7 +8,10 @@ TEST_EXITCODE=0 npm run serve & npx nx serve remix-ide-e2e-src-local-plugin & -sleep 5 & + +sleep 5 + +npm run build:e2e npm run nightwatch_local_pluginApi || TEST_EXITCODE=1 echo "$TEST_EXITCODE" From 350af625be1548da8513c4aabed40c36d9a5c20e Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sat, 16 Oct 2021 15:58:24 +0200 Subject: [PATCH 18/51] mv test --- .../{plugin_api.test.ts => plugin_api.ts} | 0 package-lock.json | 66 +++++++++++++++++-- package.json | 2 +- 3 files changed, 60 insertions(+), 8 deletions(-) rename apps/remix-ide-e2e/src/tests/{plugin_api.test.ts => plugin_api.ts} (100%) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.test.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts similarity index 100% rename from apps/remix-ide-e2e/src/tests/plugin_api.test.ts rename to apps/remix-ide-e2e/src/tests/plugin_api.ts diff --git a/package-lock.json b/package-lock.json index 226eda8245..12a8f8b65f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17912,7 +17912,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -17933,8 +17932,7 @@ "domelementtype": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, "domexception": { "version": "2.0.1", @@ -17957,7 +17955,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", - "dev": true, "requires": { "domelementtype": "^2.2.0" } @@ -17966,7 +17963,6 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -18332,8 +18328,7 @@ "entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, "env-paths": { "version": "2.2.1", @@ -23277,6 +23272,15 @@ } } }, + "html-dom-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.0.2.tgz", + "integrity": "sha512-Jq4oVkVSn+10ut3fyc2P/Fs1jqTo0l45cP6Q8d2ef/9jfkYwulO0QXmyLI0VUiZrXF4czpGgMEJRa52CQ6Fk8Q==", + "requires": { + "domhandler": "4.2.2", + "htmlparser2": "6.1.0" + } + }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -23298,12 +23302,34 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "html-react-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.0.tgz", + "integrity": "sha512-v8Kxy+7L90ZFSM690oJWBNRzZWZOQquYPpQt6kDQPzQyZptXgOJ69kHSi7xdqNdm1mOfsDPwF4K9Bo/dS5gRTQ==", + "requires": { + "domhandler": "4.2.2", + "html-dom-parser": "1.0.2", + "react-property": "2.0.0", + "style-to-js": "1.1.0" + } + }, "htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -23775,6 +23801,11 @@ "source-map": "~0.5.3" } }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "inquirer": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", @@ -40864,6 +40895,11 @@ "warning": "^4.0.3" } }, + "react-property": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", + "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" + }, "react-redux": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.5.tgz", @@ -44454,6 +44490,22 @@ } } }, + "style-to-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.0.tgz", + "integrity": "sha512-1OqefPDxGrlMwcbfpsTVRyzwdhr4W0uxYQzeA2F1CBc8WG04udg2+ybRnvh3XYL4TdHQrCahLtax2jc8xaE6rA==", + "requires": { + "style-to-object": "0.3.0" + } + }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, "stylehacks": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", diff --git a/package.json b/package.json index b933527001..f68915c41e 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "nightwatch_local_runAndDeploy": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/runAndDeploy.js --env=chrome-runAndDeploy", "nightwatch_local_url": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/url.spec.js --env=chrome", "nightwatch_local_verticalIconscontextmenu": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/verticalIconsPanel.spec.js --env=chrome", - "nightwatch_local_pluginApi": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/plugin_api.test.js --env=chrome", + "nightwatch_local_pluginApi": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/plugin_api.js --env=chrome", "onchange": "onchange apps/remix-ide/build/app.js -- npm-run-all lint", "remixd": "nx build remixd && nx serve remixd --folder=./apps/remix-ide/contracts --remixide=http://127.0.0.1:8080", "selenium": "selenium-standalone start", From c767a1d1a2eb1a7e48f2deeeb49305e477215448 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 17 Oct 2021 00:24:34 +0200 Subject: [PATCH 19/51] refactor plugin --- .../src/local-plugin/src/app/Client.ts | 9 -- .../src/local-plugin/src/app/app.tsx | 122 ++++++++++-------- .../src/local-plugin/src/app/logger.tsx | 12 +- apps/remix-ide-e2e/src/tests/plugin_api.ts | 31 +++-- 4 files changed, 93 insertions(+), 81 deletions(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts index dea17d9292..7d03a4f8e0 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts @@ -66,15 +66,6 @@ export class WorkSpacePlugin extends PluginClient { console.log("comp fin",x) }) */ - await this.setCallBacks() - - this.on( - 'solidity', - 'compilationFinished', - function (target, source, version, data) { - console.log('compile finished', target, source, version, data) - } - ) }) .catch(async (e) => { console.log('ERROR CONNECTING', e) diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index b26a5297b2..38ee187dab 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -1,83 +1,99 @@ -import React, { useState } from 'react' +import React, { useEffect, useRef, useState } from 'react' import { WorkSpacePlugin } from './Client' import { Logger } from './logger' +import { useBehaviorSubject } from './usesubscribe/index' +import { filePanelProfile } from '@remixproject/plugin-api/lib/file-system/file-panel/profile' +import { filSystemProfile } from '@remixproject/plugin-api/lib/file-system/file-manager/profile' +import { dGitProfile } from '@remixproject/plugin-api/lib/dgit/profile' +import { editorProfile } from '@remixproject/plugin-api/lib/editor/profile' +import { settingsProfile } from '@remixproject/plugin-api/lib/settings/profile' +import { networkProfile } from '@remixproject/plugin-api/lib/network/profile' +import { terminalProfile } from '@remixproject/plugin-api/lib/terminal/profile' +import { udappProfile } from '@remixproject/plugin-api/lib/udapp' +import { compilerProfile } from '@remixproject/plugin-api/lib/compiler' +import { contentImportProfile } from '@remixproject/plugin-api/lib/content-import' +import { unitTestProfile } from '@remixproject/plugin-api/lib/unit-testing' +import { windowProfile } from '@remixproject/plugin-api/lib/window' +import { pluginManagerProfile } from '@remixproject/plugin-api/lib/plugin-manager' +import { IFileSystem } from '@remixproject/plugin-api' + +import { Profile } from '@remixproject/plugin-utils' export const client = new WorkSpacePlugin() function App () { const [payload, setPayload] = useState('') - const [result, setResult] = useState() const [append, setAppend] = useState(false) + const [log, setLog] = useState() + const [profiles, setProfiles] = useState([pluginManagerProfile, filePanelProfile, filSystemProfile, dGitProfile, networkProfile, settingsProfile, editorProfile, terminalProfile, compilerProfile, udappProfile, contentImportProfile, unitTestProfile, windowProfile]) const handleChange = ({ target }: any) => { setPayload(target.value) } + useEffect(() => { + client.onload(async () => { + const customProfiles = ['solidity'] + + for (const name of customProfiles) { + const p = await client.call('manager', 'getProfile', name) + setProfiles(profiles => [p, ...profiles]) + } + + profiles.map((profile: Profile) => { + if (profile.events) { + profile.events.map((event: string) => { + console.log(profile.name, event) + client.on(profile.name as any, event, (...args:any) => { + console.log(event, args) + }) + }) + } + }) + }) + }, []) + const setAppendChange = ({ target }: any) => { console.log('append', target.checked) setAppend(target.checked) } + const clientMethod = async (profile: Profile, method: string) => { + try { + let ob: any = null + try { + ob = JSON.parse(payload) + } catch (e) {} + const send = ob || [payload] + const result = await client.call(profile.name as any, method, ...send) + setLog(result) + } catch (e) { + setLog(e.message) + } + } + return ( -
-
v5
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+
PLUGIN API TESTER
+ + + + {profiles.map((profile: Profile) => { + const methods = profile.methods.map((method: string) => { + return + }) + return


{methods}
+ })} +
) } diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx index 91712ecf82..f26812206c 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx @@ -1,21 +1,21 @@ import React, { useEffect, useState } from 'react' -import { useBehaviorSubject } from './usesubscribe/index' + import { client } from './app' interface loggerProps { - append: boolean + append: boolean, + log: any } export const Logger: React.FC = (props) => { - const log = useBehaviorSubject(client.feedback) const [value, setValue] = useState('') useEffect(() => { setValue(value => { - const addValue = typeof log === 'string' ? log : JSON.stringify(log) + const addValue = typeof props.log === 'string' ? props.log : JSON.stringify(props.log) return props.append ? `${value} ${addValue}` : addValue }) - }, [log]) + }, [props]) - return (
{value}
) + return (
{value}
) } diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 8ade0fec9b..f12ed84eea 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -18,8 +18,13 @@ const getBrowserLogs = function (browser: NightwatchBrowser) { console.log(logEntries) }) } - -const assertLog = function (browser: NightwatchBrowser, buttonText: string, msg: any, payload: string) { +/* +* PLUGINACTION +* buttonText: which button to click +* msg: what to expect from the log +* payload: extra param for the call +*/ +const pluginAction = function (browser: NightwatchBrowser, buttonText: string, msg: any, payload: string) { if (payload) { browser.clearValue('//*[@id="payload"]').setValue('//*[@id="payload"]', payload).pause(1000) } @@ -82,22 +87,22 @@ module.exports = { }, 'Should get current workspace': function (browser: NightwatchBrowser) { - assertLog(browser, 'get workspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null) + pluginAction(browser, 'get workspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null) }, 'Should get current files': function (browser: NightwatchBrowser) { - assertLog(browser, 'readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null) + pluginAction(browser, 'readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null) }, 'Should throw error on current file': function (browser: NightwatchBrowser) { - assertLog(browser, 'getcurrentfile', 'Error from IDE : Error: No such file or directory No file selected', null) + pluginAction(browser, 'getcurrentfile', 'Error from IDE : Error: No such file or directory No file selected', null) }, 'Should open readme.txt': function (browser: NightwatchBrowser) { - assertLog(browser, 'openfile', null, 'README.txt') + pluginAction(browser, 'openfile', null, 'README.txt') }, 'Should have current file': function (browser: NightwatchBrowser) { - assertLog(browser, 'getcurrentfile', 'README.txt', null) + pluginAction(browser, 'getcurrentfile', 'README.txt', null) }, 'Should activate solidityUnitTesting': function (browser: NightwatchBrowser) { - assertLog(browser, 'activate', null, 'solidityUnitTesting') + pluginAction(browser, 'activate', null, 'solidityUnitTesting') browser.frameParent() assertPluginIsActive(browser, 'solidityUnitTesting') // @ts-ignore @@ -105,13 +110,13 @@ module.exports = { }, 'Should switch to file': function (browser: NightwatchBrowser) { - assertLog(browser, 'switch to file', null, 'contracts/1_Storage.sol') - assertLog(browser, 'getcurrentfile', 'contracts/1_Storage.sol', null) - assertLog(browser, 'switch to file', null, 'README.txt') - assertLog(browser, 'getcurrentfile', 'README.txt', null) + pluginAction(browser, 'switch to file', null, 'contracts/1_Storage.sol') + pluginAction(browser, 'getcurrentfile', 'contracts/1_Storage.sol', null) + pluginAction(browser, 'switch to file', null, 'README.txt') + pluginAction(browser, 'getcurrentfile', 'README.txt', null) }, 'Should write to file': function (browser: NightwatchBrowser) { - assertLog(browser, 'write', 'README.txt', null) + pluginAction(browser, 'write', 'README.txt', null) } } From c88952594d75ae1ae94c0c1828aacbf5dd296208 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 17 Oct 2021 09:35:17 +0200 Subject: [PATCH 20/51] update local plugin --- .../src/local-plugin/src/app/app.tsx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index 38ee187dab..331a628977 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useRef, useState } from 'react' import { WorkSpacePlugin } from './Client' import { Logger } from './logger' -import { useBehaviorSubject } from './usesubscribe/index' + import { filePanelProfile } from '@remixproject/plugin-api/lib/file-system/file-panel/profile' import { filSystemProfile } from '@remixproject/plugin-api/lib/file-system/file-manager/profile' import { dGitProfile } from '@remixproject/plugin-api/lib/dgit/profile' @@ -16,7 +16,6 @@ import { contentImportProfile } from '@remixproject/plugin-api/lib/content-impor import { unitTestProfile } from '@remixproject/plugin-api/lib/unit-testing' import { windowProfile } from '@remixproject/plugin-api/lib/window' import { pluginManagerProfile } from '@remixproject/plugin-api/lib/plugin-manager' -import { IFileSystem } from '@remixproject/plugin-api' import { Profile } from '@remixproject/plugin-utils' @@ -26,7 +25,7 @@ function App () { const [payload, setPayload] = useState('') const [append, setAppend] = useState(false) const [log, setLog] = useState() - const [profiles, setProfiles] = useState([pluginManagerProfile, filePanelProfile, filSystemProfile, dGitProfile, networkProfile, settingsProfile, editorProfile, terminalProfile, compilerProfile, udappProfile, contentImportProfile, unitTestProfile, windowProfile]) + const [profiles, setProfiles] = useState([pluginManagerProfile, filePanelProfile, filSystemProfile, dGitProfile, networkProfile, settingsProfile, editorProfile, terminalProfile, compilerProfile, udappProfile, contentImportProfile, unitTestProfile, windowProfile]) const handleChange = ({ target }: any) => { setPayload(target.value) @@ -34,7 +33,7 @@ function App () { useEffect(() => { client.onload(async () => { - const customProfiles = ['solidity'] + const customProfiles = ['solidity', 'menuicons', 'tabs'] for (const name of customProfiles) { const p = await client.call('manager', 'getProfile', name) @@ -65,8 +64,8 @@ function App () { try { ob = JSON.parse(payload) } catch (e) {} - const send = ob || [payload] - const result = await client.call(profile.name as any, method, ...send) + const args = ob || [payload] + const result = await client.call(profile.name as any, method, ...args) setLog(result) } catch (e) { setLog(e.message) @@ -86,12 +85,15 @@ function App () { onChange={handleChange} /> - + {profiles.map((profile: Profile) => { const methods = profile.methods.map((method: string) => { return }) - return


{methods}
+ const events = profile.events ? profile.events.map((event: string) => { + return + }) : null + return


{methods}

{events ? : null}{events}
})}
From f5c59acfb179a4cdf735b312743f3f07aa3a84ea Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 17 Oct 2021 10:19:38 +0200 Subject: [PATCH 21/51] cleanup --- .../src/local-plugin/src/app/Client.ts | 528 +----------------- .../src/local-plugin/src/app/app.css | 131 +---- .../src/local-plugin/src/app/app.tsx | 27 +- .../src/local-plugin/src/app/logger.tsx | 5 +- .../src/local-plugin/src/app/logo.svg | 17 - .../src/local-plugin/src/app/star.svg | 11 - .../src/app/usesubscribe/index.ts | 1 - .../src/app/usesubscribe/use-observable.ts | 32 -- .../src/local-plugin/src/index.html | 2 +- package-lock.json | 70 +-- package.json | 14 +- 11 files changed, 69 insertions(+), 769 deletions(-) delete mode 100644 apps/remix-ide-e2e/src/local-plugin/src/app/logo.svg delete mode 100644 apps/remix-ide-e2e/src/local-plugin/src/app/star.svg delete mode 100644 apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/index.ts delete mode 100644 apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/use-observable.ts diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts index 7d03a4f8e0..dc9839c6b5 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts @@ -1,534 +1,8 @@ import { PluginClient } from '@remixproject/plugin' -import { customAction } from '@remixproject/plugin-api/lib/file-system/file-panel' import { createClient } from '@remixproject/plugin-webview' -import { BehaviorSubject } from 'rxjs' -import axios from 'axios' - -const simpleContract = `pragma solidity >=0.4.22 <0.7.0; -/** -* @title Storage -* @dev Store & retreive value in a variable -*/ -contract StorageTestUpdateConfiguration { - uint256 number; - /** - * @dev Store value in variable - * @param num value to store - */ - function store(uint256 num) public { - number = num; - } - /** - * @dev Return value - * @return value of 'number' - */ - function retreive() public view returns (uint256){ - return number; - } -} - - ` - -export class WorkSpacePlugin extends PluginClient { - callBackEnabled: boolean = true; - feedback = new BehaviorSubject(''); - +export class RemixPlugin extends PluginClient { constructor () { super() createClient(this) - - this.methods = ['customAction'] - - this.onload() - .then(async (x) => { - // console.log("client loaded", JSON.stringify(this)); - try { - // await this.call("solidityUnitTesting", "testFromSource", ""); - } catch (e) { - // console.log("not available"); - } - /* - let acc = await this.call("udapp","getSettings") - console.log(acc) - let ac2 = await this.call("udapp","getAccounts") - console.log(ac2) - const privateKey = "71975fbf7fe448e004ac7ae54cad0a383c3906055a75468714156a07385e96ce" - const balance = "0x56BC75E2D63100000" - let na = await this.call("udapp","createVMAccount",{ privateKey, balance }) - console.log(na) - - this.on('udapp', 'newTransaction', (tx: any) => { - // Do something - console.log("new transaction", tx) - }) - - this.on("solidity","compilationFinished",function(x){ - console.log("comp fin",x) - }) - */ - }) - .catch(async (e) => { - console.log('ERROR CONNECTING', e) - }) - } - - async setCallBacks () { - const cmd: customAction = { - id: this.name, - name: 'customAction', - type: ['file', 'folder'], - extension: [], - path: [], - pattern: [] - // sticky: true - } - - const cmd2: customAction = { - id: this.name, - name: 'myAction2', - type: ['file', 'folder'], - extension: [], - path: [], - pattern: [] - } - - this.call('filePanel', 'registerContextMenuItem', cmd) - this.call('filePanel', 'registerContextMenuItem', cmd2) - - console.log('set listeners') - const me = this - this.on('fileManager', 'currentFileChanged', function (x) { - me.setFeedback({ - event: 'currentFileChanged', - result: x - }) - }) - - this.on('filePanel', 'customAction', function (x) { - console.log('custom ACTION', x) - }) - - this.on('fileManager', 'fileRemoved', function (x) { - me.setFeedback(`fileRemoved:${x}`) - }) - - this.on( - 'solidity', - 'compilationFinished', - function (target, source, version, data) { - console.log('compile finished', target, source, version, data) - } - ) - - this.on('fileManager', 'fileAdded', function (x) { - console.log('added file', x) - me.log(x) - }) - - /* this.on("fileExplorers", "createWorkspace", function (x) { - console.log("ws create", x); - me.log(x); - }); - - this.on("fileExplorers", "setWorkspace", function (x) { - console.log("ws set", x); - me.log(x); - }); - - this.on("fileExplorers", "deleteWorkspace", function (x) { - console.log("wS DELETE", x); - me.log(x); - }); - - this.on("fileExplorers", "renameWorkspace", function (x) { - console.log("wS rn", x); - me.log(x); - }); */ - } - - setFeedback (ob: any) { - this.feedback.next(ob) - console.log(ob) - } - - async customAction (o:customAction) { - console.log('custom action called', o) - } - - async log (message: string) { - // console.log(message) - this.call('terminal', 'log', { type: 'info', value: 'Name\r\nAniket' }) - this.call('terminal', 'log', { type: 'html', value: '
test
  • test
' }) - } - - async changetoinjected () { - this.call('udapp', 'setEnvironmentMode', 'injected') - } - - async test (p: string) {} - - async activate (id: string) { - this.call('manager', 'activatePlugin', id) - } - - async deactivate (id: string) { - this.call('manager', 'deactivatePlugin', id) - } - - async getresult () { - const r = await this.call('solidity', 'getCompilationResult') - console.log('RESULT', r) - } - - async gitbranches () { - // let r = await this.call("dGitProvider","branches") - // console.log("branches", r) - } - - async gitbranch (dir: string) { - // let r = await this.call("dGitProvider","branch",dir) - } - - async gitcurrentbranch () { - try { - const r = await this.call('dGitProvider', 'currentbranch') - this.setFeedback(r) - } catch (e) { - this.setFeedback(e.message) - } - } - - async gitcheckout (dir: string) { - // let r = await this.call("dGitProvider","checkout",dir) - } - - async gitinit (dir: string) { - // let s = await this.call("fileExplorers","getCurrentWorkspace") - // let r = await this.call("dGitProvider","init") - } - - async gitstatus (dir: string) { - // let r = await this.call("dGitProvider","status",'HEAD') - // console.log("git status ", r) - } - - async gitadd (dir: string) { - // let r = await this.call("dGitProvider","add",dir) - // console.log("git add ", r) - } - - async gitremove (dir: string) { - // let r = await this.call("dGitProvider","rm",dir) - // console.log("git rm ", r) - } - - async gitlog () { - // let r = await this.call("dGitProvider","log",'HEAD') - // console.log("git log ", r) - } - - async gitcommit () { - // let r = await this.call("dGitProvider","commit",{}) - // console.log("git log ", r) - } - - async gitlsfiles () { - // let r = await this.call("dGitProvider","lsfiles",'HEAD') - // console.log("git log ", r) - } - - async gitresolveref () { - // let r = await this.call("dGitProvider","resolveref",'HEAD') - // console.log("git resolve ", r) - } - - async gitreadblob (file: string) { - // let c = await this.call("dGitProvider","log",'HEAD') - // console.log(c[c.length-1].oid) - // let r = await this.call("dGitProvider","readblob",{oid:c[c.length-1].oid, filepath:"README.txt"}) - // console.log("git blob ", r) - } - - async ipfspush () { - console.log(await this.call('dGitProvider', 'push')) - } - - async pinatapush () { - try { - const r = await this.call('dGitProvider' as any, 'pin', '124def6d9115e0c2c521', '130c1a8b18fd0c77f9ee8c1614146d277c3def661506dbf1c78618325cc53c8b') - console.log(r) - } catch (err) { - console.log(err) - } - } - - async pinlist () { - try { - const r = await this.call('dGitProvider' as any, 'pinList', '124def6d9115e0c2c521', '130c1a8b18fd0c77f9ee8c1614146d277c3def661506dbf1c78618325cc53c8b') - console.log(r) - } catch (err) { - console.log(err) - } - } - - async ipfspull (cid: string) { - try { - await this.call('dGitProvider', 'pull', cid) - } catch (e) {} - } - - async ipfsConfig () { - /* try{ - let r = await this.call("dGitProvider", "setIpfsConfig", { - host: 'localhost', - port: 5002, - protocol: 'http', - ipfsurl: 'https://ipfsgw.komputing.org/ipfs/' - }); - console.log(r) - }catch(e){ - console.log(e) - } */ - } - - async readddir (dir: string) { - try { - const files = await this.call('fileManager', 'readdir', dir) - this.setFeedback(files) - } catch (e) { - this.setFeedback(e.message) - } - } - - async write (dir: string) { - try { - this.call('fileManager', 'setFile', dir, 'simple readme') - } catch (e) { - this.setFeedback(e.message) - } - } - - async getcurrentfile () { - try { - const files = await this.call('fileManager', 'getCurrentFile') - this.setFeedback(files) - } catch (e) { - this.setFeedback(e.message) - } - } - - async switchfile (dir: string) { - try { - await this.call('fileManager', 'switchFile', dir) - } catch (e) { - this.setFeedback(e.message) - } - } - - async zip () { - const r = await this.call('dGitProvider', 'zip') - } - - async fetch (dir: string) { - try { - var files = await fetch(dir) - console.log(files) - console.log(files.toString()) - } catch (e) { - console.error(e) - } - } - - async axios (dir: string) { - try { - var files = await axios.get(dir) - console.log(files) - console.log(files.toString()) - } catch (e) { - console.error(e) - } - } - - async getcompilerconfig () { - // let config = await this.call("solidity","getCompilerConfig") - // console.log(config) - } - - async getWorkSpace () { - try { - const s = await this.call('filePanel' as any, 'getCurrentWorkspace') - this.setFeedback(s) - } catch (e) { - this.setFeedback(e.message) - } - } - - async getWorkSpaces () { - // let s = await this.call("fileExplorers","getWorkspaces") - // console.log(s) - } - - async createWorkSpace (name: string) { - try { - await this.call('filePanel', 'createWorkspace', name) - } catch (e) { - this.setFeedback(e.message) - } - } - - async importcontent (dir: string) { - console.log('import content') - var content = await this.call( - 'contentImport', - 'resolve', - 'ipfs://Qmd1gr9VeQaYNA8wVDq86RwdeMZkfF93JZhhWgfCVewYtc' - ) - console.log('content', content) - } - - async open (dir: string) { - await this.call('fileManager', 'open', dir) - } - - async highlight (f: string) { - this.call( - 'editor', - 'highlight', - { - start: { - line: 0, - column: 1 - }, - end: { - line: 1, - column: 10 - } - }, - f, - '#ffffff' - ) - } - - async addAnnotation (f: string) { - this.call('editor', 'addAnnotation', { - row: 1, - column: 1, - text: 'annotation', - type: 'error' - }) - this.call('editor', 'addAnnotation', { - row: 10, - column: 2, - text: 'annotation', - type: 'info' - }) - this.call('editor', 'addAnnotation', { - row: 12, - column: 1, - text: 'annotation', - type: 'warning' - }) - } - - async clearAnnotations (f: string) { - this.call('editor', 'clearAnnotations') - } - - async activatePlugin (f:string) { - try { - await this.call('manager', 'activatePlugin', f) - this.setFeedback(await this.call('manager', 'isActive', f)) - } catch (e) { - this.setFeedback(e.message) - } - } - - async deActivatePlugin (f:string) { - try { - await this.call('manager', 'deactivatePlugin', f) - this.setFeedback(await this.call('manager', 'isActive', f)) - } catch (e) { - this.setFeedback(e.message) - } - } - - async getSettings () { - try { - const settings = await this.call('udapp', 'getSettings') - this.setFeedback(settings) - } catch (e) { - this.setFeedback(e.message) - } - } - - async setSettings () { - const settings = await this.call('udapp', 'setEnvironmentMode', 'injected') - await this.getSettings() - } - - async debug (hash:string) { - const settings = await this.call('remixdprovider' as any, 'debug', hash) - } - - async getAccounts () { - try { - const settings = await this.call('udapp', 'getAccounts') - this.setFeedback(settings) - } catch (e) { - this.setFeedback(e.message) - } - } - - async soltest () { - const f = `pragma solidity >=0.4.0; - - contract SimpleStorage { - uint storedData; - - // a public function named set that returns a uint goes here - function set(uint _p1) public returns (uint) { - storedData = _p1; - } - - function get() public view returns (uint) { - return storedData; - } - } - ` - - const t = `pragma solidity >=0.4.0; - import "remix_tests.sol"; // this import is automatically injected by Remix. - import "./modifyVariable.sol"; - - contract test3 { - - SimpleStorage storageToTest; - function beforeAll () public { - storageToTest = new SimpleStorage(); - } - - function checkSetFunction () public { - storageToTest.set(12345); - Assert.equal(storageToTest.get(), uint(12345), "the contract should contain the function set"); - } - } - ` - // await this.call('fileManager', 'setFile', '/modifyVariable.sol', f) - await this.call('fileManager', 'switchFile', 'tests/4_Ballot_test.sol') - // await this.call('fileManager', 'setFile', '/modifyVariable_test.sol', t) - const result = await this.call( - 'solidityUnitTesting', - 'testFromPath', - 'tests/4_Ballot_test.sol' - ) - this.setFeedback(result) - } - - async disableCallBacks () { - this.callBackEnabled = false - } - - async enableCallBacks () { - this.callBackEnabled = true } } diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.css b/apps/remix-ide-e2e/src/local-plugin/src/app/app.css index 5d5777c1cb..ce033a9bb1 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.css +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.css @@ -1,128 +1,3 @@ -.app { - font-family: sans-serif; - min-width: 300px; - max-width: 600px; - margin: 50px auto; -} - -.app .gutter-left { - margin-left: 9px; -} - -.app .col-span-2 { - grid-column: span 2; -} - -.app .flex { - display: flex; - align-items: center; - justify-content: center; -} - -.app header { - background-color: #143055; - color: white; - padding: 5px; - border-radius: 3px; -} - -.app main { - padding: 0 36px; -} - -.app p { - text-align: center; -} - -.app h1 { - text-align: center; - margin-left: 18px; - font-size: 24px; -} - -.app h2 { - text-align: center; - font-size: 20px; - margin: 40px 0 10px 0; -} - -.app .resources { - text-align: center; - list-style: none; - padding: 0; - display: grid; - grid-gap: 9px; - grid-template-columns: 1fr 1fr; -} - -.app .resource { - color: #0094ba; - height: 36px; - background-color: rgba(0, 0, 0, 0); - border: 1px solid rgba(0, 0, 0, 0.12); - border-radius: 4px; - padding: 3px 9px; - text-decoration: none; -} - -.app .resource:hover { - background-color: rgba(68, 138, 255, 0.04); -} - -.app pre { - padding: 9px; - border-radius: 4px; - background-color: black; - color: #eee; -} - -.app details { - border-radius: 4px; - color: #333; - background-color: rgba(0, 0, 0, 0); - border: 1px solid rgba(0, 0, 0, 0.12); - padding: 3px 9px; - margin-bottom: 9px; -} - -.app summary { - outline: none; - height: 36px; - line-height: 36px; -} - -.app .github-star-container { - margin-top: 12px; - line-height: 20px; -} - -.app .github-star-container a { - display: flex; - align-items: center; - text-decoration: none; - color: #333; -} - -.app .github-star-badge { - color: #24292e; - display: flex; - align-items: center; - font-size: 12px; - padding: 3px 10px; - border: 1px solid rgba(27, 31, 35, 0.2); - border-radius: 3px; - background-image: linear-gradient(-180deg, #fafbfc, #eff3f6 90%); - margin-left: 4px; - font-weight: 600; -} - -.app .github-star-badge:hover { - background-image: linear-gradient(-180deg, #f0f3f6, #e6ebf1 90%); - border-color: rgba(27, 31, 35, 0.35); - background-position: -0.5em; -} -.app .github-star-badge .material-icons { - height: 16px; - width: 16px; - margin-right: 4px; -} +.jumbotron { + max-height: 25vh; +} \ No newline at end of file diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index 331a628977..06b44ee2da 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -1,6 +1,6 @@ -import React, { useEffect, useRef, useState } from 'react' -import { WorkSpacePlugin } from './Client' +import React, { useEffect, useState } from 'react' +import { RemixPlugin } from './Client' import { Logger } from './logger' import { filePanelProfile } from '@remixproject/plugin-api/lib/file-system/file-panel/profile' @@ -16,15 +16,17 @@ import { contentImportProfile } from '@remixproject/plugin-api/lib/content-impor import { unitTestProfile } from '@remixproject/plugin-api/lib/unit-testing' import { windowProfile } from '@remixproject/plugin-api/lib/window' import { pluginManagerProfile } from '@remixproject/plugin-api/lib/plugin-manager' - import { Profile } from '@remixproject/plugin-utils' -export const client = new WorkSpacePlugin() +import './app.css' + +export const client = new RemixPlugin() function App () { const [payload, setPayload] = useState('') const [append, setAppend] = useState(false) const [log, setLog] = useState() + const [events, setEvents] = useState() const [profiles, setProfiles] = useState([pluginManagerProfile, filePanelProfile, filSystemProfile, dGitProfile, networkProfile, settingsProfile, editorProfile, terminalProfile, compilerProfile, udappProfile, contentImportProfile, unitTestProfile, windowProfile]) const handleChange = ({ target }: any) => { @@ -33,12 +35,14 @@ function App () { useEffect(() => { client.onload(async () => { - const customProfiles = ['solidity', 'menuicons', 'tabs'] + const customProfiles = ['menuicons', 'tabs'] + let addProfiles = [] for (const name of customProfiles) { const p = await client.call('manager', 'getProfile', name) - setProfiles(profiles => [p, ...profiles]) + addProfiles = [...addProfiles, p] } + setProfiles(profiles => [...profiles, ...addProfiles]) profiles.map((profile: Profile) => { if (profile.events) { @@ -46,6 +50,10 @@ function App () { console.log(profile.name, event) client.on(profile.name as any, event, (...args:any) => { console.log(event, args) + setEvents({ + event: event, + args: args + }) }) }) } @@ -75,7 +83,10 @@ function App () { return (
PLUGIN API TESTER
- + + + + await clientMethod(profile, method)}>{method} }) const events = profile.events ? profile.events.map((event: string) => { - return + return }) : null return


{methods}

{events ? : null}{events}
})} diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx index f26812206c..f131b73905 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx @@ -4,7 +4,8 @@ import { client } from './app' interface loggerProps { append: boolean, - log: any + log: any, + id: string } export const Logger: React.FC = (props) => { @@ -17,5 +18,5 @@ export const Logger: React.FC = (props) => { }) }, [props]) - return (
{value}
) + return (
{value}
) } diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/logo.svg b/apps/remix-ide-e2e/src/local-plugin/src/app/logo.svg deleted file mode 100644 index 8fa84ab509..0000000000 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/logo.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/star.svg b/apps/remix-ide-e2e/src/local-plugin/src/app/star.svg deleted file mode 100644 index 901053d385..0000000000 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/star.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/index.ts b/apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/index.ts deleted file mode 100644 index d23b13c425..0000000000 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './use-observable' diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/use-observable.ts b/apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/use-observable.ts deleted file mode 100644 index 27dd854414..0000000000 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/usesubscribe/use-observable.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { useState, useEffect } from 'react' -import { Subscribable, BehaviorSubject, Observable, Subject } from 'rxjs' - -export const useSubscribable = ( - s: Subscribable, - defaultValue?: T -) => { - const [value, setValue] = useState(defaultValue) - useEffect( - () => { - const subscription = s.subscribe(setValue) - return () => subscription.unsubscribe() - }, - [s] - ) - return value -} -export const useRx = useSubscribable - -export const useObservable = ( - o: Observable, - defaultValue?: T -) => useSubscribable(o, defaultValue) - -export const useSubject = ( - s: Subject, - defaultValue?: T -) => useSubscribable(s, defaultValue) - -export const useBehaviorSubject = ( - s: BehaviorSubject -) => useSubscribable(s, s.value) diff --git a/apps/remix-ide-e2e/src/local-plugin/src/index.html b/apps/remix-ide-e2e/src/local-plugin/src/index.html index e8058b50b5..2b826a80b6 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/index.html +++ b/apps/remix-ide-e2e/src/local-plugin/src/index.html @@ -2,7 +2,7 @@ - LocalPlugin + Remix Plugin API Testser diff --git a/package-lock.json b/package-lock.json index 12a8f8b65f..49961ea093 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9832,46 +9832,46 @@ "integrity": "sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw==" }, "@remixproject/engine": { - "version": "0.3.208", - "resolved": "https://registry.npmjs.org/@remixproject/engine/-/engine-0.3.208.tgz", - "integrity": "sha512-kEWHrkQZUbik4uAVotFRVWA1+Za5m1EUYsKYaFLdroQHIUzuiWZjgYfxDixFb/hGYUZy2GPLzwTkNfJnRmSSaQ==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@remixproject/engine/-/engine-0.3.21.tgz", + "integrity": "sha512-IT2rQyiMG97WY4BMQzG0TOMOabhqafippUrGNUNk4FKKR6dXTEjD+mXaOJuesmK50UM+zpcxhsc7IQGIoCIXbQ==", "requires": { - "@remixproject/plugin-api": "0.3.208", - "@remixproject/plugin-utils": "0.3.208" + "@remixproject/plugin-api": "0.3.21", + "@remixproject/plugin-utils": "0.3.21" } }, "@remixproject/engine-web": { - "version": "0.3.208", - "resolved": "https://registry.npmjs.org/@remixproject/engine-web/-/engine-web-0.3.208.tgz", - "integrity": "sha512-3/OqsTKub5J374GoNo3H/889BdfL+khfj9uyKiyWMVK+hCQ5acdpLa+H7CPdUBbqk/Gt1HjjD+iV2zzRw/vdWg==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@remixproject/engine-web/-/engine-web-0.3.21.tgz", + "integrity": "sha512-ZSzuZLiB8EZVlGgXwl5riZdpU0lgMNcwY8U/e3b9D8PbSEr2XoOS0VD6P83KiYaPyNV9IKYoGcB1aqImm/58nA==", "requires": { - "@remixproject/engine": "0.3.208", - "@remixproject/plugin-api": "0.3.208", - "@remixproject/plugin-utils": "0.3.208" + "@remixproject/engine": "0.3.21", + "@remixproject/plugin-api": "0.3.21", + "@remixproject/plugin-utils": "0.3.21" } }, "@remixproject/plugin": { - "version": "0.3.208", - "resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.208.tgz", - "integrity": "sha512-6bA8823xaRYn+dYf1a1AObiCgSf6Q4tlSmVvcS/KYWQmi2upDmfGCILxAVaKD6CWCTP/3bdeXeH/q766NdpLcQ==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.21.tgz", + "integrity": "sha512-JxKcXxjl7Fk2oP/KQwdHErQsjAwOpOJlv7q4I5MbdfN7hue7Kpe/lbqW19YTD0Cydsjd8jCI34q/2hEN6gyU2g==", "requires": { - "@remixproject/plugin-api": "0.3.208", - "@remixproject/plugin-utils": "0.3.208", + "@remixproject/plugin-api": "0.3.21", + "@remixproject/plugin-utils": "0.3.21", "events": "3.2.0" } }, "@remixproject/plugin-api": { - "version": "0.3.208", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.208.tgz", - "integrity": "sha512-11hFxABBrEzE4fgcDblWqxLAh5ARH2tBADgh9KNk+y7LUV7aQ7OZf4KiZ2US+uKiSC6497iu/uLHbWBTeRqlVA==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.21.tgz", + "integrity": "sha512-hTb785ncQNkH597gHYd4zmuqrQ123AEBQyyeKk3FUyEyGc65hLgf/QN3WngvzU07eIY23GdllgunwirJM810vA==", "requires": { - "@remixproject/plugin-utils": "0.3.208" + "@remixproject/plugin-utils": "0.3.21" } }, "@remixproject/plugin-utils": { - "version": "0.3.208", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-utils/-/plugin-utils-0.3.208.tgz", - "integrity": "sha512-PjEK+ty6X14ud3h2U/XH8BBbqwLF3CwduOxHCXfCG0KarR4FwuSfocWQfGlASeDFmPzyV1aMGn//U6xZ03O42Q==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-utils/-/plugin-utils-0.3.21.tgz", + "integrity": "sha512-e/lzBJplTQdqMpqucLL0ovaM7FEPNzAE7QOzjFm2XhfLjUZBZ7m6CUIGNhozgo4S61yauq+nfdwc+JqZvytDnQ==", "requires": { "tslib": "2.0.1" }, @@ -9884,24 +9884,24 @@ } }, "@remixproject/plugin-webview": { - "version": "0.3.208", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-webview/-/plugin-webview-0.3.208.tgz", - "integrity": "sha512-nbcWq7xYqNQXu4G84B68fzNWsafpO9NHcmLiVOFqel6xl7gp4X9hpY5dm4Cs7WY+9YY0IdLWRNfqA6pbT2qsgw==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-webview/-/plugin-webview-0.3.21.tgz", + "integrity": "sha512-byUGdFsgFaPDtn+vCtXoM+3y9ReMhnSeO0Iu9xVmLZjHxHo0aebRHup+e7y25mL4tk+9IOQa26Cc9kE74gtHpQ==", "requires": { - "@remixproject/plugin": "0.3.208", - "@remixproject/plugin-api": "0.3.208", - "@remixproject/plugin-utils": "0.3.208", + "@remixproject/plugin": "0.3.21", + "@remixproject/plugin-api": "0.3.21", + "@remixproject/plugin-utils": "0.3.21", "axios": "^0.21.1" } }, "@remixproject/plugin-ws": { - "version": "0.3.208", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-ws/-/plugin-ws-0.3.208.tgz", - "integrity": "sha512-7GH18UXSO8TZ9khKPvJQESGMVDSnPhDj42j4ENjK+Td6qpYutfTmqMD1YMW3TL2KgY89irytPHCMuCiUtEDoBQ==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-ws/-/plugin-ws-0.3.21.tgz", + "integrity": "sha512-uAgwVKn7oPZQjIj+sYzpQK1t5XBvxzFXo/wSUWgq4aMO23Mz+UvVx0fOoJ45gDqTbATI5yle0rab2Sn9HXNSMw==", "requires": { - "@remixproject/plugin": "0.3.208", - "@remixproject/plugin-api": "0.3.208", - "@remixproject/plugin-utils": "0.3.208" + "@remixproject/plugin": "0.3.21", + "@remixproject/plugin-api": "0.3.21", + "@remixproject/plugin-utils": "0.3.21" } }, "@restart/context": { diff --git a/package.json b/package.json index f68915c41e..e5bd1a2021 100644 --- a/package.json +++ b/package.json @@ -141,13 +141,13 @@ "@ethereumjs/common": "^2.5.0", "@ethereumjs/tx": "^3.3.2", "@ethereumjs/vm": "^5.5.3", - "@remixproject/engine": "^0.3.20", - "@remixproject/engine-web": "^0.3.20", - "@remixproject/plugin": "^0.3.20", - "@remixproject/plugin-api": "^0.3.20", - "@remixproject/plugin-utils": "^0.3.20", - "@remixproject/plugin-webview": "^0.3.20", - "@remixproject/plugin-ws": "^0.3.20", + "@remixproject/engine": "next", + "@remixproject/engine-web": "next", + "@remixproject/plugin": "next", + "@remixproject/plugin-api": "next", + "@remixproject/plugin-utils": "next", + "@remixproject/plugin-webview": "next", + "@remixproject/plugin-ws": "next", "ansi-gray": "^0.1.1", "async": "^2.6.2", "axios": ">=0.21.1", From 42babc67b3464743898a78e53172cd2ddfd95e71 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 17 Oct 2021 11:13:48 +0200 Subject: [PATCH 22/51] addlocalplugin command --- .../src/commands/addLocalPlugin.ts | 46 ++++++++++++ .../src/local-plugin/src/app/app.tsx | 5 +- .../src/local-plugin/src/app/logger.tsx | 3 - apps/remix-ide-e2e/src/tests/plugin_api.ts | 75 ++++++------------- apps/remix-ide-e2e/src/types/index.d.ts | 1 + 5 files changed, 71 insertions(+), 59 deletions(-) create mode 100644 apps/remix-ide-e2e/src/commands/addLocalPlugin.ts diff --git a/apps/remix-ide-e2e/src/commands/addLocalPlugin.ts b/apps/remix-ide-e2e/src/commands/addLocalPlugin.ts new file mode 100644 index 0000000000..105c93e457 --- /dev/null +++ b/apps/remix-ide-e2e/src/commands/addLocalPlugin.ts @@ -0,0 +1,46 @@ +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' +import { ExternalProfile, LocationProfile, Profile } from '@remixproject/plugin-utils' + +class AddLocalPlugin extends EventEmitter { + command (this: NightwatchBrowser, profile: Profile & LocationProfile & ExternalProfile): NightwatchBrowser { + this.api.perform((done) => { + addLocalPlugin(this.api, profile, () => { + done() + this.emit('complete') + }) + }) + return this + } +} + +function addLocalPlugin (browser: NightwatchBrowser, profile: Profile & LocationProfile & ExternalProfile, callback: VoidFunction) { + browser.waitForElementVisible('*[data-id="remixIdeSidePanel"]') + .pause(3000).element('css selector', '*[data-id="pluginManagerComponentPluginManager"]', function (result) { + if (result.status === 0) { + browser.click('*[plugin="pluginManager"]') + } + }) + + browser.waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') + .execute(function () { + window.testmode = true + }) + .click('*[data-id="pluginManagerComponentPluginSearchButton"]') + .waitForElementVisible('*[data-id="pluginManagerLocalPluginModalDialogModalDialogContainer-react"]') + .click('*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalBody-react"]') + .waitForElementVisible('*[data-id="localPluginName"]') + .clearValue('*[data-id="localPluginName"]').setValue('*[data-id="localPluginName"]', profile.name) + .clearValue('*[data-id="localPluginDisplayName"]').setValue('*[data-id="localPluginDisplayName"]', profile.displayName) + .clearValue('*[data-id="localPluginUrl"]').setValue('*[data-id="localPluginUrl"]', profile.url) + .clearValue('*[data-id="localPluginCanActivate"]').setValue('*[data-id="localPluginCanActivate"]', profile.canActivate.join(',')) + .click('*[data-id="localPluginRadioButtoniframe"]') + .click(profile.location === 'sidePanel' ? '*[data-id="localPluginRadioButtonsidePanel"]' : '*[data-id="localPluginRadioButtonmainPanel"]') + .click('*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalFooter-react"]') + .click('*[data-id="pluginManagerLocalPluginModalDialog-modal-footer-ok-react') + .waitForElementVisible('[data-id="verticalIconsKindlocalPlugin"]') + .click('[data-id="verticalIconsKindlocalPlugin"]') + .perform(function () { callback() }) +} + +module.exports = AddLocalPlugin diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index 06b44ee2da..5fe545d244 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -20,7 +20,7 @@ import { Profile } from '@remixproject/plugin-utils' import './app.css' -export const client = new RemixPlugin() +const client = new RemixPlugin() function App () { const [payload, setPayload] = useState('') @@ -47,9 +47,7 @@ function App () { profiles.map((profile: Profile) => { if (profile.events) { profile.events.map((event: string) => { - console.log(profile.name, event) client.on(profile.name as any, event, (...args:any) => { - console.log(event, args) setEvents({ event: event, args: args @@ -62,7 +60,6 @@ function App () { }, []) const setAppendChange = ({ target }: any) => { - console.log('append', target.checked) setAppend(target.checked) } diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx index f131b73905..e127f11240 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/logger.tsx @@ -1,7 +1,4 @@ import React, { useEffect, useState } from 'react' - -import { client } from './app' - interface loggerProps { append: boolean, log: any, diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index f12ed84eea..1f5046c142 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -1,4 +1,5 @@ 'use strict' +import { ExternalProfile, LocationProfile, Profile } from '@remixproject/plugin-utils' import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' @@ -6,11 +7,12 @@ declare global { interface Window { testmode: boolean; } } -const localPluginData = { - pluginName: 'localPlugin', - pluginDisplayName: 'Local Plugin', - pluginCanActivate: 'dGitProvider,flattener,solidityUnitTesting', - pluginUrl: 'http://localhost:2020' +const localPluginData: Profile & LocationProfile & ExternalProfile = { + name: 'localPlugin', + displayName: 'Local Plugin', + canActivate: ['dGitProvider', 'flattener', 'solidityUnitTesting'], + url: 'http://localhost:2020', + location: 'sidePanel' } const getBrowserLogs = function (browser: NightwatchBrowser) { @@ -18,24 +20,19 @@ const getBrowserLogs = function (browser: NightwatchBrowser) { console.log(logEntries) }) } -/* -* PLUGINACTION -* buttonText: which button to click -* msg: what to expect from the log -* payload: extra param for the call -*/ -const pluginAction = function (browser: NightwatchBrowser, buttonText: string, msg: any, payload: string) { + +const clickAndCheckLog = function (browser: NightwatchBrowser, buttonText: string, msg: any, payload: string) { if (payload) { browser.clearValue('//*[@id="payload"]').setValue('//*[@id="payload"]', payload).pause(1000) } if (msg && typeof msg !== 'string') msg = JSON.stringify(msg) browser - .useXpath().waitForElementVisible(`//*[text()='${buttonText}']`).click(`//*[text()='${buttonText}']`) + .useXpath().waitForElementVisible(`//*[@data-id='${buttonText}']`).click(`//*[@data-id='${buttonText}']`) .pause(2000) getBrowserLogs(browser) if (msg) { - browser.waitForElementVisible('//*[@id="log"]').verify.containsText('//*[@id="log"]', msg) + browser.waitForElementVisible('//*[@id="methods"]').verify.containsText('//*[@id="methods"]', msg) } } @@ -54,55 +51,29 @@ module.exports = { }) }, - 'Should Load Plugin Manager': function (browser: NightwatchBrowser) { - browser.waitForElementVisible('*[data-id="remixIdeSidePanel"]') - .pause(3000) - .click('*[plugin="pluginManager"]') - .pause(3000) - .waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') - .assert.containsText('*[data-id="sidePanelSwapitTitle"]', 'PLUGIN MANAGER') - }, - 'Should connect a local plugin': function (browser: NightwatchBrowser) { - browser.waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') - .execute(function () { - window.testmode = true - }) - .click('*[data-id="pluginManagerComponentPluginSearchButton"]') - .waitForElementVisible('*[data-id="pluginManagerLocalPluginModalDialogModalDialogContainer-react"]') - .click('*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalBody-react"]') - .waitForElementVisible('*[data-id="localPluginName"]') - .clearValue('*[data-id="localPluginName"]').setValue('*[data-id="localPluginName"]', localPluginData.pluginName) - .clearValue('*[data-id="localPluginDisplayName"]').setValue('*[data-id="localPluginDisplayName"]', localPluginData.pluginDisplayName) - .clearValue('*[data-id="localPluginUrl"]').setValue('*[data-id="localPluginUrl"]', localPluginData.pluginUrl) - .clearValue('*[data-id="localPluginCanActivate"]').setValue('*[data-id="localPluginCanActivate"]', localPluginData.pluginCanActivate) - .click('*[data-id="localPluginRadioButtoniframe"]') - .click('*[data-id="localPluginRadioButtonsidePanel"]') - .click('*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalFooter-react"]') - .click('*[data-id="pluginManagerLocalPluginModalDialog-modal-footer-ok-react') - .waitForElementVisible('[data-id="verticalIconsKindlocalPlugin"]') - .click('[data-id="verticalIconsKindlocalPlugin"]') + browser.addLocalPlugin(localPluginData) // @ts-ignore .frame(0) }, 'Should get current workspace': function (browser: NightwatchBrowser) { - pluginAction(browser, 'get workspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null) + clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null) }, 'Should get current files': function (browser: NightwatchBrowser) { - pluginAction(browser, 'readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null) + clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null) }, 'Should throw error on current file': function (browser: NightwatchBrowser) { - pluginAction(browser, 'getcurrentfile', 'Error from IDE : Error: No such file or directory No file selected', null) + clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'Error from IDE : Error: No such file or directory No file selected', null) }, 'Should open readme.txt': function (browser: NightwatchBrowser) { - pluginAction(browser, 'openfile', null, 'README.txt') + clickAndCheckLog(browser, 'fileManager:open', null, 'README.txt') }, 'Should have current file': function (browser: NightwatchBrowser) { - pluginAction(browser, 'getcurrentfile', 'README.txt', null) + clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null) }, 'Should activate solidityUnitTesting': function (browser: NightwatchBrowser) { - pluginAction(browser, 'activate', null, 'solidityUnitTesting') + clickAndCheckLog(browser, 'manager:activatePlugin', null, 'solidityUnitTesting') browser.frameParent() assertPluginIsActive(browser, 'solidityUnitTesting') // @ts-ignore @@ -110,13 +81,13 @@ module.exports = { }, 'Should switch to file': function (browser: NightwatchBrowser) { - pluginAction(browser, 'switch to file', null, 'contracts/1_Storage.sol') - pluginAction(browser, 'getcurrentfile', 'contracts/1_Storage.sol', null) - pluginAction(browser, 'switch to file', null, 'README.txt') - pluginAction(browser, 'getcurrentfile', 'README.txt', null) + clickAndCheckLog(browser, 'fileManager:switchFile', null, 'contracts/1_Storage.sol') + clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'contracts/1_Storage.sol', null) + clickAndCheckLog(browser, 'fileManager:switchFile', null, 'README.txt') + clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null) }, 'Should write to file': function (browser: NightwatchBrowser) { - pluginAction(browser, 'write', 'README.txt', null) + clickAndCheckLog(browser, 'fileManager:writeFile', 'README.txt', null) } } diff --git a/apps/remix-ide-e2e/src/types/index.d.ts b/apps/remix-ide-e2e/src/types/index.d.ts index bdbb6d0da7..f0f8fd5843 100644 --- a/apps/remix-ide-e2e/src/types/index.d.ts +++ b/apps/remix-ide-e2e/src/types/index.d.ts @@ -57,6 +57,7 @@ declare module 'nightwatch' { checkAnnotationsNotPresent(type: string): NightwatchBrowser getLastTransactionHash(callback: (hash: string) => void) currentWorkspaceIs(name: string): NightwatchBrowser + addLocalPlugin(this: NightwatchBrowser, profile: Profile & LocationProfile & ExternalProfile): NightwatchBrowser } export interface NightwatchBrowser { From 54f2b74e4c2726481eeb13fa6bc82e2c2495d554 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 17 Oct 2021 12:29:15 +0200 Subject: [PATCH 23/51] rm old test file --- .../src/commands/acceptAndRemember.ts | 29 ++++ .../src/local-plugin/src/app/app.tsx | 3 +- .../src/local-plugin/tests/plugin-api.test.ts | 156 ------------------ apps/remix-ide-e2e/src/tests/pluginManager.ts | 1 - apps/remix-ide-e2e/src/tests/plugin_api.ts | 57 +++++-- apps/remix-ide-e2e/src/types/index.d.ts | 1 + 6 files changed, 72 insertions(+), 175 deletions(-) create mode 100644 apps/remix-ide-e2e/src/commands/acceptAndRemember.ts delete mode 100644 apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts diff --git a/apps/remix-ide-e2e/src/commands/acceptAndRemember.ts b/apps/remix-ide-e2e/src/commands/acceptAndRemember.ts new file mode 100644 index 0000000000..dc11a33529 --- /dev/null +++ b/apps/remix-ide-e2e/src/commands/acceptAndRemember.ts @@ -0,0 +1,29 @@ +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' + +class AcceptAndRemember extends EventEmitter { + command (this: NightwatchBrowser, remember:boolean, accept: boolean): NightwatchBrowser { + this.api.perform((done) => { + acceptAndRemember(this.api, remember, accept, () => { + done() + this.emit('complete') + }) + }) + return this + } +} + +function acceptAndRemember (browser: NightwatchBrowser, remember: boolean, accept: boolean, callback: VoidFunction) { + browser.useXpath().waitForElementVisible('//*[@data-id="modalDialogModalBody"]') + if (remember) { + browser.click('//*[@id="remember"]') + } + if (accept) { + browser.click('//*[@id="modal-footer-ok"]') + } else { + browser.click('//*[@id="modal-footer-cancel"]') + } + browser.perform(function () { callback() }) +} + +module.exports = AcceptAndRemember diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index 5fe545d244..c0b31f55b3 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -84,6 +84,7 @@ function App () { + - - {profiles.map((profile: Profile) => { const methods = profile.methods.map((method: string) => { return diff --git a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts b/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts deleted file mode 100644 index bdfddbeaf8..0000000000 --- a/apps/remix-ide-e2e/src/local-plugin/tests/plugin-api.test.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { Selector, RequestLogger, Role } from 'testcafe' -import { Profile, LocationProfile, ExternalProfile } from '@remixproject/plugin-utils' - -fixture`Plugin API tests` - .page(process.env.TEST_URL || 'http://127.0.0.1:8080') - .beforeEach(async t => { - - }).afterEach(async t => { - console.log(await t.getBrowserConsoleMessages()) - }) -const openPlugin = async (t: TestController, plugin: string) => { - await t.click(`#icon-panel div[plugin="${plugin}"]`) -} - -interface dataIdSelectorInterface extends Selector { - select(id: string): Promise -} - -const setCompilerVersion = async (t: TestController, version: string) => { - const citySelect = Selector('#evmVersionSelector') - const cityOption = citySelect.find('option') - await t.click(citySelect).click(cityOption.withAttribute('value', 'london')) -} - -const ClickLaunchIcon = async (t: TestController, icon: string) => { - await t.click('#icon-panel div[plugin="' + icon + '"]')// .click('#icon-panel div[plugin="' + icon + '"]') -} - -const dataIdSelector = async (id: string) => { return Selector(`[data-id="${id}"]`) } - -const installPlugin = async (t: TestController, profile: Profile & LocationProfile & ExternalProfile) => { - await t.click('*[plugin="pluginManager"]') - .click('*[data-id="pluginManagerComponentPluginSearchButton') - // cy.get(`*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalTitle-react`).should('be.visible') - .typeText('*[data-id="localPluginName', profile.name) - .typeText('*[data-id="localPluginDisplayName', profile.displayName) - .typeText('*[data-id="localPluginUrl', profile.url) - .typeText('*[data-id="localPluginCanActivate', profile.canActivate && profile.canActivate.join(',')) - .click('*[data-id="pluginManagerLocalPluginModalDialog-modal-footer-ok-react"').click('*[plugin="pluginManager"]') -} - -const expectLogMessage = async (t: TestController, msg: any) => { - if (typeof msg !== 'string') msg = JSON.stringify(msg) - const message = await Selector('#log').textContent - console.log(message) - await t.expect(message.includes(msg)).ok() -} - -const localPluginData = { - name: 'localplugin', - displayName: 'localplugin', - location: 'sidePanel', - url: 'http://localhost:2020', - canActivate: [ - 'dGitProvider,flattener,solidityUnitTesting' - ] -} - -test.only('install plugin', async t => { - // exists doesn't wait with timeouts, this is a hack but it works, it will wait for buttons to appear - // https://testcafe.io/documentation/402829/guides/basic-guides/select-page-elements#selector-timeout - await Selector('Button', { timeout: 120000 }).innerText - if (await Selector('Button').withText('Sure').exists) { - await t.click(Selector('Button').withText('Sure')) - } - await t.click('.introjs-skipbutton') - await ClickLaunchIcon(t, 'solidity') - - await t.click(Selector('#optimize')) - await setCompilerVersion(t, 'builtin') - await t.wait(10000) - // await setCompilerVersion(t, 'builtin') - - // await installPlugin(t, localPluginData) -}) - -test.disablePageReloads('switch to plugin', async t => { - await t - .click('#verticalIconsKindpluginManager') - // .click('[data-id="pluginManagerComponentActivateButtondgittest"]') - .click('[data-id="verticalIconsKindlocalplugin"]') - .switchToIframe('#plugin-localplugin') -}) - -test.disablePageReloads('not be able to get current file', async t => { - await t - .click(Selector('Button').withText('getcurrentfile')) - await expectLogMessage(t, 'Error from IDE : Error: No such file or directory No file selected') -}) - -test.disablePageReloads('be able to get current file', async t => { - await t - .switchToMainWindow() - - await openPlugin(t, 'filePanel') - await t.click(await dataIdSelector('treeViewLitreeViewItemREADME.txt')) - await openPlugin(t, localPluginData.name) - await t.switchToIframe('#plugin-localplugin') - .click(Selector('Button') - .withText('getcurrentfile')) - - await expectLogMessage(t, 'README.txt') -}) - -test.disablePageReloads('gets the current workspace', async t => { - await t.click(Selector('Button') - .withText('get workspace')) - await expectLogMessage(t, { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }) -}) - -test.disablePageReloads('creates a workspace', async t => { - await t.typeText('#payload', 'testing') - .click(Selector('Button') - .withText('create workspace')).wait(2000).click(Selector('Button') - .withText('get workspace')) - await expectLogMessage(t, { name: 'testing', isLocalhost: false, absolutePath: '.workspaces/testing' }) -}) - -test.disablePageReloads('get file list', async t => { - await t.typeText('#payload', '/', { replace: true }) - .click(Selector('Button') - .withText('readdir')) - await expectLogMessage(t, { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }) -}) - -test.disablePageReloads('open a file', async t => { - const file = 'contracts/2_Owner.sol' - await t.typeText('#payload', file, { replace: true }) - .click(Selector('Button') - .withText('openfile')) - - await expectLogMessage(t, { event: 'currentFileChanged', result: file }) - - await t.click(Selector('Button') - .withText('getcurrentfile')) - - await expectLogMessage(t, file) -}) - -test.disablePageReloads('run a test file', async t => { - await t - .click('#appendToLog') - .click(Selector('Button') - .withText('run sol test')) - .switchToMainWindow() - .click('#remember') - .click(Selector('span').withText('Accept')) - .switchToIframe('#plugin-localplugin') - .typeText('#payload', '/', { replace: true }) - .click(Selector('Button') - .withText('readdir')) - .click(Selector('Button') - .withText('run sol test')).wait(5000) - - await expectLogMessage(t, '"totalPassing":1,"totalFailing":0') -}) diff --git a/apps/remix-ide-e2e/src/tests/pluginManager.ts b/apps/remix-ide-e2e/src/tests/pluginManager.ts index 689cab23a2..ed215e33e1 100644 --- a/apps/remix-ide-e2e/src/tests/pluginManager.ts +++ b/apps/remix-ide-e2e/src/tests/pluginManager.ts @@ -157,7 +157,6 @@ module.exports = { 'Should load back installed plugins after reload': function (browser: NightwatchBrowser) { browser .waitForElementVisible('*[data-id="remixIdeSidePanel"]') - .click('*[plugin="pluginManager"]') .waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') .getInstalledPlugins((plugins) => { browser.refresh() diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 1f5046c142..ed9454e751 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -21,18 +21,23 @@ const getBrowserLogs = function (browser: NightwatchBrowser) { }) } -const clickAndCheckLog = function (browser: NightwatchBrowser, buttonText: string, msg: any, payload: string) { +const clickAndCheckLog = function (browser: NightwatchBrowser, buttonText: string, methodResult: any, eventResult: any, payload: any) { if (payload) { + if (typeof payload !== 'string') payload = JSON.stringify(payload) browser.clearValue('//*[@id="payload"]').setValue('//*[@id="payload"]', payload).pause(1000) } - if (msg && typeof msg !== 'string') msg = JSON.stringify(msg) + if (methodResult && typeof methodResult !== 'string') methodResult = JSON.stringify(methodResult) + if (eventResult && typeof eventResult !== 'string') eventResult = JSON.stringify(eventResult) browser .useXpath().waitForElementVisible(`//*[@data-id='${buttonText}']`).click(`//*[@data-id='${buttonText}']`) .pause(2000) getBrowserLogs(browser) - if (msg) { - browser.waitForElementVisible('//*[@id="methods"]').verify.containsText('//*[@id="methods"]', msg) + if (methodResult) { + browser.waitForElementVisible('//*[@id="methods"]').verify.containsText('//*[@id="methods"]', methodResult) + } + if (eventResult) { + browser.waitForElementVisible('//*[@id="events"]').verify.containsText('//*[@id="events"]', eventResult) } } @@ -58,22 +63,26 @@ module.exports = { }, 'Should get current workspace': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null) + clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null, null) }, 'Should get current files': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null) + clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) }, 'Should throw error on current file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'Error from IDE : Error: No such file or directory No file selected', null) + clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'Error from IDE : Error: No such file or directory No file selected', null, null) }, 'Should open readme.txt': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:open', null, 'README.txt') + clickAndCheckLog(browser, 'fileManager:open', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') }, 'Should have current file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null) + clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) + }, + 'Should close all files': function (browser: NightwatchBrowser) { + clickAndCheckLog(browser, 'fileManager:closeAllFiles', null, { event: 'noFileSelected', args: [] }, null) }, + 'Should activate solidityUnitTesting': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'manager:activatePlugin', null, 'solidityUnitTesting') + clickAndCheckLog(browser, 'manager:activatePlugin', null, null, 'solidityUnitTesting') browser.frameParent() assertPluginIsActive(browser, 'solidityUnitTesting') // @ts-ignore @@ -81,13 +90,29 @@ module.exports = { }, 'Should switch to file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:switchFile', null, 'contracts/1_Storage.sol') - clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'contracts/1_Storage.sol', null) - clickAndCheckLog(browser, 'fileManager:switchFile', null, 'README.txt') - clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null) + clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['contracts/1_Storage.sol'] }, 'contracts/1_Storage.sol') + clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'contracts/1_Storage.sol', null, null) + clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') + clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) }, 'Should write to file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:writeFile', 'README.txt', null) - } + clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileSaved', args: ['README.txt'] }, ['README.txt', 'test']) + // @ts-ignore + browser.frameParent().acceptAndRemember(true, true).frame(0) + clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'README.txt') + }, + 'Should create workspace': function (browser: NightwatchBrowser) { + clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'testspace') + clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'testspace', isLocalhost: false, absolutePath: '.workspaces/testspace' }, null, null) + clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) + }, + + 'Should compile a file': function (browser: NightwatchBrowser) { + clickAndCheckLog(browser, 'solidity:compile', null, null, 'contracts/1_Storage.sol') + }, + + 'Should get compilationresults': function (browser: NightwatchBrowser) { + clickAndCheckLog(browser, 'solidity:getCompilationResult', 'contracts/1_Storage.sol', null, null) + } } diff --git a/apps/remix-ide-e2e/src/types/index.d.ts b/apps/remix-ide-e2e/src/types/index.d.ts index f0f8fd5843..286f58e9d8 100644 --- a/apps/remix-ide-e2e/src/types/index.d.ts +++ b/apps/remix-ide-e2e/src/types/index.d.ts @@ -58,6 +58,7 @@ declare module 'nightwatch' { getLastTransactionHash(callback: (hash: string) => void) currentWorkspaceIs(name: string): NightwatchBrowser addLocalPlugin(this: NightwatchBrowser, profile: Profile & LocationProfile & ExternalProfile): NightwatchBrowser + acceptAndRemember (this: NightwatchBrowser, remember: boolean, accept: boolean): NightwatchBrowser } export interface NightwatchBrowser { From 7f9c0dc46ae2eb74e4975c310427ed9a78acdb04 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 17 Oct 2021 12:45:33 +0200 Subject: [PATCH 24/51] more tests --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 28 +++++++++++++++------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index ed9454e751..f18e962e65 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -62,6 +62,8 @@ module.exports = { .frame(0) }, + // FILESYSTEM + 'Should get current workspace': function (browser: NightwatchBrowser) { clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null, null) }, @@ -77,18 +79,17 @@ module.exports = { 'Should have current file': function (browser: NightwatchBrowser) { clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) }, + 'Should create dir': function (browser: NightwatchBrowser) { + clickAndCheckLog(browser, 'fileManager:mkdir', null, null, 'testdir') + clickAndCheckLog(browser, 'fileManager:readdir', 'testdir', null, '/') + }, + 'Should get file': function (browser: NightwatchBrowser) { + clickAndCheckLog(browser, 'fileManager:getFile', 'REMIX EXAMPLE PROJECT', null, 'README.txt') + }, 'Should close all files': function (browser: NightwatchBrowser) { clickAndCheckLog(browser, 'fileManager:closeAllFiles', null, { event: 'noFileSelected', args: [] }, null) }, - 'Should activate solidityUnitTesting': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'manager:activatePlugin', null, null, 'solidityUnitTesting') - browser.frameParent() - assertPluginIsActive(browser, 'solidityUnitTesting') - // @ts-ignore - browser.frame(0) - }, - 'Should switch to file': function (browser: NightwatchBrowser) { clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['contracts/1_Storage.sol'] }, 'contracts/1_Storage.sol') clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'contracts/1_Storage.sol', null, null) @@ -108,11 +109,22 @@ module.exports = { clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) }, + // COMPILER + 'Should compile a file': function (browser: NightwatchBrowser) { clickAndCheckLog(browser, 'solidity:compile', null, null, 'contracts/1_Storage.sol') }, 'Should get compilationresults': function (browser: NightwatchBrowser) { clickAndCheckLog(browser, 'solidity:getCompilationResult', 'contracts/1_Storage.sol', null, null) + }, + + // UNIT TESTING + 'Should activate solidityUnitTesting': function (browser: NightwatchBrowser) { + clickAndCheckLog(browser, 'manager:activatePlugin', null, null, 'solidityUnitTesting') + browser.frameParent() + assertPluginIsActive(browser, 'solidityUnitTesting') + // @ts-ignore + browser.frame(0) } } From b122eb371cfd89c2484d29aff5799db19c1dd2d9 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 17 Oct 2021 12:48:23 +0200 Subject: [PATCH 25/51] rm testcafe --- apps/remix-ide-e2e/src/local-plugin/.testcaferc.js | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 apps/remix-ide-e2e/src/local-plugin/.testcaferc.js diff --git a/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js b/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js deleted file mode 100644 index afe5b0e8dc..0000000000 --- a/apps/remix-ide-e2e/src/local-plugin/.testcaferc.js +++ /dev/null @@ -1,11 +0,0 @@ -let os = require("os"); - -module.exports = { - skipJsErrors: true, - browsers: ['chrome'], - screenshots: { - "path": "/tmp/artifacts", - "takeOnFails": true, - "pathPattern": "${DATE}_${TIME}/test-${TEST_INDEX}/${USERAGENT}/${FILE_INDEX}.png" - } -} From c747292a31506379c5275f47323930443602b5c0 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 17 Oct 2021 12:50:12 +0200 Subject: [PATCH 26/51] handle undefined --- apps/remix-ide-e2e/src/commands/addLocalPlugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/commands/addLocalPlugin.ts b/apps/remix-ide-e2e/src/commands/addLocalPlugin.ts index 105c93e457..06f4b25cdc 100644 --- a/apps/remix-ide-e2e/src/commands/addLocalPlugin.ts +++ b/apps/remix-ide-e2e/src/commands/addLocalPlugin.ts @@ -33,7 +33,7 @@ function addLocalPlugin (browser: NightwatchBrowser, profile: Profile & Location .clearValue('*[data-id="localPluginName"]').setValue('*[data-id="localPluginName"]', profile.name) .clearValue('*[data-id="localPluginDisplayName"]').setValue('*[data-id="localPluginDisplayName"]', profile.displayName) .clearValue('*[data-id="localPluginUrl"]').setValue('*[data-id="localPluginUrl"]', profile.url) - .clearValue('*[data-id="localPluginCanActivate"]').setValue('*[data-id="localPluginCanActivate"]', profile.canActivate.join(',')) + .clearValue('*[data-id="localPluginCanActivate"]').setValue('*[data-id="localPluginCanActivate"]', profile.canActivate ? profile.canActivate.join(',') : '') .click('*[data-id="localPluginRadioButtoniframe"]') .click(profile.location === 'sidePanel' ? '*[data-id="localPluginRadioButtonsidePanel"]' : '*[data-id="localPluginRadioButtonmainPanel"]') .click('*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalFooter-react"]') From ccd2781b93b731c75d11091214a8348d3e31065d Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 17 Oct 2021 12:56:30 +0200 Subject: [PATCH 27/51] rm trash --- apps/remix-ide/src/assets/js/workspace_1632313874650 | 1 - 1 file changed, 1 deletion(-) delete mode 160000 apps/remix-ide/src/assets/js/workspace_1632313874650 diff --git a/apps/remix-ide/src/assets/js/workspace_1632313874650 b/apps/remix-ide/src/assets/js/workspace_1632313874650 deleted file mode 160000 index 6af4ed6169..0000000000 --- a/apps/remix-ide/src/assets/js/workspace_1632313874650 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6af4ed6169ee4165ce86457f98c0a568bd9d7491 From 0237bb867607539ca0dd8cb4f786b5d9a061b8b5 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 17 Oct 2021 12:57:20 +0200 Subject: [PATCH 28/51] rm testcafe --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index e5bd1a2021..4c0a7b4be2 100644 --- a/package.json +++ b/package.json @@ -296,7 +296,6 @@ "tap-spec": "^5.0.0", "tape": "^4.13.3", "terser-webpack-plugin": "^4.2.3", - "testcafe": "^1.16.1", "ts-jest": "^27.0.5", "ts-node": "^7.0.1", "tslint": "~6.0.0", From cb33c10cc697ebe146bef3624fc01060136756d5 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 17 Oct 2021 19:18:46 +0200 Subject: [PATCH 29/51] dgit tests plus extra assertion logging upd types --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 25 +- package-lock.json | 1496 -------------------- package.json | 3 +- 3 files changed, 24 insertions(+), 1500 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index f18e962e65..98c2956045 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -17,7 +17,21 @@ const localPluginData: Profile & LocationProfile & ExternalProfile = { const getBrowserLogs = function (browser: NightwatchBrowser) { browser.getLog('browser', (logEntries) => { - console.log(logEntries) + if (logEntries && logEntries.length > 0) { + console.log('Browser log:') + console.log(logEntries) + } + }) +} +const debugValues = function (browser: NightwatchBrowser, field: string, expected: string) { + browser.waitForElementVisible(`//*[@id="${field}"]`).getText(`//*[@id="${field}"]`, (result) => { + if (!result.value.toString().includes(expected)) { + console.log('Actual result:') + console.log(result.value.toString()) + console.log('Expected result:') + console.log(expected) + getBrowserLogs(browser) + } }) } @@ -32,11 +46,12 @@ const clickAndCheckLog = function (browser: NightwatchBrowser, buttonText: strin .useXpath().waitForElementVisible(`//*[@data-id='${buttonText}']`).click(`//*[@data-id='${buttonText}']`) .pause(2000) - getBrowserLogs(browser) if (methodResult) { + debugValues(browser, 'methods', methodResult) browser.waitForElementVisible('//*[@id="methods"]').verify.containsText('//*[@id="methods"]', methodResult) } if (eventResult) { + debugValues(browser, 'events', eventResult) browser.waitForElementVisible('//*[@id="events"]').verify.containsText('//*[@id="events"]', eventResult) } } @@ -119,6 +134,12 @@ module.exports = { clickAndCheckLog(browser, 'solidity:getCompilationResult', 'contracts/1_Storage.sol', null, null) }, + // DGIT + 'Should have changes on new workspace': function (browser: NightwatchBrowser) { + clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'dgit') + clickAndCheckLog(browser, 'dGitProvider:status', [['README.txt', 0, 2, 0], ['contracts/1_Storage.sol', 0, 2, 0], ['contracts/2_Owner.sol', 0, 2, 0], ['contracts/3_Ballot.sol', 0, 2, 0], ['scripts/deploy_ethers.js', 0, 2, 0], ['scripts/deploy_web3.js', 0, 2, 0], ['tests/4_Ballot_test.sol', 0, 2, 0]], null, null) + }, + // UNIT TESTING 'Should activate solidityUnitTesting': function (browser: NightwatchBrowser) { clickAndCheckLog(browser, 'manager:activatePlugin', null, null, 'solidityUnitTesting') diff --git a/package-lock.json b/package-lock.json index 49961ea093..c39731e81b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -839,15 +839,6 @@ "@babel/helper-plugin-utils": "^7.8.3" } }, - "@babel/plugin-syntax-flow": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz", - "integrity": "sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, "@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -1056,16 +1047,6 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.14.5.tgz", - "integrity": "sha512-KhcolBKfXbvjwI3TV7r7TkYm8oNXHNBqGOy6JDVwtecFaRoKYsUUqJdS10q0YDKW1c6aZQgO+Ys3LfGkox8pXA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-flow": "^7.14.5" - } - }, "@babel/plugin-transform-for-of": { "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", @@ -2182,17 +2163,6 @@ } } }, - "@babel/preset-flow": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.14.5.tgz", - "integrity": "sha512-pP5QEb4qRUSVGzzKx9xqRuHUrM/jEzMqdrZpdMA+oUCRgd5zM1qGr5y5+ZgAL/1tVv1H0dyk5t4SKJntqyiVtg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-flow-strip-types": "^7.14.5" - } - }, "@babel/preset-modules": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", @@ -10518,12 +10488,6 @@ "integrity": "sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ==", "dev": true }, - "@types/error-stack-parser": { - "version": "1.3.18", - "resolved": "https://registry.npmjs.org/@types/error-stack-parser/-/error-stack-parser-1.3.18.tgz", - "integrity": "sha1-4ByfjIXKg7YQMgxiJYsMkCat4Pc=", - "dev": true - }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -11677,23 +11641,6 @@ } } }, - "acorn-hammerhead": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/acorn-hammerhead/-/acorn-hammerhead-0.5.0.tgz", - "integrity": "sha512-TI9TFfJBfduhcM2GggayNhdYvdJ3UgS/Bu3sB7FB2AUmNCmCJ+TSOT6GXu+bodG5/xL74D5zE4XRaqyjgjsYVQ==", - "dev": true, - "requires": { - "@types/estree": "0.0.46" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", - "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", - "dev": true - } - } - }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -12109,12 +12056,6 @@ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "dev": true }, - "array-find": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", - "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", - "dev": true - }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -12286,22 +12227,6 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", "dev": true }, - "asar": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-2.1.0.tgz", - "integrity": "sha512-d2Ovma+bfqNpvBzY/KU8oPY67ZworixTpkjSx0PCXnQi67c2cXmssaTxpFDUM0ttopXoGx/KRxNg/GDThYbXQA==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "chromium-pickle-js": "^0.2.0", - "commander": "^2.20.0", - "cuint": "^0.2.2", - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "tmp-promise": "^1.0.5" - } - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -12425,12 +12350,6 @@ "async": "^2.4.0" } }, - "async-exit-hook": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-1.1.2.tgz", - "integrity": "sha1-gJXXXkiMKazuBVH+hyUhadeJz7o=", - "dev": true - }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -13879,12 +13798,6 @@ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" }, - "bin-v8-flags-filter": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bin-v8-flags-filter/-/bin-v8-flags-filter-1.2.0.tgz", - "integrity": "sha512-g8aeYkY7GhyyKRvQMBsJQZjhm2iCX3dKYvfrMpwVR8IxmUGrkpCBFoKbB9Rh0o3sTLCjU/1tFpZ4C7j3f+D+3g==", - "dev": true - }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -13999,12 +13912,6 @@ "readable-stream": "^3.6.0" } }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "dev": true - }, "boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", @@ -14161,15 +14068,6 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, - "brotli": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", - "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", - "dev": true, - "requires": { - "base64-js": "^1.1.2" - } - }, "brotli-size": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/brotli-size/-/brotli-size-4.0.0.tgz", @@ -15026,45 +14924,6 @@ "caller-callsite": "^2.0.0" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "callsite-record": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/callsite-record/-/callsite-record-4.1.3.tgz", - "integrity": "sha512-otAcPmu8TiHZ38cIL3NjQa1nGoSQRRe8WDDUgj5ZUwJWn1wzOYBwVSJbpVyzZ0sesQeKlYsPu9DG70fhh6AK9g==", - "dev": true, - "requires": { - "@types/error-stack-parser": "^1.3.18", - "@types/lodash": "^4.14.72", - "callsite": "^1.0.0", - "chalk": "^2.4.0", - "error-stack-parser": "^1.3.3", - "highlight-es": "^1.0.0", - "lodash": "4.6.1 || ^4.16.1", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "error-stack-parser": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz", - "integrity": "sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI=", - "dev": true, - "requires": { - "stackframe": "^0.3.1" - } - }, - "stackframe": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", - "integrity": "sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ=", - "dev": true - } - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -15162,31 +15021,6 @@ "lazy-cache": "^1.0.3" } }, - "chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "dependencies": { - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - } - } - }, "chai-nightwatch": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/chai-nightwatch/-/chai-nightwatch-0.4.1.tgz", @@ -15246,12 +15080,6 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, "check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -15282,36 +15110,12 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, - "chrome-remote-interface": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.30.1.tgz", - "integrity": "sha512-emKaqCjYAgrT35nm6PvTUKJ++2NX9qAmrcNRPRGyryG9Kc7wlkvO0bmvEdNMrr8Bih2e149WctJZFzUiM1UNwg==", - "dev": true, - "requires": { - "commander": "2.11.x", - "ws": "^7.2.0" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - } - } - }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, - "chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", - "dev": true - }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -15703,12 +15507,6 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, - "coffeescript": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.6.1.tgz", - "integrity": "sha512-GG5nkF93qII8HmHqnnibkgpp/SV7PSnSPiWsbinwya7nNOe95aE/x2xrKZJFks8Qpko3TNrC+/LahaKgrz5YCg==", - "dev": true - }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -16773,12 +16571,6 @@ "randomfill": "^1.0.3" } }, - "crypto-md5": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-md5/-/crypto-md5-1.0.0.tgz", - "integrity": "sha1-zMjadQx1PH7curxUKWdHKjhOhrs=", - "dev": true - }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -16801,29 +16593,6 @@ "insert-css": "^0.2.0" } }, - "css": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", - "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "source-map": "^0.1.38", - "source-map-resolve": "^0.5.1", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, "css-box-model": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", @@ -17077,12 +16846,6 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" }, - "cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", - "dev": true - }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -17745,12 +17508,6 @@ "minimist": "^1.1.1" } }, - "device-specs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/device-specs/-/device-specs-1.0.0.tgz", - "integrity": "sha512-fYXbFSeilT7bnKWFi4OERSPHdtaEoDGn4aUhV5Nly6/I+Tp6JZ/6Icmd7LVIF5euyodGpxz2e/bfUmDnIdSIDw==", - "dev": true - }, "dezalgo": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", @@ -18272,33 +18029,6 @@ "once": "^1.4.0" } }, - "endpoint-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/endpoint-utils/-/endpoint-utils-1.0.2.tgz", - "integrity": "sha1-CAjDNppyfNeWejn/NOvJJriBRqg=", - "dev": true, - "requires": { - "ip": "^1.1.3", - "pinkie-promise": "^1.0.0" - }, - "dependencies": { - "pinkie": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", - "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=", - "dev": true - }, - "pinkie-promise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", - "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", - "dev": true, - "requires": { - "pinkie": "^1.0.0" - } - } - } - }, "enhanced-resolve": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", @@ -19081,29 +18811,6 @@ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true - }, - "esotope-hammerhead": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/esotope-hammerhead/-/esotope-hammerhead-0.6.1.tgz", - "integrity": "sha512-RG4orJ1xy+zD6fTEKuDYaqCuL1ymYa1/Bp+j9c7b/u7B8yI6+Qgg8o4lT1EDAOG9eBzBtwtTWR0chqt3hr0hZw==", - "dev": true, - "requires": { - "@types/estree": "0.0.46" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", - "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", - "dev": true - } - } - }, "espree": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", @@ -21647,12 +21354,6 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -22630,15 +22331,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, - "graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -23156,25 +22848,6 @@ "tslib": "^2.0.3" } }, - "highlight-es": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/highlight-es/-/highlight-es-1.0.3.tgz", - "integrity": "sha512-s/SIX6yp/5S1p8aC/NRDC1fwEb+myGIfp8/TzZz0rtAv8fzsdX7vGl3Q1TrXCsczFq8DI3CBFBCySPClfBSdbg==", - "dev": true, - "requires": { - "chalk": "^2.4.0", - "is-es2016-keyword": "^1.0.0", - "js-tokens": "^3.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -23503,12 +23176,6 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, - "humanize-duration": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.27.0.tgz", - "integrity": "sha512-qLo/08cNc3Tb0uD7jK0jAcU5cnqCM0n568918E7R2XhMr/+7F37p4EY062W/stg7tmzvknNn9b/1+UhVRzsYrQ==", - "dev": true - }, "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -24931,12 +24598,6 @@ "is-primitive": "^2.0.0" } }, - "is-es2016-keyword": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-es2016-keyword/-/is-es2016-keyword-1.0.0.tgz", - "integrity": "sha1-9uVOEQxeT40mXmnS7Q6vjPX0dxg=", - "dev": true - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -25032,12 +24693,6 @@ } } }, - "is-jquery-obj": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-jquery-obj/-/is-jquery-obj-0.1.1.tgz", - "integrity": "sha512-18toSebUVF7y717dgw/Dzn6djOCqrkiDp3MhB8P6TdKyCVkbD1ZwE7Uz8Hwx6hUPTvKjbyYH9ncXT4ts4qLaSA==", - "dev": true - }, "is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -30350,15 +30005,6 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "linux-platform-info": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/linux-platform-info/-/linux-platform-info-0.0.3.tgz", - "integrity": "sha1-La4yQ4Xmbj11W+yD+Gx77qYc64M=", - "dev": true, - "requires": { - "os-family": "^1.0.0" - } - }, "listr": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", @@ -30879,86 +30525,6 @@ } } }, - "log-update-async-hook": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/log-update-async-hook/-/log-update-async-hook-2.0.2.tgz", - "integrity": "sha512-HQwkKFTZeUOrDi1Duf2CSUa/pSpcaCHKLdx3D/Z16DsipzByOBffcg5y0JZA1q0n80dYgLXe2hFM9JGNgBsTDw==", - "dev": true, - "requires": { - "ansi-escapes": "^2.0.0", - "async-exit-hook": "^1.1.2", - "onetime": "^2.0.1", - "wrap-ansi": "^2.1.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - } - } - }, "logform": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz", @@ -31224,15 +30790,6 @@ } } }, - "match-url-wildcard": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/match-url-wildcard/-/match-url-wildcard-0.0.4.tgz", - "integrity": "sha512-R1XhQaamUZPWLOPtp4ig5j+3jctN+skhgRmEQTUamMzmNtRG69QEirQs0NZKLtHMR7tzWpmtnS4Eqv65DcgXUA==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", @@ -32637,12 +32194,6 @@ "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", "dev": true }, - "moment-duration-format-commonjs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/moment-duration-format-commonjs/-/moment-duration-format-commonjs-1.0.1.tgz", - "integrity": "sha512-KhKZRH21/+ihNRWrmdNFOyBptFi7nAWZFeFsRRpXkzgk/Yublb4fxyP0jU6EY1VDxUL/VUPdCmm/wAnpbfXdfw==", - "dev": true - }, "morphdom": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.6.1.tgz", @@ -32941,12 +32492,6 @@ "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", "dev": true }, - "mustache": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", - "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==", - "dev": true - }, "mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", @@ -38701,12 +38246,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-family": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/os-family/-/os-family-1.1.0.tgz", - "integrity": "sha512-E3Orl5pvDJXnVmpaAA2TeNNpNhTMl4o5HghuWhOivBjEiTnJSrMYSa5uZMek1lBEvu8kKEsa2YgVcGFVDqX/9w==", - "dev": true - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -39410,12 +38949,6 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, "pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", @@ -39620,12 +39153,6 @@ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, - "pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true - }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -40385,15 +39912,6 @@ "integrity": "sha1-LMfr6Vn8OmYZwEq029yeRS2GS70=", "dev": true }, - "promisify-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promisify-event/-/promisify-event-1.0.0.tgz", - "integrity": "sha1-vXUj6ga3AWLzcJeQFrU6aGxg6Q8=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, "prompts": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", @@ -40635,12 +40153,6 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, - "qrcode-terminal": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.10.0.tgz", - "integrity": "sha1-p2pI4mEKGPl/o6K9UytoKs/4bFM=", - "dev": true - }, "qs": { "version": "6.10.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", @@ -40965,15 +40477,6 @@ "graceful-fs": "^4.1.2" } }, - "read-file-relative": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/read-file-relative/-/read-file-relative-1.2.0.tgz", - "integrity": "sha1-mPfZbqoh0rTHov69Y9L8jPNen5s=", - "dev": true, - "requires": { - "callsite": "^1.0.0" - } - }, "read-only-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", @@ -41436,12 +40939,6 @@ "remove-trailing-separator": "^1.1.0" } }, - "replicator": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/replicator/-/replicator-1.0.5.tgz", - "integrity": "sha512-saxS4y7NFkLMa92BR4bPHR41GD+f/qoDAwD2xZmN+MpDXgibkxwLO2qk7dCHYtskSkd/bWS8Jy6kC5MZUkg1tw==", - "dev": true - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -45475,932 +44972,6 @@ "minimatch": "^3.0.4" } }, - "testcafe": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/testcafe/-/testcafe-1.16.1.tgz", - "integrity": "sha512-efb4S7YIyu8BpG4dZQBCgPE3V1YWU8J32v7/cPr1zW1yY/9F2B0y1lMTpeFJ3rUMdHSZpwYi6y00dEfEnNeN/Q==", - "dev": true, - "requires": { - "@babel/core": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-decorators": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-runtime": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-flow": "^7.12.1", - "@babel/preset-react": "^7.12.1", - "@babel/runtime": "^7.12.5", - "@types/node": "^12.20.10", - "async-exit-hook": "^1.1.2", - "babel-plugin-module-resolver": "^4.0.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "bin-v8-flags-filter": "^1.1.2", - "bowser": "^2.8.1", - "callsite": "^1.0.0", - "callsite-record": "^4.0.0", - "chai": "^4.1.2", - "chalk": "^2.3.0", - "chrome-remote-interface": "^0.30.0", - "coffeescript": "^2.3.1", - "commander": "^8.0.0", - "debug": "^4.3.1", - "dedent": "^0.4.0", - "del": "^3.0.0", - "device-specs": "^1.0.0", - "diff": "^4.0.2", - "elegant-spinner": "^1.0.1", - "emittery": "^0.4.1", - "endpoint-utils": "^1.0.2", - "error-stack-parser": "^1.3.6", - "esm": "^3.2.25", - "execa": "^4.0.3", - "globby": "^11.0.4", - "graceful-fs": "^4.1.11", - "graphlib": "^2.1.5", - "humanize-duration": "^3.25.0", - "import-lazy": "^3.1.0", - "indent-string": "^1.2.2", - "is-ci": "^1.0.10", - "is-docker": "^2.0.0", - "is-glob": "^2.0.1", - "is-stream": "^2.0.0", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "log-update-async-hook": "^2.0.2", - "make-dir": "^3.0.0", - "mime-db": "^1.41.0", - "moment": "^2.10.3", - "moment-duration-format-commonjs": "^1.0.0", - "mustache": "^2.1.2", - "nanoid": "^1.0.1", - "os-family": "^1.0.0", - "parse5": "^1.5.0", - "pify": "^2.3.0", - "pinkie": "^2.0.4", - "pngjs": "^3.3.1", - "pretty-hrtime": "^1.0.3", - "promisify-event": "^1.0.0", - "qrcode-terminal": "^0.10.0", - "read-file-relative": "^1.2.0", - "replicator": "^1.0.5", - "resolve-cwd": "^1.0.0", - "resolve-from": "^4.0.0", - "sanitize-filename": "^1.6.0", - "semver": "^5.6.0", - "source-map-support": "^0.5.16", - "strip-bom": "^2.0.0", - "testcafe-browser-tools": "2.0.16", - "testcafe-hammerhead": "24.5.4", - "testcafe-legacy-api": "5.1.1", - "testcafe-reporter-json": "^2.1.0", - "testcafe-reporter-list": "^2.1.0", - "testcafe-reporter-minimal": "^2.1.0", - "testcafe-reporter-spec": "^2.1.1", - "testcafe-reporter-xunit": "^2.1.0", - "time-limit-promise": "^1.0.2", - "tmp": "0.0.28", - "tree-kill": "^1.2.2", - "typescript": "^3.3.3", - "unquote": "^1.1.1" - }, - "dependencies": { - "@babel/preset-react": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", - "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/plugin-transform-react-jsx-development": "^7.14.5", - "@babel/plugin-transform-react-pure-annotations": "^7.14.5" - } - }, - "@types/node": { - "version": "12.20.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.29.tgz", - "integrity": "sha512-dU2ypz+gO5va1OBvs0iT3BNHG5SgTqRvq8r+kU3e/LAseKapUJ8zTUE9Ve9fTpi27tN/7ahOAhCJwQWsffvsyw==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "commander": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.2.0.tgz", - "integrity": "sha512-LLKxDvHeL91/8MIyTAD5BFMNtoIwztGPMiM/7Bl8rIPmHCZXRxmSWr91h57dpOpnQ6jIUqEWdXE/uBYMfiVZDA==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "dedent": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.4.0.tgz", - "integrity": "sha1-h979BAvUwVldljKC7FfzwqhSVkI=", - "dev": true - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "emittery": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.4.1.tgz", - "integrity": "sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ==", - "dev": true - }, - "error-stack-parser": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz", - "integrity": "sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI=", - "dev": true, - "requires": { - "stackframe": "^0.3.1" - } - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "import-lazy": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", - "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", - "dev": true - }, - "indent-string": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-1.2.2.tgz", - "integrity": "sha1-25m8xYPrarux5I3LsZmamGBBy2s=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "minimist": "^1.1.0", - "repeating": "^1.1.0" - } - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanoid": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-1.3.4.tgz", - "integrity": "sha512-4ug4BsuHxiVHoRUe1ud6rUFT3WUMmjXt1W0quL0CviZQANdan7D8kqN5/maw53hmAApY/jfzMRkC57BNNs60ZQ==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-1.0.0.tgz", - "integrity": "sha1-Tq7qQe0EDRcCRX32SkKysH0kb58=", - "dev": true, - "requires": { - "resolve-from": "^2.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "stackframe": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", - "integrity": "sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ=", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "tmp": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", - "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - }, - "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "testcafe-browser-tools": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/testcafe-browser-tools/-/testcafe-browser-tools-2.0.16.tgz", - "integrity": "sha512-JljbS0FboABksIMEH1L7P4ZdI82AQ8saWb/7WsxkDCOtDuHID5ZSEb/w9tqLN1+4BQaCgS5veN3lWUnfb0saEA==", - "dev": true, - "requires": { - "array-find": "^1.0.0", - "debug": "^4.3.1", - "dedent": "^0.7.0", - "del": "^5.1.0", - "execa": "^3.3.0", - "graceful-fs": "^4.1.11", - "linux-platform-info": "^0.0.3", - "lodash": "^4.17.15", - "mkdirp": "^0.5.1", - "mustache": "^2.1.2", - "nanoid": "^2.1.3", - "os-family": "^1.0.0", - "pify": "^2.3.0", - "pinkie": "^2.0.1", - "read-file-relative": "^1.2.0", - "which-promise": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "dev": true, - "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "testcafe-hammerhead": { - "version": "24.5.4", - "resolved": "https://registry.npmjs.org/testcafe-hammerhead/-/testcafe-hammerhead-24.5.4.tgz", - "integrity": "sha512-ve2rgOQEh4R48L8eu945DDeLOH/Owj8ZmJL0lQBnsLrZA60vsSxpvOczuj98f2u1jtgGjcxOeRTIkNypcRZAyA==", - "dev": true, - "requires": { - "acorn-hammerhead": "0.5.0", - "asar": "^2.0.1", - "bowser": "1.6.0", - "brotli": "^1.3.1", - "crypto-md5": "^1.0.0", - "css": "2.2.3", - "debug": "4.3.1", - "esotope-hammerhead": "0.6.1", - "http-cache-semantics": "^4.1.0", - "iconv-lite": "0.5.1", - "lodash": "^4.17.20", - "lru-cache": "2.6.3", - "match-url-wildcard": "0.0.4", - "merge-stream": "^1.0.1", - "mime": "~1.4.1", - "mustache": "^2.1.1", - "nanoid": "^3.1.12", - "os-family": "^1.0.0", - "parse5": "2.2.3", - "pinkie": "2.0.4", - "read-file-relative": "^1.2.0", - "semver": "5.5.0", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "webauth": "^1.1.0" - }, - "dependencies": { - "bowser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.6.0.tgz", - "integrity": "sha1-N/w4e2Fstq7zcNq01r1AK3TFxU0=", - "dev": true - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "iconv-lite": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.1.tgz", - "integrity": "sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "lru-cache": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.3.tgz", - "integrity": "sha1-UczQtPwMhDWH16VwnOTTt2Kb7cU=", - "dev": true - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "parse5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz", - "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "dev": true, - "requires": { - "punycode": "^1.4.1" - } - } - } - }, - "testcafe-legacy-api": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/testcafe-legacy-api/-/testcafe-legacy-api-5.1.1.tgz", - "integrity": "sha512-WRy9XvH/u+HE19oXs70xuxlcC+x4Yhydhhy5PadK/Ro9ssupSjEFxc/gzTWWcvdxAXO8JWgsXl/x4v5RMYtMow==", - "dev": true, - "requires": { - "async": "0.2.6", - "dedent": "^0.6.0", - "highlight-es": "^1.0.0", - "is-jquery-obj": "^0.1.0", - "lodash": "^4.14.0", - "moment": "^2.14.1", - "mustache": "^2.2.1", - "os-family": "^1.0.0", - "parse5": "^2.1.5", - "pify": "^2.3.0", - "pinkie": "^2.0.1", - "read-file-relative": "^1.2.0", - "strip-bom": "^2.0.0", - "testcafe-hammerhead": ">=19.4.0" - }, - "dependencies": { - "async": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.6.tgz", - "integrity": "sha1-rT83PZJJrjJIgVZVgryQ4VKrvWg=", - "dev": true - }, - "dedent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.6.0.tgz", - "integrity": "sha1-Dm2o8M5Sg471zsXI+TlrDBtko8s=", - "dev": true - }, - "parse5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz", - "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "testcafe-reporter-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/testcafe-reporter-json/-/testcafe-reporter-json-2.2.0.tgz", - "integrity": "sha512-wfpNaZgGP2WoqdmnIXOyxcpwSzdH1HvzXSN397lJkXOrQrwhuGUThPDvyzPnZqxZSzXdDUvIPJm55tCMWbfymQ==", - "dev": true - }, - "testcafe-reporter-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/testcafe-reporter-list/-/testcafe-reporter-list-2.1.0.tgz", - "integrity": "sha1-n6ifcbl9Pf5ktDAtXiJ97mmuxrk=", - "dev": true - }, - "testcafe-reporter-minimal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/testcafe-reporter-minimal/-/testcafe-reporter-minimal-2.1.0.tgz", - "integrity": "sha1-Z28DVHY0FDxurzq1KGgnOkvr9CE=", - "dev": true - }, - "testcafe-reporter-spec": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/testcafe-reporter-spec/-/testcafe-reporter-spec-2.1.1.tgz", - "integrity": "sha1-gVb87Q9RMkhlWa1WC8gGdkaSdew=", - "dev": true - }, - "testcafe-reporter-xunit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/testcafe-reporter-xunit/-/testcafe-reporter-xunit-2.1.0.tgz", - "integrity": "sha1-5tZsVyzhWvJmcGrw/WELKoQd1EM=", - "dev": true - }, "text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", @@ -46512,12 +45083,6 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "time-limit-promise": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/time-limit-promise/-/time-limit-promise-1.0.4.tgz", - "integrity": "sha512-FLHDDsIDducw7MBcRWlFtW2Tm50DoKOSFf0Nzx17qwXj8REXCte0eUkHrJl9QU3Bl9arG3XNYX0PcHpZ9xyuLw==", - "dev": true - }, "time-stamp": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", @@ -46557,27 +45122,6 @@ "os-tmpdir": "~1.0.2" } }, - "tmp-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.1.0.tgz", - "integrity": "sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw==", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "tmp": "0.1.0" - }, - "dependencies": { - "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", - "dev": true, - "requires": { - "rimraf": "^2.6.3" - } - } - } - }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -48666,12 +47210,6 @@ } } }, - "webauth": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webauth/-/webauth-1.1.0.tgz", - "integrity": "sha1-ZHBPa4AmmGYFvDymKZUubib90QA=", - "dev": true - }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -49168,40 +47706,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "which-promise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-promise/-/which-promise-1.0.0.tgz", - "integrity": "sha1-ILch3wWzW3Bhdv+hCwkJq6RgMDU=", - "dev": true, - "requires": { - "pify": "^2.2.0", - "pinkie-promise": "^1.0.0", - "which": "^1.1.2" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", - "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=", - "dev": true - }, - "pinkie-promise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", - "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", - "dev": true, - "requires": { - "pinkie": "^1.0.0" - } - } - } - }, "which-typed-array": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", diff --git a/package.json b/package.json index 4c0a7b4be2..1f4d553837 100644 --- a/package.json +++ b/package.json @@ -217,8 +217,7 @@ "@types/jest": "^27.0.2", "@types/lodash": "^4.14.172", "@types/mocha": "^7.0.2", - "@types/nightwatch": "^1.1.6", - "@types/node": "~8.9.4", + "@types/nightwatch": "1.3.4", "@types/react": "^17.0.24", "@types/react-beautiful-dnd": "^13.1.2", "@types/react-dom": "^17.0.9", From b63fcc9bb04743b355a6a51de75da449d07a0dc5 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 17 Oct 2021 19:32:25 +0200 Subject: [PATCH 30/51] add type --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 1f4d553837..63fb8bd746 100644 --- a/package.json +++ b/package.json @@ -218,6 +218,7 @@ "@types/lodash": "^4.14.172", "@types/mocha": "^7.0.2", "@types/nightwatch": "1.3.4", + "@types/node": "~8.9.4", "@types/react": "^17.0.24", "@types/react-beautiful-dnd": "^13.1.2", "@types/react-dom": "^17.0.9", From 2ebe883b8a3be628f0f1c9757d80f5bd8eed7eda Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Mon, 18 Oct 2021 09:08:36 +0200 Subject: [PATCH 31/51] unit tests --- apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx | 5 ++--- apps/remix-ide/src/remixEngine.js | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index c0b31f55b3..c9cb1d113a 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -13,7 +13,6 @@ import { terminalProfile } from '@remixproject/plugin-api/lib/terminal/profile' import { udappProfile } from '@remixproject/plugin-api/lib/udapp' import { compilerProfile } from '@remixproject/plugin-api/lib/compiler' import { contentImportProfile } from '@remixproject/plugin-api/lib/content-import' -import { unitTestProfile } from '@remixproject/plugin-api/lib/unit-testing' import { windowProfile } from '@remixproject/plugin-api/lib/window' import { pluginManagerProfile } from '@remixproject/plugin-api/lib/plugin-manager' import { Profile } from '@remixproject/plugin-utils' @@ -27,7 +26,7 @@ function App () { const [append, setAppend] = useState(false) const [log, setLog] = useState() const [events, setEvents] = useState() - const [profiles, setProfiles] = useState([pluginManagerProfile, filePanelProfile, filSystemProfile, dGitProfile, networkProfile, settingsProfile, editorProfile, terminalProfile, compilerProfile, udappProfile, contentImportProfile, unitTestProfile, windowProfile]) + const [profiles, setProfiles] = useState([pluginManagerProfile, filePanelProfile, filSystemProfile, dGitProfile, networkProfile, settingsProfile, editorProfile, terminalProfile, compilerProfile, udappProfile, contentImportProfile, windowProfile]) const handleChange = ({ target }: any) => { setPayload(target.value) @@ -35,7 +34,7 @@ function App () { useEffect(() => { client.onload(async () => { - const customProfiles = ['menuicons', 'tabs'] + const customProfiles = ['menuicons', 'tabs', 'solidityUnitTesting'] let addProfiles = [] for (const name of customProfiles) { diff --git a/apps/remix-ide/src/remixEngine.js b/apps/remix-ide/src/remixEngine.js index e7c358e576..fd40429fa1 100644 --- a/apps/remix-ide/src/remixEngine.js +++ b/apps/remix-ide/src/remixEngine.js @@ -13,6 +13,7 @@ export class RemixEngine extends Engine { if (name === 'dGitProvider') return { queueTimeout: 60000 * 4 } if (name === 'slither') return { queueTimeout: 60000 * 4 } // Requires when a solc version is installed if (name === 'hardhat') return { queueTimeout: 60000 * 4 } + if (name === 'solidityUnitTesting') return { queueTimeout: 60000 * 4 } return { queueTimeout: 10000 } } From 14fbd18b4f86feb82f1be497f6003c74ae727f1c Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 19 Oct 2021 12:23:48 +0100 Subject: [PATCH 32/51] Merge branch 'master' of https://github.com/ethereum/remix-project into e2epluginapi2 --- .../src/local-plugin/src/app/app.tsx | 8 +- apps/remix-ide-e2e/src/tests/plugin_api.ts | 193 ++++++++++++------ .../assets/css/intro.js/2.7.0/introjs.min.css | 1 + .../assets/css/intro.js/4.1.0/introjs.min.css | 2 + apps/remix-ide/src/remixEngine.js | 2 +- 5 files changed, 136 insertions(+), 70 deletions(-) create mode 100644 apps/remix-ide/src/assets/css/intro.js/2.7.0/introjs.min.css create mode 100644 apps/remix-ide/src/assets/css/intro.js/4.1.0/introjs.min.css diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index c9cb1d113a..f10251cccd 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -46,7 +46,8 @@ function App () { profiles.map((profile: Profile) => { if (profile.events) { profile.events.map((event: string) => { - client.on(profile.name as any, event, (...args:any) => { + client.on(profile.name as any, event, (...args: any) => { + console.log('event :', event, args) setEvents({ event: event, args: args @@ -67,9 +68,12 @@ function App () { let ob: any = null try { ob = JSON.parse(payload) - } catch (e) {} + if (ob && !Array.isArray(ob)) { ob = [ob] } + } catch (e) { } const args = ob || [payload] + console.log('calling :', profile.name, method, ...args) const result = await client.call(profile.name as any, method, ...args) + console.log('result :', result) setLog(result) } catch (e) { setLog(e.message) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 98c2956045..99867259ed 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -1,6 +1,7 @@ 'use strict' import { ExternalProfile, LocationProfile, Profile } from '@remixproject/plugin-utils' import { NightwatchBrowser } from 'nightwatch' +import { resolve } from 'url' import init from '../helpers/init' declare global { @@ -15,7 +16,7 @@ const localPluginData: Profile & LocationProfile & ExternalProfile = { location: 'sidePanel' } -const getBrowserLogs = function (browser: NightwatchBrowser) { +const getBrowserLogs = async function (browser: NightwatchBrowser) { browser.getLog('browser', (logEntries) => { if (logEntries && logEntries.length > 0) { console.log('Browser log:') @@ -23,37 +24,72 @@ const getBrowserLogs = function (browser: NightwatchBrowser) { } }) } -const debugValues = function (browser: NightwatchBrowser, field: string, expected: string) { - browser.waitForElementVisible(`//*[@id="${field}"]`).getText(`//*[@id="${field}"]`, (result) => { - if (!result.value.toString().includes(expected)) { - console.log('Actual result:') - console.log(result.value.toString()) - console.log('Expected result:') - console.log(expected) - getBrowserLogs(browser) +const debugValues = async function (browser: NightwatchBrowser, field: string, expected: any) { + return new Promise((resolve) => { + if (!expected) { + resolve(true) + return } + browser.waitForElementVisible(`//*[@id="${field}"]`).getText(`//*[@id="${field}"]`, (result) => { + console.log(result) + if (!result.value.toString().includes(expected)) { + console.log('Actual result:') + console.log(result.value.toString()) + console.log('Expected result:') + console.log(expected) + getBrowserLogs(browser) + browser.assert.ok(false, 'Returned value from call does not match expected value.') + } else { + browser.assert.ok(true) + } + resolve(true) + }) }) } -const clickAndCheckLog = function (browser: NightwatchBrowser, buttonText: string, methodResult: any, eventResult: any, payload: any) { - if (payload) { +const setPayload = async (browser: NightwatchBrowser, payload: any) => { + return new Promise((resolve) => { if (typeof payload !== 'string') payload = JSON.stringify(payload) - browser.clearValue('//*[@id="payload"]').setValue('//*[@id="payload"]', payload).pause(1000) - } - if (methodResult && typeof methodResult !== 'string') methodResult = JSON.stringify(methodResult) - if (eventResult && typeof eventResult !== 'string') eventResult = JSON.stringify(eventResult) - browser - .useXpath().waitForElementVisible(`//*[@data-id='${buttonText}']`).click(`//*[@data-id='${buttonText}']`) - .pause(2000) - - if (methodResult) { - debugValues(browser, 'methods', methodResult) - browser.waitForElementVisible('//*[@id="methods"]').verify.containsText('//*[@id="methods"]', methodResult) - } - if (eventResult) { - debugValues(browser, 'events', eventResult) - browser.waitForElementVisible('//*[@id="events"]').verify.containsText('//*[@id="events"]', eventResult) + browser.clearValue('//*[@id="payload"]').setValue('//*[@id="payload"]', payload, (result) => { + resolve(result) + }) + }) +} + +const clickButton = async (browser: NightwatchBrowser, buttonText: string) => { + return new Promise((resolve) => { + browser.useXpath().waitForElementVisible(`//*[@data-id='${buttonText}']`) + .click(`//*[@data-id='${buttonText}']`) + .pause(2000, () => resolve(true)) + }) +} + +const checkForAcceptAndRemember = async function (browser: NightwatchBrowser) { + return new Promise((resolve) => { + browser.frameParent().element('xpath', '//*[@data-id="modalDialogModalBody"]', (visible:any) => { + if (visible.status && visible.status === -1) { + // @ts-ignore + browser.frame(0, () => { resolve(true) }) + } else { + browser.click('//*[@id="remember"]').click('//*[@id="modal-footer-ok"]', () => { + // @ts-ignore + browser.frame(0, () => { resolve(true) }) + }) + } + }) + }) +} + +const clickAndCheckLog = async (browser: NightwatchBrowser, buttonText: string, methodResult: any, eventResult: any, payload: any) => { + if (payload) { + await setPayload(browser, payload) } + if (methodResult && typeof methodResult !== 'string') { methodResult = JSON.stringify(methodResult) } + if (eventResult && typeof eventResult !== 'string') { eventResult = JSON.stringify(eventResult) } + await clickButton(browser, buttonText) + await checkForAcceptAndRemember(browser) + await debugValues(browser, 'methods', methodResult) + await debugValues(browser, 'events', eventResult) } const assertPluginIsActive = function (browser: NightwatchBrowser, id: string) { @@ -67,7 +103,7 @@ module.exports = { afterEach: function (browser: NightwatchBrowser) { browser.getLog('browser', (logEntries) => { - console.log(logEntries) + // console.log(logEntries) }) }, @@ -79,70 +115,93 @@ module.exports = { // FILESYSTEM - 'Should get current workspace': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null, null) + 'Should get current workspace': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null, null) }, - 'Should get current files': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) + + 'Should get current files': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) }, - 'Should throw error on current file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'Error from IDE : Error: No such file or directory No file selected', null, null) + 'Should throw error on current file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'Error from IDE : Error: No such file or directory No file selected', null, null) }, - 'Should open readme.txt': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:open', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') + 'Should open readme.txt': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:open', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') }, - 'Should have current file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) + 'Should have current file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) }, - 'Should create dir': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:mkdir', null, null, 'testdir') - clickAndCheckLog(browser, 'fileManager:readdir', 'testdir', null, '/') + 'Should create dir': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:mkdir', null, null, 'testdir') + await clickAndCheckLog(browser, 'fileManager:readdir', 'testdir', null, '/') }, - 'Should get file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:getFile', 'REMIX EXAMPLE PROJECT', null, 'README.txt') + 'Should get file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:getFile', 'REMIX EXAMPLE PROJECT', null, 'README.txt') }, - 'Should close all files': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:closeAllFiles', null, { event: 'noFileSelected', args: [] }, null) + 'Should close all files': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:closeAllFiles', null, { event: 'noFileSelected', args: [] }, null) }, - 'Should switch to file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['contracts/1_Storage.sol'] }, 'contracts/1_Storage.sol') - clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'contracts/1_Storage.sol', null, null) - clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') - clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) + 'Should switch to file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['contracts/1_Storage.sol'] }, 'contracts/1_Storage.sol') + await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'contracts/1_Storage.sol', null, null) + await clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') + await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) }, - 'Should write to file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileSaved', args: ['README.txt'] }, ['README.txt', 'test']) - // @ts-ignore - browser.frameParent().acceptAndRemember(true, true).frame(0) - clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'README.txt') + 'Should write to file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileSaved', args: ['README.txt'] }, ['README.txt', 'test']) + await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'README.txt') + }, + 'Should write to new file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileAdded', args: ['testing.txt'] }, ['testing.txt', 'test']) + await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'testing.txt') + }, + 'Should rename file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:rename', null, null, ['testing.txt', 'testrename.txt']) + await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'testrename.txt') }, - 'Should create workspace': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'testspace') - clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'testspace', isLocalhost: false, absolutePath: '.workspaces/testspace' }, null, null) - clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) + 'Should create empty workspace': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, ['emptyworkspace', false]) + await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'emptyworkspace', isLocalhost: false, absolutePath: '.workspaces/emptyworkspace' }, null, null) + await clickAndCheckLog(browser, 'fileManager:readdir', {}, null, '/') + }, + 'Should create workspace': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'testspace') + await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'testspace', isLocalhost: false, absolutePath: '.workspaces/testspace' }, null, null) + await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) }, // COMPILER - 'Should compile a file': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'solidity:compile', null, null, 'contracts/1_Storage.sol') + 'Should compile a file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'solidity:compile', null, null, 'contracts/1_Storage.sol') }, - 'Should get compilationresults': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'solidity:getCompilationResult', 'contracts/1_Storage.sol', null, null) + 'Should get compilationresults': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'solidity:getCompilationResult', 'contracts/1_Storage.sol', null, null) }, // DGIT - 'Should have changes on new workspace': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'dgit') - clickAndCheckLog(browser, 'dGitProvider:status', [['README.txt', 0, 2, 0], ['contracts/1_Storage.sol', 0, 2, 0], ['contracts/2_Owner.sol', 0, 2, 0], ['contracts/3_Ballot.sol', 0, 2, 0], ['scripts/deploy_ethers.js', 0, 2, 0], ['scripts/deploy_web3.js', 0, 2, 0], ['tests/4_Ballot_test.sol', 0, 2, 0]], null, null) + 'Should have changes on new workspace': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'dgit') + await clickAndCheckLog(browser, 'dGitProvider:status', [['README.txt', 0, 2, 0], ['contracts/1_Storage.sol', 0, 2, 0], ['contracts/2_Owner.sol', 0, 2, 0], ['contracts/3_Ballot.sol', 0, 2, 0], ['scripts/deploy_ethers.js', 0, 2, 0], ['scripts/deploy_web3.js', 0, 2, 0], ['tests/4_Ballot_test.sol', 0, 2, 0]], null, null) + }, + + 'Should stage contract': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'dGitProvider:add', null, null, { + filepath: 'contracts/1_Storage.sol' + }) + await clickAndCheckLog(browser, 'dGitProvider:status', [['README.txt', 0, 2, 0], ['contracts/1_Storage.sol', 0, 2, 2], ['contracts/2_Owner.sol', 0, 2, 0], ['contracts/3_Ballot.sol', 0, 2, 0], ['scripts/deploy_ethers.js', 0, 2, 0], ['scripts/deploy_web3.js', 0, 2, 0], ['tests/4_Ballot_test.sol', 0, 2, 0]], null, null) + }, + 'Should commit changes': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'dGitProvider:commit', null, null, { author: { name: 'Remix', email: 'Remix' }, message: 'commit-message' }) + await clickAndCheckLog(browser, 'dGitProvider:log', 'commit-message', null, null) }, // UNIT TESTING - 'Should activate solidityUnitTesting': function (browser: NightwatchBrowser) { - clickAndCheckLog(browser, 'manager:activatePlugin', null, null, 'solidityUnitTesting') + 'Should activate solidityUnitTesting': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'manager:activatePlugin', null, null, 'solidityUnitTesting') browser.frameParent() assertPluginIsActive(browser, 'solidityUnitTesting') // @ts-ignore diff --git a/apps/remix-ide/src/assets/css/intro.js/2.7.0/introjs.min.css b/apps/remix-ide/src/assets/css/intro.js/2.7.0/introjs.min.css new file mode 100644 index 0000000000..4f508ed90c --- /dev/null +++ b/apps/remix-ide/src/assets/css/intro.js/2.7.0/introjs.min.css @@ -0,0 +1 @@ +.introjs-overlay{position:absolute;box-sizing:content-box;z-index:999999;background-color:#000;opacity:0;background:-moz-radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);background:-webkit-gradient(radial,center center,0px,center center,100%,color-stop(0%,rgba(0,0,0,0.4)),color-stop(100%,rgba(0,0,0,0.9)));background:-webkit-radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);background:-o-radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);background:-ms-radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);background:radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#66000000',endColorstr='#e6000000',GradientType=1)";-ms-filter:"alpha(opacity=50)";filter:alpha(opacity=50);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1.0!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:white;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{box-sizing:content-box;position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border:1px solid rgba(0,0,0,.5);border-radius:4px;box-shadow:0 2px 15px rgba(0,0,0,.4);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{box-sizing:content-box;position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer *:before,.introjs-helperLayer *:after{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{box-sizing:content-box;position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:bold;color:white;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid white;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid white;content:'';position:absolute}.introjs-arrow.top{top:-10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:white;border-left-color:transparent}.introjs-arrow.top-right{top:-10px;right:10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:white;border-left-color:transparent}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:white;border-left-color:transparent}.introjs-arrow.right{right:-10px;top:10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:transparent;border-left-color:white}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:transparent;border-left-color:white}.introjs-arrow.bottom{bottom:-10px;border-top-color:white;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.introjs-arrow.left{left:-10px;top:10px;border-top-color:transparent;border-right-color:white;border-bottom-color:transparent;border-left-color:transparent}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-top-color:transparent;border-right-color:white;border-bottom-color:transparent;border-left-color:transparent}.introjs-tooltip{box-sizing:content-box;position:absolute;visibility:visible;padding:10px;background-color:white;min-width:200px;max-width:300px;border-radius:3px;box-shadow:0 1px 10px rgba(0,0,0,.4);-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:.3em .8em;border:1px solid #d4d4d4;margin:0;text-decoration:none;text-shadow:1px 1px 0 #fff;font:11px/normal sans-serif;color:#333;white-space:nowrap;cursor:pointer;outline:0;background-color:#ececec;background-image:-webkit-gradient(linear,0 0,0 100%,from(#f4f4f4),to(#ececec));background-image:-moz-linear-gradient(#f4f4f4,#ececec);background-image:-o-linear-gradient(#f4f4f4,#ececec);background-image:linear-gradient(#f4f4f4,#ececec);-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em;zoom:1;*display:inline;margin-top:10px}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:focus,.introjs-button:active{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:0}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-disabled,.introjs-disabled:hover,.introjs-disabled:focus{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center}.introjs-bullets ul{box-sizing:content-box;clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:hover{background:#999}.introjs-bullets ul li a.active{background:#999}.introjs-progress{box-sizing:content-box;overflow:hidden;height:10px;margin:10px 0 5px 0;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{box-sizing:content-box;float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{box-sizing:content-box;position:absolute;background:transparent;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,0.57)}.introjs-hint-pulse{box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,0.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,0.24);z-index:10;position:absolute;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{box-sizing:content-box;border:10px solid rgba(146,146,146,0.36);background:transparent;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:.0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(0.1);opacity:.3}75%{-webkit-transform:scale(0.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:.0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:.0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(0.1);opacity:.3}75%{-moz-transform:scale(0.5);opacity:.5}100%{-moz-transform:scale(1);opacity:.0}}@keyframes introjspulse{0%{transform:scale(0);opacity:.0}25%{transform:scale(0);opacity:.1}50%{transform:scale(0.1);opacity:.3}75%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:.0}} \ No newline at end of file diff --git a/apps/remix-ide/src/assets/css/intro.js/4.1.0/introjs.min.css b/apps/remix-ide/src/assets/css/intro.js/4.1.0/introjs.min.css new file mode 100644 index 0000000000..d8b1714797 --- /dev/null +++ b/apps/remix-ide/src/assets/css/intro.js/4.1.0/introjs.min.css @@ -0,0 +1,2 @@ +@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes introjspulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.introjs-overlay{position:absolute;-webkit-box-sizing:content-box;box-sizing:content-box;z-index:999999;opacity:0;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-showElement{z-index:9999999!important}tr.introjs-showElement>td{z-index:9999999!important;position:relative}tr.introjs-showElement>th{z-index:9999999!important;position:relative}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:#fff;opacity:0}.introjs-relativePosition{position:relative}.introjs-helperLayer{-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;z-index:9999998;border-radius:4px;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *{-webkit-box-sizing:content-box;box-sizing:content-box}.introjs-helperLayer :before{-webkit-box-sizing:content-box;box-sizing:content-box}.introjs-helperLayer :after{-webkit-box-sizing:content-box;box-sizing:content-box}.introjs-tooltipReferenceLayer{font-family:"Helvetica Neue",Inter,ui-sans-serif,"Apple Color Emoji",Helvetica,Arial,sans-serif;-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;visibility:hidden;z-index:100000000;background-color:transparent;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-tooltipReferenceLayer *{font-family:"Helvetica Neue",Inter,ui-sans-serif,"Apple Color Emoji",Helvetica,Arial,sans-serif}.introjs-helperNumberLayer{font-family:"Helvetica Neue",Inter,ui-sans-serif,"Apple Color Emoji",Helvetica,Arial,sans-serif;color:#9e9e9e;text-align:center;padding-top:10px;padding-bottom:10px}.introjs-arrow{border:5px solid transparent;content:"";position:absolute}.introjs-arrow.top{top:-10px;left:10px;border-bottom-color:#fff}.introjs-arrow.top-right{top:-10px;right:10px;border-bottom-color:#fff}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-bottom-color:#fff}.introjs-arrow.right{right:-10px;top:10px;border-left-color:#fff}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-left-color:#fff}.introjs-arrow.bottom{bottom:-10px;left:10px;border-top-color:#fff}.introjs-arrow.bottom-right{bottom:-10px;right:10px;border-top-color:#fff}.introjs-arrow.bottom-middle{bottom:-10px;left:50%;margin-left:-5px;border-top-color:#fff}.introjs-arrow.left{left:-10px;top:10px;border-right-color:#fff}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-right-color:#fff}.introjs-tooltip{-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;visibility:visible;background-color:#fff;min-width:250px;max-width:300px;border-radius:5px;-webkit-box-shadow:0 3px 30px rgba(33,33,33,.3);box-shadow:0 3px 30px rgba(33,33,33,.3);-webkit-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltiptext{padding:20px}.introjs-tooltip-title{font-size:18px;margin:0;padding:0;font-weight:700;float:left;line-height:32px}.introjs-tooltip-header{padding-left:20px;padding-right:20px;padding-top:10px}.introjs-tooltip-header:after{content:".";visibility:hidden;display:block;height:0;clear:both}.introjs-tooltipbuttons{border-top:1px solid #e0e0e0;padding:10px;text-align:right;white-space:nowrap}.introjs-tooltipbuttons:after{content:"";visibility:hidden;display:block;height:0;clear:both}.introjs-button{-webkit-box-sizing:content-box;box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:.5rem 1rem;border:1px solid #bdbdbd;text-decoration:none;text-shadow:1px 1px 0 #fff;font-size:14px;color:#424242;white-space:nowrap;cursor:pointer;outline:0;background-color:#f4f4f4;border-radius:.2em;zoom:1}.introjs-button:hover{outline:0;text-decoration:none;border-color:#9e9e9e;background-color:#e0e0e0;color:#212121}.introjs-button:focus{outline:0;text-decoration:none;background-color:#eee;-webkit-box-shadow:0 0 0 .2rem rgba(158,158,158,.5);box-shadow:0 0 0 .2rem rgba(158,158,158,.5);border:1px solid #616161;color:#212121}.introjs-button:active{outline:0;text-decoration:none;background-color:#e0e0e0;border-color:#9e9e9e;color:#212121}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{-webkit-box-sizing:content-box;box-sizing:content-box;color:#616161;float:right;font-size:20px;cursor:pointer;font-weight:700;line-height:1;text-align:center;padding:7px 10px}.introjs-skipbutton:focus,.introjs-skipbutton:hover{color:#212121;outline:0;text-decoration:none}.introjs-prevbutton{float:left}.introjs-nextbutton{float:right}.introjs-disabled{color:#9e9e9e;border-color:#bdbdbd;-webkit-box-shadow:none;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-disabled:focus,.introjs-disabled:hover{color:#9e9e9e;border-color:#bdbdbd;-webkit-box-shadow:none;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center;padding-top:10px;padding-bottom:10px}.introjs-bullets ul{-webkit-box-sizing:content-box;box-sizing:content-box;clear:both;margin:0 auto 0;padding:0;display:inline-block}.introjs-bullets ul li{-webkit-box-sizing:content-box;box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{-webkit-transition:width .1s ease-in;-o-transition:width .1s ease-in;transition:width .1s ease-in;-webkit-box-sizing:content-box;box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:focus,.introjs-bullets ul li a:hover{width:15px;background:#999;text-decoration:none;outline:0}.introjs-bullets ul li a.active{width:15px;background:#999}.introjs-progress{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:hidden;height:10px;margin:10px;border-radius:4px;background-color:#e0e0e0}.introjs-progressbar{-webkit-box-sizing:content-box;box-sizing:content-box;float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-pulse{-webkit-box-sizing:content-box;box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,.27);border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;position:absolute;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;animation:none}.introjs-hint-dot{-webkit-box-sizing:content-box;box-sizing:content-box;border:10px solid rgba(146,146,146,.36);background:0 0;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0} +/*# sourceMappingURL=introjs.min.css.map */ \ No newline at end of file diff --git a/apps/remix-ide/src/remixEngine.js b/apps/remix-ide/src/remixEngine.js index fd40429fa1..1ad385146b 100644 --- a/apps/remix-ide/src/remixEngine.js +++ b/apps/remix-ide/src/remixEngine.js @@ -13,7 +13,7 @@ export class RemixEngine extends Engine { if (name === 'dGitProvider') return { queueTimeout: 60000 * 4 } if (name === 'slither') return { queueTimeout: 60000 * 4 } // Requires when a solc version is installed if (name === 'hardhat') return { queueTimeout: 60000 * 4 } - if (name === 'solidityUnitTesting') return { queueTimeout: 60000 * 4 } + if (name === 'localPlugin') return { queueTimeout: 60000 * 4 } return { queueTimeout: 10000 } } From 60cc2fd1b98c3936e2d8b245882b66a000d365d2 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 19 Oct 2021 12:55:08 +0100 Subject: [PATCH 33/51] close all files to make test work --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 1 - apps/remix-ide/src/app/panels/file-panel.js | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 99867259ed..fc7f977251 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -1,7 +1,6 @@ 'use strict' import { ExternalProfile, LocationProfile, Profile } from '@remixproject/plugin-utils' import { NightwatchBrowser } from 'nightwatch' -import { resolve } from 'url' import init from '../helpers/init' declare global { diff --git a/apps/remix-ide/src/app/panels/file-panel.js b/apps/remix-ide/src/app/panels/file-panel.js index 4ed0e6c8c9..f91ef5e2b7 100644 --- a/apps/remix-ide/src/app/panels/file-panel.js +++ b/apps/remix-ide/src/app/panels/file-panel.js @@ -251,6 +251,7 @@ module.exports = class Filepanel extends ViewPlugin { if (checkSpecialChars(workspaceName) || checkSlash(workspaceName)) throw new Error('special characters are not allowed') if (await this.workspaceExists(workspaceName)) throw new Error('workspace already exists') else { + await this.call('fileManager', 'closeAllFiles') const workspaceProvider = this._deps.fileProviders.workspace await this.processCreateWorkspace(workspaceName) workspaceProvider.setWorkspace(workspaceName) From 9b4f755279275a2e800a32e9ab7e9d4adcd2ad11 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 19 Oct 2021 14:43:09 +0100 Subject: [PATCH 34/51] linting --- .../src/commands/acceptAndRemember.ts | 15 ++++++++------- apps/remix-ide-e2e/src/tests/plugin_api.ts | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/remix-ide-e2e/src/commands/acceptAndRemember.ts b/apps/remix-ide-e2e/src/commands/acceptAndRemember.ts index dc11a33529..987a6fbe7e 100644 --- a/apps/remix-ide-e2e/src/commands/acceptAndRemember.ts +++ b/apps/remix-ide-e2e/src/commands/acceptAndRemember.ts @@ -16,14 +16,15 @@ class AcceptAndRemember extends EventEmitter { function acceptAndRemember (browser: NightwatchBrowser, remember: boolean, accept: boolean, callback: VoidFunction) { browser.useXpath().waitForElementVisible('//*[@data-id="modalDialogModalBody"]') if (remember) { - browser.click('//*[@id="remember"]') - } - if (accept) { - browser.click('//*[@id="modal-footer-ok"]') - } else { - browser.click('//*[@id="modal-footer-cancel"]') + browser.click('//*[@id="remember"]', () => { + if (accept) { + browser.click('//*[@id="modal-footer-ok"]') + } else { + browser.click('//*[@id="modal-footer-cancel"]') + } + browser.perform(function () { callback() }) + }) } - browser.perform(function () { callback() }) } module.exports = AcceptAndRemember diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index fc7f977251..6886a0dcfe 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -102,7 +102,7 @@ module.exports = { afterEach: function (browser: NightwatchBrowser) { browser.getLog('browser', (logEntries) => { - // console.log(logEntries) + console.log(logEntries) }) }, From 316bc22269e044d72b86f5650a5321797ef88f40 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 19 Oct 2021 15:32:23 +0100 Subject: [PATCH 35/51] more tests --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 24 +++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 6886a0dcfe..e631abe757 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -1,6 +1,7 @@ 'use strict' import { ExternalProfile, LocationProfile, Profile } from '@remixproject/plugin-utils' import { NightwatchBrowser } from 'nightwatch' +import { resolve } from 'url' import init from '../helpers/init' declare global { @@ -79,6 +80,14 @@ const checkForAcceptAndRemember = async function (browser: NightwatchBrowser) { }) } +const setAppend = async (browser: NightwatchBrowser) => { + return new Promise((resolve) => { + browser.waitForElementVisible('//*[@id="appendToLog"]').click('//*[@id="appendToLog"]', () => { + resolve(true) + }) + }) +} + const clickAndCheckLog = async (browser: NightwatchBrowser, buttonText: string, methodResult: any, eventResult: any, payload: any) => { if (payload) { await setPayload(browser, payload) @@ -109,12 +118,13 @@ module.exports = { 'Should connect a local plugin': function (browser: NightwatchBrowser) { browser.addLocalPlugin(localPluginData) // @ts-ignore - .frame(0) + .frame(0).useXpath() }, // FILESYSTEM 'Should get current workspace': async function (browser: NightwatchBrowser) { + await browser.pause(20000) await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null, null) }, @@ -170,6 +180,14 @@ module.exports = { await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'testspace', isLocalhost: false, absolutePath: '.workspaces/testspace' }, null, null) await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) }, + 'Should get all workspaces': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['default_workspace', 'emptyworkspace', 'testspace'], null, null) + }, + 'Should have set workspace event': async function (browser: NightwatchBrowser) { + await setAppend(browser) + await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, { event: 'setWorkspace', args: [{ name: 'newspace', isLocalhost: false }] }, 'newspace') + await setAppend(browser) + }, // COMPILER @@ -205,5 +223,9 @@ module.exports = { assertPluginIsActive(browser, 'solidityUnitTesting') // @ts-ignore browser.frame(0) + }, + + 'Should test from path with solidityUnitTesting': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'solidityUnitTesting:testFromPath', '"totalPassing":2,"totalFailing":0', null, 'tests/4_Ballot_test.sol') } } From e4df3d4dfd4817f15736501051d6edd53ed18415 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 19 Oct 2021 15:32:38 +0100 Subject: [PATCH 36/51] lint --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index e631abe757..349cb847a6 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -1,7 +1,6 @@ 'use strict' import { ExternalProfile, LocationProfile, Profile } from '@remixproject/plugin-utils' import { NightwatchBrowser } from 'nightwatch' -import { resolve } from 'url' import init from '../helpers/init' declare global { From 666a3988763b02881221759ca52b7ccdf844b408 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 19 Oct 2021 16:39:26 +0100 Subject: [PATCH 37/51] pauses --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 349cb847a6..9efeff7997 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -59,7 +59,7 @@ const clickButton = async (browser: NightwatchBrowser, buttonText: string) => { return new Promise((resolve) => { browser.useXpath().waitForElementVisible(`//*[@data-id='${buttonText}']`) .click(`//*[@data-id='${buttonText}']`) - .pause(2000, () => resolve(true)) + .pause(5000, () => resolve(true)) }) } @@ -123,7 +123,6 @@ module.exports = { // FILESYSTEM 'Should get current workspace': async function (browser: NightwatchBrowser) { - await browser.pause(20000) await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null, null) }, From fa670bd70ae44e3209841d1b9b779025c930508e Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 19 Oct 2021 16:49:54 +0100 Subject: [PATCH 38/51] pausing --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 9efeff7997..3eb8be849d 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -133,7 +133,9 @@ module.exports = { await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'Error from IDE : Error: No such file or directory No file selected', null, null) }, 'Should open readme.txt': async function (browser: NightwatchBrowser) { + await setAppend(browser) await clickAndCheckLog(browser, 'fileManager:open', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') + await setAppend(browser) }, 'Should have current file': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) @@ -146,22 +148,30 @@ module.exports = { await clickAndCheckLog(browser, 'fileManager:getFile', 'REMIX EXAMPLE PROJECT', null, 'README.txt') }, 'Should close all files': async function (browser: NightwatchBrowser) { + await setAppend(browser) await clickAndCheckLog(browser, 'fileManager:closeAllFiles', null, { event: 'noFileSelected', args: [] }, null) + await setAppend(browser) }, 'Should switch to file': async function (browser: NightwatchBrowser) { + await setAppend(browser) await clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['contracts/1_Storage.sol'] }, 'contracts/1_Storage.sol') await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'contracts/1_Storage.sol', null, null) await clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) + await setAppend(browser) }, 'Should write to file': async function (browser: NightwatchBrowser) { + await setAppend(browser) await clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileSaved', args: ['README.txt'] }, ['README.txt', 'test']) await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'README.txt') + await setAppend(browser) }, 'Should write to new file': async function (browser: NightwatchBrowser) { + await setAppend(browser) await clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileAdded', args: ['testing.txt'] }, ['testing.txt', 'test']) await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'testing.txt') + await setAppend(browser) }, 'Should rename file': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:rename', null, null, ['testing.txt', 'testrename.txt']) From 1f7b74176562ca88c99c380f36eadb8dc68b480d Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sat, 23 Oct 2021 11:07:56 +0100 Subject: [PATCH 39/51] context test --- .../src/local-plugin/src/app/Client.ts | 5 ++++ .../src/local-plugin/src/app/app.tsx | 6 +++++ apps/remix-ide-e2e/src/tests/plugin_api.ts | 27 +++++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts index dc9839c6b5..488b109db6 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/Client.ts @@ -3,6 +3,11 @@ import { createClient } from '@remixproject/plugin-webview' export class RemixPlugin extends PluginClient { constructor () { super() + this.methods = ['testCommand'] createClient(this) } + + async testCommand (data: any) { + + } } diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index f10251cccd..9f6af73fc2 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -36,6 +36,11 @@ function App () { client.onload(async () => { const customProfiles = ['menuicons', 'tabs', 'solidityUnitTesting'] + client.testCommand = async (data: any) => { + console.log(data) + setLog(data) + } + let addProfiles = [] for (const name of customProfiles) { const p = await client.call('manager', 'getProfile', name) @@ -72,6 +77,7 @@ function App () { } catch (e) { } const args = ob || [payload] console.log('calling :', profile.name, method, ...args) + await client.call('manager', 'activatePlugin', profile.name) const result = await client.call(profile.name as any, method, ...args) console.log('result :', result) setLog(result) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 3eb8be849d..6c9bdb3aae 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -93,8 +93,10 @@ const clickAndCheckLog = async (browser: NightwatchBrowser, buttonText: string, } if (methodResult && typeof methodResult !== 'string') { methodResult = JSON.stringify(methodResult) } if (eventResult && typeof eventResult !== 'string') { eventResult = JSON.stringify(eventResult) } - await clickButton(browser, buttonText) - await checkForAcceptAndRemember(browser) + if (buttonText) { + await clickButton(browser, buttonText) + await checkForAcceptAndRemember(browser) + } await debugValues(browser, 'methods', methodResult) await debugValues(browser, 'events', eventResult) } @@ -122,6 +124,25 @@ module.exports = { // FILESYSTEM + 'Should create context menu item': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'filePanel:registerContextMenuItem', null, null, { + id: 'localPlugin', + name: 'testCommand', + label: 'testCommand', + type: [], + extension: ['.sol'], + path: [], + pattern: [] + }) + await browser.useXpath().frameParent(async () => { + await clickButton(browser, 'verticalIconsFileExplorerIcons') + // await clickButton(browser, 'treeViewLitreeViewItemcontracts') + browser.rightClick('*[data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]').waitForElementVisible('//*[@id="menuitemtestcommand"]').click('//*[@id="menuitemtestcommand"]', async () => { + await clickAndCheckLog(browser, null, { id: 'localPlugin', name: 'testCommand', label: 'testCommand', type: [], extension: ['.sol'], path: ['contracts/1_Storage.sol'], pattern: [] }, null, null) + }) + }) + }, + 'Should get current workspace': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null, null) }, @@ -224,6 +245,8 @@ module.exports = { await clickAndCheckLog(browser, 'dGitProvider:log', 'commit-message', null, null) }, + // context menu + // UNIT TESTING 'Should activate solidityUnitTesting': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'manager:activatePlugin', null, null, 'solidityUnitTesting') From d6769dff6e88681a8d9d571371f5a2e8f718d7f4 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Mon, 25 Oct 2021 16:42:51 +0200 Subject: [PATCH 40/51] speed up tests --- .../src/local-plugin/src/app/app.tsx | 4 ++ apps/remix-ide-e2e/src/tests/plugin_api.ts | 38 +++++++++++++------ apps/remix-ide/src/app/panels/file-panel.js | 2 +- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index 9f6af73fc2..ecbcd530ce 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -25,6 +25,7 @@ function App () { const [payload, setPayload] = useState('') const [append, setAppend] = useState(false) const [log, setLog] = useState() + const [started, setStarted] = useState(false) const [events, setEvents] = useState() const [profiles, setProfiles] = useState([pluginManagerProfile, filePanelProfile, filSystemProfile, dGitProfile, networkProfile, settingsProfile, editorProfile, terminalProfile, compilerProfile, udappProfile, contentImportProfile, windowProfile]) @@ -76,6 +77,7 @@ function App () { if (ob && !Array.isArray(ob)) { ob = [ob] } } catch (e) { } const args = ob || [payload] + setStarted(true) console.log('calling :', profile.name, method, ...args) await client.call('manager', 'activatePlugin', profile.name) const result = await client.call(profile.name as any, method, ...args) @@ -84,11 +86,13 @@ function App () { } catch (e) { setLog(e.message) } + setStarted(false) } return (
PLUGIN API TESTER
+

diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 6c9bdb3aae..81e660bbfd 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -57,9 +57,11 @@ const setPayload = async (browser: NightwatchBrowser, payload: any) => { const clickButton = async (browser: NightwatchBrowser, buttonText: string) => { return new Promise((resolve) => { - browser.useXpath().waitForElementVisible(`//*[@data-id='${buttonText}']`) - .click(`//*[@data-id='${buttonText}']`) - .pause(5000, () => resolve(true)) + browser.useXpath().waitForElementVisible(`//*[@data-id='${buttonText}']`).pause(100) + .click(`//*[@data-id='${buttonText}']`, async () => { + await checkForAcceptAndRemember(browser) + browser.waitForElementContainsText('//*[@id="callStatus"]', 'stop').perform(() => resolve(true)) + }) }) } @@ -95,7 +97,6 @@ const clickAndCheckLog = async (browser: NightwatchBrowser, buttonText: string, if (eventResult && typeof eventResult !== 'string') { eventResult = JSON.stringify(eventResult) } if (buttonText) { await clickButton(browser, buttonText) - await checkForAcceptAndRemember(browser) } await debugValues(browser, 'methods', methodResult) await debugValues(browser, 'events', eventResult) @@ -122,7 +123,7 @@ module.exports = { .frame(0).useXpath() }, - // FILESYSTEM + // context menu item 'Should create context menu item': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:registerContextMenuItem', null, null, { @@ -135,20 +136,24 @@ module.exports = { pattern: [] }) await browser.useXpath().frameParent(async () => { - await clickButton(browser, 'verticalIconsFileExplorerIcons') - // await clickButton(browser, 'treeViewLitreeViewItemcontracts') - browser.rightClick('*[data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]').waitForElementVisible('//*[@id="menuitemtestcommand"]').click('//*[@id="menuitemtestcommand"]', async () => { - await clickAndCheckLog(browser, null, { id: 'localPlugin', name: 'testCommand', label: 'testCommand', type: [], extension: ['.sol'], path: ['contracts/1_Storage.sol'], pattern: [] }, null, null) - }) + browser.useCss().clickLaunchIcon('filePanel') + .rightClick('[data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]').useXpath().waitForElementVisible('//*[@id="menuitemtestcommand"]').click('//*[@id="menuitemtestcommand"]', async () => { + // @ts-ignore + browser.click('//*[@data-id="verticalIconsKindlocalPlugin"]').frame(0, async () => { + await clickAndCheckLog(browser, null, { id: 'localPlugin', name: 'testCommand', label: 'testCommand', type: [], extension: ['.sol'], path: ['contracts/1_Storage.sol'], pattern: [] }, null, null) + }) + }) }) }, + // FILESYSTEM + 'Should get current workspace': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }, null, null) }, 'Should get current files': async function (browser: NightwatchBrowser) { - await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) + await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, '/') }, 'Should throw error on current file': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'Error from IDE : Error: No such file or directory No file selected', null, null) @@ -217,11 +222,22 @@ module.exports = { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, { event: 'setWorkspace', args: [{ name: 'newspace', isLocalhost: false }] }, 'newspace') await setAppend(browser) }, + 'Should rename workspace': async function (browser: NightwatchBrowser) { + await setAppend(browser) + await clickAndCheckLog(browser, 'filePanel:renameWorkspace', null, null, ['default_workspace', 'renamed']) + await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['emptyworkspace', 'testspace', 'newspace', 'renamed'], null, null) + await setAppend(browser) + }, // COMPILER 'Should compile a file': async function (browser: NightwatchBrowser) { + await setAppend(browser) await clickAndCheckLog(browser, 'solidity:compile', null, null, 'contracts/1_Storage.sol') + browser.pause(5000, async () => { + await clickAndCheckLog(browser, 'solidity:compile', null, 'compilationFinished', null) + await setAppend(browser) + }) }, 'Should get compilationresults': async function (browser: NightwatchBrowser) { diff --git a/apps/remix-ide/src/app/panels/file-panel.js b/apps/remix-ide/src/app/panels/file-panel.js index f91ef5e2b7..2cddfe78c1 100644 --- a/apps/remix-ide/src/app/panels/file-panel.js +++ b/apps/remix-ide/src/app/panels/file-panel.js @@ -35,7 +35,7 @@ const modalDialogCustom = require('../ui/modal-dialog-custom') const profile = { name: 'filePanel', displayName: 'File explorers', - methods: ['createNewFile', 'uploadFile', 'getCurrentWorkspace', 'getWorkspaces', 'createWorkspace', 'setWorkspace', 'registerContextMenuItem'], + methods: ['createNewFile', 'uploadFile', 'getCurrentWorkspace', 'getWorkspaces', 'createWorkspace', 'setWorkspace', 'registerContextMenuItem', 'renameWorkspace'], events: ['setWorkspace', 'renameWorkspace', 'deleteWorkspace', 'createWorkspace'], icon: 'assets/img/fileManager.webp', description: ' - ', From ecf0dc034f348604810b6a9b399ff38a74e8ff1e Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Mon, 25 Oct 2021 17:15:31 +0200 Subject: [PATCH 41/51] test accounts --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 45 ++++++++++++++-------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 81e660bbfd..358cd05bd4 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -55,6 +55,14 @@ const setPayload = async (browser: NightwatchBrowser, payload: any) => { }) } +const clearPayLoad = async (browser: NightwatchBrowser) => { + return new Promise((resolve) => { + browser.clearValue('//*[@id="payload"]', () => { + resolve(true) + }) + }) +} + const clickButton = async (browser: NightwatchBrowser, buttonText: string) => { return new Promise((resolve) => { browser.useXpath().waitForElementVisible(`//*[@data-id='${buttonText}']`).pause(100) @@ -92,6 +100,8 @@ const setAppend = async (browser: NightwatchBrowser) => { const clickAndCheckLog = async (browser: NightwatchBrowser, buttonText: string, methodResult: any, eventResult: any, payload: any) => { if (payload) { await setPayload(browser, payload) + } else { + await clearPayLoad(browser) } if (methodResult && typeof methodResult !== 'string') { methodResult = JSON.stringify(methodResult) } if (eventResult && typeof eventResult !== 'string') { eventResult = JSON.stringify(eventResult) } @@ -123,6 +133,11 @@ module.exports = { .frame(0).useXpath() }, + // UDAPP + 'Should get accounts': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'udapp:getAccounts', '0x5B38Da6a701c568545dCfcB03FcB875f56beddC4', null, null) + }, + // context menu item 'Should create context menu item': async function (browser: NightwatchBrowser) { @@ -229,21 +244,6 @@ module.exports = { await setAppend(browser) }, - // COMPILER - - 'Should compile a file': async function (browser: NightwatchBrowser) { - await setAppend(browser) - await clickAndCheckLog(browser, 'solidity:compile', null, null, 'contracts/1_Storage.sol') - browser.pause(5000, async () => { - await clickAndCheckLog(browser, 'solidity:compile', null, 'compilationFinished', null) - await setAppend(browser) - }) - }, - - 'Should get compilationresults': async function (browser: NightwatchBrowser) { - await clickAndCheckLog(browser, 'solidity:getCompilationResult', 'contracts/1_Storage.sol', null, null) - }, - // DGIT 'Should have changes on new workspace': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'dgit') @@ -274,5 +274,20 @@ module.exports = { 'Should test from path with solidityUnitTesting': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'solidityUnitTesting:testFromPath', '"totalPassing":2,"totalFailing":0', null, 'tests/4_Ballot_test.sol') + }, + + // COMPILER + + 'Should compile a file': async function (browser: NightwatchBrowser) { + await setAppend(browser) + await clickAndCheckLog(browser, 'solidity:compile', null, null, 'contracts/1_Storage.sol') + browser.pause(5000, async () => { + await clickAndCheckLog(browser, 'solidity:compile', null, 'compilationFinished', null) + await setAppend(browser) + }) + }, + + 'Should get compilationresults': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'solidity:getCompilationResult', 'contracts/1_Storage.sol', null, null) } } From cade37cb49123cae13c2f08bad3cc7bbae1f2ea4 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 26 Oct 2021 11:58:10 +0200 Subject: [PATCH 42/51] rm plugin manager from ci --- .circleci/config.yml | 34 -- .../src/local-plugin/src/app/app.tsx | 26 +- .../src/local-plugin/src/app/logger.tsx | 14 +- .../src/local-plugin/src/index.html | 3 +- ...pluginManager.ts => pluginManager.test.ts} | 50 +- apps/remix-ide-e2e/src/tests/plugin_api.ts | 79 +-- .../ci/browser_tests_plugin_manager.sh | 21 - apps/remix-ide/src/app/files/dgitProvider.js | 4 +- apps/remix-ide/src/app/panels/file-panel.js | 4 +- package-lock.json | 457 +++++++++--------- package.json | 2 +- 11 files changed, 300 insertions(+), 394 deletions(-) rename apps/remix-ide-e2e/src/tests/{pluginManager.ts => pluginManager.test.ts} (75%) delete mode 100755 apps/remix-ide/ci/browser_tests_plugin_manager.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 756829d2f2..161d36c15e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -221,40 +221,6 @@ jobs: - store_artifacts: path: ./reports/screenshots - remix-ide-plugin-manager: - docker: - # specify the version you desire here - - image: circleci/node:14.17.6-browsers - - # Specify service dependencies here if necessary - # CircleCI maintains a library of pre-built images - # documented at https://circleci.com/docs/2.0/circleci-images/ - resource_class: xlarge - # - image: circleci/mongo:3.4.4 - environment: - - COMMIT_AUTHOR_EMAIL: "yann@ethereum.org" - - COMMIT_AUTHOR: "Circle CI" - - FILES_TO_PACKAGE: "dist/apps/remix-ide/assets dist/apps/remix-ide/index.html dist/apps/remix-ide/main.js dist/apps/remix-ide/polyfills.js dist/apps/remix-ide/runtime.js dist/apps/remix-ide/vendor.js dist/apps/remix-ide/favicon.ico" - working_directory: ~/remix-project - - steps: - - checkout - - run: npm install - - run: npx nx build remix-ide --with-deps - - run: npx nx build remix-ide-e2e-src-local-plugin - - run: - name: Download Selenium - command: ./node_modules/.bin/selenium-standalone install --drivers.chrome.version=2.39 --drivers.chrome.baseURL=https://chromedriver.storage.googleapis.com - - run: - name: Start Selenium - command: ./node_modules/.bin/selenium-standalone start --drivers.chrome.version=2.39 --drivers.chrome.baseURL=https://chromedriver.storage.googleapis.com - background: true - - run: ./apps/remix-ide/ci/browser_tests_plugin_manager.sh - - store_test_results: - path: ./reports/tests - - store_artifacts: - path: ./reports/screenshots - remix-ide-plugin-api: docker: # specify the version you desire here diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index ecbcd530ce..7e619557e7 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -23,7 +23,6 @@ const client = new RemixPlugin() function App () { const [payload, setPayload] = useState('') - const [append, setAppend] = useState(false) const [log, setLog] = useState() const [started, setStarted] = useState(false) const [events, setEvents] = useState() @@ -39,7 +38,7 @@ function App () { client.testCommand = async (data: any) => { console.log(data) - setLog(data) + methodLog(data) } let addProfiles = [] @@ -54,7 +53,7 @@ function App () { profile.events.map((event: string) => { client.on(profile.name as any, event, (...args: any) => { console.log('event :', event, args) - setEvents({ + eventLog({ event: event, args: args }) @@ -65,8 +64,14 @@ function App () { }) }, []) - const setAppendChange = ({ target }: any) => { - setAppend(target.checked) + const methodLog = (log: any) => { + const addValue = typeof log === 'string' ? log : JSON.stringify(log) + setLog((value) => `${value} ${addValue}`) + } + + const eventLog = (log: any) => { + const addValue = typeof log === 'string' ? log : JSON.stringify(log) + setEvents((value) => `${value} ${addValue}`) } const clientMethod = async (profile: Profile, method: string) => { @@ -78,13 +83,15 @@ function App () { } catch (e) { } const args = ob || [payload] setStarted(true) + setLog('') + setEvents('') console.log('calling :', profile.name, method, ...args) await client.call('manager', 'activatePlugin', profile.name) const result = await client.call(profile.name as any, method, ...args) console.log('result :', result) - setLog(result) + methodLog(result) } catch (e) { - setLog(e.message) + methodLog(e.message) } setStarted(false) } @@ -94,10 +101,9 @@ function App () {
PLUGIN API TESTER


- + - - + = (props) => { - const [value, setValue] = useState('') - - useEffect(() => { - setValue(value => { - const addValue = typeof props.log === 'string' ? props.log : JSON.stringify(props.log) - return props.append ? `${value} ${addValue}` : addValue - }) - }, [props]) - - return (
{value}
) + return (
{props.log}
) } diff --git a/apps/remix-ide-e2e/src/local-plugin/src/index.html b/apps/remix-ide-e2e/src/local-plugin/src/index.html index 2b826a80b6..a263a933db 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/index.html +++ b/apps/remix-ide-e2e/src/local-plugin/src/index.html @@ -1,10 +1,9 @@ + Remix Plugin API Testser - - diff --git a/apps/remix-ide-e2e/src/tests/pluginManager.ts b/apps/remix-ide-e2e/src/tests/pluginManager.test.ts similarity index 75% rename from apps/remix-ide-e2e/src/tests/pluginManager.ts rename to apps/remix-ide-e2e/src/tests/pluginManager.test.ts index ed215e33e1..48f3ae29d8 100644 --- a/apps/remix-ide-e2e/src/tests/pluginManager.ts +++ b/apps/remix-ide-e2e/src/tests/pluginManager.test.ts @@ -12,13 +12,6 @@ const testData = { pluginUrl: 'https://zokrates.github.io/zokrates-remix-plugin/' } -const localPluginData = { - pluginName: 'localPlugin', - pluginDisplayName: 'Local Plugin', - pluginCanActivate: 'LearnEth', - pluginUrl: 'http://localhost:2020' -} - module.exports = { before: function (browser: NightwatchBrowser, done: VoidFunction) { init(browser, done, 'http://127.0.0.1:8080', false) @@ -76,44 +69,6 @@ module.exports = { .waitForElementVisible('*[data-id="pluginManagerComponentActivateButtonvyper"]', 60000) }, - /* - 'Should grant plugin permission (ZOKRATES)': function (browser) { - browser.waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') - .click('*[data-id="pluginManagerPermissionsButton"]') - .waitForElementVisible('*[data-id="pluginManagerSettingsPermissionForm"]') - .assert.containsText('*[data-id="pluginManagerSettingsPermissionForm"]', 'No Permission requested yet') - .modalFooterOKClick() - .click('*[data-id="verticalIconsFileExplorerIcons"]') - .openFile('3_Ballot.sol') - .click('*[plugin="ZoKrates"]') - .pause(5000) - .frame(0) - .useXpath().click("//span[text()='Compile']") - .pause(2000) - .frameParent() - .useCss().waitForElementVisible('*[data-id="modalDialogContainer"]') - .assert.containsText('*[data-id="permissionHandlerMessage"]', 'ZOKRATES" WOULD LIKE TO ACCESS "FILE MANAGER" :') - .pause(2000) - .click('*[data-id="permissionHandlerRememberChoice"]') - .pause(2000) - .modalFooterOKClick() - }, - - 'Should revert plugin permission (ZOKRATES)': function (browser) { - browser.waitForElementVisible('*[data-id="verticalIconsSettingsIcons"]') - .click('*[data-id="verticalIconsSettingsIcons"]') - .waitForElementVisible('*[data-id="pluginManagerPermissionsButton"]') - .click('*[data-id="pluginManagerPermissionsButton"]') - .waitForElementVisible('*[data-id="modalDialogContainer"]') - .click('*[data-id="pluginManagerSettingsPermissionForm"]') - .pause(2000) - .click('*[data-id="pluginManagerSettingsClearAllPermission"]') - .pause(2000) - .assert.containsText('*[data-id="pluginManagerSettingsPermissionForm"]', 'No Permission requested yet') - .modalFooterOKClick() - }, - */ - 'Should connect a local plugin': function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="pluginManagerComponentPluginManager"]') .execute(function () { @@ -130,8 +85,6 @@ module.exports = { .click('*[data-id="localPluginRadioButtonsidePanel"]') .click('*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalFooter-react"]') .click('*[data-id="pluginManagerLocalPluginModalDialog-modal-footer-ok-react') - // .modalFooterOKClick() - // .waitForElementVisible('*[data-id="pluginManagerComponentDeactivateButtonremixIde"]', 60000) }, 'Should display error message for creating already existing plugin': function (browser: NightwatchBrowser) { @@ -163,9 +116,8 @@ module.exports = { .waitForElementVisible('*[data-id="remixIdeSidePanel"]') .pause(3000) .perform((done) => { - // const filtered = plugins.filter(plugin => plugin !== 'testremixIde') // remove this when localplugin bug is resolved plugins.forEach(plugin => { - if ((plugin !== testData.pluginName) && plugin !== localPluginData.pluginName) { + if (plugin !== testData.pluginName) { browser.waitForElementVisible(`[plugin="${plugin}"`) } }) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 358cd05bd4..64160abc09 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -89,14 +89,6 @@ const checkForAcceptAndRemember = async function (browser: NightwatchBrowser) { }) } -const setAppend = async (browser: NightwatchBrowser) => { - return new Promise((resolve) => { - browser.waitForElementVisible('//*[@id="appendToLog"]').click('//*[@id="appendToLog"]', () => { - resolve(true) - }) - }) -} - const clickAndCheckLog = async (browser: NightwatchBrowser, buttonText: string, methodResult: any, eventResult: any, payload: any) => { if (payload) { await setPayload(browser, payload) @@ -112,8 +104,12 @@ const clickAndCheckLog = async (browser: NightwatchBrowser, buttonText: string, await debugValues(browser, 'events', eventResult) } -const assertPluginIsActive = function (browser: NightwatchBrowser, id: string) { - browser.waitForElementVisible(`//*[@data-id="verticalIconsKind${id}"]`) +const assertPluginIsActive = function (browser: NightwatchBrowser, id: string, shouldBeVisible: boolean) { + if (shouldBeVisible) { + browser.waitForElementVisible(`//*[@data-id="verticalIconsKind${id}"]`) + } else { + browser.waitForElementNotPresent(`//*[@data-id="verticalIconsKind${id}"]`) + } } module.exports = { @@ -152,6 +148,12 @@ module.exports = { }) await browser.useXpath().frameParent(async () => { browser.useCss().clickLaunchIcon('filePanel') + .waitForElementVisible('[data-id="treeViewLitreeViewItemcontracts"]').element('css selector', '[data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]', (visible: any) => { + if (visible.status && visible.status === -1) { + browser.click('[data-id="treeViewLitreeViewItemcontracts"]') + } + }) + .waitForElementVisible('[data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]') .rightClick('[data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]').useXpath().waitForElementVisible('//*[@id="menuitemtestcommand"]').click('//*[@id="menuitemtestcommand"]', async () => { // @ts-ignore browser.click('//*[@data-id="verticalIconsKindlocalPlugin"]').frame(0, async () => { @@ -174,9 +176,7 @@ module.exports = { await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'Error from IDE : Error: No such file or directory No file selected', null, null) }, 'Should open readme.txt': async function (browser: NightwatchBrowser) { - await setAppend(browser) await clickAndCheckLog(browser, 'fileManager:open', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') - await setAppend(browser) }, 'Should have current file': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) @@ -189,30 +189,26 @@ module.exports = { await clickAndCheckLog(browser, 'fileManager:getFile', 'REMIX EXAMPLE PROJECT', null, 'README.txt') }, 'Should close all files': async function (browser: NightwatchBrowser) { - await setAppend(browser) await clickAndCheckLog(browser, 'fileManager:closeAllFiles', null, { event: 'noFileSelected', args: [] }, null) - await setAppend(browser) }, 'Should switch to file': async function (browser: NightwatchBrowser) { - await setAppend(browser) await clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['contracts/1_Storage.sol'] }, 'contracts/1_Storage.sol') await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'contracts/1_Storage.sol', null, null) await clickAndCheckLog(browser, 'fileManager:switchFile', null, { event: 'currentFileChanged', args: ['README.txt'] }, 'README.txt') await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'README.txt', null, null) - await setAppend(browser) }, 'Should write to file': async function (browser: NightwatchBrowser) { - await setAppend(browser) await clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileSaved', args: ['README.txt'] }, ['README.txt', 'test']) await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'README.txt') - await setAppend(browser) + }, + 'Should set file': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'fileManager:setFile', null, { event: 'fileAdded', args: ['new.sol'] }, ['new.sol', 'test']) + await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'new.sol') }, 'Should write to new file': async function (browser: NightwatchBrowser) { - await setAppend(browser) await clickAndCheckLog(browser, 'fileManager:writeFile', null, { event: 'fileAdded', args: ['testing.txt'] }, ['testing.txt', 'test']) await clickAndCheckLog(browser, 'fileManager:readFile', 'test', null, 'testing.txt') - await setAppend(browser) }, 'Should rename file': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:rename', null, null, ['testing.txt', 'testrename.txt']) @@ -220,7 +216,7 @@ module.exports = { }, 'Should create empty workspace': async function (browser: NightwatchBrowser) { - await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, ['emptyworkspace', false]) + await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, ['emptyworkspace', true]) await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'emptyworkspace', isLocalhost: false, absolutePath: '.workspaces/emptyworkspace' }, null, null) await clickAndCheckLog(browser, 'fileManager:readdir', {}, null, '/') }, @@ -233,17 +229,18 @@ module.exports = { await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['default_workspace', 'emptyworkspace', 'testspace'], null, null) }, 'Should have set workspace event': async function (browser: NightwatchBrowser) { - await setAppend(browser) await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, { event: 'setWorkspace', args: [{ name: 'newspace', isLocalhost: false }] }, 'newspace') - await setAppend(browser) + }, + 'Should have event when switching workspace': async function (browser: NightwatchBrowser) { + // @ts-ignore + browser.frameParent().useCss().clickLaunchIcon('filePanel').click('*[data-id="workspacesSelect"] option[value="default_workspace"]').useXpath().click('//*[@data-id="verticalIconsKindlocalPlugin"]').frame(0, async () => { + await clickAndCheckLog(browser, null, null, { event: 'setWorkspace', args: [{ name: 'default_workspace', isLocalhost: false }] }, null) + }) }, 'Should rename workspace': async function (browser: NightwatchBrowser) { - await setAppend(browser) await clickAndCheckLog(browser, 'filePanel:renameWorkspace', null, null, ['default_workspace', 'renamed']) await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['emptyworkspace', 'testspace', 'newspace', 'renamed'], null, null) - await setAppend(browser) }, - // DGIT 'Should have changes on new workspace': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'dgit') @@ -260,30 +257,48 @@ module.exports = { await clickAndCheckLog(browser, 'dGitProvider:commit', null, null, { author: { name: 'Remix', email: 'Remix' }, message: 'commit-message' }) await clickAndCheckLog(browser, 'dGitProvider:log', 'commit-message', null, null) }, - - // context menu - + 'Should have git log': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'dGitProvider:log', 'commit-message', null, null) + }, + 'Should have branches': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'dGitProvider:branches', [{ name: 'main' }], null, null) + }, + // resolver + 'Should resolve url': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'contentImport:resolve', '# Remix Project', null, 'https://github.com/ethereum/remix-project/blob/master/README.md') + }, + 'Should resolve and save url': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'contentImport:resolveAndSave', '# Remix Project', { event: 'fileAdded', args: ['.deps/github/ethereum/remix-project/README.md'] }, 'https://github.com/ethereum/remix-project/blob/master/README.md') + }, // UNIT TESTING 'Should activate solidityUnitTesting': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'manager:activatePlugin', null, null, 'solidityUnitTesting') browser.frameParent() - assertPluginIsActive(browser, 'solidityUnitTesting') + assertPluginIsActive(browser, 'solidityUnitTesting', true) // @ts-ignore browser.frame(0) + await clickAndCheckLog(browser, 'manager:isActive', true, null, 'solidityUnitTesting') }, 'Should test from path with solidityUnitTesting': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'solidityUnitTesting:testFromPath', '"totalPassing":2,"totalFailing":0', null, 'tests/4_Ballot_test.sol') }, + 'Should deactivate solidityUnitTesting': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'manager:deactivatePlugin', null, null, 'solidityUnitTesting') + browser.frameParent() + assertPluginIsActive(browser, 'solidityUnitTesting', false) + // @ts-ignore + browser.frame(0) + await clickAndCheckLog(browser, 'manager:isActive', false, null, 'solidityUnitTesting') + }, + // COMPILER 'Should compile a file': async function (browser: NightwatchBrowser) { - await setAppend(browser) await clickAndCheckLog(browser, 'solidity:compile', null, null, 'contracts/1_Storage.sol') browser.pause(5000, async () => { await clickAndCheckLog(browser, 'solidity:compile', null, 'compilationFinished', null) - await setAppend(browser) }) }, diff --git a/apps/remix-ide/ci/browser_tests_plugin_manager.sh b/apps/remix-ide/ci/browser_tests_plugin_manager.sh deleted file mode 100755 index 4f856292c6..0000000000 --- a/apps/remix-ide/ci/browser_tests_plugin_manager.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -set -e - -BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} -echo "$BUILD_ID" -TEST_EXITCODE=0 - -npm run serve & -npx nx serve remix-ide-e2e-src-local-plugin & - -sleep 5 - -npm run build:e2e -npm run nightwatch_local_pluginManager || TEST_EXITCODE=1 - -echo "$TEST_EXITCODE" -if [ "$TEST_EXITCODE" -eq 1 ] -then - exit 1 -fi diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.js index 76851a6204..047b7d3a27 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.js @@ -227,7 +227,7 @@ class DGitProvider extends Plugin { const permission = await this.askUserPermission('clone', 'Import multiple files into your workspaces.') if (!permission) return false if (this.calculateLocalStorage() > 10000) throw new Error('The local storage of the browser is full.') - await this.call('filePanel', 'createWorkspace', `workspace_${Date.now()}`, false) + await this.call('filePanel', 'createWorkspace', `workspace_${Date.now()}`, true) const cmd = { url: input.url, @@ -459,7 +459,7 @@ class DGitProvider extends Plugin { if (!permission) return false if (this.calculateLocalStorage() > 10000) throw new Error('The local storage of the browser is full.') const cid = cmd.cid - await this.call('filePanel', 'createWorkspace', `workspace_${Date.now()}`, false) + await this.call('filePanel', 'createWorkspace', `workspace_${Date.now()}`, true) const workspace = await this.call('filePanel', 'getCurrentWorkspace') let result if (cmd.local) { diff --git a/apps/remix-ide/src/app/panels/file-panel.js b/apps/remix-ide/src/app/panels/file-panel.js index 2cddfe78c1..3da87a426d 100644 --- a/apps/remix-ide/src/app/panels/file-panel.js +++ b/apps/remix-ide/src/app/panels/file-panel.js @@ -246,7 +246,7 @@ module.exports = class Filepanel extends ViewPlugin { return browserProvider.exists(workspacePath) } - async createWorkspace (workspaceName, setDefaults = true) { + async createWorkspace (workspaceName, isEmpty = false) { if (!workspaceName) throw new Error('name cannot be empty') if (checkSpecialChars(workspaceName) || checkSlash(workspaceName)) throw new Error('special characters are not allowed') if (await this.workspaceExists(workspaceName)) throw new Error('workspace already exists') @@ -256,7 +256,7 @@ module.exports = class Filepanel extends ViewPlugin { await this.processCreateWorkspace(workspaceName) workspaceProvider.setWorkspace(workspaceName) await this.request.setWorkspace(workspaceName) // tells the react component to switch to that workspace - if (setDefaults) { + if (!isEmpty) { for (const file in examples) { try { await workspaceProvider.set(examples[file].name, examples[file].content) diff --git a/package-lock.json b/package-lock.json index 0334f37243..0f63484073 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33819,7 +33819,7 @@ }, "aproba": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=" }, "archy": { @@ -33834,7 +33834,7 @@ }, "bluebird": { "version": "3.5.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" }, "call-limit": { @@ -33844,7 +33844,7 @@ }, "chownr": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, "cmd-shim": { @@ -34076,7 +34076,7 @@ }, "graceful-fs": { "version": "4.1.11", - "resolved": false, + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "has-unicode": { @@ -34086,7 +34086,7 @@ }, "hosted-git-info": { "version": "2.4.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=" }, "iferr": { @@ -34229,7 +34229,7 @@ }, "mississippi": { "version": "1.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-1.3.0.tgz", "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=", "requires": { "concat-stream": "^1.5.0", @@ -34246,7 +34246,7 @@ "dependencies": { "concat-stream": { "version": "1.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "requires": { "inherits": "^2.0.3", @@ -34256,14 +34256,14 @@ "dependencies": { "typedarray": { "version": "0.0.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" } } }, "duplexify": { "version": "3.5.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.0.tgz", "integrity": "sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=", "requires": { "end-of-stream": "1.0.0", @@ -34274,7 +34274,7 @@ "dependencies": { "end-of-stream": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", "integrity": "sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=", "requires": { "once": "~1.3.0" @@ -34282,7 +34282,7 @@ "dependencies": { "once": { "version": "1.3.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "requires": { "wrappy": "1" @@ -34292,14 +34292,14 @@ }, "stream-shift": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" } } }, "end-of-stream": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", "integrity": "sha1-6TUyWLqpEIll78QcsO+K3i88+wc=", "requires": { "once": "~1.3.0" @@ -34307,7 +34307,7 @@ "dependencies": { "once": { "version": "1.3.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "requires": { "wrappy": "1" @@ -34317,7 +34317,7 @@ }, "flush-write-stream": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", "requires": { "inherits": "^2.0.1", @@ -34326,7 +34326,7 @@ }, "from2": { "version": "2.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { "inherits": "^2.0.1", @@ -34335,7 +34335,7 @@ }, "parallel-transform": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "requires": { "cyclist": "~0.2.2", @@ -34345,14 +34345,14 @@ "dependencies": { "cyclist": { "version": "0.2.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" } } }, "pump": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", "requires": { "end-of-stream": "^1.1.0", @@ -34361,7 +34361,7 @@ }, "pumpify": { "version": "1.3.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz", "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", "requires": { "duplexify": "^3.1.2", @@ -34371,7 +34371,7 @@ }, "stream-each": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.0.tgz", "integrity": "sha1-HpXUdXP1gNgU3A/4zQ9m8c5TyZE=", "requires": { "end-of-stream": "^1.1.0", @@ -34380,14 +34380,14 @@ "dependencies": { "stream-shift": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" } } }, "through2": { "version": "2.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { "readable-stream": "^2.1.5", @@ -34396,7 +34396,7 @@ "dependencies": { "xtend": { "version": "4.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } @@ -34456,7 +34456,7 @@ }, "node-gyp": { "version": "3.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.0.tgz", "integrity": "sha1-dHT2OjoFARYd2gtjQfAi8UxCP6Y=", "requires": { "fstream": "^1.0.0", @@ -34476,7 +34476,7 @@ "dependencies": { "minimatch": { "version": "3.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "requires": { "brace-expansion": "^1.0.0" @@ -34484,7 +34484,7 @@ "dependencies": { "brace-expansion": { "version": "1.1.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", "requires": { "balanced-match": "^0.4.1", @@ -34493,12 +34493,12 @@ "dependencies": { "balanced-match": { "version": "0.4.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" }, "concat-map": { "version": "0.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" } } @@ -34507,7 +34507,7 @@ }, "nopt": { "version": "3.0.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { "abbrev": "1" @@ -34517,7 +34517,7 @@ }, "nopt": { "version": "4.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "requires": { "abbrev": "1", @@ -34526,7 +34526,7 @@ "dependencies": { "osenv": { "version": "0.1.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "requires": { "os-homedir": "^1.0.0", @@ -34535,12 +34535,12 @@ "dependencies": { "os-homedir": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-tmpdir": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" } } @@ -34554,7 +34554,7 @@ }, "normalize-package-data": { "version": "2.3.8", - "resolved": false, + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=", "requires": { "hosted-git-info": "^2.1.4", @@ -34565,7 +34565,7 @@ "dependencies": { "is-builtin-module": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { "builtin-modules": "^1.0.0" @@ -34573,7 +34573,7 @@ "dependencies": { "builtin-modules": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" } } @@ -34587,7 +34587,6 @@ }, "npm-install-checks": { "version": "3.0.0", - "resolved": false, "integrity": "sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc=", "requires": { "semver": "^2.3.0 || 3.x || 4 || 5" @@ -34595,7 +34594,7 @@ }, "npm-package-arg": { "version": "4.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-4.2.1.tgz", "integrity": "sha1-WTMD/eqF98Qid18X+et2cPaA4+w=", "requires": { "hosted-git-info": "^2.1.5", @@ -34645,7 +34644,7 @@ }, "npmlog": { "version": "4.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz", "integrity": "sha1-0DlQ4OeM4VJ7om0qdZLpNIrD518=", "requires": { "are-we-there-yet": "~1.1.2", @@ -34656,7 +34655,7 @@ "dependencies": { "are-we-there-yet": { "version": "1.1.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { "delegates": "^1.0.0", @@ -34665,19 +34664,19 @@ "dependencies": { "delegates": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" } } }, "console-control-strings": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "gauge": { "version": "2.7.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { "aproba": "^1.0.3", @@ -34692,17 +34691,17 @@ "dependencies": { "object-assign": { "version": "4.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "signal-exit": { "version": "3.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "string-width": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -34712,12 +34711,12 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" @@ -34725,7 +34724,7 @@ "dependencies": { "number-is-nan": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } @@ -34734,7 +34733,7 @@ }, "wide-align": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", "requires": { "string-width": "^1.0.1" @@ -34744,7 +34743,7 @@ }, "set-blocking": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" } } @@ -34834,7 +34833,7 @@ }, "read-package-json": { "version": "2.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.5.tgz", "integrity": "sha1-+Tpk5kFSnfaKCMZN5GOJ6KP4iEU=", "requires": { "glob": "^7.1.1", @@ -34845,7 +34844,7 @@ "dependencies": { "json-parse-helpfulerror": { "version": "1.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", "requires": { "jju": "^1.1.0" @@ -34853,7 +34852,7 @@ "dependencies": { "jju": { "version": "1.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz", "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=" } } @@ -34862,7 +34861,7 @@ }, "read-package-tree": { "version": "5.1.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.1.5.tgz", "integrity": "sha1-rOfmOBx2hPlwqqmPx8XStmat2rY=", "requires": { "debuglog": "^1.0.1", @@ -34874,7 +34873,7 @@ }, "readable-stream": { "version": "2.2.9", - "resolved": false, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", "requires": { "buffer-shims": "~1.0.0", @@ -34888,22 +34887,22 @@ "dependencies": { "buffer-shims": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" }, "isarray": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "process-nextick-args": { "version": "1.0.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "string_decoder": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=", "requires": { "buffer-shims": "~1.0.0" @@ -34911,7 +34910,7 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" } } @@ -34938,7 +34937,7 @@ }, "request": { "version": "2.81.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "requires": { "aws-sign2": "~0.6.0", @@ -34967,22 +34966,22 @@ "dependencies": { "aws-sign2": { "version": "0.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" }, "aws4": { "version": "1.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, "caseless": { "version": "0.12.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "combined-stream": { "version": "1.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { "delayed-stream": "~1.0.0" @@ -34990,24 +34989,24 @@ "dependencies": { "delayed-stream": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" } } }, "extend": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" }, "forever-agent": { "version": "0.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz", "integrity": "sha1-icNTQAi5fq2ky7FX1Y9vXfAl6uQ=", "requires": { "asynckit": "^0.4.0", @@ -35017,14 +35016,14 @@ "dependencies": { "asynckit": { "version": "0.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" } } }, "har-validator": { "version": "4.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "requires": { "ajv": "^4.9.1", @@ -35033,7 +35032,7 @@ "dependencies": { "ajv": { "version": "4.11.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.4.tgz", "integrity": "sha1-6/OlXUsTLqYP9YR66F0u8GmWC0U=", "requires": { "co": "^4.6.0", @@ -35042,12 +35041,12 @@ "dependencies": { "co": { "version": "4.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "json-stable-stringify": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { "jsonify": "~0.0.0" @@ -35055,7 +35054,7 @@ "dependencies": { "jsonify": { "version": "0.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" } } @@ -35064,14 +35063,14 @@ }, "har-schema": { "version": "1.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" } } }, "hawk": { "version": "3.1.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { "boom": "2.x.x", @@ -35082,7 +35081,7 @@ "dependencies": { "boom": { "version": "2.10.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { "hoek": "2.x.x" @@ -35090,7 +35089,7 @@ }, "cryptiles": { "version": "2.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "requires": { "boom": "2.x.x" @@ -35098,12 +35097,12 @@ }, "hoek": { "version": "2.16.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, "sntp": { "version": "1.0.9", - "resolved": false, + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "requires": { "hoek": "2.x.x" @@ -35113,7 +35112,7 @@ }, "http-signature": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "requires": { "assert-plus": "^0.2.0", @@ -35123,12 +35122,12 @@ "dependencies": { "assert-plus": { "version": "0.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" }, "jsprim": { "version": "1.3.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz", "integrity": "sha1-KnJW9wQSop7jZwqspiWZTE3P8lI=", "requires": { "extsprintf": "1.0.2", @@ -35138,17 +35137,17 @@ "dependencies": { "extsprintf": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" }, "json-schema": { "version": "0.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "verror": { "version": "1.3.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", "requires": { "extsprintf": "1.0.2" @@ -35158,7 +35157,7 @@ }, "sshpk": { "version": "1.11.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.11.0.tgz", "integrity": "sha1-LY1eu0pvqyj/ujf6YqkPSj6lnXc=", "requires": { "asn1": "~0.2.3", @@ -35174,17 +35173,17 @@ "dependencies": { "asn1": { "version": "0.2.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "assert-plus": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "bcrypt-pbkdf": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { @@ -35193,7 +35192,7 @@ }, "dashdash": { "version": "1.14.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { "assert-plus": "^1.0.0" @@ -35201,7 +35200,7 @@ }, "ecc-jsbn": { "version": "0.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { @@ -35210,7 +35209,7 @@ }, "getpass": { "version": "0.1.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", "requires": { "assert-plus": "^1.0.0" @@ -35218,7 +35217,7 @@ }, "jodid25519": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", "optional": true, "requires": { @@ -35227,13 +35226,13 @@ }, "jsbn": { "version": "0.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, "tweetnacl": { "version": "0.14.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true } @@ -35243,22 +35242,22 @@ }, "is-typedarray": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "isstream": { "version": "0.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "json-stringify-safe": { "version": "5.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "mime-types": { "version": "2.1.14", - "resolved": false, + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz", "integrity": "sha1-9+99l1g/yvO30oK2+LVnnaselO4=", "requires": { "mime-db": "~1.26.0" @@ -35266,39 +35265,39 @@ "dependencies": { "mime-db": { "version": "1.26.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz", "integrity": "sha1-6v/NDk/Gk1z4E02iRuLmw1MFrf8=" } } }, "oauth-sign": { "version": "0.8.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "performance-now": { "version": "0.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" }, "qs": { "version": "6.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" }, "safe-buffer": { "version": "5.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" }, "stringstream": { "version": "0.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "tough-cookie": { "version": "2.3.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", "requires": { "punycode": "^1.4.1" @@ -35306,14 +35305,14 @@ "dependencies": { "punycode": { "version": "1.4.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" } } }, "tunnel-agent": { "version": "0.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { "safe-buffer": "^5.0.1" @@ -35323,12 +35322,12 @@ }, "retry": { "version": "0.10.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" }, "rimraf": { "version": "2.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "requires": { "glob": "^7.0.5" @@ -35336,7 +35335,7 @@ }, "semver": { "version": "5.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" }, "sha": { @@ -35428,7 +35427,7 @@ }, "tar": { "version": "2.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { "block-stream": "*", @@ -35438,7 +35437,7 @@ "dependencies": { "block-stream": { "version": "0.0.8", - "resolved": false, + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz", "integrity": "sha1-Boj0baK7+c/wxPaCJaDLlcvopGs=", "requires": { "inherits": "~2.0.0" @@ -35486,7 +35485,7 @@ }, "update-notifier": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.1.0.tgz", "integrity": "sha1-7AweU1NrdmR6JLd8uDlm2TFRI9k=", "requires": { "boxen": "^1.0.0", @@ -35501,7 +35500,7 @@ "dependencies": { "boxen": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.0.0.tgz", "integrity": "sha1-smlLrx9gX3CP8Bd8Ehk7IvKaqqs=", "requires": { "ansi-align": "^1.1.0", @@ -35515,7 +35514,7 @@ "dependencies": { "ansi-align": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=", "requires": { "string-width": "^1.0.1" @@ -35523,7 +35522,7 @@ "dependencies": { "string-width": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -35533,12 +35532,12 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" @@ -35546,7 +35545,7 @@ "dependencies": { "number-is-nan": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } @@ -35557,17 +35556,17 @@ }, "camelcase": { "version": "4.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.0.0.tgz", "integrity": "sha1-iw+Q1Evl4oG5A7mIc0m5JZXvB/I=" }, "cli-boxes": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "string-width": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -35576,14 +35575,14 @@ "dependencies": { "is-fullwidth-code-point": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" } } }, "term-size": { "version": "0.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/term-size/-/term-size-0.1.1.tgz", "integrity": "sha1-hzYLljlsq1dgljcUzaDQy+7K2co=", "requires": { "execa": "^0.4.0" @@ -35591,7 +35590,7 @@ "dependencies": { "execa": { "version": "0.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz", "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=", "requires": { "cross-spawn-async": "^2.1.1", @@ -35604,7 +35603,7 @@ "dependencies": { "cross-spawn-async": { "version": "2.2.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=", "requires": { "lru-cache": "^4.0.0", @@ -35613,7 +35612,7 @@ "dependencies": { "lru-cache": { "version": "4.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", "requires": { "pseudomap": "^1.0.1", @@ -35622,12 +35621,12 @@ "dependencies": { "pseudomap": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "yallist": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=" } } @@ -35636,12 +35635,12 @@ }, "is-stream": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "npm-run-path": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=", "requires": { "path-key": "^1.0.0" @@ -35649,17 +35648,17 @@ }, "object-assign": { "version": "4.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "path-key": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=" }, "strip-eof": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" } } @@ -35668,7 +35667,7 @@ }, "widest-line": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", "requires": { "string-width": "^1.0.1" @@ -35676,7 +35675,7 @@ "dependencies": { "string-width": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -35686,12 +35685,12 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" @@ -35699,7 +35698,7 @@ "dependencies": { "number-is-nan": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } @@ -35712,7 +35711,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { "ansi-styles": "^2.2.1", @@ -35724,17 +35723,17 @@ "dependencies": { "ansi-styles": { "version": "2.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "escape-string-regexp": { "version": "1.0.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "has-ansi": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { "ansi-regex": "^2.0.0" @@ -35742,14 +35741,14 @@ }, "supports-color": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, "configstore": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.0.0.tgz", "integrity": "sha1-4bhmnBgDzMULVF6S+ObnmqgOAZY=", "requires": { "dot-prop": "^4.1.0", @@ -35762,7 +35761,7 @@ "dependencies": { "dot-prop": { "version": "4.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=", "requires": { "is-obj": "^1.0.0" @@ -35770,14 +35769,14 @@ "dependencies": { "is-obj": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" } } }, "unique-string": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { "crypto-random-string": "^1.0.0" @@ -35785,7 +35784,7 @@ "dependencies": { "crypto-random-string": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" } } @@ -35794,12 +35793,12 @@ }, "is-npm": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "latest-version": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.0.0.tgz", "integrity": "sha1-MQTwCMDDkQhBB/haNEvGHjiXBkk=", "requires": { "package-json": "^3.0.0" @@ -35807,7 +35806,7 @@ "dependencies": { "package-json": { "version": "3.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/package-json/-/package-json-3.1.0.tgz", "integrity": "sha1-zigZAP6AUhUMxnCcbABsGP2y83k=", "requires": { "got": "^6.7.1", @@ -35818,7 +35817,7 @@ "dependencies": { "got": { "version": "6.7.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "requires": { "create-error-class": "^3.0.0", @@ -35836,7 +35835,7 @@ "dependencies": { "create-error-class": { "version": "3.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { "capture-stack-trace": "^1.0.0" @@ -35844,59 +35843,59 @@ "dependencies": { "capture-stack-trace": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" } } }, "duplexer3": { "version": "0.1.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "get-stream": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "is-redirect": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-retry-allowed": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-stream": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "lowercase-keys": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, "safe-buffer": { "version": "5.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" }, "timed-out": { "version": "4.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "unzip-response": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" }, "url-parse-lax": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { "prepend-http": "^1.0.1" @@ -35904,7 +35903,7 @@ "dependencies": { "prepend-http": { "version": "1.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" } } @@ -35913,7 +35912,7 @@ }, "registry-auth-token": { "version": "3.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.1.0.tgz", "integrity": "sha1-mXwIJW4MeZmDe5DpRNs52KeQJ2s=", "requires": { "rc": "^1.1.6" @@ -35921,7 +35920,7 @@ "dependencies": { "rc": { "version": "1.1.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.7.tgz", "integrity": "sha1-xepWS7B6/5/TpbMukGwdOmWUD+o=", "requires": { "deep-extend": "~0.4.0", @@ -35932,17 +35931,17 @@ "dependencies": { "deep-extend": { "version": "0.4.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=" }, "minimist": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "strip-json-comments": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" } } @@ -35951,7 +35950,7 @@ }, "registry-url": { "version": "3.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { "rc": "^1.0.1" @@ -35959,7 +35958,7 @@ "dependencies": { "rc": { "version": "1.1.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.7.tgz", "integrity": "sha1-xepWS7B6/5/TpbMukGwdOmWUD+o=", "requires": { "deep-extend": "~0.4.0", @@ -35970,17 +35969,17 @@ "dependencies": { "deep-extend": { "version": "0.4.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=" }, "minimist": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "strip-json-comments": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" } } @@ -35993,12 +35992,12 @@ }, "lazy-req": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-2.0.0.tgz", "integrity": "sha1-yUUKNj7N2i5vDHATKtTzf48G8rQ=" }, "semver-diff": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { "semver": "^5.0.3" @@ -36006,14 +36005,14 @@ }, "xdg-basedir": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" } } }, "uuid": { "version": "3.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" }, "validate-npm-package-license": { @@ -36075,7 +36074,7 @@ }, "which": { "version": "1.2.14", - "resolved": false, + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", "requires": { "isexe": "^2.0.0" @@ -36083,7 +36082,7 @@ "dependencies": { "isexe": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" } } @@ -36095,7 +36094,7 @@ }, "write-file-atomic": { "version": "1.3.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.3.tgz", "integrity": "sha1-gx3SLUkb3BNRgLuZag6z+L9Yd5E=", "requires": { "graceful-fs": "^4.1.11", @@ -36255,7 +36254,7 @@ }, "cross-spawn": { "version": "5.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { @@ -36272,7 +36271,7 @@ }, "execa": { "version": "0.7.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { @@ -36302,19 +36301,19 @@ }, "get-stream": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, "invert-kv": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { @@ -36323,7 +36322,7 @@ }, "is-stream": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, @@ -36335,7 +36334,7 @@ }, "lcid": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { @@ -36354,7 +36353,7 @@ }, "lru-cache": { "version": "4.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { @@ -36364,7 +36363,7 @@ }, "mem": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { @@ -36373,7 +36372,7 @@ }, "mimic-fn": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", "dev": true }, @@ -36409,7 +36408,7 @@ }, "os-locale": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { @@ -36549,19 +36548,19 @@ }, "y18n": { "version": "3.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, "yallist": { "version": "2.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, "yargs": { "version": "10.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.0.3.tgz", "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==", "dev": true, "requires": { @@ -36581,13 +36580,13 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "cliui": { "version": "3.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { @@ -36598,7 +36597,7 @@ "dependencies": { "string-width": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { @@ -36611,7 +36610,7 @@ }, "string-width": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { @@ -36621,13 +36620,13 @@ "dependencies": { "is-fullwidth-code-point": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "strip-ansi": { "version": "4.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { @@ -36640,7 +36639,7 @@ }, "yargs-parser": { "version": "8.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.0.0.tgz", "integrity": "sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY=", "dev": true, "requires": { @@ -36649,7 +36648,7 @@ "dependencies": { "camelcase": { "version": "4.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true } @@ -37053,7 +37052,7 @@ }, "debug": { "version": "4.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { @@ -37142,7 +37141,7 @@ }, "find-up": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { @@ -37295,7 +37294,7 @@ }, "istanbul-lib-coverage": { "version": "2.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", "dev": true }, @@ -37339,7 +37338,7 @@ }, "istanbul-lib-report": { "version": "2.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz", "integrity": "sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA==", "dev": true, "requires": { @@ -37350,7 +37349,7 @@ "dependencies": { "supports-color": { "version": "6.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { @@ -37361,7 +37360,7 @@ }, "istanbul-lib-source-maps": { "version": "3.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz", "integrity": "sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ==", "dev": true, "requires": { @@ -37374,7 +37373,7 @@ "dependencies": { "source-map": { "version": "0.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } @@ -37382,7 +37381,7 @@ }, "istanbul-reports": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.1.1.tgz", "integrity": "sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw==", "dev": true, "requires": { @@ -37418,7 +37417,7 @@ }, "locate-path": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { @@ -37450,7 +37449,7 @@ }, "make-dir": { "version": "1.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { @@ -37479,7 +37478,7 @@ }, "merge-source-map": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, "requires": { @@ -37488,7 +37487,7 @@ "dependencies": { "source-map": { "version": "0.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } @@ -37627,7 +37626,7 @@ }, "p-limit": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { @@ -37636,7 +37635,7 @@ }, "p-locate": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { @@ -37645,7 +37644,7 @@ }, "p-try": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, @@ -37737,7 +37736,7 @@ }, "read-pkg": { "version": "3.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { @@ -37748,7 +37747,7 @@ }, "read-pkg-up": { "version": "4.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "requires": { @@ -37788,7 +37787,7 @@ }, "resolve-from": { "version": "4.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, @@ -37919,7 +37918,7 @@ }, "test-exclude": { "version": "5.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.1.0.tgz", "integrity": "sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA==", "dev": true, "requires": { diff --git a/package.json b/package.json index f54f8040bf..fd29d63991 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "nightwatch_local_gist": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/gist.spec.js --env=chrome", "nightwatch_local_workspace": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/workspace.test.js --env=chrome", "nightwatch_local_defaultLayout": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/defaultLayout.test.js --env=chrome", - "nightwatch_local_pluginManager": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/pluginManager.js --env=chrome", + "nightwatch_local_pluginManager": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/pluginManager.test.js --env=chrome", "nightwatch_local_publishContract": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/publishContract.test.js --env=chrome", "nightwatch_local_generalSettings": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/generalSettings.test.js --env=chrome", "nightwatch_local_fileExplorer": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/fileExplorer.test.js --env=chrome", From 247cc18dba4d8b218de32c48d09dc516f1e5ac88 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 26 Oct 2021 12:00:04 +0200 Subject: [PATCH 43/51] rm plugin manager test from ci --- .circleci/config.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 161d36c15e..acc9a0ffb8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -391,9 +391,6 @@ workflows: - remix-ide-run-deploy: requires: - lint - - remix-ide-plugin-manager: - requires: - - lint - publish: requires: - lint @@ -404,7 +401,6 @@ workflows: - remix-ide-firefox-1 - remix-ide-firefox-2 - remix-ide-run-deploy - - remix-ide-plugin-manager - remix-ide-plugin-api filters: branches: @@ -416,7 +412,6 @@ workflows: - remix-ide-firefox-1 - remix-ide-firefox-2 - remix-ide-run-deploy - - remix-ide-plugin-manager - remix-ide-plugin-api filters: branches: @@ -428,7 +423,6 @@ workflows: - remix-ide-firefox-1 - remix-ide-firefox-2 - remix-ide-run-deploy - - remix-ide-plugin-manager - remix-ide-plugin-api filters: branches: From bea4cee4c412409ab3d8b41b1f4ba89e37937b67 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 26 Oct 2021 15:44:39 +0200 Subject: [PATCH 44/51] wait for element --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 64160abc09..fa7f253cc3 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -80,7 +80,7 @@ const checkForAcceptAndRemember = async function (browser: NightwatchBrowser) { // @ts-ignore browser.frame(0, () => { resolve(true) }) } else { - browser.click('//*[@id="remember"]').click('//*[@id="modal-footer-ok"]', () => { + browser.waitForElementVisible('//*[@id="remember"]').click('//*[@id="remember"]').click('//*[@id="modal-footer-ok"]', () => { // @ts-ignore browser.frame(0, () => { resolve(true) }) }) From 8540fb198e379389f4cddd905c06be3f17caa24c Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 26 Oct 2021 17:23:52 +0200 Subject: [PATCH 45/51] comment rename workspace --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index fa7f253cc3..66af95371c 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -237,10 +237,10 @@ module.exports = { await clickAndCheckLog(browser, null, null, { event: 'setWorkspace', args: [{ name: 'default_workspace', isLocalhost: false }] }, null) }) }, - 'Should rename workspace': async function (browser: NightwatchBrowser) { - await clickAndCheckLog(browser, 'filePanel:renameWorkspace', null, null, ['default_workspace', 'renamed']) - await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['emptyworkspace', 'testspace', 'newspace', 'renamed'], null, null) - }, + // 'Should rename workspace': async function (browser: NightwatchBrowser) { + // await clickAndCheckLog(browser, 'filePanel:renameWorkspace', null, null, ['default_workspace', 'renamed']) + // await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['emptyworkspace', 'testspace', 'newspace', 'renamed'], null, null) + // }, // DGIT 'Should have changes on new workspace': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'dgit') From e5f78059f24084c60075705accf60f000509fe9f Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 29 Oct 2021 09:04:19 +0200 Subject: [PATCH 46/51] add rename ws --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 66af95371c..30aafeafc7 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -237,10 +237,11 @@ module.exports = { await clickAndCheckLog(browser, null, null, { event: 'setWorkspace', args: [{ name: 'default_workspace', isLocalhost: false }] }, null) }) }, - // 'Should rename workspace': async function (browser: NightwatchBrowser) { - // await clickAndCheckLog(browser, 'filePanel:renameWorkspace', null, null, ['default_workspace', 'renamed']) - // await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['emptyworkspace', 'testspace', 'newspace', 'renamed'], null, null) - // }, + + 'Should rename workspace': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'filePanel:renameWorkspace', null, null, ['default_workspace', 'renamed']) + await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['emptyworkspace', 'testspace', 'newspace', 'renamed'], null, null) + }, // DGIT 'Should have changes on new workspace': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'dgit') From ad1270d5b8334109281b9572fbf678cb4c4c04bc Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 29 Oct 2021 09:35:17 +0200 Subject: [PATCH 47/51] accept remember --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 30aafeafc7..a2bff60a30 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -75,16 +75,18 @@ const clickButton = async (browser: NightwatchBrowser, buttonText: string) => { const checkForAcceptAndRemember = async function (browser: NightwatchBrowser) { return new Promise((resolve) => { - browser.frameParent().element('xpath', '//*[@data-id="modalDialogModalBody"]', (visible:any) => { - if (visible.status && visible.status === -1) { + browser.frameParent(() => { + browser.pause(1000).element('xpath', '//*[@data-id="permissionHandlerRememberUnchecked"]', (visible:any) => { + if (visible.status && visible.status === -1) { // @ts-ignore - browser.frame(0, () => { resolve(true) }) - } else { - browser.waitForElementVisible('//*[@id="remember"]').click('//*[@id="remember"]').click('//*[@id="modal-footer-ok"]', () => { - // @ts-ignore browser.frame(0, () => { resolve(true) }) - }) - } + } else { + browser.waitForElementVisible('//*[@data-id="permissionHandlerRememberUnchecked"]').click('//*[@data-id="permissionHandlerRememberUnchecked"]').waitForElementVisible('//*[@id="modal-footer-ok"]').click('//*[@id="modal-footer-ok"]', () => { + // @ts-ignore + browser.frame(0, () => { resolve(true) }) + }) + } + }) }) }) } From 5cf40ca442d06c7a55a195e3a3307b399ec02c54 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 29 Oct 2021 13:26:41 +0200 Subject: [PATCH 48/51] update API --- .../src/local-plugin/src/app/app.tsx | 1 - apps/remix-ide-e2e/src/tests/plugin_api.ts | 4 + package-lock.json | 527 +++++++++--------- package.json | 14 +- 4 files changed, 275 insertions(+), 271 deletions(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx index 7e619557e7..50c4699997 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx +++ b/apps/remix-ide-e2e/src/local-plugin/src/app/app.tsx @@ -2,7 +2,6 @@ import React, { useEffect, useState } from 'react' import { RemixPlugin } from './Client' import { Logger } from './logger' - import { filePanelProfile } from '@remixproject/plugin-api/lib/file-system/file-panel/profile' import { filSystemProfile } from '@remixproject/plugin-api/lib/file-system/file-manager/profile' import { dGitProfile } from '@remixproject/plugin-api/lib/dgit/profile' diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index a2bff60a30..e04be05787 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -244,6 +244,10 @@ module.exports = { await clickAndCheckLog(browser, 'filePanel:renameWorkspace', null, null, ['default_workspace', 'renamed']) await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['emptyworkspace', 'testspace', 'newspace', 'renamed'], null, null) }, + 'Should delete workspace': async function (browser: NightwatchBrowser) { + await clickAndCheckLog(browser, 'filePanel:deleteWorkspace', null, null, ['testspace']) + await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['emptyworkspace', 'newspace', 'renamed'], null, null) + }, // DGIT 'Should have changes on new workspace': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'dgit') diff --git a/package-lock.json b/package-lock.json index f456e0c5a6..5fcf108368 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9251,46 +9251,46 @@ "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==" }, "@remixproject/engine": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/@remixproject/engine/-/engine-0.3.21.tgz", - "integrity": "sha512-IT2rQyiMG97WY4BMQzG0TOMOabhqafippUrGNUNk4FKKR6dXTEjD+mXaOJuesmK50UM+zpcxhsc7IQGIoCIXbQ==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/@remixproject/engine/-/engine-0.3.24.tgz", + "integrity": "sha512-XVPaRIAwxTxEmc+u+bq9nIqUcP1NDdQFTm/8xmw8HcZicgagUW/y0RuLEMBj5GTGXF+EsljY27t6bPy7fmVHWQ==", "requires": { - "@remixproject/plugin-api": "0.3.21", - "@remixproject/plugin-utils": "0.3.21" + "@remixproject/plugin-api": "0.3.24", + "@remixproject/plugin-utils": "0.3.24" } }, "@remixproject/engine-web": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/@remixproject/engine-web/-/engine-web-0.3.21.tgz", - "integrity": "sha512-ZSzuZLiB8EZVlGgXwl5riZdpU0lgMNcwY8U/e3b9D8PbSEr2XoOS0VD6P83KiYaPyNV9IKYoGcB1aqImm/58nA==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/@remixproject/engine-web/-/engine-web-0.3.24.tgz", + "integrity": "sha512-6P2NLoL9KSa/84FumEM3QxvOW4g/hIEsq8NcbBA+/PHz9VnIRoxRg2K/jGJUHHqKw+dfoSdk5lQ+LkFQHcrp+w==", "requires": { - "@remixproject/engine": "0.3.21", - "@remixproject/plugin-api": "0.3.21", - "@remixproject/plugin-utils": "0.3.21" + "@remixproject/engine": "0.3.24", + "@remixproject/plugin-api": "0.3.24", + "@remixproject/plugin-utils": "0.3.24" } }, "@remixproject/plugin": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.21.tgz", - "integrity": "sha512-JxKcXxjl7Fk2oP/KQwdHErQsjAwOpOJlv7q4I5MbdfN7hue7Kpe/lbqW19YTD0Cydsjd8jCI34q/2hEN6gyU2g==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.24.tgz", + "integrity": "sha512-nGtt3IZA5X2kcXauu5h5P8EEoMtHbVGm5wWnv0c7aYYWbffhQdK8dqtNNEAtQavWrsp5TL61zekqpkFzgxVv9w==", "requires": { - "@remixproject/plugin-api": "0.3.21", - "@remixproject/plugin-utils": "0.3.21", + "@remixproject/plugin-api": "0.3.24", + "@remixproject/plugin-utils": "0.3.24", "events": "3.2.0" } }, "@remixproject/plugin-api": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.21.tgz", - "integrity": "sha512-hTb785ncQNkH597gHYd4zmuqrQ123AEBQyyeKk3FUyEyGc65hLgf/QN3WngvzU07eIY23GdllgunwirJM810vA==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.24.tgz", + "integrity": "sha512-mBxou9OSsQt7ggMmKTJR433jJaSAckBmVj82Ek7i/+EGxEAxSqKhPfRlh5sFiTgvUmzHQzuvqa8ndyw0Bbcq4w==", "requires": { - "@remixproject/plugin-utils": "0.3.21" + "@remixproject/plugin-utils": "0.3.24" } }, "@remixproject/plugin-utils": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-utils/-/plugin-utils-0.3.21.tgz", - "integrity": "sha512-e/lzBJplTQdqMpqucLL0ovaM7FEPNzAE7QOzjFm2XhfLjUZBZ7m6CUIGNhozgo4S61yauq+nfdwc+JqZvytDnQ==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-utils/-/plugin-utils-0.3.24.tgz", + "integrity": "sha512-nMXGCgs6filbgUc/Zvh1gReGG5HN2Bq+AI4Q7Ao08Thhg5ALj1UsbzQf86Ya/L7Q+EF6Em1CbgPT0VhcGlP66A==", "requires": { "tslib": "2.0.1" }, @@ -9303,13 +9303,13 @@ } }, "@remixproject/plugin-webview": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-webview/-/plugin-webview-0.3.21.tgz", - "integrity": "sha512-byUGdFsgFaPDtn+vCtXoM+3y9ReMhnSeO0Iu9xVmLZjHxHo0aebRHup+e7y25mL4tk+9IOQa26Cc9kE74gtHpQ==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-webview/-/plugin-webview-0.3.24.tgz", + "integrity": "sha512-Wcyi+gGq1AYprE58vhQS181swAKZpoLAfKlKuHJ+ezbysUDuX8jgsEiQ6u1c17nQfy8Hp9sntK6VcCcDddn8gg==", "requires": { - "@remixproject/plugin": "0.3.21", - "@remixproject/plugin-api": "0.3.21", - "@remixproject/plugin-utils": "0.3.21", + "@remixproject/plugin": "0.3.24", + "@remixproject/plugin-api": "0.3.24", + "@remixproject/plugin-utils": "0.3.24", "axios": "^0.21.1" }, "dependencies": { @@ -9324,13 +9324,13 @@ } }, "@remixproject/plugin-ws": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-ws/-/plugin-ws-0.3.21.tgz", - "integrity": "sha512-uAgwVKn7oPZQjIj+sYzpQK1t5XBvxzFXo/wSUWgq4aMO23Mz+UvVx0fOoJ45gDqTbATI5yle0rab2Sn9HXNSMw==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-ws/-/plugin-ws-0.3.24.tgz", + "integrity": "sha512-COIROJX61vS2TRH82MflIUlScxLauNtLkMRY7vzncVOIvufApvNc84Ua8Vr6vhSb2tZeWX+u4UTiFnpFDRL7xw==", "requires": { - "@remixproject/plugin": "0.3.21", - "@remixproject/plugin-api": "0.3.21", - "@remixproject/plugin-utils": "0.3.21" + "@remixproject/plugin": "0.3.24", + "@remixproject/plugin-api": "0.3.24", + "@remixproject/plugin-utils": "0.3.24" } }, "@restart/context": { @@ -32929,7 +32929,7 @@ }, "aproba": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "resolved": false, "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=" }, "archy": { @@ -32944,7 +32944,7 @@ }, "bluebird": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "resolved": false, "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" }, "call-limit": { @@ -32954,7 +32954,7 @@ }, "chownr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "resolved": false, "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, "cmd-shim": { @@ -33186,7 +33186,7 @@ }, "graceful-fs": { "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "resolved": false, "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "has-unicode": { @@ -33196,7 +33196,7 @@ }, "hosted-git-info": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", + "resolved": false, "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=" }, "iferr": { @@ -33339,7 +33339,7 @@ }, "mississippi": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-1.3.0.tgz", + "resolved": false, "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=", "requires": { "concat-stream": "^1.5.0", @@ -33356,7 +33356,7 @@ "dependencies": { "concat-stream": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "resolved": false, "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "requires": { "inherits": "^2.0.3", @@ -33366,14 +33366,14 @@ "dependencies": { "typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "resolved": false, "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" } } }, "duplexify": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.0.tgz", + "resolved": false, "integrity": "sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=", "requires": { "end-of-stream": "1.0.0", @@ -33384,7 +33384,7 @@ "dependencies": { "end-of-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", + "resolved": false, "integrity": "sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=", "requires": { "once": "~1.3.0" @@ -33392,7 +33392,7 @@ "dependencies": { "once": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "resolved": false, "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "requires": { "wrappy": "1" @@ -33402,14 +33402,14 @@ }, "stream-shift": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "resolved": false, "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" } } }, "end-of-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", + "resolved": false, "integrity": "sha1-6TUyWLqpEIll78QcsO+K3i88+wc=", "requires": { "once": "~1.3.0" @@ -33417,7 +33417,7 @@ "dependencies": { "once": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "resolved": false, "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "requires": { "wrappy": "1" @@ -33427,7 +33427,7 @@ }, "flush-write-stream": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "resolved": false, "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", "requires": { "inherits": "^2.0.1", @@ -33436,7 +33436,7 @@ }, "from2": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "resolved": false, "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { "inherits": "^2.0.1", @@ -33445,7 +33445,7 @@ }, "parallel-transform": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "resolved": false, "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "requires": { "cyclist": "~0.2.2", @@ -33455,14 +33455,14 @@ "dependencies": { "cyclist": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "resolved": false, "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" } } }, "pump": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", + "resolved": false, "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", "requires": { "end-of-stream": "^1.1.0", @@ -33471,7 +33471,7 @@ }, "pumpify": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz", + "resolved": false, "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", "requires": { "duplexify": "^3.1.2", @@ -33481,7 +33481,7 @@ }, "stream-each": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.0.tgz", + "resolved": false, "integrity": "sha1-HpXUdXP1gNgU3A/4zQ9m8c5TyZE=", "requires": { "end-of-stream": "^1.1.0", @@ -33490,14 +33490,14 @@ "dependencies": { "stream-shift": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "resolved": false, "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" } } }, "through2": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "resolved": false, "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { "readable-stream": "^2.1.5", @@ -33506,7 +33506,7 @@ "dependencies": { "xtend": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "resolved": false, "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } @@ -33566,7 +33566,7 @@ }, "node-gyp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.0.tgz", + "resolved": false, "integrity": "sha1-dHT2OjoFARYd2gtjQfAi8UxCP6Y=", "requires": { "fstream": "^1.0.0", @@ -33586,7 +33586,7 @@ "dependencies": { "minimatch": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "resolved": false, "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "requires": { "brace-expansion": "^1.0.0" @@ -33594,7 +33594,7 @@ "dependencies": { "brace-expansion": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", + "resolved": false, "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", "requires": { "balanced-match": "^0.4.1", @@ -33603,12 +33603,12 @@ "dependencies": { "balanced-match": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "resolved": false, "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" } } @@ -33617,7 +33617,7 @@ }, "nopt": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "resolved": false, "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { "abbrev": "1" @@ -33627,7 +33627,7 @@ }, "nopt": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "resolved": false, "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "requires": { "abbrev": "1", @@ -33636,7 +33636,7 @@ "dependencies": { "osenv": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "resolved": false, "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "requires": { "os-homedir": "^1.0.0", @@ -33645,12 +33645,12 @@ "dependencies": { "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" } } @@ -33664,7 +33664,7 @@ }, "normalize-package-data": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", + "resolved": false, "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=", "requires": { "hosted-git-info": "^2.1.4", @@ -33675,7 +33675,7 @@ "dependencies": { "is-builtin-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "resolved": false, "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { "builtin-modules": "^1.0.0" @@ -33683,7 +33683,7 @@ "dependencies": { "builtin-modules": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "resolved": false, "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" } } @@ -33697,6 +33697,7 @@ }, "npm-install-checks": { "version": "3.0.0", + "resolved": false, "integrity": "sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc=", "requires": { "semver": "^2.3.0 || 3.x || 4 || 5" @@ -33704,7 +33705,7 @@ }, "npm-package-arg": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-4.2.1.tgz", + "resolved": false, "integrity": "sha1-WTMD/eqF98Qid18X+et2cPaA4+w=", "requires": { "hosted-git-info": "^2.1.5", @@ -33754,7 +33755,7 @@ }, "npmlog": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz", + "resolved": false, "integrity": "sha1-0DlQ4OeM4VJ7om0qdZLpNIrD518=", "requires": { "are-we-there-yet": "~1.1.2", @@ -33765,7 +33766,7 @@ "dependencies": { "are-we-there-yet": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "resolved": false, "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { "delegates": "^1.0.0", @@ -33774,19 +33775,19 @@ "dependencies": { "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" } } }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { "aproba": "^1.0.3", @@ -33801,17 +33802,17 @@ "dependencies": { "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -33821,12 +33822,12 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" @@ -33834,7 +33835,7 @@ "dependencies": { "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } @@ -33843,7 +33844,7 @@ }, "wide-align": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", + "resolved": false, "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", "requires": { "string-width": "^1.0.1" @@ -33853,7 +33854,7 @@ }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" } } @@ -33943,7 +33944,7 @@ }, "read-package-json": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.5.tgz", + "resolved": false, "integrity": "sha1-+Tpk5kFSnfaKCMZN5GOJ6KP4iEU=", "requires": { "glob": "^7.1.1", @@ -33954,7 +33955,7 @@ "dependencies": { "json-parse-helpfulerror": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "resolved": false, "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", "requires": { "jju": "^1.1.0" @@ -33962,7 +33963,7 @@ "dependencies": { "jju": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz", + "resolved": false, "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=" } } @@ -33971,7 +33972,7 @@ }, "read-package-tree": { "version": "5.1.5", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.1.5.tgz", + "resolved": false, "integrity": "sha1-rOfmOBx2hPlwqqmPx8XStmat2rY=", "requires": { "debuglog": "^1.0.1", @@ -33983,7 +33984,7 @@ }, "readable-stream": { "version": "2.2.9", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "resolved": false, "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", "requires": { "buffer-shims": "~1.0.0", @@ -33997,22 +33998,22 @@ "dependencies": { "buffer-shims": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "resolved": false, "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "process-nextick-args": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "resolved": false, "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "string_decoder": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "resolved": false, "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=", "requires": { "buffer-shims": "~1.0.0" @@ -34020,7 +34021,7 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" } } @@ -34047,7 +34048,7 @@ }, "request": { "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "resolved": false, "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "requires": { "aws-sign2": "~0.6.0", @@ -34076,22 +34077,22 @@ "dependencies": { "aws-sign2": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "resolved": false, "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" }, "aws4": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "resolved": false, "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, "caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "resolved": false, "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "combined-stream": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "resolved": false, "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { "delayed-stream": "~1.0.0" @@ -34099,24 +34100,24 @@ "dependencies": { "delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "resolved": false, "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" } } }, "extend": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "resolved": false, "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" }, "forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "resolved": false, "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz", + "resolved": false, "integrity": "sha1-icNTQAi5fq2ky7FX1Y9vXfAl6uQ=", "requires": { "asynckit": "^0.4.0", @@ -34126,14 +34127,14 @@ "dependencies": { "asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "resolved": false, "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" } } }, "har-validator": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "resolved": false, "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "requires": { "ajv": "^4.9.1", @@ -34142,7 +34143,7 @@ "dependencies": { "ajv": { "version": "4.11.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.4.tgz", + "resolved": false, "integrity": "sha1-6/OlXUsTLqYP9YR66F0u8GmWC0U=", "requires": { "co": "^4.6.0", @@ -34151,12 +34152,12 @@ "dependencies": { "co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "resolved": false, "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "json-stable-stringify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "resolved": false, "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { "jsonify": "~0.0.0" @@ -34164,7 +34165,7 @@ "dependencies": { "jsonify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "resolved": false, "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" } } @@ -34173,14 +34174,14 @@ }, "har-schema": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "resolved": false, "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" } } }, "hawk": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "resolved": false, "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { "boom": "2.x.x", @@ -34191,7 +34192,7 @@ "dependencies": { "boom": { "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "resolved": false, "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { "hoek": "2.x.x" @@ -34199,7 +34200,7 @@ }, "cryptiles": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "resolved": false, "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "requires": { "boom": "2.x.x" @@ -34207,12 +34208,12 @@ }, "hoek": { "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "resolved": false, "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, "sntp": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "resolved": false, "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "requires": { "hoek": "2.x.x" @@ -34222,7 +34223,7 @@ }, "http-signature": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "resolved": false, "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "requires": { "assert-plus": "^0.2.0", @@ -34232,12 +34233,12 @@ "dependencies": { "assert-plus": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "resolved": false, "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" }, "jsprim": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz", + "resolved": false, "integrity": "sha1-KnJW9wQSop7jZwqspiWZTE3P8lI=", "requires": { "extsprintf": "1.0.2", @@ -34247,17 +34248,17 @@ "dependencies": { "extsprintf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "resolved": false, "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" }, "json-schema": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "resolved": false, "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "verror": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "resolved": false, "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", "requires": { "extsprintf": "1.0.2" @@ -34267,7 +34268,7 @@ }, "sshpk": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.11.0.tgz", + "resolved": false, "integrity": "sha1-LY1eu0pvqyj/ujf6YqkPSj6lnXc=", "requires": { "asn1": "~0.2.3", @@ -34283,17 +34284,17 @@ "dependencies": { "asn1": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "resolved": false, "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "resolved": false, "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "bcrypt-pbkdf": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "resolved": false, "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { @@ -34302,7 +34303,7 @@ }, "dashdash": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "resolved": false, "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { "assert-plus": "^1.0.0" @@ -34310,7 +34311,7 @@ }, "ecc-jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "resolved": false, "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { @@ -34319,7 +34320,7 @@ }, "getpass": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", + "resolved": false, "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", "requires": { "assert-plus": "^1.0.0" @@ -34327,7 +34328,7 @@ }, "jodid25519": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "resolved": false, "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", "optional": true, "requires": { @@ -34336,13 +34337,13 @@ }, "jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "resolved": false, "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, "tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "resolved": false, "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true } @@ -34352,22 +34353,22 @@ }, "is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "resolved": false, "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "isstream": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "resolved": false, "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "resolved": false, "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "mime-types": { "version": "2.1.14", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz", + "resolved": false, "integrity": "sha1-9+99l1g/yvO30oK2+LVnnaselO4=", "requires": { "mime-db": "~1.26.0" @@ -34375,39 +34376,39 @@ "dependencies": { "mime-db": { "version": "1.26.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz", + "resolved": false, "integrity": "sha1-6v/NDk/Gk1z4E02iRuLmw1MFrf8=" } } }, "oauth-sign": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "resolved": false, "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "performance-now": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "resolved": false, "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" }, "qs": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "resolved": false, "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" }, "safe-buffer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "resolved": false, "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" }, "stringstream": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "resolved": false, "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "tough-cookie": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "resolved": false, "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", "requires": { "punycode": "^1.4.1" @@ -34415,14 +34416,14 @@ "dependencies": { "punycode": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "resolved": false, "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" } } }, "tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "resolved": false, "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { "safe-buffer": "^5.0.1" @@ -34432,12 +34433,12 @@ }, "retry": { "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "resolved": false, "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" }, "rimraf": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "resolved": false, "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "requires": { "glob": "^7.0.5" @@ -34445,7 +34446,7 @@ }, "semver": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "resolved": false, "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" }, "sha": { @@ -34537,7 +34538,7 @@ }, "tar": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "resolved": false, "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { "block-stream": "*", @@ -34547,7 +34548,7 @@ "dependencies": { "block-stream": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz", + "resolved": false, "integrity": "sha1-Boj0baK7+c/wxPaCJaDLlcvopGs=", "requires": { "inherits": "~2.0.0" @@ -34595,7 +34596,7 @@ }, "update-notifier": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.1.0.tgz", + "resolved": false, "integrity": "sha1-7AweU1NrdmR6JLd8uDlm2TFRI9k=", "requires": { "boxen": "^1.0.0", @@ -34610,7 +34611,7 @@ "dependencies": { "boxen": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.0.0.tgz", + "resolved": false, "integrity": "sha1-smlLrx9gX3CP8Bd8Ehk7IvKaqqs=", "requires": { "ansi-align": "^1.1.0", @@ -34624,7 +34625,7 @@ "dependencies": { "ansi-align": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", + "resolved": false, "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=", "requires": { "string-width": "^1.0.1" @@ -34632,7 +34633,7 @@ "dependencies": { "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -34642,12 +34643,12 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" @@ -34655,7 +34656,7 @@ "dependencies": { "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } @@ -34666,17 +34667,17 @@ }, "camelcase": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.0.0.tgz", + "resolved": false, "integrity": "sha1-iw+Q1Evl4oG5A7mIc0m5JZXvB/I=" }, "cli-boxes": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "resolved": false, "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "string-width": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "resolved": false, "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -34685,14 +34686,14 @@ "dependencies": { "is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "resolved": false, "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" } } }, "term-size": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-0.1.1.tgz", + "resolved": false, "integrity": "sha1-hzYLljlsq1dgljcUzaDQy+7K2co=", "requires": { "execa": "^0.4.0" @@ -34700,7 +34701,7 @@ "dependencies": { "execa": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz", + "resolved": false, "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=", "requires": { "cross-spawn-async": "^2.1.1", @@ -34713,7 +34714,7 @@ "dependencies": { "cross-spawn-async": { "version": "2.2.5", - "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", + "resolved": false, "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=", "requires": { "lru-cache": "^4.0.0", @@ -34722,7 +34723,7 @@ "dependencies": { "lru-cache": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "resolved": false, "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", "requires": { "pseudomap": "^1.0.1", @@ -34731,12 +34732,12 @@ "dependencies": { "pseudomap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "resolved": false, "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "yallist": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", + "resolved": false, "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=" } } @@ -34745,12 +34746,12 @@ }, "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "resolved": false, "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "npm-run-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", + "resolved": false, "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=", "requires": { "path-key": "^1.0.0" @@ -34758,17 +34759,17 @@ }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "path-key": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", + "resolved": false, "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=" }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": false, "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" } } @@ -34777,7 +34778,7 @@ }, "widest-line": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "resolved": false, "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", "requires": { "string-width": "^1.0.1" @@ -34785,7 +34786,7 @@ "dependencies": { "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -34795,12 +34796,12 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" @@ -34808,7 +34809,7 @@ "dependencies": { "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } @@ -34821,7 +34822,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": false, "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { "ansi-styles": "^2.2.1", @@ -34833,17 +34834,17 @@ "dependencies": { "ansi-styles": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "resolved": false, "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "resolved": false, "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "has-ansi": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "resolved": false, "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { "ansi-regex": "^2.0.0" @@ -34851,14 +34852,14 @@ }, "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": false, "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, "configstore": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.0.0.tgz", + "resolved": false, "integrity": "sha1-4bhmnBgDzMULVF6S+ObnmqgOAZY=", "requires": { "dot-prop": "^4.1.0", @@ -34871,7 +34872,7 @@ "dependencies": { "dot-prop": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", + "resolved": false, "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=", "requires": { "is-obj": "^1.0.0" @@ -34879,14 +34880,14 @@ "dependencies": { "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": false, "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" } } }, "unique-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "resolved": false, "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { "crypto-random-string": "^1.0.0" @@ -34894,7 +34895,7 @@ "dependencies": { "crypto-random-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "resolved": false, "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" } } @@ -34903,12 +34904,12 @@ }, "is-npm": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "resolved": false, "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "latest-version": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.0.0.tgz", + "resolved": false, "integrity": "sha1-MQTwCMDDkQhBB/haNEvGHjiXBkk=", "requires": { "package-json": "^3.0.0" @@ -34916,7 +34917,7 @@ "dependencies": { "package-json": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-3.1.0.tgz", + "resolved": false, "integrity": "sha1-zigZAP6AUhUMxnCcbABsGP2y83k=", "requires": { "got": "^6.7.1", @@ -34927,7 +34928,7 @@ "dependencies": { "got": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": false, "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "requires": { "create-error-class": "^3.0.0", @@ -34945,7 +34946,7 @@ "dependencies": { "create-error-class": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "resolved": false, "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { "capture-stack-trace": "^1.0.0" @@ -34953,59 +34954,59 @@ "dependencies": { "capture-stack-trace": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "resolved": false, "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" } } }, "duplexer3": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "resolved": false, "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": false, "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "is-redirect": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "resolved": false, "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-retry-allowed": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "resolved": false, "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "resolved": false, "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "lowercase-keys": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "resolved": false, "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, "safe-buffer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "resolved": false, "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" }, "timed-out": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "resolved": false, "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "unzip-response": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "resolved": false, "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" }, "url-parse-lax": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "resolved": false, "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { "prepend-http": "^1.0.1" @@ -35013,7 +35014,7 @@ "dependencies": { "prepend-http": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "resolved": false, "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" } } @@ -35022,7 +35023,7 @@ }, "registry-auth-token": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.1.0.tgz", + "resolved": false, "integrity": "sha1-mXwIJW4MeZmDe5DpRNs52KeQJ2s=", "requires": { "rc": "^1.1.6" @@ -35030,7 +35031,7 @@ "dependencies": { "rc": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.7.tgz", + "resolved": false, "integrity": "sha1-xepWS7B6/5/TpbMukGwdOmWUD+o=", "requires": { "deep-extend": "~0.4.0", @@ -35041,17 +35042,17 @@ "dependencies": { "deep-extend": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", + "resolved": false, "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=" }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": false, "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" } } @@ -35060,7 +35061,7 @@ }, "registry-url": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "resolved": false, "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { "rc": "^1.0.1" @@ -35068,7 +35069,7 @@ "dependencies": { "rc": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.7.tgz", + "resolved": false, "integrity": "sha1-xepWS7B6/5/TpbMukGwdOmWUD+o=", "requires": { "deep-extend": "~0.4.0", @@ -35079,17 +35080,17 @@ "dependencies": { "deep-extend": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", + "resolved": false, "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=" }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": false, "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" } } @@ -35102,12 +35103,12 @@ }, "lazy-req": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-2.0.0.tgz", + "resolved": false, "integrity": "sha1-yUUKNj7N2i5vDHATKtTzf48G8rQ=" }, "semver-diff": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "resolved": false, "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { "semver": "^5.0.3" @@ -35115,14 +35116,14 @@ }, "xdg-basedir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "resolved": false, "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" } } }, "uuid": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "resolved": false, "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" }, "validate-npm-package-license": { @@ -35184,7 +35185,7 @@ }, "which": { "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "resolved": false, "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", "requires": { "isexe": "^2.0.0" @@ -35192,7 +35193,7 @@ "dependencies": { "isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "resolved": false, "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" } } @@ -35204,7 +35205,7 @@ }, "write-file-atomic": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.3.tgz", + "resolved": false, "integrity": "sha1-gx3SLUkb3BNRgLuZag6z+L9Yd5E=", "requires": { "graceful-fs": "^4.1.11", @@ -35358,7 +35359,7 @@ }, "cross-spawn": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "resolved": false, "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { @@ -35375,7 +35376,7 @@ }, "execa": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "resolved": false, "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { @@ -35405,19 +35406,19 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": false, "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, "invert-kv": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "resolved": false, "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { @@ -35426,7 +35427,7 @@ }, "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "resolved": false, "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, @@ -35438,7 +35439,7 @@ }, "lcid": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "resolved": false, "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { @@ -35457,7 +35458,7 @@ }, "lru-cache": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "resolved": false, "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { @@ -35467,7 +35468,7 @@ }, "mem": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "resolved": false, "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { @@ -35476,7 +35477,7 @@ }, "mimic-fn": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "resolved": false, "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", "dev": true }, @@ -35512,7 +35513,7 @@ }, "os-locale": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "resolved": false, "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { @@ -35652,19 +35653,19 @@ }, "y18n": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "resolved": false, "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, "yallist": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "resolved": false, "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, "yargs": { "version": "10.0.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.0.3.tgz", + "resolved": false, "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==", "dev": true, "requires": { @@ -35684,13 +35685,13 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "resolved": false, "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "cliui": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "resolved": false, "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { @@ -35701,7 +35702,7 @@ "dependencies": { "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { @@ -35714,7 +35715,7 @@ }, "string-width": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "resolved": false, "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { @@ -35724,13 +35725,13 @@ "dependencies": { "is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "resolved": false, "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "resolved": false, "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { @@ -35743,7 +35744,7 @@ }, "yargs-parser": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.0.0.tgz", + "resolved": false, "integrity": "sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY=", "dev": true, "requires": { @@ -35752,7 +35753,7 @@ "dependencies": { "camelcase": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "resolved": false, "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true } @@ -36150,7 +36151,7 @@ }, "debug": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "resolved": false, "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { @@ -36239,7 +36240,7 @@ }, "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "resolved": false, "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { @@ -36392,7 +36393,7 @@ }, "istanbul-lib-coverage": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "resolved": false, "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", "dev": true }, @@ -36436,7 +36437,7 @@ }, "istanbul-lib-report": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz", + "resolved": false, "integrity": "sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA==", "dev": true, "requires": { @@ -36447,7 +36448,7 @@ "dependencies": { "supports-color": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "resolved": false, "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { @@ -36458,7 +36459,7 @@ }, "istanbul-lib-source-maps": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz", + "resolved": false, "integrity": "sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ==", "dev": true, "requires": { @@ -36471,7 +36472,7 @@ "dependencies": { "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "resolved": false, "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } @@ -36479,7 +36480,7 @@ }, "istanbul-reports": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.1.1.tgz", + "resolved": false, "integrity": "sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw==", "dev": true, "requires": { @@ -36515,7 +36516,7 @@ }, "locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "resolved": false, "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { @@ -36547,7 +36548,7 @@ }, "make-dir": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "resolved": false, "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { @@ -36576,7 +36577,7 @@ }, "merge-source-map": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "resolved": false, "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, "requires": { @@ -36585,7 +36586,7 @@ "dependencies": { "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "resolved": false, "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } @@ -36724,7 +36725,7 @@ }, "p-limit": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "resolved": false, "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { @@ -36733,7 +36734,7 @@ }, "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "resolved": false, "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { @@ -36742,7 +36743,7 @@ }, "p-try": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "resolved": false, "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, @@ -36834,7 +36835,7 @@ }, "read-pkg": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "resolved": false, "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { @@ -36845,7 +36846,7 @@ }, "read-pkg-up": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "resolved": false, "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "requires": { @@ -36885,7 +36886,7 @@ }, "resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "resolved": false, "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, @@ -37016,7 +37017,7 @@ }, "test-exclude": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.1.0.tgz", + "resolved": false, "integrity": "sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA==", "dev": true, "requires": { diff --git a/package.json b/package.json index a9dae90818..b6d99a91d7 100644 --- a/package.json +++ b/package.json @@ -142,13 +142,13 @@ "@ethereumjs/tx": "^3.3.2", "@ethereumjs/vm": "^5.5.3", "@monaco-editor/react": "^4.3.1", - "@remixproject/engine": "next", - "@remixproject/engine-web": "next", - "@remixproject/plugin": "next", - "@remixproject/plugin-api": "next", - "@remixproject/plugin-utils": "next", - "@remixproject/plugin-webview": "next", - "@remixproject/plugin-ws": "next", + "@remixproject/engine": "^0.3.24", + "@remixproject/engine-web": "^0.3.24", + "@remixproject/plugin": "^0.3.24", + "@remixproject/plugin-api": "^0.3.24", + "@remixproject/plugin-utils": "^0.3.24", + "@remixproject/plugin-webview": "^0.3.24", + "@remixproject/plugin-ws": "^0.3.24", "ansi-gray": "^0.1.1", "async": "^2.6.2", "axios": ">=0.21.1", From 5128080ea9c92d75e22e2a6aa23f4d95db26e386 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 29 Oct 2021 13:33:45 +0200 Subject: [PATCH 49/51] comments on the method --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index e04be05787..1a832ea945 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -91,6 +91,17 @@ const checkForAcceptAndRemember = async function (browser: NightwatchBrowser) { }) } +/** + * performs an action on the test local plugin calling a method on a plugin + * + * @param {NightwatchBrowser} browser + * @param {string} buttonText the button which needs to be clicked formatted as pluginname:methodname, ie 'fileManager:writeFile' + * @param {any} methodResult can be a string expected or an object. it is the result of the method called. strings are evaluated as part of the result, an object should be exactly the result + * @param {any} eventResult can be a string expected or an object. it is the event generated by the method called. strings are evaluated as part of the result, an object should be exactly the result + * @param {any} payload can be a string expected or an object. it is the payload passed to the call + * @return {Promise} + */ + const clickAndCheckLog = async (browser: NightwatchBrowser, buttonText: string, methodResult: any, eventResult: any, payload: any) => { if (payload) { await setPayload(browser, payload) From 11e10d102a113137288580fd725952b6bdb98db4 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 29 Oct 2021 13:36:13 +0200 Subject: [PATCH 50/51] update comment --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 1a832ea945..9eae1f8c4f 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -23,6 +23,7 @@ const getBrowserLogs = async function (browser: NightwatchBrowser) { } }) } + const debugValues = async function (browser: NightwatchBrowser, field: string, expected: any) { return new Promise((resolve) => { if (!expected) { @@ -96,8 +97,8 @@ const checkForAcceptAndRemember = async function (browser: NightwatchBrowser) { * * @param {NightwatchBrowser} browser * @param {string} buttonText the button which needs to be clicked formatted as pluginname:methodname, ie 'fileManager:writeFile' - * @param {any} methodResult can be a string expected or an object. it is the result of the method called. strings are evaluated as part of the result, an object should be exactly the result - * @param {any} eventResult can be a string expected or an object. it is the event generated by the method called. strings are evaluated as part of the result, an object should be exactly the result + * @param {any} methodResult can be a string expected or an object. it is the result of the method called. + * @param {any} eventResult can be a string expected or an object. it is the event generated by the method called. * @param {any} payload can be a string expected or an object. it is the payload passed to the call * @return {Promise} */ From fb3fbc88b6e8cc98e650ee8d08e6a65fcb6de51c Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 29 Oct 2021 13:57:09 +0200 Subject: [PATCH 51/51] Update index.html --- apps/remix-ide-e2e/src/local-plugin/src/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/local-plugin/src/index.html b/apps/remix-ide-e2e/src/local-plugin/src/index.html index a263a933db..b1a45c177c 100644 --- a/apps/remix-ide-e2e/src/local-plugin/src/index.html +++ b/apps/remix-ide-e2e/src/local-plugin/src/index.html @@ -3,7 +3,7 @@ - Remix Plugin API Testser + Remix Plugin API Tester