From 51f6d22d5152152f1ef98f09e2801e978d4db0f5 Mon Sep 17 00:00:00 2001 From: Aniket <30843294+Aniket-Engg@users.noreply.github.com> Date: Tue, 21 Dec 2021 23:00:55 +0530 Subject: [PATCH 01/43] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 57cf2b34b4..b8f700f796 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ git clone https://github.com/ethereum/remix-project.git ```bash cd remix-project npm install +npm run build:libs // Build remix libs nx build nx serve ``` From b53591f99daaca7103d1955e3bf5b68e07ca101b Mon Sep 17 00:00:00 2001 From: Josel95 Date: Tue, 16 Nov 2021 13:29:16 -0300 Subject: [PATCH 02/43] terminal dragging refactor --- .../src/lib/custom-hooks/useDragTerminal.tsx | 67 +++++++++++++ .../terminal/src/lib/remix-ui-terminal.tsx | 95 ++++++------------- 2 files changed, 97 insertions(+), 65 deletions(-) create mode 100644 libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx diff --git a/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx b/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx new file mode 100644 index 0000000000..4a269d4d31 --- /dev/null +++ b/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx @@ -0,0 +1,67 @@ +import { useEffect, useState } from 'react' + +export const useDragTerminal = (offsetHeight: number) => { + const [isOpen, setIsOpen] = useState(true) + const [lastYPosition, setLastYPosition] = useState(0) + const [terminalPosition, setTerminalPosition] = useState(offsetHeight) + const [isDragging, setIsDragging] = useState(false) + + const handleDraggingStart = (event: React.MouseEvent) => { + setLastYPosition(event.clientY) + setIsDragging(true) + } + + const handleDragging = (event: MouseEvent) => { + event.preventDefault() + + if (isDragging) { + const mouseYPosition = event.clientY + const difference = lastYPosition - mouseYPosition + const newTerminalPosition = terminalPosition + difference + setTerminalPosition(newTerminalPosition) + setLastYPosition(mouseYPosition) + } + } + + const handleDraggingEnd = () => { + if(!isDragging) return + + setIsDragging(false) + + // Check terminal position to determine if it should be open or closed + setIsOpen(terminalPosition > offsetHeight) + } + + const handleToggleTerminal = (event: React.MouseEvent) => { + event.preventDefault() + event.stopPropagation() + + setIsOpen(!isOpen) + } + + // Add event listeners for dragging + useEffect(() => { + document.addEventListener('mousemove', handleDragging) + document.addEventListener('mouseup', handleDraggingEnd) + + return () => { + document.removeEventListener('mousemove', handleDragging) + document.removeEventListener('mouseup', handleDraggingEnd) + } + }, [handleDragging, handleDraggingEnd]) + + // Reset terminal position + useEffect(() => { + if(!terminalPosition){ + setTerminalPosition(offsetHeight) + } + }, [terminalPosition, setTerminalPosition]) + + return { + isOpen, + terminalPosition, + isDragging, + handleDraggingStart, + handleToggleTerminal, + } +} \ No newline at end of file diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx index 6225e4f50e..54c10f39c5 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx @@ -17,6 +17,7 @@ import RenderKnownTransactions from './components/RenderKnownTransactions' // es import parse from 'html-react-parser' import { EMPTY_BLOCK, KNOWN_TRANSACTION, RemixUiTerminalProps, UNKNOWN_TRANSACTION } from './types/terminalTypes' import { wrapScript } from './utils/wrapScript' +import { useDragTerminal } from './custom-hooks/useDragTerminal' /* eslint-disable-next-line */ export interface ClipboardEvent extends SyntheticEvent { @@ -25,13 +26,8 @@ export interface ClipboardEvent extends SyntheticEvent { export const RemixUiTerminal = (props: RemixUiTerminalProps) => { const { call, _deps, on, config, event, gistHandler, version } = props.plugin - const [toggleDownUp, setToggleDownUp] = useState('fa-angle-double-down') const [_cmdIndex, setCmdIndex] = useState(-1) const [_cmdTemp, setCmdTemp] = useState('') - // dragable state - const [leftHeight, setLeftHeight] = useState(undefined) - const [separatorYPosition, setSeparatorYPosition] = useState(undefined) - const [dragging, setDragging] = useState(false) const [newstate, dispatch] = useReducer(registerCommandReducer, initialState) const [cmdHistory, cmdHistoryDispatch] = useReducer(addCommandHistoryReducer, initialState) @@ -78,6 +74,30 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { // terminal dragable const leftRef = useRef(null) const panelRef = useRef(null) + const terminalMenu = useRef(null) + + const { + isOpen, + isDragging, + terminalPosition, + handleDraggingStart, + handleToggleTerminal + } = useDragTerminal((terminalMenu.current && terminalMenu.current.offsetHeight) || 0) + + // Check open state + useEffect(() => { + const resizeValue = isOpen ? [config.get('terminal-top-offset')] : [] + event.trigger('resize', resizeValue) + }, [isOpen]) + + useEffect(() => { + leftRef.current.style.backgroundColor = isDragging ? '#007AA6' : '' + leftRef.current.style.border = isDragging ? '2px solid #007AA6' : '' + }, [isDragging]) + + useEffect(() => { + event.trigger('resize', [terminalPosition + 32]) + } , [terminalPosition]) const scrollToBottom = () => { messagesEndRef.current.scrollIntoView({ behavior: 'smooth' }) @@ -193,18 +213,8 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { } } - const handleMinimizeTerminal = (e) => { - e.preventDefault() - e.stopPropagation() - if (toggleDownUp === 'fa-angle-double-down') { - setToggleDownUp('fa-angle-double-up') - event.trigger('resize', []) - } else { - const terminalTopOffset = config.get('terminal-top-offset') - event.trigger('resize', [terminalTopOffset]) - setToggleDownUp('fa-angle-double-down') - } - } + + const focusinput = () => { inputEl.current.focus() @@ -277,51 +287,6 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { } } - /* start of mouse events */ - - const mousedown = (event: MouseEvent) => { - setSeparatorYPosition(event.clientY) - setDragging(true) - } - - const onMouseMove: any = (e: MouseEvent) => { - e.preventDefault() - if (dragging && leftHeight && separatorYPosition) { - const newLeftHeight = leftHeight + separatorYPosition - e.clientY - setSeparatorYPosition(e.clientY) - setLeftHeight(newLeftHeight) - event.trigger('resize', [newLeftHeight + 32]) - } - } - - const onMouseUp = () => { - leftRef.current.style.backgroundColor = '' - leftRef.current.style.border = '' - setDragging(false) - } - - /* end of mouse event */ - - useEffect(() => { - document.addEventListener('mousemove', onMouseMove) - document.addEventListener('mouseup', onMouseUp) - - return () => { - document.removeEventListener('mousemove', onMouseMove) - document.removeEventListener('mouseup', onMouseUp) - } - }, [onMouseMove, onMouseUp]) - - React.useEffect(() => { - if (panelRef) { - if (!leftHeight) { - setLeftHeight(panelRef.current.offsetHeight) - return - } - panelRef.current.style.height = `${leftHeight}px` - } - }, [leftHeight, setLeftHeight, panelRef]) - /* block contents that gets rendered from scriptRunner */ const _blocksRenderer = (mode) => { @@ -463,9 +428,9 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { return (
-
-
- +
+
+
From cc5a763083f2efa5f34d32c89d8cfe6c47d53122 Mon Sep 17 00:00:00 2001 From: Josel95 Date: Tue, 16 Nov 2021 13:39:27 -0300 Subject: [PATCH 03/43] fixed bug when scrolling terminal when is closed --- .../terminal/src/lib/custom-hooks/useDragTerminal.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx b/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx index 4a269d4d31..89d24f6f19 100644 --- a/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx +++ b/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx @@ -4,6 +4,8 @@ export const useDragTerminal = (offsetHeight: number) => { const [isOpen, setIsOpen] = useState(true) const [lastYPosition, setLastYPosition] = useState(0) const [terminalPosition, setTerminalPosition] = useState(offsetHeight) + // Used to save position of the terminal when it is closed + const [lastTerminalPosition, setLastTerminalPosition] = useState(offsetHeight) const [isDragging, setIsDragging] = useState(false) const handleDraggingStart = (event: React.MouseEvent) => { @@ -36,6 +38,14 @@ export const useDragTerminal = (offsetHeight: number) => { event.preventDefault() event.stopPropagation() + if(isOpen) { + setLastTerminalPosition(terminalPosition) + setLastYPosition(0) + setTerminalPosition(offsetHeight) + } else { + setTerminalPosition(lastTerminalPosition) + } + setIsOpen(!isOpen) } From ce5552b7676798852a1915b9cc33127aab17c14c Mon Sep 17 00:00:00 2001 From: Josel95 Date: Tue, 16 Nov 2021 13:45:03 -0300 Subject: [PATCH 04/43] get saved terminal position --- .../src/lib/custom-hooks/useDragTerminal.tsx | 16 ++++++++-------- .../terminal/src/lib/remix-ui-terminal.tsx | 7 +++++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx b/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx index 89d24f6f19..cdd4f6dc6a 100644 --- a/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx +++ b/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx @@ -1,11 +1,11 @@ import { useEffect, useState } from 'react' -export const useDragTerminal = (offsetHeight: number) => { - const [isOpen, setIsOpen] = useState(true) +export const useDragTerminal = (minHeight: number, defaultPosition: number) => { + const [isOpen, setIsOpen] = useState(defaultPosition > minHeight) const [lastYPosition, setLastYPosition] = useState(0) - const [terminalPosition, setTerminalPosition] = useState(offsetHeight) + const [terminalPosition, setTerminalPosition] = useState(defaultPosition) // Used to save position of the terminal when it is closed - const [lastTerminalPosition, setLastTerminalPosition] = useState(offsetHeight) + const [lastTerminalPosition, setLastTerminalPosition] = useState(defaultPosition) const [isDragging, setIsDragging] = useState(false) const handleDraggingStart = (event: React.MouseEvent) => { @@ -31,7 +31,7 @@ export const useDragTerminal = (offsetHeight: number) => { setIsDragging(false) // Check terminal position to determine if it should be open or closed - setIsOpen(terminalPosition > offsetHeight) + setIsOpen(terminalPosition > minHeight) } const handleToggleTerminal = (event: React.MouseEvent) => { @@ -41,9 +41,9 @@ export const useDragTerminal = (offsetHeight: number) => { if(isOpen) { setLastTerminalPosition(terminalPosition) setLastYPosition(0) - setTerminalPosition(offsetHeight) + setTerminalPosition(minHeight) } else { - setTerminalPosition(lastTerminalPosition) + setTerminalPosition(lastTerminalPosition <= minHeight ? 323 : lastTerminalPosition) } setIsOpen(!isOpen) @@ -63,7 +63,7 @@ export const useDragTerminal = (offsetHeight: number) => { // Reset terminal position useEffect(() => { if(!terminalPosition){ - setTerminalPosition(offsetHeight) + setTerminalPosition(defaultPosition) } }, [terminalPosition, setTerminalPosition]) diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx index 54c10f39c5..5c3cd54c33 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx @@ -76,13 +76,16 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { const panelRef = useRef(null) const terminalMenu = useRef(null) + const terminalMenuOffsetHeight = (terminalMenu.current && terminalMenu.current.offsetHeight) || 35 + const terminalDefaultPosition = config.get('terminal-top-offset') + const { isOpen, isDragging, terminalPosition, handleDraggingStart, handleToggleTerminal - } = useDragTerminal((terminalMenu.current && terminalMenu.current.offsetHeight) || 0) + } = useDragTerminal(terminalMenuOffsetHeight, terminalDefaultPosition) // Check open state useEffect(() => { @@ -96,7 +99,7 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { }, [isDragging]) useEffect(() => { - event.trigger('resize', [terminalPosition + 32]) + event.trigger('resize', [terminalPosition]) } , [terminalPosition]) const scrollToBottom = () => { From a6cab250d648127ca34cf395dbd338cc0649d602 Mon Sep 17 00:00:00 2001 From: Josel95 Date: Thu, 25 Nov 2021 08:29:20 -0300 Subject: [PATCH 05/43] changed terminal dragbar styles --- libs/remix-ui/terminal/src/lib/remix-ui-terminal.css | 5 +++++ libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx | 7 +------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.css b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.css index ca50eee4dc..74b88d8b76 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.css +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.css @@ -151,6 +151,11 @@ element.style { cursor : row-resize; z-index : 999; } + + .dragbarDragging { + background-color: var(--primary); + border: 2px solid var(--primary); + } .console { cursor : pointer; diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx index 5c3cd54c33..420ec850bf 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx @@ -93,11 +93,6 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { event.trigger('resize', resizeValue) }, [isOpen]) - useEffect(() => { - leftRef.current.style.backgroundColor = isDragging ? '#007AA6' : '' - leftRef.current.style.border = isDragging ? '2px solid #007AA6' : '' - }, [isDragging]) - useEffect(() => { event.trigger('resize', [terminalPosition]) } , [terminalPosition]) @@ -431,7 +426,7 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { return (
-
+
From b53a178e6970801be6c5bf71691749a7f9d64a67 Mon Sep 17 00:00:00 2001 From: lianahus Date: Fri, 17 Dec 2021 11:02:49 +0100 Subject: [PATCH 06/43] creating the remix-ui-home-tab lib --- nx.json | 3 +++ tsconfig.base.json | 1 + workspace.json | 17 +++++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/nx.json b/nx.json index 89415d9af6..8bc14e4e9d 100644 --- a/nx.json +++ b/nx.json @@ -139,6 +139,9 @@ "remix-ui-vertical-icons-panel": { "tags": [] }, + "remix-ui-home-tab": { + "tags": [] + }, "remix-ui-tabs": { "tags": [] }, diff --git a/tsconfig.base.json b/tsconfig.base.json index a0aa90a641..fcb8955cab 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -65,6 +65,7 @@ "@remix-ui/terminal": ["libs/remix-ui/terminal/src/index.ts"], "@remix-ui/plugin-manager": ["libs/remix-ui/plugin-manager/src/index.ts"], "@remix-ui/editor": ["libs/remix-ui/editor/src/index.ts"], + "@remix-project/remix-ui/home-tab": ["libs/remix-ui/home-tab/src/index.ts"], "@remix-ui/tabs": ["libs/remix-ui/tabs/src/index.ts"], "@remix-ui/helper": ["libs/remix-ui/helper/src/index.ts"], "@remix-ui/app": ["libs/remix-ui/app/src/index.ts"], diff --git a/workspace.json b/workspace.json index a6845d74a1..8ce5f9f9ce 100644 --- a/workspace.json +++ b/workspace.json @@ -1007,6 +1007,23 @@ } } }, + "remix-ui-home-tab": { + "root": "libs/remix-ui/home-tab", + "sourceRoot": "libs/remix-ui/home-tab/src", + "projectType": "library", + "schematics": {}, + "architect": { + "lint": { + "builder": "@nrwl/linter:lint", + "options": { + "linter": "eslint", + "tsConfig": ["libs/remix-ui/home-tab/tsconfig.lib.json"], + "exclude": ["**/node_modules/**", "!libs/remix-ui/home-tab/**/*"] + } + + } + } + }, "remix-ui-editor": { "root": "libs/remix-ui/editor", "sourceRoot": "libs/remix-ui/editor/src", From 7b2ec3491ed696c4941e2333b19098752499add4 Mon Sep 17 00:00:00 2001 From: lianahus Date: Thu, 16 Sep 2021 18:58:27 +0200 Subject: [PATCH 07/43] home-tab react lib added --- .../src/app/ui/landing-page/landing-page.js | 573 +----------------- apps/remix-ide/src/assets/img/solhintLogo.png | Bin 3400 -> 0 bytes .../remix-ide/src/assets/img/solhintLogo.webp | Bin 0 -> 1584 bytes libs/remix-ui/home-tab/.babelrc | 4 + libs/remix-ui/home-tab/.eslintrc | 248 ++++++++ libs/remix-ui/home-tab/README.md | 7 + libs/remix-ui/home-tab/src/index.ts | 1 + .../src/lib/components/pluginButton.tsx | 27 + .../home-tab/src/lib/remix-ui-home-tab.css | 86 +++ .../home-tab/src/lib/remix-ui-home-tab.tsx | 278 +++++++++ .../home-tab/src/lib/themeContext.tsx | 16 + libs/remix-ui/home-tab/tsconfig.json | 16 + libs/remix-ui/home-tab/tsconfig.lib.json | 13 + 13 files changed, 718 insertions(+), 551 deletions(-) delete mode 100644 apps/remix-ide/src/assets/img/solhintLogo.png create mode 100644 apps/remix-ide/src/assets/img/solhintLogo.webp create mode 100644 libs/remix-ui/home-tab/.babelrc create mode 100644 libs/remix-ui/home-tab/.eslintrc create mode 100644 libs/remix-ui/home-tab/README.md create mode 100644 libs/remix-ui/home-tab/src/index.ts create mode 100644 libs/remix-ui/home-tab/src/lib/components/pluginButton.tsx create mode 100644 libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css create mode 100644 libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx create mode 100644 libs/remix-ui/home-tab/src/lib/themeContext.tsx create mode 100644 libs/remix-ui/home-tab/tsconfig.json create mode 100644 libs/remix-ui/home-tab/tsconfig.lib.json diff --git a/apps/remix-ide/src/app/ui/landing-page/landing-page.js b/apps/remix-ide/src/app/ui/landing-page/landing-page.js index 744b5c988b..bd66f66054 100644 --- a/apps/remix-ide/src/app/ui/landing-page/landing-page.js +++ b/apps/remix-ide/src/app/ui/landing-page/landing-page.js @@ -1,110 +1,14 @@ +/* global */ +import React from 'react' // eslint-disable-line +import ReactDOM from 'react-dom' import * as packageJson from '../../../../../../package.json' import { ViewPlugin } from '@remixproject/engine-web' -import { migrateToWorkspace } from '../../../migrateFileSystem' -import JSZip from 'jszip' +import { RemixUiHomeTab } from '@remix-ui/home-tab' // eslint-disable-line +import { id } from '@ethersproject/hash' const yo = require('yo-yo') -const csjs = require('csjs-inject') const globalRegistry = require('../../../global/registry') -const modalDialogCustom = require('../modal-dialog-custom') -const modalDialog = require('../modaldialog') -const tooltip = require('../tooltip') const GistHandler = require('../../../lib/gist-handler') -const QueryParams = require('../../../lib/query-params.js') -const _paq = window._paq = window._paq || [] - -const css = csjs` - .text { - cursor: pointer; - font-weight: normal; - max-width: 300px; - user-select: none; - } - .text:hover { - cursor: pointer; - text-decoration: underline; - } - .homeContainer { - user-select: none; - overflow-y: hidden; - } - .mainContent { - overflow-y: auto; - flex-grow: 3; - } - .hpLogoContainer { - margin: 30px; - padding-right: 90px; - } - .mediaBadge { - font-size: 2em; - height: 2em; - width: 2em; - } - .mediaBadge:focus { - outline: none; - } - .image { - height: 1em; - width: 1em; - text-align: center; - } - .logoImg { - height: 10em; - } - .hpSections { - } - .rightPanel { - right: 0; - position: absolute; - z-index: 3; - } - .remixHomeMedia { - overflow-y: auto; - overflow-x: hidden; - max-height: 720px; - } - .panels { - box-shadow: 0px 0px 13px -7px; - } - .labelIt { - margin-bottom: 0; - } - .bigLabelSize { - font-size: 13px; - } - .seeAll { - margin-top: 7px; - white-space: nowrap; - } - .importFrom p { - margin-right: 10px; - } - .logoContainer img{ - height: 150px; - opacity: 0.7; - } - .envLogo { - height: 16px; - } - .cursorStyle { - cursor: pointer; - } - .envButton { - width: 120px; - height: 70px; - } - .media { - overflow: hidden; - width: 400px; - transition: .5s ease-out; - z-index: 1000; - } - .migrationBtn { - width: 100px; - } -} -` const profile = { name: 'home', @@ -116,7 +20,6 @@ const profile = { location: 'mainPanel', version: packageJson.version } - export class LandingPage extends ViewPlugin { constructor (appManager, verticalIcons, fileManager, filePanel, contentImport) { super(profile) @@ -127,459 +30,27 @@ export class LandingPage extends ViewPlugin { this.appManager = appManager this.verticalIcons = verticalIcons this.gistHandler = new GistHandler() - const themeQuality = globalRegistry.get('themeModule').api.currentTheme().quality - window.addEventListener('resize', () => this.adjustMediaPanel()) - window.addEventListener('click', (e) => this.hideMediaPanel(e)) - this.twitterFrame = yo` -
- - -
- ` - this.badgeTwitter = yo`` - this.badgeMedium = yo`` - this.twitterPanel = yo` -
- ${this.twitterFrame} -
- ` - this.mediumPanel = yo` -
-
-
--
-
-
- ` - this.adjustMediaPanel() - globalRegistry.get('themeModule').api.events.on('themeChanged', (theme) => { - this.onThemeChanged(theme.quality) - }) - } - - adjustMediaPanel () { - this.twitterPanel.style.maxHeight = Math.max(window.innerHeight - 150, 200) + 'px' - this.mediumPanel.style.maxHeight = Math.max(window.innerHeight - 150, 200) + 'px' - } - - hideMediaPanel (e) { - const mediaPanelsTitle = document.getElementById('remixIDEMediaPanelsTitle') - const mediaPanels = document.getElementById('remixIDEMediaPanels') - if (!mediaPanelsTitle || !mediaPanels) return - if (!mediaPanelsTitle.contains(e.target) && !mediaPanels.contains(e.target)) { - this.mediumPanel.classList.remove('d-block') - this.mediumPanel.classList.add('d-none') - this.twitterPanel.classList.remove('d-block') - this.twitterPanel.classList.add('d-none') - } - } - - onThemeChanged (themeQuality) { - const twitterFrame = yo` -
- - -
- ` - yo.update(this.twitterFrame, twitterFrame) - - const invertNum = (themeQuality === 'dark') ? 1 : 0 - if (this.solEnv.getElementsByTagName('img')[0]) this.solEnv.getElementsByTagName('img')[0].style.filter = `invert(${invertNum})` - if (this.optimismEnv.getElementsByTagName('img')[0]) this.optimismEnv.getElementsByTagName('img')[0].style.filter = `invert(${invertNum})` - if (this.solhintEnv.getElementsByTagName('img')[0]) this.solhintEnv.getElementsByTagName('img')[0].style.filter = `invert(${invertNum})` - if (this.learnEthEnv.getElementsByTagName('img')[0]) this.learnEthEnv.getElementsByTagName('img')[0].style.filter = `invert(${invertNum})` - if (this.sourcifyEnv.getElementsByTagName('img')[0]) this.sourcifyEnv.getElementsByTagName('img')[0].style.filter = `invert(${invertNum})` - if (this.moreEnv.getElementsByTagName('img')[0]) this.moreEnv.getElementsByTagName('img')[0].style.filter = `invert(${invertNum})` - if (this.websiteIcon) this.websiteIcon.style.filter = `invert(${invertNum})` - } + this.el = document.createElement('div') + this.el.setAttribute('id', 'landingPageHomeContainer') + this.el.setAttribute('class', 'remixui_homeContainer justify-content-between bg-light d-flex') + this.el.setAttribute('data-id', 'landingPageHomeContainer') + // to retrieve medium posts + document.body.appendChild(yo``) + document.body.appendChild(yo``) - showMediaPanel (e) { - if (e.target.id === 'remixIDEHomeTwitterbtn') { - this.mediumPanel.classList.remove('d-block') - this.mediumPanel.classList.add('d-none') - this.twitterPanel.classList.toggle('d-block') - _paq.push(['trackEvent', 'pluginManager', 'media', 'twitter']) - } else { - this.twitterPanel.classList.remove('d-block') - this.twitterPanel.classList.add('d-none') - this.mediumPanel.classList.toggle('d-block') - _paq.push(['trackEvent', 'pluginManager', 'media', 'medium']) - } } render () { - const load = (service, item, examples, info) => { - const contentImport = this.contentImport - const fileProviders = globalRegistry.get('fileproviders').api - const msg = yo` -
- Enter the ${item} you would like to load. -
${info}
-
e.g ${examples.map((url) => { return yo`` })}
-
` - - const title = `Import from ${service}` - modalDialogCustom.prompt(title, msg, null, (target) => { - if (target !== '') { - contentImport.import( - target, - (loadingMsg) => { tooltip(loadingMsg) }, - (error, content, cleanUrl, type, url) => { - if (error) { - modalDialogCustom.alert(title, error.message || error) - } else { - try { - fileProviders.workspace.addExternal(type + '/' + cleanUrl, content, url) - this.verticalIcons.select('filePanel') - } catch (e) { - modalDialogCustom.alert(title, e.message) - } - } - } - ) - } - }) - } - - const startSolidity = async () => { - await this.appManager.activatePlugin(['solidity', 'udapp', 'solidityStaticAnalysis', 'solidityUnitTesting']) - this.verticalIcons.select('solidity') - _paq.push(['trackEvent', 'pluginManager', 'userActivate', 'solidity']) - } - const startOptimism = async () => { - await this.appManager.activatePlugin('optimism-compiler') - this.verticalIcons.select('optimism-compiler') - _paq.push(['trackEvent', 'pluginManager', 'userActivate', 'optimism-compiler']) - } - const startSolhint = async () => { - await this.appManager.activatePlugin(['solidity', 'solhint']) - this.verticalIcons.select('solhint') - _paq.push(['trackEvent', 'pluginManager', 'userActivate', 'solhint']) - } - const startLearnEth = async () => { - await this.appManager.activatePlugin(['solidity', 'LearnEth', 'solidityUnitTesting']) - this.verticalIcons.select('LearnEth') - _paq.push(['trackEvent', 'pluginManager', 'userActivate', 'learnEth']) - } - const startSourceVerify = async () => { - await this.appManager.activatePlugin(['solidity', 'source-verification']) - this.verticalIcons.select('source-verification') - _paq.push(['trackEvent', 'pluginManager', 'userActivate', 'source-verification']) - } - const startPluginManager = async () => { - await this.appManager.activatePlugin('pluginManager') - this.verticalIcons.select('pluginManager') - } - const startRestoreBackupZip = async () => { - await this.appManager.activatePlugin(['restorebackupzip']) - this.verticalIcons.select('restorebackupzip') - _paq.push(['trackEvent', 'pluginManager', 'userActivate', 'restorebackupzip']) - } - - const createNewFile = () => { - this.call('filePanel', 'createNewFile') - } - - const saveAs = (blob, name) => { - const node = document.createElement('a') - node.download = name - node.rel = 'noopener' - node.href = URL.createObjectURL(blob) - setTimeout(function () { URL.revokeObjectURL(node.href) }, 4E4) // 40s - setTimeout(function () { - try { - node.dispatchEvent(new MouseEvent('click')) - } catch (e) { - var evt = document.createEvent('MouseEvents') - evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, - 20, false, false, false, false, 0, null) - node.dispatchEvent(evt) - } - }, 0) // 40s - } - - const downloadFiles = async () => { - try { - tooltip('preparing files for download, please wait..') - const fileProviders = globalRegistry.get('fileproviders').api - const zip = new JSZip() - await fileProviders.browser.copyFolderToJson('/', ({ path, content }) => { - zip.file(`remixbackup${path}`, content) - }) - zip.generateAsync({ type: 'blob' }).then(function (blob) { - saveAs(blob, 'remixbackup.zip') - }).catch((e) => { - tooltip(e.message) - }) - } catch (e) { - tooltip(e.message) - } - } - - const uploadFile = (target) => { - this.call('filePanel', 'uploadFile', target) - } - - const connectToLocalhost = () => { - this.appManager.activatePlugin('remixd') - } - const importFromGist = () => { - this.gistHandler.loadFromGist({ gist: '' }, globalRegistry.get('filemanager').api) - this.verticalIcons.select('filePanel') - } - - globalRegistry.get('themeModule').api.events.on('themeChanged', (theme) => { - globalRegistry.get('themeModule').api.fixInvert(document.getElementById('remixLogo')) - globalRegistry.get('themeModule').api.fixInvert(document.getElementById('solidityLogo')) - globalRegistry.get('themeModule').api.fixInvert(document.getElementById('debuggerLogo')) - globalRegistry.get('themeModule').api.fixInvert(document.getElementById('learnEthLogo')) - globalRegistry.get('themeModule').api.fixInvert(document.getElementById('workshopLogo')) - globalRegistry.get('themeModule').api.fixInvert(document.getElementById('moreLogo')) - globalRegistry.get('themeModule').api.fixInvert(document.getElementById('solhintLogo')) - }) - - const createLargeButton = (imgPath, envID, envText, callback) => { - return yo` - - ` - } - - // main - this.solEnv = createLargeButton('assets/img/solidityLogo.webp', 'solidityLogo', 'Solidity', startSolidity) - // Featured - this.optimismEnv = createLargeButton('assets/img/optimismLogo.webp', 'optimismLogo', 'Optimism', startOptimism) - this.solhintEnv = createLargeButton('assets/img/solhintLogo.png', 'solhintLogo', 'Solhint linter', startSolhint) - this.learnEthEnv = createLargeButton('assets/img/learnEthLogo.webp', 'learnEthLogo', 'LearnEth', startLearnEth) - this.sourcifyEnv = createLargeButton('assets/img/sourcifyLogo.webp', 'sourcifyLogo', 'Sourcify', startSourceVerify) - this.moreEnv = createLargeButton('assets/img/moreLogo.webp', 'moreLogo', 'More', startPluginManager) - this.websiteIcon = yo`` - - const themeQuality = globalRegistry.get('themeModule').api.currentTheme().quality - const invertNum = (themeQuality === 'dark') ? 1 : 0 - this.solEnv.getElementsByTagName('img')[0].style.filter = `invert(${invertNum})` - this.optimismEnv.getElementsByTagName('img')[0].style.filter = `invert(${invertNum})` - this.solhintEnv.getElementsByTagName('img')[0].style.filter = `invert(${invertNum})` - this.learnEthEnv.getElementsByTagName('img')[0].style.filter = `invert(${invertNum})` - this.sourcifyEnv.getElementsByTagName('img')[0].style.filter = `invert(${invertNum})` - this.moreEnv.getElementsByTagName('img')[0].style.filter = `invert(${invertNum})` - this.websiteIcon.style.filter = `invert(${invertNum})` - - const switchToPreviousVersion = () => { - const query = new QueryParams() - query.update({ appVersion: '0.7.7' }) - _paq.push(['trackEvent', 'LoadingType', 'oldExperience_0.7.7']) - document.location.reload() - } - - const migrate = async () => { - try { - setTimeout(() => { - tooltip('migrating workspace...') - }, 500) - const workspaceName = await migrateToWorkspace(this.fileManager, this.filePanel) - tooltip('done. ' + workspaceName + ' created.') - } catch (e) { - setTimeout(() => { - tooltip(e.message) - }, 1000) - } - } - const onAcceptDownloadn = async () => { - await downloadFiles() - const el = document.getElementById('modal-dialog') - el.parentElement.removeChild(el) - migrate() - } - - const onDownload = () => { - const el = document.getElementById('modal-dialog') - el.parentElement.removeChild(el) - migrate() - } - - const onCancel = () => { - const el = document.getElementById('modal-dialog') - el.parentElement.removeChild(el) - } - - const migrateWorkspace = async () => { - modalDialog( - 'File system Migration', - yo` - Do you want to download your files to local device first? -
- - - -
- `, - { - label: '', - fn: null - }, - { - label: '', - fn: null - } - ) - } - - const img = yo`` - const playRemi = async () => { await document.getElementById('remiAudio').play() } - // to retrieve medium posts - document.body.appendChild(yo``) - const container = yo` -
-
-
-
-
-
- ${img} - -
-
Quicklinks
- Guide for migrating the old File System -

Migration tools:

-
  • - - migrateWorkspace()}>Basic migration - -
  • -
  • - downloadFiles()}>Download all Files - as a backup zip -
  • -
  • - startRestoreBackupZip()}>Restore filesfrom backup zip -
  • -

    Help:

    - - Gitter channel - Report on Github - -
    -
    -
    -
    -
    -
    -

    Featured Plugins

    -
    - ${this.solEnv} - ${this.optimismEnv} - ${this.learnEthEnv} - ${this.solhintEnv} - ${this.sourcifyEnv} - ${this.moreEnv} -
    -
    -
    -
    -

    File

    -

    - - createNewFile()}>New File -

    -

    - - -

    -

    - - connectToLocalhost()}>Connect to Localhost -

    -

    -
    - - - - -
    -
    -
    -

    Resources

    -

    - - Documentation -

    -

    - - Gitter channel -

    -

    - ${this.websiteIcon} - Featuring website -

    -

    - - switchToPreviousVersion()}>Old experience -

    -
    -
    -
    -
    -
    -
    -
    - ${this.badgeTwitter} - ${this.badgeMedium} -
    -
    - ${this.mediumPanel} - ${this.twitterPanel} -
    -
    -
    -
    -
    - ` + this.renderComponent() + return this.el + } - return container + renderComponent () { + ReactDOM.render( + + , this.el) } } diff --git a/apps/remix-ide/src/assets/img/solhintLogo.png b/apps/remix-ide/src/assets/img/solhintLogo.png deleted file mode 100644 index eab3cbb63b568c94be0388a0928739ecac5abf11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3400 zcmbVP2{_d0A0JdimP8x>jcJS{V@@-U$&idN8I5H`r)loYWoG2IvO?(^Dmm7D#Uwep z6iRHA-Gn4kX-g_a5j&3lzv=Mo{-6C{`+J`E_rAaP{k)&={e7O_0gAV~wx*FL2n5ph z^dNo@%v9yjSOmONXM;L{X{pE~PyzyJtxygXP-gZj5NNRh*DpXCK=#7Zg?t2!A>7SG zg!4rJ8U%854j0kr!AvQ5HPm_ z=_nKiZ0CSL+hVb{C~GhVg+U=vI3yYaN8932SUlPe{N;fF(!>lF{(IuaFS39y0)!)# zittEeSXdY$%myJ8vyo^A2L~hygT!Fq00J(F5J+j^aDl}1D+7@!p^Ld9DOV@}D;a6K zg`rXc1km)e34GB4tw8d{O@PCY;WQBvjX)_)`UGUq7jU9bG4GRb1|7-dG5Jh^R03ep z3s@0HC>2UL!hb`(aQr6$fNRO*1sQ*-3!lFrLLznB3z+f6A%BUM_(h1A$nTjFVW^nS zblVH4X{xkFgm)D)X;PusPblPl4HV_8%3ur{fdN~RX>_hYX~fz;TwxMvQYHZc#0?Ec zq2U;`9~uanJsyRDq0o2~>NAuqWN=v#e+9*$@K~EaL4l-U(4@5g3TDvpETNcB15D=f zX>2A^Bw$0p3y#FQ3VA{?AQ;dN{l|SzS67Ny$l~&V1ENq0cBgR#K;D^s(v(cbdkQ2{ znt;yqBoZKiXAoR215dMKVIAzSC^(CWqrtHl8U}99qA}oh7zbM$x}6OR!@zvKPZZKa zmGS?2pYea*-z??=^+)6VZ60M+Dia6q!Ic0ZjrdYGzRZv>D;^j8DOd0`y0Qic5V|t> zOa|o3HurCP;4^I)hY67Whm`mXlL%STFq)X@!UnwcKO`LzP#>wR*Uy$9|JBG(XMd>e zuW+DYD3=SJ3iw#)bxZ-!;KV>DqiJRD1A)~0Jc%xToWYK)4uP+`{?ET2d;Qezg{l3~ zpgJ8&Xg?zPTQGIQv9dj<*B>wN*XSUc+s#dB>H)Y41SCskS$`&nM z{aAc9gyA-mT%dTZU%9;@H>N>h=|d+L$M;+i^x+Z=&Y12Q8WHsj>t$X$=$|)a73rw{ z%C!EGhJUT6cIP4I>#LB)M%H(qzj z1q}q?Tsw{$yUt7Q&-ut=oUUmtjjGXrAuKZNUE zFrO?p>e#tUJH^rqmyLirRTpTN-Nt4%KOm-UtjP)@aHd5vgL)GJdNwCHariiEhLLx4 zr&rf7k8xo`3>!l7<#d1xw;Eo#`}$1J^TH|36W{prbTZ9-b39%g8JNdErtob{)2mgZ z6onTzk9xM=%t;>4tA1QKTeT*_Oc57Vt8Z|hU6LMTf)pAb;74O|kzPj#LDploTVB_sE8i6S zVTOzm<(X2h5{jJ;dipV!koK$Gps#7&62U_9K&ubEOk5|Hzbc4QJz$5*QcYz&2`%ok zvL@cySB8Dn$q&km0({Xn- zvrPPvbWhe^KHfWY(0j>BeRX#!$cmpW3!RQYk7~x9PG#QsE@VQD@?I~~_Lqn^=`OOl zz7Z*ugWPk7!`54R_X$F6W1|0c?Gda|tvZ!WfU+J@>r1=cyPCaCwXX*Lz`jd(xGwgh z(SFiD*fVvoRjJnZ6w_AFQIh4NP)ZNzrRIlQdr;+ev#SU>UamOO(_q}z^QHA^ll!wX zGtZju*ORZpAi@l?kZu9y&kV%KvbdMYB*KTj#(X30H!#Iz3!Q`VoTp96q`ST@Z#%b9 za>FTc26c6Gr+aH)N7i!Q6nV6l!i(pO-1=Yr*x1`Kl}0tF<4xC*y3JZvtccoNGw9e= z;iEBLJN3Nea^<7;{u9^&Y{oGlsO2A~0~%V@+Kh&aqRJn1?T}1xEau~07U$7&$3`_x z+}gF0p)$Y9o!jO@lD~bI=bzza;!ife(zI4LKb#`6QtyE{d0v1Gj?H|lI}%gc&9G1m zC*8gFPVXRLd7ZmS)&{Vu#!+hgPpzXQW1n@s>2_vZV)Jb5#fCUFW1l{)@@3APKq&rj zQ;_^s#>2{@itz^z&{-LJ6q{=>!^bYxxgShkN2a#12xJTJ)I^EJem0E8HjlhN*{m&fM~=Poe7tS4)GWbWbLBTz)(Ofc z*ZVxZ3Ql@UxR?A?Yn%n?7T#C6H0U?*f;m(AdvA(ftE+kn!K|A_a1M{07(W*kI=?%= zR*^oav-!PG(GM4WJ98hEHIWwgPj*LUdEpLM7xwOY-iXXryOJ@>hTNL+UTv5j_|c&; zFkx;)_sE;oI% zufgZe1_zx>B|STFB>U0MWdy~<9ocV}k`4vt##hHqZY~UL+dDI2ul{=pBbJReFW4@_ zw9U`HfcZATiUYHsH}7x?-F+{$Y4%Nl&haf_mA-kT4#?JwGdm4CPEHkuJb|V0k9$|m zq>ydWpj6Ani+Zb$A8laoj=@C;GnY2BrDUl*-et(M&JRGBIZo{}>uM!5WvsnWcf$MB zNw95*;#K7Qdk8#V++GpA6I-+OSM24GdarJRe=u^gb!Yukfa(IWjNCXm#yUM~M^cAp?}514@f0SIzbA7=Q8pP|{A5 z)t7b=e%c;#)n(5|zkG(-6XC}ui-ECQHC-hPqjPmmxGjW;HF-@wGL0+k=}qEWXDzzQ zf>lZd<0sCBraCwu2plLpm=n1<$Zn%_%;03#oqw!9ZzCgCG_{vlpCk`xO2-;v9$iu=<%Dleh7@JeKQ$#O2v(e|QfJAp-Bww2+T%rDRS?N_6K92=cE9ZA z26W{yDD`xRvCie5b@9fQxh-o)lNp`md5=rp^vT>Co3~wmldw_-8A>c+)H5C|r#82v z5^vO*R@*upu38naA*(>q6Amw++;=%3b9%6h>b{q}#L>7jn!9A(zBkj}w}dB_4Kcq9 zw4dKm(_mPh*uuM-hJ_S_1Zr`kb-TYk&?lpejvy^wEH4SL1rUOww6j@^} z?m!DVC^-2JZ;ix$&Dtj)&)fT8bbT)m^>vIPm-k%1Y-fT!%AxzkZDSRxlG8>~DJlXZ x!`kZ7O>T8nR@EIYNEK>x?5V5a59f#Hbqt|az1H@(4=De2Jl(vBl^cTM{|O$!in#y) diff --git a/apps/remix-ide/src/assets/img/solhintLogo.webp b/apps/remix-ide/src/assets/img/solhintLogo.webp new file mode 100644 index 0000000000000000000000000000000000000000..cc9ecb3bea44a9ca63e0af309c1ddc3df9d66201 GIT binary patch literal 1584 zcmV-02G99YNk&E}1^@t8MM6+kP&iB*1^@srQ~(ta&3u3$qW?j}gW1`(<&h*gvfyBw z`>2?4&&1gUtyNDxnT0A(@j&cu_*CfC-p9EbX)A!SSW{WLvohHffjU9tT=I zy4NOoiiuXvp2^Xd@+6f|20^8Q(y;sY7x6;PhTd`EE(@+IF}%h-j7HV$pVO!2C$+GuQqxNfi=>sYG@0%5`ms zr9nnwyl5p#X|e5Y9de_C=JvwG;015NB2CHXJ`?L@j^8rg&3B!fn>H} z?S6g3H|8s}k_@DcsUry@V(wJb(REMeDOyZaWh91)qJ>b>&J+!T-92|cRddADs3D`v}x;;X-Y65pLArq?jl0snQ=UZ31BmPTsUYEZ*Cy6(X|TvJjyh@hy^ zGU29!esI@}Y0R3UBC6!*x(D%4jWh(Q=`kAk-AyO@k7lTOqtOsi?9M-shiHU~#xP?U zjQ{SYpWH`_r1MmzMMdcD*AL)M&zxza6fs(*o#J;l{nLF=joBMo(Lzb>e*NE%J-0~> z6je34JBVq1chi3VQIp2Z6-i>W#AtWdJ>t6dI86}aA;IK(P~Vy6cQ^ff|8CmZQZ-B> z(1vi+dVS!NRiY{~Ldf3OtGlN8-A$AJqnN!h(i*L#s9<}kAFGIJN{zOE|Lgsj=65&! zd~eS&H9<*;8Q0q{`k^95QjO8SKT+SA=693RtWh#(iJE`C-S=JEmehW?XMC^}nv^1GK69{rO8`zMw^ z&h_@BACs}s#Aqku*LTfRBt}D!7S%bdw-*m91VxRe`TK9)I0tP_uOc*J?)CPB9~%!% z8Z_i!eDhSy5rGsD(ul>bx0m{{(xOeZX;uFIPxsCeDO%MUrrHHrZ%_FlL81gHVlwvY z^D!mV^dJ<`1zB$=emEki5;U9`C+qe>N+2YI8m405>+Su2jT$CtqfzqrU#!mtRZWYi zLPwm|_4YD97D;0~h1O3#SD%U`G*LA*8JzC*_VWwu5X*nX6`NjhMMDrlRj4z#o6TlZG2S4C zq4dmHZ`w^!HD1Fi;!NFa1|c1r8c}C#+A57<6j8((+|7ohhLuoJXZSyCv{6B87%OmZ z8CFWgioC=R2ct2_O4wfNe}N_nt*(N}-u~yIC=_BPuDACelR&J__4e$cDvhoT>+RXU ifK;r|_4e!`rB>>Cd-gaHD|Wp-du#=-w?8@9%LD*8xDY@9 literal 0 HcmV?d00001 diff --git a/libs/remix-ui/home-tab/.babelrc b/libs/remix-ui/home-tab/.babelrc new file mode 100644 index 0000000000..09d67939cc --- /dev/null +++ b/libs/remix-ui/home-tab/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["@nrwl/react/babel"], + "plugins": [] +} diff --git a/libs/remix-ui/home-tab/.eslintrc b/libs/remix-ui/home-tab/.eslintrc new file mode 100644 index 0000000000..977f139a09 --- /dev/null +++ b/libs/remix-ui/home-tab/.eslintrc @@ -0,0 +1,248 @@ +{ + "rules": { + "array-callback-return": "warn", + "dot-location": ["warn", "property"], + "eqeqeq": ["warn", "smart"], + "new-parens": "warn", + "no-caller": "warn", + "no-cond-assign": ["warn", "except-parens"], + "no-const-assign": "warn", + "no-control-regex": "warn", + "no-delete-var": "warn", + "no-dupe-args": "warn", + "no-dupe-keys": "warn", + "no-duplicate-case": "warn", + "no-empty-character-class": "warn", + "no-empty-pattern": "warn", + "no-eval": "warn", + "no-ex-assign": "warn", + "no-extend-native": "warn", + "no-extra-bind": "warn", + "no-extra-label": "warn", + "no-fallthrough": "warn", + "no-func-assign": "warn", + "no-implied-eval": "warn", + "no-invalid-regexp": "warn", + "no-iterator": "warn", + "no-label-var": "warn", + "no-labels": ["warn", { "allowLoop": true, "allowSwitch": false }], + "no-lone-blocks": "warn", + "no-loop-func": "warn", + "no-mixed-operators": [ + "warn", + { + "groups": [ + ["&", "|", "^", "~", "<<", ">>", ">>>"], + ["==", "!=", "===", "!==", ">", ">=", "<", "<="], + ["&&", "||"], + ["in", "instanceof"] + ], + "allowSamePrecedence": false + } + ], + "no-multi-str": "warn", + "no-native-reassign": "warn", + "no-negated-in-lhs": "warn", + "no-new-func": "warn", + "no-new-object": "warn", + "no-new-symbol": "warn", + "no-new-wrappers": "warn", + "no-obj-calls": "warn", + "no-octal": "warn", + "no-octal-escape": "warn", + "no-redeclare": "warn", + "no-regex-spaces": "warn", + "no-restricted-syntax": ["warn", "WithStatement"], + "no-script-url": "warn", + "no-self-assign": "warn", + "no-self-compare": "warn", + "no-sequences": "warn", + "no-shadow-restricted-names": "warn", + "no-sparse-arrays": "warn", + "no-template-curly-in-string": "warn", + "no-this-before-super": "warn", + "no-throw-literal": "warn", + "no-restricted-globals": [ + "error", + "addEventListener", + "blur", + "close", + "closed", + "confirm", + "defaultStatus", + "defaultstatus", + "event", + "external", + "find", + "focus", + "frameElement", + "frames", + "history", + "innerHeight", + "innerWidth", + "length", + "location", + "locationbar", + "menubar", + "moveBy", + "moveTo", + "name", + "onblur", + "onerror", + "onfocus", + "onload", + "onresize", + "onunload", + "open", + "opener", + "opera", + "outerHeight", + "outerWidth", + "pageXOffset", + "pageYOffset", + "parent", + "print", + "removeEventListener", + "resizeBy", + "resizeTo", + "screen", + "screenLeft", + "screenTop", + "screenX", + "screenY", + "scroll", + "scrollbars", + "scrollBy", + "scrollTo", + "scrollX", + "scrollY", + "self", + "status", + "statusbar", + "stop", + "toolbar", + "top" + ], + "no-unexpected-multiline": "warn", + "no-unreachable": "warn", + "no-unused-expressions": [ + "error", + { + "allowShortCircuit": true, + "allowTernary": true, + "allowTaggedTemplates": true + } + ], + "no-unused-labels": "warn", + "no-useless-computed-key": "warn", + "no-useless-concat": "warn", + "no-useless-escape": "warn", + "no-useless-rename": [ + "warn", + { + "ignoreDestructuring": false, + "ignoreImport": false, + "ignoreExport": false + } + ], + "no-with": "warn", + "no-whitespace-before-property": "warn", + "react-hooks/exhaustive-deps": "warn", + "require-yield": "warn", + "rest-spread-spacing": ["warn", "never"], + "strict": ["warn", "never"], + "unicode-bom": ["warn", "never"], + "use-isnan": "warn", + "valid-typeof": "warn", + "no-restricted-properties": [ + "error", + { + "object": "require", + "property": "ensure", + "message": "Please use import() instead. More info: https://facebook.github.io/create-react-app/docs/code-splitting" + }, + { + "object": "System", + "property": "import", + "message": "Please use import() instead. More info: https://facebook.github.io/create-react-app/docs/code-splitting" + } + ], + "getter-return": "warn", + "import/first": "error", + "import/no-amd": "error", + "import/no-webpack-loader-syntax": "error", + "react/forbid-foreign-prop-types": ["warn", { "allowInPropTypes": true }], + "react/jsx-no-comment-textnodes": "warn", + "react/jsx-no-duplicate-props": "warn", + "react/jsx-no-target-blank": "warn", + "react/jsx-no-undef": "error", + "react/jsx-pascal-case": ["warn", { "allowAllCaps": true, "ignore": [] }], + "react/jsx-uses-react": "warn", + "react/jsx-uses-vars": "warn", + "react/no-danger-with-children": "warn", + "react/no-direct-mutation-state": "warn", + "react/no-is-mounted": "warn", + "react/no-typos": "error", + "react/react-in-jsx-scope": "error", + "react/require-render-return": "error", + "react/style-prop-object": "warn", + "react/jsx-no-useless-fragment": "warn", + "jsx-a11y/accessible-emoji": "warn", + "jsx-a11y/alt-text": "warn", + "jsx-a11y/anchor-has-content": "warn", + "jsx-a11y/anchor-is-valid": [ + "warn", + { "aspects": ["noHref", "invalidHref"] } + ], + "jsx-a11y/aria-activedescendant-has-tabindex": "warn", + "jsx-a11y/aria-props": "warn", + "jsx-a11y/aria-proptypes": "warn", + "jsx-a11y/aria-role": "warn", + "jsx-a11y/aria-unsupported-elements": "warn", + "jsx-a11y/heading-has-content": "warn", + "jsx-a11y/iframe-has-title": "warn", + "jsx-a11y/img-redundant-alt": "warn", + "jsx-a11y/no-access-key": "warn", + "jsx-a11y/no-distracting-elements": "warn", + "jsx-a11y/no-redundant-roles": "warn", + "jsx-a11y/role-has-required-aria-props": "warn", + "jsx-a11y/role-supports-aria-props": "warn", + "jsx-a11y/scope": "warn", + "react-hooks/rules-of-hooks": "error", + "default-case": "off", + "no-dupe-class-members": "off", + "no-undef": "off", + "@typescript-eslint/consistent-type-assertions": "warn", + "no-array-constructor": "off", + "@typescript-eslint/no-array-constructor": "warn", + "@typescript-eslint/no-namespace": "error", + "no-use-before-define": "off", + "@typescript-eslint/no-use-before-define": [ + "warn", + { + "functions": false, + "classes": false, + "variables": false, + "typedefs": false + } + ], + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": [ + "warn", + { "args": "none", "ignoreRestSiblings": true } + ], + "no-useless-constructor": "off", + "@typescript-eslint/no-useless-constructor": "warn" + }, + "env": { + "browser": true, + "commonjs": true, + "es6": true, + "jest": true, + "node": true + }, + "settings": { "react": { "version": "detect" } }, + "plugins": ["import", "jsx-a11y", "react", "react-hooks"], + "extends": ["../../../.eslintrc"], + "ignorePatterns": ["!**/*"] +} diff --git a/libs/remix-ui/home-tab/README.md b/libs/remix-ui/home-tab/README.md new file mode 100644 index 0000000000..27f152a0ae --- /dev/null +++ b/libs/remix-ui/home-tab/README.md @@ -0,0 +1,7 @@ +# remix-ui-home-tab + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test remix-ui-home-tab` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/libs/remix-ui/home-tab/src/index.ts b/libs/remix-ui/home-tab/src/index.ts new file mode 100644 index 0000000000..ab0129545e --- /dev/null +++ b/libs/remix-ui/home-tab/src/index.ts @@ -0,0 +1 @@ +export * from './lib/remix-ui-home-tab' diff --git a/libs/remix-ui/home-tab/src/lib/components/pluginButton.tsx b/libs/remix-ui/home-tab/src/lib/components/pluginButton.tsx new file mode 100644 index 0000000000..ec0e02b2bd --- /dev/null +++ b/libs/remix-ui/home-tab/src/lib/components/pluginButton.tsx @@ -0,0 +1,27 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import React, { useContext } from 'react' +import { ThemeContext } from '../themeContext' + +interface PluginButtonProps { + imgPath: string, + envID: string, + envText: string, + callback: any +} + +function PluginButton ({ imgPath, envID, envText, callback }: PluginButtonProps) { + const themeFilter = useContext(ThemeContext) + + return ( + + ) +} + +export default PluginButton diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css new file mode 100644 index 0000000000..224bda49e8 --- /dev/null +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css @@ -0,0 +1,86 @@ +.remixui_text { + cursor: pointer; + font-weight: normal; + max-width: 300px; + user-select: none; + } + .remixui_text:hover { + cursor: pointer; + text-decoration: underline; + } + .remixui_homeContainer { + user-select: none; + overflow-y: hidden; + overflow-y: auto; + flex-grow: 3; + } + .remixui_hpLogoContainer { + margin: 30px; + padding-right: 90px; + } + .remixui_mediaBadge { + font-size: 2em; + height: 2em; + width: 2em; + } + .remixui_mediaBadge:focus { + outline: none; + } + .remixui_image { + height: 1em; + width: 1em; + text-align: center; + } + .remixui_logoImg { + height: 10em; + } + .remixui_rightPanel { + right: 0; + position: absolute; + z-index: 3; + } + .remixui_remixHomeMedia { + overflow-y: auto; + overflow-x: hidden; + max-height: 720px; + } + .remixui_panels { + box-shadow: 0px 0px 13px -7px; + } + .remixui_labelIt { + margin-bottom: 0; + } + .remixui_bigLabelSize { + font-size: 13px; + } + .remixui_seeAll { + margin-top: 7px; + white-space: nowrap; + } + .remixui_importFrom p { + margin-right: 10px; + } + .remixui_logoContainer img{ + height: 150px; + opacity: 0.7; + } + .remixui_envLogo { + height: 16px; + width: 16px; + } + .remixui_cursorStyle { + cursor: pointer; + } + .remixui_envButton { + width: 120px; + height: 70px; + } + .remixui_media { + overflow: hidden; + width: 400px; + transition: .5s ease-out; + z-index: 1000; + } + .remixui_migrationBtn { + width: 100px; + } \ No newline at end of file diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx new file mode 100644 index 0000000000..dc993eccbb --- /dev/null +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -0,0 +1,278 @@ +import React, { useState, useRef, useEffect } from 'react' // eslint-disable-line + +import './remix-ui-home-tab.css' +import { ModalDialog } from '@remix-ui/modal-dialog' // eslint-disable-line +import PluginButton from './components/pluginButton' // eslint-disable-line +import QueryParams from '../../../../../apps/remix-ide/src/lib/query-params' +import { ThemeContext, themes } from './themeContext' +import { stat } from 'fs' + +declare global { + interface Window { + _paq: any + } +} +const _paq = window._paq = window._paq || [] //eslint-disable-line + +/* eslint-disable-next-line */ +export interface RemixUiHomeTabProps { + plugin: any, + registry: any +} + +export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { + const { plugin, registry } = props + const [state, setState] = useState<{ + showBasicMigration: boolean, + themeQuality: { filter: string, name: string }, + showMediaPanel: 'none' | 'twitter' | 'medium' + }>({ + showBasicMigration: false, + themeQuality: registry.get('themeModule').api.currentTheme().quality === 'dark' ? themes.dark : themes.light, + showMediaPanel: 'none' + }) + + const playRemi = async () => { + remiAudioEl.current.play() + } + + const remiAudioEl = useRef(null) + + useEffect(() => { + registry.get('themeModule').api.events.on('themeChanged', (theme) => { + // update theme quality. To be used for for images + setState(prevState => { + return { ...prevState, themeQuality: theme.quality === 'dark' ? themes.dark : themes.light } + }) + }) + window.addEventListener('click', (e) => { + if (e.target.id !== 'remixIDEHomeTwitterbtn' && e.target.id !== 'remixIDEHomeMediumbtn') { + // todo check event.target + setState(prevState => { return { ...prevState, showMediaPanel: 'none' } }) + } + }) + }, []) + + const createNewFile = () => { + plugin.call('filePanel', 'createNewFile') + } + + const uploadFile = (target) => { + plugin.call('filePanel', 'uploadFile', target) + } + + const connectToLocalhost = () => { + plugin.appManager.activatePlugin('remixd') + } + const importFromGist = () => { + plugin.gistHandler.loadFromGist({ gist: '' }, registry.get('filemanager').api) + plugin.verticalIcons.select('filePanel') + } + const switchToPreviousVersion = () => { + const query = new QueryParams() + query.update({ appVersion: '0.7.7' }) + _paq.push(['trackEvent', 'LoadingType', 'oldExperience_0.7.7']) + document.location.reload() + } + const startSolidity = async () => { + await plugin.appManager.activatePlugin(['solidity', 'udapp', 'solidityStaticAnalysis', 'solidityUnitTesting']) + plugin.verticalIcons.select('solidity') + _paq.push(['trackEvent', 'pluginManager', 'userActivate', 'solidity']) + } + const startOptimism = async () => { + await plugin.appManager.activatePlugin('optimism-compiler') + plugin.verticalIcons.select('optimism-compiler') + _paq.push(['trackEvent', 'pluginManager', 'userActivate', 'optimism-compiler']) + } + const startSolhint = async () => { + await plugin.appManager.activatePlugin(['solidity', 'solhint']) + plugin.verticalIcons.select('solhint') + _paq.push(['trackEvent', 'pluginManager', 'userActivate', 'solhint']) + } + const startLearnEth = async () => { + await plugin.appManager.activatePlugin(['solidity', 'LearnEth', 'solidityUnitTesting']) + plugin.verticalIcons.select('LearnEth') + _paq.push(['trackEvent', 'pluginManager', 'userActivate', 'learnEth']) + } + const startSourceVerify = async () => { + await plugin.appManager.activatePlugin(['solidity', 'source-verification']) + plugin.verticalIcons.select('source-verification') + _paq.push(['trackEvent', 'pluginManager', 'userActivate', 'source-verification']) + } + const startPluginManager = async () => { + await plugin.appManager.activatePlugin('pluginManager') + plugin.verticalIcons.select('pluginManager') + } + + const load = (service, item, examples, info = '') => {/* + const contentImport = this.contentImport + const fileProviders = registry.get('fileproviders').api + const msg = yo` +
    + Enter the ${item} you would like to load. +
    ${info}
    +
    e.g ${examples.map((url) => { return yo`` })}
    +
    ` + + const title = `Import from ${service}` + modalDialogCustom.prompt(title, msg, null, (target) => { + if (target !== '') { + contentImport.import( + target, + (loadingMsg) => { tooltip(loadingMsg) }, + (error, content, cleanUrl, type, url) => { + if (error) { + modalDialogCustom.alert(title, error.message || error) + } else { + try { + fileProviders.workspace.addExternal(type + '/' + cleanUrl, content, url) + this.verticalIcons.select('filePanel') + } catch (e) { + modalDialogCustom.alert(title, e.message) + } + } + } + ) + } + })*/ + } + const maxHeight = Math.max(window.innerHeight - 150, 200) + 'px' + return ( +
    +
    +
    + playRemi() } alt=""> + +
    +
    +
    +
    +
    +

    Featured Plugins

    +
    + + + + + + + + +
    +
    +
    +
    +

    File

    +

    + + createNewFile()}>New File +

    +

    + + +

    +

    + + connectToLocalhost()}>Connect to Localhost +

    +

    +
    + + + + +
    +
    +
    +

    Resources

    +

    + + Documentation +

    +

    + + Gitter channel +

    +

    + + Featuring website +

    +

    + + switchToPreviousVersion()}>Old experience +

    +
    +
    +
    +
    +
    +
    + + +
    +
    + { (state.showMediaPanel === 'medium') &&
    +
    +
    +
    +
    +
    } + { (state.showMediaPanel === 'twitter') &&
    +
    + + +
    +
    } +
    +
    +
    + ) +} + +export default RemixUiHomeTab diff --git a/libs/remix-ui/home-tab/src/lib/themeContext.tsx b/libs/remix-ui/home-tab/src/lib/themeContext.tsx new file mode 100644 index 0000000000..fc67007dac --- /dev/null +++ b/libs/remix-ui/home-tab/src/lib/themeContext.tsx @@ -0,0 +1,16 @@ +import React from 'react' // eslint-disable-line + +export const themes = { + light: { + filter: 'invert(0)', + name: 'light' + }, + dark: { + filter: 'invert(1)', + name: 'dark' + } +} + +export const ThemeContext = React.createContext( + themes.dark // default value +) diff --git a/libs/remix-ui/home-tab/tsconfig.json b/libs/remix-ui/home-tab/tsconfig.json new file mode 100644 index 0000000000..d52e31ad74 --- /dev/null +++ b/libs/remix-ui/home-tab/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/libs/remix-ui/home-tab/tsconfig.lib.json b/libs/remix-ui/home-tab/tsconfig.lib.json new file mode 100644 index 0000000000..b560bc4dec --- /dev/null +++ b/libs/remix-ui/home-tab/tsconfig.lib.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "types": ["node"] + }, + "files": [ + "../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../node_modules/@nrwl/react/typings/image.d.ts" + ], + "exclude": ["**/*.spec.ts", "**/*.spec.tsx"], + "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] +} From 25f9f1958f479f9e5ebc7dda43cbf6e173478b94 Mon Sep 17 00:00:00 2001 From: lianahus Date: Mon, 4 Oct 2021 12:38:54 +0200 Subject: [PATCH 08/43] adding the modal dialog --- .../src/app/ui/landing-page/landing-page.js | 2 - .../home-tab/src/lib/remix-ui-home-tab.css | 3 +- .../home-tab/src/lib/remix-ui-home-tab.tsx | 347 ++++++++++-------- 3 files changed, 189 insertions(+), 163 deletions(-) diff --git a/apps/remix-ide/src/app/ui/landing-page/landing-page.js b/apps/remix-ide/src/app/ui/landing-page/landing-page.js index bd66f66054..81efff22c3 100644 --- a/apps/remix-ide/src/app/ui/landing-page/landing-page.js +++ b/apps/remix-ide/src/app/ui/landing-page/landing-page.js @@ -4,7 +4,6 @@ import ReactDOM from 'react-dom' import * as packageJson from '../../../../../../package.json' import { ViewPlugin } from '@remixproject/engine-web' import { RemixUiHomeTab } from '@remix-ui/home-tab' // eslint-disable-line -import { id } from '@ethersproject/hash' const yo = require('yo-yo') const globalRegistry = require('../../../global/registry') @@ -37,7 +36,6 @@ export class LandingPage extends ViewPlugin { // to retrieve medium posts document.body.appendChild(yo``) document.body.appendChild(yo``) - } render () { diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css index 224bda49e8..80fb6d7d39 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css @@ -83,4 +83,5 @@ } .remixui_migrationBtn { width: 100px; - } \ No newline at end of file + } + \ No newline at end of file diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx index dc993eccbb..208af4e9d7 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -25,11 +25,15 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { const [state, setState] = useState<{ showBasicMigration: boolean, themeQuality: { filter: string, name: string }, - showMediaPanel: 'none' | 'twitter' | 'medium' + showMediaPanel: 'none' | 'twitter' | 'medium', + showModalDialog: boolean, + modalInfo: { title: string, loadItem: string, examples: Array } }>({ showBasicMigration: false, themeQuality: registry.get('themeModule').api.currentTheme().quality === 'dark' ? themes.dark : themes.light, - showMediaPanel: 'none' + showMediaPanel: 'none', + showModalDialog: false, + modalInfo: { title: '', loadItem: '', examples: []} }) const playRemi = async () => { @@ -45,20 +49,21 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { return { ...prevState, themeQuality: theme.quality === 'dark' ? themes.dark : themes.light } }) }) - window.addEventListener('click', (e) => { - if (e.target.id !== 'remixIDEHomeTwitterbtn' && e.target.id !== 'remixIDEHomeMediumbtn') { + window.addEventListener('click', (event) => { + const { id } = (event.target as HTMLButtonElement).dataset + if ( id !== 'remixIDEHomeTwitterbtn' && id!== 'remixIDEHomeMediumbtn') { // todo check event.target setState(prevState => { return { ...prevState, showMediaPanel: 'none' } }) } }) }, []) - const createNewFile = () => { - plugin.call('filePanel', 'createNewFile') + const createNewFile = async () => { + await plugin.call('filePanel', 'createNewFile') } - const uploadFile = (target) => { - plugin.call('filePanel', 'uploadFile', target) + const uploadFile = async (target) => { + await plugin.call('filePanel', 'uploadFile', target) } const connectToLocalhost = () => { @@ -104,174 +109,196 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { plugin.verticalIcons.select('pluginManager') } - const load = (service, item, examples, info = '') => {/* - const contentImport = this.contentImport - const fileProviders = registry.get('fileproviders').api - const msg = yo` -
    - Enter the ${item} you would like to load. -
    ${info}
    -
    e.g ${examples.map((url) => { return yo`` })}
    -
    ` + const showFullMessage = (title: string, loadItem: string, examples: Array) => { + setState(prevState => { + return { ...prevState, modalInfo: { title: title, loadItem: loadItem , examples: examples } } + }) + } + + const hideFullMessage = () => { //eslint-disable-line + setState(prevState => { + return { ...prevState, showModalDialog: false } + }) + } - const title = `Import from ${service}` - modalDialogCustom.prompt(title, msg, null, (target) => { - if (target !== '') { - contentImport.import( - target, - (loadingMsg) => { tooltip(loadingMsg) }, - (error, content, cleanUrl, type, url) => { - if (error) { - modalDialogCustom.alert(title, error.message || error) - } else { - try { - fileProviders.workspace.addExternal(type + '/' + cleanUrl, content, url) - this.verticalIcons.select('filePanel') - } catch (e) { - modalDialogCustom.alert(title, e.message) - } - } + const processLoading = () => { + const contentImport = plugin.contentImport + const fileProviders = registry.get('fileproviders').api + contentImport.import( + null,//target, + (loadingMsg) => { setState(prevState => { return { ...prevState, tooltip: loadingMsg } }) }, + (error, content, cleanUrl, type, url) => { + if (error) { + //modalDialogCustom.alert(state.modalInfo.title, error.message || error) + } else { + try { + fileProviders.workspace.addExternal(type + '/' + cleanUrl, content, url) + plugin.call('menuicons', 'select', 'filePanel') + } catch (e) { + //modalDialogCustom.alert(state.modalInfo.title, e.message) } - ) + } } - })*/ + ) } + const maxHeight = Math.max(window.innerHeight - 150, 200) + 'px' return ( -
    -
    -
    - playRemi() } alt=""> - -
    -
    -
    -
    -
    -

    Featured Plugins

    -
    - - - - - - - - + <> + {} } + hide={ !state.showModalDialog } + handleHide={ () => hideFullMessage() } + okFn={ () => processLoading() } + > +
    + { state.modalInfo.loadItem !== '' && Enter the { state.modalInfo.loadItem } you would like to load. } + { state.modalInfo.examples.length !== 0 && + <> +
    e.g
    +
    + { state.modalInfo.examples.map((url) => { return `` }) }
    + } +
    +
    +
    +
    +
    + playRemi() } alt=""> +
    -
    -
    -

    File

    -

    - - createNewFile()}>New File -

    -

    - - -

    -

    - - connectToLocalhost()}>Connect to Localhost -

    -

    -
    - - - - +
    +
    +
    +
    +

    Featured Plugins

    +
    + + startSolidity()} /> + startOptimism()} /> + startSolhint()} /> + startLearnEth()} /> + startSourceVerify()} /> + +
    -
    -

    Resources

    -

    - - Documentation -

    -

    - - Gitter channel -

    -

    - - Featuring website -

    -

    - - switchToPreviousVersion()}>Old experience -

    +
    +
    +

    File

    +

    + + createNewFile()}>New File +

    +

    + + +

    +

    + + connectToLocalhost()}>Connect to Localhost +

    +

    +
    + + + + +
    +
    +
    +

    Resources

    +

    + + Documentation +

    +

    + + Gitter channel +

    +

    + + Featuring website +

    +

    + + switchToPreviousVersion()}>Old experience +

    +
    -
    -
    -
    - - -
    -
    - { (state.showMediaPanel === 'medium') &&
    -
    -
    +
    +
    + + +
    +
    + { (state.showMediaPanel === 'medium') &&
    +
    +
    +
    -
    -
    } - { (state.showMediaPanel === 'twitter') &&
    -
    - - -
    -
    } +
    } + { (state.showMediaPanel === 'twitter') &&
    +
    + + +
    +
    } +
    -
    + ) } From c6bf48e29f7eef9eb63693e18c4455945cef56ac Mon Sep 17 00:00:00 2001 From: lianahus Date: Wed, 6 Oct 2021 11:38:37 +0200 Subject: [PATCH 09/43] import files are fixed --- .../home-tab/src/lib/remix-ui-home-tab.css | 2 - .../home-tab/src/lib/remix-ui-home-tab.tsx | 69 +++++++++++++++---- 2 files changed, 54 insertions(+), 17 deletions(-) diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css index 80fb6d7d39..689efed837 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css @@ -2,14 +2,12 @@ cursor: pointer; font-weight: normal; max-width: 300px; - user-select: none; } .remixui_text:hover { cursor: pointer; text-decoration: underline; } .remixui_homeContainer { - user-select: none; overflow-y: hidden; overflow-y: auto; flex-grow: 3; diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx index 208af4e9d7..60f606c60e 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -2,6 +2,7 @@ import React, { useState, useRef, useEffect } from 'react' // eslint-disable-lin import './remix-ui-home-tab.css' import { ModalDialog } from '@remix-ui/modal-dialog' // eslint-disable-line +import { Toaster } from '@remix-ui/toaster' // eslint-disable-line import PluginButton from './components/pluginButton' // eslint-disable-line import QueryParams from '../../../../../apps/remix-ide/src/lib/query-params' import { ThemeContext, themes } from './themeContext' @@ -27,13 +28,17 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { themeQuality: { filter: string, name: string }, showMediaPanel: 'none' | 'twitter' | 'medium', showModalDialog: boolean, - modalInfo: { title: string, loadItem: string, examples: Array } + modalInfo: { title: string, loadItem: string, examples: Array }, + importSource: string, + toasterMsg: string }>({ showBasicMigration: false, themeQuality: registry.get('themeModule').api.currentTheme().quality === 'dark' ? themes.dark : themes.light, showMediaPanel: 'none', showModalDialog: false, - modalInfo: { title: '', loadItem: '', examples: []} + modalInfo: { title: '', loadItem: '', examples: []}, + importSource: '', + toasterMsg: '' }) const playRemi = async () => { @@ -41,6 +46,7 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { } const remiAudioEl = useRef(null) + const inputValue = useRef(null) useEffect(() => { registry.get('themeModule').api.events.on('themeChanged', (theme) => { @@ -51,13 +57,19 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { }) window.addEventListener('click', (event) => { const { id } = (event.target as HTMLButtonElement).dataset - if ( id !== 'remixIDEHomeTwitterbtn' && id!== 'remixIDEHomeMediumbtn') { + if ( id !== 'remixIDEHomeTwitterbtn' && id !== 'remixIDEHomeMediumbtn') { // todo check event.target setState(prevState => { return { ...prevState, showMediaPanel: 'none' } }) } }) }, []) + const toast = (message: string) => { + setState(prevState => { + return { ...prevState, toasterMsg: message } + }) + } + const createNewFile = async () => { await plugin.call('filePanel', 'createNewFile') } @@ -110,14 +122,15 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { } const showFullMessage = (title: string, loadItem: string, examples: Array) => { + console.log('showFullMessage') setState(prevState => { - return { ...prevState, modalInfo: { title: title, loadItem: loadItem , examples: examples } } + return { ...prevState, showModalDialog: true, modalInfo: { title: title, loadItem: loadItem , examples: examples } } }) } const hideFullMessage = () => { //eslint-disable-line setState(prevState => { - return { ...prevState, showModalDialog: false } + return { ...prevState, showModalDialog: false, importSource: '' } }) } @@ -125,45 +138,71 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { const contentImport = plugin.contentImport const fileProviders = registry.get('fileproviders').api contentImport.import( - null,//target, + state.importSource, (loadingMsg) => { setState(prevState => { return { ...prevState, tooltip: loadingMsg } }) }, (error, content, cleanUrl, type, url) => { if (error) { //modalDialogCustom.alert(state.modalInfo.title, error.message || error) + toast(error.message || error) } else { try { fileProviders.workspace.addExternal(type + '/' + cleanUrl, content, url) plugin.call('menuicons', 'select', 'filePanel') } catch (e) { //modalDialogCustom.alert(state.modalInfo.title, e.message) + toast(e.message) + } } } ) + setState(prevState => { + return { ...prevState, showModalDialog: false } + }) } const maxHeight = Math.max(window.innerHeight - 150, 200) + 'px' + const examples = state.modalInfo.examples.map((urlEl, key) => ()) return ( <> {} } + title={ 'Import from ' + state.modalInfo.title } + okLabel='Import' hide={ !state.showModalDialog } handleHide={ () => hideFullMessage() } - okFn={ () => processLoading() } + okFn={ () => { + processLoading() + setState(prevState => { + return { ...prevState, importSource: '' } + })} + } > -
    - { state.modalInfo.loadItem !== '' && Enter the { state.modalInfo.loadItem } you would like to load. } - { state.modalInfo.examples.length !== 0 && +
    + { state.modalInfo.loadItem !== '' && Enter the { state.modalInfo.loadItem } you would like to load. } + { state.modalInfo.examples.length !== 0 && <> -
    e.g
    +
    e.g
    - { state.modalInfo.examples.map((url) => { return `` }) } + { examples }
    } + { + setState(prevState => { + return { ...prevState, importSource: inputValue.current.value } + }) + }} + />
    +
    From 018e5d4a37fab1659559a4e4bd64d35a37c86510 Mon Sep 17 00:00:00 2001 From: lianahus Date: Wed, 6 Oct 2021 11:53:04 +0200 Subject: [PATCH 10/43] icon size fixed --- libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css index 689efed837..7aff9a02db 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css @@ -64,7 +64,6 @@ } .remixui_envLogo { height: 16px; - width: 16px; } .remixui_cursorStyle { cursor: pointer; From ebc82298695d66f7d0eed45682d915fadcd231fc Mon Sep 17 00:00:00 2001 From: lianahus Date: Thu, 7 Oct 2021 12:33:55 +0200 Subject: [PATCH 11/43] twitter panel fixed --- .../src/app/ui/landing-page/landing-page.js | 3 +- .../home-tab/src/lib/remix-ui-home-tab.css | 1 - .../home-tab/src/lib/remix-ui-home-tab.tsx | 55 +- package-lock.json | 1811 +++++++++++------ package.json | 3 +- 5 files changed, 1228 insertions(+), 645 deletions(-) diff --git a/apps/remix-ide/src/app/ui/landing-page/landing-page.js b/apps/remix-ide/src/app/ui/landing-page/landing-page.js index 81efff22c3..af3ad9dc04 100644 --- a/apps/remix-ide/src/app/ui/landing-page/landing-page.js +++ b/apps/remix-ide/src/app/ui/landing-page/landing-page.js @@ -34,8 +34,7 @@ export class LandingPage extends ViewPlugin { this.el.setAttribute('class', 'remixui_homeContainer justify-content-between bg-light d-flex') this.el.setAttribute('data-id', 'landingPageHomeContainer') // to retrieve medium posts - document.body.appendChild(yo``) - document.body.appendChild(yo``) + //document.body.appendChild(yo``) } render () { diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css index 7aff9a02db..045719e03a 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css @@ -40,7 +40,6 @@ .remixui_remixHomeMedia { overflow-y: auto; overflow-x: hidden; - max-height: 720px; } .remixui_panels { box-shadow: 0px 0px 13px -7px; diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx index 60f606c60e..6ebb414806 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -3,9 +3,11 @@ import React, { useState, useRef, useEffect } from 'react' // eslint-disable-lin import './remix-ui-home-tab.css' import { ModalDialog } from '@remix-ui/modal-dialog' // eslint-disable-line import { Toaster } from '@remix-ui/toaster' // eslint-disable-line +import Mediumfeed from './components/mediumFeed' // eslint-disable-line import PluginButton from './components/pluginButton' // eslint-disable-line import QueryParams from '../../../../../apps/remix-ide/src/lib/query-params' import { ThemeContext, themes } from './themeContext' +import { TwitterTimelineEmbed } from 'react-twitter-embed' import { stat } from 'fs' declare global { @@ -56,8 +58,9 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { }) }) window.addEventListener('click', (event) => { - const { id } = (event.target as HTMLButtonElement).dataset - if ( id !== 'remixIDEHomeTwitterbtn' && id !== 'remixIDEHomeMediumbtn') { + const target = event.target as Element + const id = target.id + if (id !== 'remixIDEHomeTwitterbtn' && id !== 'remixIDEHomeMediumbtn') { // todo check event.target setState(prevState => { return { ...prevState, showMediaPanel: 'none' } }) } @@ -142,14 +145,12 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { (loadingMsg) => { setState(prevState => { return { ...prevState, tooltip: loadingMsg } }) }, (error, content, cleanUrl, type, url) => { if (error) { - //modalDialogCustom.alert(state.modalInfo.title, error.message || error) toast(error.message || error) } else { try { fileProviders.workspace.addExternal(type + '/' + cleanUrl, content, url) plugin.call('menuicons', 'select', 'filePanel') } catch (e) { - //modalDialogCustom.alert(state.modalInfo.title, e.message) toast(e.message) } @@ -161,8 +162,9 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { }) } - const maxHeight = Math.max(window.innerHeight - 150, 200) + 'px' + const maxHeight = Math.max(window.innerHeight - 150, 250) + 'px' const examples = state.modalInfo.examples.map((urlEl, key) => ()) + const elHeight = '4000px' return ( <> {
    - { (state.showMediaPanel === 'medium') &&
    -
    -
    -
    + { (state.showMediaPanel === 'medium') &&
    +
    +
    } - { (state.showMediaPanel === 'twitter') &&
    -
    - - + { (state.showMediaPanel === 'twitter') &&
    +
    +
    -
    } +
    }
    diff --git a/package-lock.json b/package-lock.json index 58d4cbed00..b645b66c46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1517,14 +1517,6 @@ "requires": { "core-js": "^2.6.5", "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - } } }, "@babel/preset-env": { @@ -12885,12 +12877,6 @@ "regenerator-runtime": "^0.11.0" }, "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -19423,7 +19409,8 @@ "dependencies": { "@types/bn.js": { "version": "4.11.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", "dev": true, "requires": { "@types/node": "*" @@ -19431,12 +19418,14 @@ }, "@types/node": { "version": "14.11.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==", "dev": true }, "@types/pbkdf2": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", "dev": true, "requires": { "@types/node": "*" @@ -19444,7 +19433,8 @@ }, "@types/secp256k1": { "version": "4.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog==", "dev": true, "requires": { "@types/node": "*" @@ -19452,12 +19442,14 @@ }, "ansi-regex": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { "version": "3.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -19465,7 +19457,8 @@ }, "base-x": { "version": "3.0.8", - "bundled": true, + "resolved": false, + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -19473,22 +19466,26 @@ }, "blakejs": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=", "dev": true }, "bn.js": { "version": "4.11.9", - "bundled": true, + "resolved": false, + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", "dev": true }, "brorand": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, "browserify-aes": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { "buffer-xor": "^1.0.3", @@ -19501,7 +19498,8 @@ }, "bs58": { "version": "4.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", "dev": true, "requires": { "base-x": "^3.0.2" @@ -19509,7 +19507,8 @@ }, "bs58check": { "version": "2.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "dev": true, "requires": { "bs58": "^4.0.0", @@ -19519,22 +19518,26 @@ }, "buffer-from": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "buffer-xor": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, "camelcase": { "version": "5.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "cipher-base": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -19543,7 +19546,8 @@ }, "cliui": { "version": "5.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { "string-width": "^3.1.0", @@ -19553,7 +19557,8 @@ }, "color-convert": { "version": "1.9.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -19561,12 +19566,14 @@ }, "color-name": { "version": "1.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "create-hash": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { "cipher-base": "^1.0.1", @@ -19578,7 +19585,8 @@ }, "create-hmac": { "version": "1.1.7", - "bundled": true, + "resolved": false, + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { "cipher-base": "^1.0.3", @@ -19591,7 +19599,8 @@ }, "cross-spawn": { "version": "6.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -19603,12 +19612,14 @@ }, "decamelize": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "elliptic": { "version": "6.5.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -19622,12 +19633,14 @@ }, "emoji-regex": { "version": "7.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "end-of-stream": { "version": "1.4.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -19635,7 +19648,8 @@ }, "ethereum-cryptography": { "version": "0.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dev": true, "requires": { "@types/pbkdf2": "^3.0.0", @@ -19657,7 +19671,8 @@ }, "ethereumjs-util": { "version": "6.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", "dev": true, "requires": { "@types/bn.js": "^4.11.3", @@ -19671,7 +19686,8 @@ }, "ethjs-util": { "version": "0.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", "dev": true, "requires": { "is-hex-prefixed": "1.0.0", @@ -19680,7 +19696,8 @@ }, "evp_bytestokey": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -19689,7 +19706,8 @@ }, "execa": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "^6.0.0", @@ -19703,7 +19721,8 @@ }, "find-up": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" @@ -19711,12 +19730,14 @@ }, "get-caller-file": { "version": "2.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-stream": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" @@ -19724,7 +19745,8 @@ }, "hash-base": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "requires": { "inherits": "^2.0.4", @@ -19734,7 +19756,8 @@ }, "hash.js": { "version": "1.1.7", - "bundled": true, + "resolved": false, + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -19743,7 +19766,8 @@ }, "hmac-drbg": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { "hash.js": "^1.0.3", @@ -19753,37 +19777,44 @@ }, "inherits": { "version": "2.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "invert-kv": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-hex-prefixed": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", "dev": true }, "is-stream": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "keccak": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", "dev": true, "requires": { "node-addon-api": "^2.0.0", @@ -19792,7 +19823,8 @@ }, "lcid": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { "invert-kv": "^2.0.0" @@ -19800,7 +19832,8 @@ }, "locate-path": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -19809,7 +19842,8 @@ }, "map-age-cleaner": { "version": "0.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { "p-defer": "^1.0.0" @@ -19817,7 +19851,8 @@ }, "md5.js": { "version": "1.3.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { "hash-base": "^3.0.0", @@ -19827,7 +19862,8 @@ }, "mem": { "version": "4.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", @@ -19837,37 +19873,44 @@ }, "mimic-fn": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimalistic-assert": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, "minimalistic-crypto-utils": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", "dev": true }, "nice-try": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node-addon-api": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", "dev": true }, "node-gyp-build": { "version": "4.2.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", "dev": true }, "npm-run-path": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "^2.0.0" @@ -19875,7 +19918,8 @@ }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" @@ -19883,7 +19927,8 @@ }, "os-locale": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { "execa": "^1.0.0", @@ -19893,22 +19938,26 @@ }, "p-defer": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, "p-finally": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-is-promise": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", "dev": true }, "p-limit": { "version": "2.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -19916,7 +19965,8 @@ }, "p-locate": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" @@ -19924,22 +19974,26 @@ }, "p-try": { "version": "2.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "path-exists": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-key": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "pbkdf2": { "version": "3.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -19951,7 +20005,8 @@ }, "pump": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -19960,7 +20015,8 @@ }, "randombytes": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -19968,7 +20024,8 @@ }, "readable-stream": { "version": "3.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -19978,17 +20035,20 @@ }, "require-directory": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "ripemd160": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { "hash-base": "^3.0.0", @@ -19997,7 +20057,8 @@ }, "rlp": { "version": "2.2.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", "dev": true, "requires": { "bn.js": "^4.11.1" @@ -20005,17 +20066,20 @@ }, "safe-buffer": { "version": "5.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "scrypt-js": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", "dev": true }, "secp256k1": { "version": "4.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", "dev": true, "requires": { "elliptic": "^6.5.2", @@ -20025,22 +20089,26 @@ }, "semver": { "version": "5.7.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "setimmediate": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, "sha.js": { "version": "2.4.11", - "bundled": true, + "resolved": false, + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -20049,7 +20117,8 @@ }, "shebang-command": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -20057,22 +20126,26 @@ }, "shebang-regex": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-support": { "version": "0.5.12", - "bundled": true, + "resolved": false, + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -20081,7 +20154,8 @@ }, "string-width": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -20091,7 +20165,8 @@ }, "string_decoder": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { "safe-buffer": "~5.2.0" @@ -20099,7 +20174,8 @@ }, "strip-ansi": { "version": "5.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -20107,12 +20183,14 @@ }, "strip-eof": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "strip-hex-prefix": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", "dev": true, "requires": { "is-hex-prefixed": "1.0.0" @@ -20120,12 +20198,14 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "which": { "version": "1.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -20133,12 +20213,14 @@ }, "which-module": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wrap-ansi": { "version": "5.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -20148,17 +20230,20 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "y18n": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yargs": { "version": "13.2.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", "dev": true, "requires": { "cliui": "^5.0.0", @@ -20176,7 +20261,8 @@ }, "yargs-parser": { "version": "13.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -32174,7 +32260,8 @@ "dependencies": { "JSONStream": { "version": "1.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -32182,57 +32269,70 @@ "dependencies": { "jsonparse": { "version": "1.3.0", - "bundled": true + "resolved": false, + "integrity": "sha1-hfwkWx2SWazGlBlguQWt9k594Og=" }, "through": { "version": "2.3.8", - "bundled": true + "resolved": false, + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" } } }, "abbrev": { "version": "1.1.0", - "bundled": true + "resolved": false, + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=" }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansicolors": { "version": "0.3.2", - "bundled": true + "resolved": false, + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" }, "ansistyles": { "version": "0.1.3", - "bundled": true + "resolved": false, + "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=" }, "aproba": { "version": "1.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=" }, "archy": { "version": "1.0.0", - "bundled": true + "resolved": false, + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" }, "asap": { "version": "2.0.5", - "bundled": true + "resolved": false, + "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8=" }, "bluebird": { "version": "3.5.0", - "bundled": true + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" }, "call-limit": { "version": "1.1.0", - "bundled": true + "resolved": false, + "integrity": "sha1-b9YbA/PaQqLNDsK2DwK9DnGZH+o=" }, "chownr": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, "cmd-shim": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", "requires": { "graceful-fs": "^4.1.2", "mkdirp": "~0.5.0" @@ -32240,7 +32340,8 @@ }, "columnify": { "version": "1.5.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", "requires": { "strip-ansi": "^3.0.0", "wcwidth": "^1.0.0" @@ -32248,21 +32349,24 @@ "dependencies": { "wcwidth": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-AtBZ/3qPx0Hg9rXaHmmytA2uym8=", "requires": { "defaults": "^1.0.0" }, "dependencies": { "defaults": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "requires": { "clone": "^1.0.2" }, "dependencies": { "clone": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" } } } @@ -32272,7 +32376,8 @@ }, "config-chain": { "version": "1.1.11", - "bundled": true, + "resolved": false, + "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", "requires": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -32280,17 +32385,20 @@ "dependencies": { "proto-list": { "version": "1.2.4", - "bundled": true + "resolved": false, + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" } } }, "debuglog": { "version": "1.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" }, "dezalgo": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "requires": { "asap": "^2.0.0", "wrappy": "1" @@ -32298,11 +32406,13 @@ }, "editor": { "version": "1.0.0", - "bundled": true + "resolved": false, + "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=" }, "fs-vacuum": { "version": "1.2.10", - "bundled": true, + "resolved": false, + "integrity": "sha1-t2Kb7AekAxolSP35n17PHMizHjY=", "requires": { "graceful-fs": "^4.1.2", "path-is-inside": "^1.0.1", @@ -32311,7 +32421,8 @@ }, "fs-write-stream-atomic": { "version": "1.0.10", - "bundled": true, + "resolved": false, + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "requires": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -32321,7 +32432,8 @@ }, "fstream": { "version": "1.0.11", - "bundled": true, + "resolved": false, + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -32331,7 +32443,8 @@ }, "fstream-npm": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-0sPIkQE0aYLWTlcJHDhIe9qRb84=", "requires": { "fstream-ignore": "^1.0.0", "inherits": "2" @@ -32339,7 +32452,8 @@ "dependencies": { "fstream-ignore": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "requires": { "fstream": "^1.0.0", "inherits": "2", @@ -32348,14 +32462,16 @@ "dependencies": { "minimatch": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "requires": { "brace-expansion": "^1.0.0" }, "dependencies": { "brace-expansion": { "version": "1.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", "requires": { "balanced-match": "^0.4.1", "concat-map": "0.0.1" @@ -32363,11 +32479,13 @@ "dependencies": { "balanced-match": { "version": "0.4.2", - "bundled": true + "resolved": false, + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" }, "concat-map": { "version": "0.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" } } } @@ -32379,7 +32497,8 @@ }, "glob": { "version": "7.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -32391,18 +32510,21 @@ "dependencies": { "fs.realpath": { "version": "1.0.0", - "bundled": true + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "minimatch": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "requires": { "brace-expansion": "^1.0.0" }, "dependencies": { "brace-expansion": { "version": "1.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", "requires": { "balanced-match": "^0.4.1", "concat-map": "0.0.1" @@ -32410,11 +32532,13 @@ "dependencies": { "balanced-match": { "version": "0.4.2", - "bundled": true + "resolved": false, + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" }, "concat-map": { "version": "0.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" } } } @@ -32422,33 +32546,40 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" } } }, "graceful-fs": { "version": "4.1.11", - "bundled": true + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "has-unicode": { "version": "2.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "hosted-git-info": { "version": "2.4.2", - "bundled": true + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", + "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=" }, "iferr": { "version": "0.1.5", - "bundled": true + "resolved": false, + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "imurmurhash": { "version": "0.1.4", - "bundled": true + "resolved": false, + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -32456,15 +32587,18 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "resolved": false, + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.4", - "bundled": true + "resolved": false, + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" }, "init-package-json": { "version": "1.10.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-zYc6FneWvvuZYSsodioLY5P9j2o=", "requires": { "glob": "^7.1.1", "npm-package-arg": "^4.0.0 || ^5.0.0", @@ -32478,7 +32612,8 @@ "dependencies": { "promzard": { "version": "0.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", "requires": { "read": "1" } @@ -32487,19 +32622,23 @@ }, "lazy-property": { "version": "1.0.0", - "bundled": true + "resolved": false, + "integrity": "sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=" }, "lockfile": { "version": "1.0.3", - "bundled": true + "resolved": false, + "integrity": "sha1-Jjj8OaAzHpysGgS3F5mTHJxQ33k=" }, "lodash._baseindexof": { "version": "3.1.0", - "bundled": true + "resolved": false, + "integrity": "sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=" }, "lodash._baseuniq": { "version": "4.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=", "requires": { "lodash._createset": "~4.0.0", "lodash._root": "~3.0.0" @@ -32507,56 +32646,68 @@ "dependencies": { "lodash._createset": { "version": "4.0.3", - "bundled": true + "resolved": false, + "integrity": "sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=" }, "lodash._root": { "version": "3.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" } } }, "lodash._bindcallback": { "version": "3.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" }, "lodash._cacheindexof": { "version": "3.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=" }, "lodash._createcache": { "version": "3.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", "requires": { "lodash._getnative": "^3.0.0" } }, "lodash._getnative": { "version": "3.9.1", - "bundled": true + "resolved": false, + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" }, "lodash.clonedeep": { "version": "4.5.0", - "bundled": true + "resolved": false, + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" }, "lodash.restparam": { "version": "3.6.1", - "bundled": true + "resolved": false, + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" }, "lodash.union": { "version": "4.6.0", - "bundled": true + "resolved": false, + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" }, "lodash.uniq": { "version": "4.5.0", - "bundled": true + "resolved": false, + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "lodash.without": { "version": "4.4.0", - "bundled": true + "resolved": false, + "integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=" }, "mississippi": { "version": "1.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-1.3.0.tgz", + "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=", "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -32572,7 +32723,8 @@ "dependencies": { "concat-stream": { "version": "1.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "requires": { "inherits": "^2.0.3", "readable-stream": "^2.2.2", @@ -32581,13 +32733,15 @@ "dependencies": { "typedarray": { "version": "0.0.6", - "bundled": true + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" } } }, "duplexify": { "version": "3.5.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.0.tgz", + "integrity": "sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=", "requires": { "end-of-stream": "1.0.0", "inherits": "^2.0.1", @@ -32597,14 +32751,16 @@ "dependencies": { "end-of-stream": { "version": "1.0.0", - "bundled": true, + "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" }, "dependencies": { "once": { "version": "1.3.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "requires": { "wrappy": "1" } @@ -32613,20 +32769,23 @@ }, "stream-shift": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" } } }, "end-of-stream": { "version": "1.1.0", - "bundled": true, + "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" }, "dependencies": { "once": { "version": "1.3.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "requires": { "wrappy": "1" } @@ -32635,7 +32794,8 @@ }, "flush-write-stream": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.4" @@ -32643,7 +32803,8 @@ }, "from2": { "version": "2.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -32651,7 +32812,8 @@ }, "parallel-transform": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "requires": { "cyclist": "~0.2.2", "inherits": "^2.0.3", @@ -32660,13 +32822,15 @@ "dependencies": { "cyclist": { "version": "0.2.2", - "bundled": true + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" } } }, "pump": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", + "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -32674,7 +32838,8 @@ }, "pumpify": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz", + "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", "requires": { "duplexify": "^3.1.2", "inherits": "^2.0.1", @@ -32683,7 +32848,8 @@ }, "stream-each": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.0.tgz", + "integrity": "sha1-HpXUdXP1gNgU3A/4zQ9m8c5TyZE=", "requires": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -32691,13 +32857,15 @@ "dependencies": { "stream-shift": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" } } }, "through2": { "version": "2.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" @@ -32705,7 +32873,8 @@ "dependencies": { "xtend": { "version": "4.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } } @@ -32713,20 +32882,23 @@ }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" }, "dependencies": { "minimist": { "version": "0.0.8", - "bundled": true + "resolved": false, + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } }, "move-concurrently": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "requires": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -32738,7 +32910,8 @@ "dependencies": { "copy-concurrently": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-Rft4ZiSaHKiJqlcI5svSc+dbslA=", "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -32750,7 +32923,8 @@ }, "run-queue": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { "aproba": "^1.1.1" } @@ -32759,7 +32933,8 @@ }, "node-gyp": { "version": "3.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.0.tgz", + "integrity": "sha1-dHT2OjoFARYd2gtjQfAi8UxCP6Y=", "requires": { "fstream": "^1.0.0", "glob": "^7.0.3", @@ -32778,14 +32953,16 @@ "dependencies": { "minimatch": { "version": "3.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "requires": { "brace-expansion": "^1.0.0" }, "dependencies": { "brace-expansion": { "version": "1.1.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", "requires": { "balanced-match": "^0.4.1", "concat-map": "0.0.1" @@ -32793,11 +32970,13 @@ "dependencies": { "balanced-match": { "version": "0.4.2", - "bundled": true + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" }, "concat-map": { "version": "0.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" } } } @@ -32805,7 +32984,8 @@ }, "nopt": { "version": "3.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { "abbrev": "1" } @@ -32814,7 +32994,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "requires": { "abbrev": "1", "osenv": "^0.1.4" @@ -32822,7 +33003,8 @@ "dependencies": { "osenv": { "version": "0.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -32830,11 +33012,13 @@ "dependencies": { "os-homedir": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-tmpdir": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" } } } @@ -32842,11 +33026,13 @@ }, "normalize-git-url": { "version": "3.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-jl8Uvgva7bc+ByADEKpBbCc1D8Q=" }, "normalize-package-data": { "version": "2.3.8", - "bundled": true, + "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", "is-builtin-module": "^1.0.0", @@ -32856,14 +33042,16 @@ "dependencies": { "is-builtin-module": { "version": "1.0.0", - "bundled": true, + "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" }, "dependencies": { "builtin-modules": { "version": "1.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" } } } @@ -32871,18 +33059,20 @@ }, "npm-cache-filename": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=" }, "npm-install-checks": { "version": "3.0.0", - "bundled": true, + "integrity": "sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc=", "requires": { "semver": "^2.3.0 || 3.x || 4 || 5" } }, "npm-package-arg": { "version": "4.2.1", - "bundled": true, + "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", "semver": "^5.1.0" @@ -32890,7 +33080,8 @@ }, "npm-registry-client": { "version": "8.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-gxR2RVQjygomXG/9thAPzAQrNs8=", "requires": { "concat-stream": "^1.5.2", "graceful-fs": "^4.1.6", @@ -32906,7 +33097,8 @@ "dependencies": { "concat-stream": { "version": "1.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "requires": { "inherits": "^2.0.3", "readable-stream": "^2.2.2", @@ -32915,7 +33107,8 @@ "dependencies": { "typedarray": { "version": "0.0.6", - "bundled": true + "resolved": false, + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" } } } @@ -32923,11 +33116,13 @@ }, "npm-user-validate": { "version": "0.1.5", - "bundled": true + "resolved": false, + "integrity": "sha1-UkZdUMLSApSlcSW5lrrtv1bFAEs=" }, "npmlog": { "version": "4.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz", + "integrity": "sha1-0DlQ4OeM4VJ7om0qdZLpNIrD518=", "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -32937,7 +33132,8 @@ "dependencies": { "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "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", "readable-stream": "^2.0.6" @@ -32945,17 +33141,20 @@ "dependencies": { "delegates": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" } } }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -32969,15 +33168,18 @@ "dependencies": { "object-assign": { "version": "4.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "signal-exit": { "version": "3.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -32986,18 +33188,21 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "bundled": true + "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", - "bundled": true, + "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" }, "dependencies": { "number-is-nan": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } } @@ -33005,7 +33210,8 @@ }, "wide-align": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", + "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", "requires": { "string-width": "^1.0.1" } @@ -33014,24 +33220,28 @@ }, "set-blocking": { "version": "2.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" } } }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" } }, "opener": { "version": "1.4.3", - "bundled": true + "resolved": false, + "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=" }, "osenv": { "version": "0.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -33039,41 +33249,48 @@ "dependencies": { "os-homedir": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-tmpdir": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" } } }, "path-is-inside": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "read": { "version": "1.0.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "requires": { "mute-stream": "~0.0.4" }, "dependencies": { "mute-stream": { "version": "0.0.5", - "bundled": true + "resolved": false, + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" } } }, "read-cmd-shim": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", "requires": { "graceful-fs": "^4.1.2" } }, "read-installed": { "version": "4.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", "requires": { "debuglog": "^1.0.1", "graceful-fs": "^4.1.2", @@ -33086,13 +33303,15 @@ "dependencies": { "util-extend": { "version": "1.0.3", - "bundled": true + "resolved": false, + "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=" } } }, "read-package-json": { "version": "2.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.5.tgz", + "integrity": "sha1-+Tpk5kFSnfaKCMZN5GOJ6KP4iEU=", "requires": { "glob": "^7.1.1", "graceful-fs": "^4.1.2", @@ -33102,14 +33321,16 @@ "dependencies": { "json-parse-helpfulerror": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", "requires": { "jju": "^1.1.0" }, "dependencies": { "jju": { "version": "1.3.0", - "bundled": true + "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz", + "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=" } } } @@ -33117,7 +33338,8 @@ }, "read-package-tree": { "version": "5.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.1.5.tgz", + "integrity": "sha1-rOfmOBx2hPlwqqmPx8XStmat2rY=", "requires": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", @@ -33128,7 +33350,8 @@ }, "readable-stream": { "version": "2.2.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", "requires": { "buffer-shims": "~1.0.0", "core-util-is": "~1.0.0", @@ -33141,36 +33364,43 @@ "dependencies": { "buffer-shims": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" }, "core-util-is": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "isarray": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "process-nextick-args": { "version": "1.0.7", - "bundled": true + "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", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=", "requires": { "buffer-shims": "~1.0.0" } }, "util-deprecate": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" } } }, "readdir-scoped-modules": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", "requires": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", @@ -33180,7 +33410,8 @@ }, "realize-package-specifier": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-0N74gpUrjeP2frpekRmWYScfQfQ=", "requires": { "dezalgo": "^1.0.1", "npm-package-arg": "^4.1.1" @@ -33188,7 +33419,8 @@ }, "request": { "version": "2.81.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "requires": { "aws-sign2": "~0.6.0", "aws4": "^1.2.1", @@ -33216,40 +33448,48 @@ "dependencies": { "aws-sign2": { "version": "0.6.0", - "bundled": true + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" }, "aws4": { "version": "1.6.0", - "bundled": true + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, "caseless": { "version": "0.12.0", - "bundled": true + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "combined-stream": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { "delayed-stream": "~1.0.0" }, "dependencies": { "delayed-stream": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" } } }, "extend": { "version": "3.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" }, "forever-agent": { "version": "0.6.1", - "bundled": true + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz", + "integrity": "sha1-icNTQAi5fq2ky7FX1Y9vXfAl6uQ=", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.5", @@ -33258,13 +33498,15 @@ "dependencies": { "asynckit": { "version": "0.4.0", - "bundled": true + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" } } }, "har-validator": { "version": "4.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "requires": { "ajv": "^4.9.1", "har-schema": "^1.0.5" @@ -33272,7 +33514,8 @@ "dependencies": { "ajv": { "version": "4.11.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.4.tgz", + "integrity": "sha1-6/OlXUsTLqYP9YR66F0u8GmWC0U=", "requires": { "co": "^4.6.0", "json-stable-stringify": "^1.0.1" @@ -33280,18 +33523,21 @@ "dependencies": { "co": { "version": "4.6.0", - "bundled": true + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "json-stable-stringify": { "version": "1.0.1", - "bundled": true, + "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" }, "dependencies": { "jsonify": { "version": "0.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" } } } @@ -33299,13 +33545,15 @@ }, "har-schema": { "version": "1.0.5", - "bundled": true + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" } } }, "hawk": { "version": "3.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { "boom": "2.x.x", "cryptiles": "2.x.x", @@ -33315,25 +33563,29 @@ "dependencies": { "boom": { "version": "2.10.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { "hoek": "2.x.x" } }, "cryptiles": { "version": "2.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "requires": { "boom": "2.x.x" } }, "hoek": { "version": "2.16.3", - "bundled": true + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, "sntp": { "version": "1.0.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "requires": { "hoek": "2.x.x" } @@ -33342,7 +33594,8 @@ }, "http-signature": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "requires": { "assert-plus": "^0.2.0", "jsprim": "^1.2.2", @@ -33351,11 +33604,13 @@ "dependencies": { "assert-plus": { "version": "0.2.0", - "bundled": true + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" }, "jsprim": { "version": "1.3.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz", + "integrity": "sha1-KnJW9wQSop7jZwqspiWZTE3P8lI=", "requires": { "extsprintf": "1.0.2", "json-schema": "0.2.3", @@ -33364,15 +33619,18 @@ "dependencies": { "extsprintf": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" }, "json-schema": { "version": "0.2.3", - "bundled": true + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "verror": { "version": "1.3.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", "requires": { "extsprintf": "1.0.2" } @@ -33381,7 +33639,8 @@ }, "sshpk": { "version": "1.11.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.11.0.tgz", + "integrity": "sha1-LY1eu0pvqyj/ujf6YqkPSj6lnXc=", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -33396,15 +33655,18 @@ "dependencies": { "asn1": { "version": "0.2.3", - "bundled": true + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "assert-plus": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "bcrypt-pbkdf": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { "tweetnacl": "^0.14.3" @@ -33412,14 +33674,16 @@ }, "dashdash": { "version": "1.14.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { "assert-plus": "^1.0.0" } }, "ecc-jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { "jsbn": "~0.1.0" @@ -33427,14 +33691,16 @@ }, "getpass": { "version": "0.1.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", + "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", "requires": { "assert-plus": "^1.0.0" } }, "jodid25519": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", "optional": true, "requires": { "jsbn": "~0.1.0" @@ -33442,12 +33708,14 @@ }, "jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, "tweetnacl": { "version": "0.14.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true } } @@ -33456,65 +33724,78 @@ }, "is-typedarray": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "isstream": { "version": "0.1.2", - "bundled": true + "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", - "bundled": true + "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", - "bundled": true, + "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" }, "dependencies": { "mime-db": { "version": "1.26.0", - "bundled": true + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz", + "integrity": "sha1-6v/NDk/Gk1z4E02iRuLmw1MFrf8=" } } }, "oauth-sign": { "version": "0.8.2", - "bundled": true + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "performance-now": { "version": "0.2.0", - "bundled": true + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" }, "qs": { "version": "6.4.0", - "bundled": true + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" }, "safe-buffer": { "version": "5.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" }, "stringstream": { "version": "0.0.5", - "bundled": true + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "tough-cookie": { "version": "2.3.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", "requires": { "punycode": "^1.4.1" }, "dependencies": { "punycode": { "version": "1.4.1", - "bundled": true + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" } } }, "tunnel-agent": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { "safe-buffer": "^5.0.1" } @@ -33523,22 +33804,26 @@ }, "retry": { "version": "0.10.1", - "bundled": true + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" }, "rimraf": { "version": "2.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "requires": { "glob": "^7.0.5" } }, "semver": { "version": "5.3.0", - "bundled": true + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" }, "sha": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-YDCCL70smCOUn49y7WQR7lzyWq4=", "requires": { "graceful-fs": "^4.1.2", "readable-stream": "^2.0.2" @@ -33546,15 +33831,18 @@ }, "slide": { "version": "1.1.6", - "bundled": true + "resolved": false, + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" }, "sorted-object": { "version": "2.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=" }, "sorted-union-stream": { "version": "2.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=", "requires": { "from2": "^1.3.0", "stream-iterate": "^1.1.0" @@ -33562,7 +33850,8 @@ "dependencies": { "from2": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=", "requires": { "inherits": "~2.0.1", "readable-stream": "~1.1.10" @@ -33570,7 +33859,8 @@ "dependencies": { "readable-stream": { "version": "1.1.14", - "bundled": true, + "resolved": false, + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -33580,15 +33870,18 @@ "dependencies": { "core-util-is": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "isarray": { "version": "0.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "string_decoder": { "version": "0.10.31", - "bundled": true + "resolved": false, + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } } @@ -33596,20 +33889,23 @@ }, "stream-iterate": { "version": "1.1.1", - "bundled": true + "resolved": false, + "integrity": "sha1-XX0ZeqUryeJxtEVHyeOIsrGzODY=" } } }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" } }, "tar": { "version": "2.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { "block-stream": "*", "fstream": "^1.0.2", @@ -33618,7 +33914,8 @@ "dependencies": { "block-stream": { "version": "0.0.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz", + "integrity": "sha1-Boj0baK7+c/wxPaCJaDLlcvopGs=", "requires": { "inherits": "~2.0.0" } @@ -33627,26 +33924,31 @@ }, "text-table": { "version": "0.2.0", - "bundled": true + "resolved": false, + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "uid-number": { "version": "0.0.6", - "bundled": true + "resolved": false, + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" }, "umask": { "version": "1.1.0", - "bundled": true + "resolved": false, + "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=" }, "unique-filename": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", "requires": { "unique-slug": "^2.0.0" }, "dependencies": { "unique-slug": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", "requires": { "imurmurhash": "^0.1.4" } @@ -33655,11 +33957,13 @@ }, "unpipe": { "version": "1.0.0", - "bundled": true + "resolved": false, + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "update-notifier": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.1.0.tgz", + "integrity": "sha1-7AweU1NrdmR6JLd8uDlm2TFRI9k=", "requires": { "boxen": "^1.0.0", "chalk": "^1.0.0", @@ -33673,7 +33977,8 @@ "dependencies": { "boxen": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.0.0.tgz", + "integrity": "sha1-smlLrx9gX3CP8Bd8Ehk7IvKaqqs=", "requires": { "ansi-align": "^1.1.0", "camelcase": "^4.0.0", @@ -33686,14 +33991,16 @@ "dependencies": { "ansi-align": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", + "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=", "requires": { "string-width": "^1.0.1" }, "dependencies": { "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -33702,18 +34009,21 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "bundled": true + "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", - "bundled": true, + "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" }, "dependencies": { "number-is-nan": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } } @@ -33723,15 +34033,18 @@ }, "camelcase": { "version": "4.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.0.0.tgz", + "integrity": "sha1-iw+Q1Evl4oG5A7mIc0m5JZXvB/I=" }, "cli-boxes": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "string-width": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^3.0.0" @@ -33739,20 +34052,23 @@ "dependencies": { "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true + "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", - "bundled": true, + "resolved": "https://registry.npmjs.org/term-size/-/term-size-0.1.1.tgz", + "integrity": "sha1-hzYLljlsq1dgljcUzaDQy+7K2co=", "requires": { "execa": "^0.4.0" }, "dependencies": { "execa": { "version": "0.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz", + "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=", "requires": { "cross-spawn-async": "^2.1.1", "is-stream": "^1.1.0", @@ -33764,7 +34080,8 @@ "dependencies": { "cross-spawn-async": { "version": "2.2.5", - "bundled": true, + "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", "which": "^1.2.8" @@ -33772,7 +34089,8 @@ "dependencies": { "lru-cache": { "version": "4.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", "requires": { "pseudomap": "^1.0.1", "yallist": "^2.0.0" @@ -33780,11 +34098,13 @@ "dependencies": { "pseudomap": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "yallist": { "version": "2.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", + "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=" } } } @@ -33792,26 +34112,31 @@ }, "is-stream": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "npm-run-path": { "version": "1.0.0", - "bundled": true, + "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" } }, "object-assign": { "version": "4.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "path-key": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", + "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=" }, "strip-eof": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" } } } @@ -33819,14 +34144,16 @@ }, "widest-line": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", "requires": { "string-width": "^1.0.1" }, "dependencies": { "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -33835,18 +34162,21 @@ "dependencies": { "code-point-at": { "version": "1.1.0", - "bundled": true + "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", - "bundled": true, + "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" }, "dependencies": { "number-is-nan": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" } } } @@ -33858,7 +34188,8 @@ }, "chalk": { "version": "1.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -33869,28 +34200,33 @@ "dependencies": { "ansi-styles": { "version": "2.2.1", - "bundled": true + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "escape-string-regexp": { "version": "1.0.5", - "bundled": true + "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", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { "ansi-regex": "^2.0.0" } }, "supports-color": { "version": "2.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, "configstore": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.0.0.tgz", + "integrity": "sha1-4bhmnBgDzMULVF6S+ObnmqgOAZY=", "requires": { "dot-prop": "^4.1.0", "graceful-fs": "^4.1.2", @@ -33902,27 +34238,31 @@ "dependencies": { "dot-prop": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", + "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=", "requires": { "is-obj": "^1.0.0" }, "dependencies": { "is-obj": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" } } }, "unique-string": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { "crypto-random-string": "^1.0.0" }, "dependencies": { "crypto-random-string": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" } } } @@ -33930,18 +34270,21 @@ }, "is-npm": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "latest-version": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.0.0.tgz", + "integrity": "sha1-MQTwCMDDkQhBB/haNEvGHjiXBkk=", "requires": { "package-json": "^3.0.0" }, "dependencies": { "package-json": { "version": "3.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/package-json/-/package-json-3.1.0.tgz", + "integrity": "sha1-zigZAP6AUhUMxnCcbABsGP2y83k=", "requires": { "got": "^6.7.1", "registry-auth-token": "^3.0.1", @@ -33951,7 +34294,8 @@ "dependencies": { "got": { "version": "6.7.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "requires": { "create-error-class": "^3.0.0", "duplexer3": "^0.1.4", @@ -33968,63 +34312,76 @@ "dependencies": { "create-error-class": { "version": "3.0.2", - "bundled": true, + "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" }, "dependencies": { "capture-stack-trace": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" } } }, "duplexer3": { "version": "0.1.4", - "bundled": true + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "get-stream": { "version": "3.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "is-redirect": { "version": "1.0.0", - "bundled": true + "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", - "bundled": true + "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", - "bundled": true + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "lowercase-keys": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, "safe-buffer": { "version": "5.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" }, "timed-out": { "version": "4.0.1", - "bundled": true + "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", - "bundled": true + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" }, "url-parse-lax": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { "prepend-http": "^1.0.1" }, "dependencies": { "prepend-http": { "version": "1.0.4", - "bundled": true + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" } } } @@ -34032,14 +34389,16 @@ }, "registry-auth-token": { "version": "3.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.1.0.tgz", + "integrity": "sha1-mXwIJW4MeZmDe5DpRNs52KeQJ2s=", "requires": { "rc": "^1.1.6" }, "dependencies": { "rc": { "version": "1.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.7.tgz", + "integrity": "sha1-xepWS7B6/5/TpbMukGwdOmWUD+o=", "requires": { "deep-extend": "~0.4.0", "ini": "~1.3.0", @@ -34049,15 +34408,18 @@ "dependencies": { "deep-extend": { "version": "0.4.1", - "bundled": true + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", + "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=" }, "minimist": { "version": "1.2.0", - "bundled": true + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "strip-json-comments": { "version": "2.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" } } } @@ -34065,14 +34427,16 @@ }, "registry-url": { "version": "3.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { "rc": "^1.0.1" }, "dependencies": { "rc": { "version": "1.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.7.tgz", + "integrity": "sha1-xepWS7B6/5/TpbMukGwdOmWUD+o=", "requires": { "deep-extend": "~0.4.0", "ini": "~1.3.0", @@ -34082,15 +34446,18 @@ "dependencies": { "deep-extend": { "version": "0.4.1", - "bundled": true + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", + "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=" }, "minimist": { "version": "1.2.0", - "bundled": true + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "strip-json-comments": { "version": "2.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" } } } @@ -34102,28 +34469,33 @@ }, "lazy-req": { "version": "2.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-2.0.0.tgz", + "integrity": "sha1-yUUKNj7N2i5vDHATKtTzf48G8rQ=" }, "semver-diff": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { "semver": "^5.0.3" } }, "xdg-basedir": { "version": "3.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" } } }, "uuid": { "version": "3.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" }, "validate-npm-package-license": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "requires": { "spdx-correct": "~1.0.0", "spdx-expression-parse": "~1.0.0" @@ -34131,20 +34503,23 @@ "dependencies": { "spdx-correct": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "requires": { "spdx-license-ids": "^1.0.2" }, "dependencies": { "spdx-license-ids": { "version": "1.2.0", - "bundled": true + "resolved": false, + "integrity": "sha1-tUndD2Pct0Whfi6joHQC4OMy0eI=" } } }, "spdx-expression-parse": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-1SsUtelnB3FECvIlvLVjEirEUvY=", "requires": { "spdx-exceptions": "^1.0.4", "spdx-license-ids": "^1.0.0" @@ -34152,11 +34527,12 @@ "dependencies": { "spdx-exceptions": { "version": "1.0.4", - "bundled": true + "resolved": false, + "integrity": "sha1-IguEI5EZrpBFqJLbgag/TOFvgP0=" }, "spdx-license-ids": { "version": "1.2.0", - "bundled": true + "resolved": false } } } @@ -34164,37 +34540,43 @@ }, "validate-npm-package-name": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", "requires": { "builtins": "^1.0.3" }, "dependencies": { "builtins": { "version": "1.0.3", - "bundled": true + "resolved": false, + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" } } }, "which": { "version": "1.2.14", - "bundled": true, + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", "requires": { "isexe": "^2.0.0" }, "dependencies": { "isexe": { "version": "2.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" } } }, "wrappy": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "1.3.3", - "bundled": true, + "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", "imurmurhash": "^0.1.4", @@ -34335,17 +34717,20 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "cross-spawn": { "version": "5.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { "lru-cache": "^4.0.1", @@ -34355,12 +34740,14 @@ }, "decamelize": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "execa": { "version": "0.7.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { "cross-spawn": "^5.0.1", @@ -34374,7 +34761,8 @@ }, "find-up": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { "locate-path": "^2.0.0" @@ -34382,22 +34770,26 @@ }, "get-caller-file": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, "get-stream": { "version": "3.0.0", - "bundled": true, + "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", - "bundled": true, + "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", - "bundled": true, + "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" @@ -34405,17 +34797,20 @@ }, "is-stream": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "lcid": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { "invert-kv": "^1.0.0" @@ -34423,7 +34818,8 @@ }, "locate-path": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "^2.0.0", @@ -34432,7 +34828,8 @@ }, "lru-cache": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -34441,7 +34838,8 @@ }, "mem": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { "mimic-fn": "^1.0.0" @@ -34449,17 +34847,20 @@ }, "mimic-fn": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", "dev": true }, "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -34467,7 +34868,8 @@ }, "npm-run-path": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "^2.0.0" @@ -34475,12 +34877,14 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "os-locale": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { "execa": "^0.7.0", @@ -34490,17 +34894,20 @@ }, "p-finally": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-limit": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", "dev": true }, "p-locate": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { "p-limit": "^1.1.0" @@ -34508,37 +34915,44 @@ }, "path-exists": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-key": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "pseudomap": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, "require-directory": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "shebang-command": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -34546,17 +34960,20 @@ }, "shebang-regex": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "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", @@ -34566,7 +34983,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -34574,12 +34992,14 @@ }, "strip-eof": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "which": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -34587,12 +35007,14 @@ }, "which-module": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wrap-ansi": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { "string-width": "^1.0.1", @@ -34601,17 +35023,20 @@ }, "y18n": { "version": "3.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, "yallist": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, "yargs": { "version": "10.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.0.3.tgz", + "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==", "dev": true, "requires": { "cliui": "^3.2.0", @@ -34630,12 +35055,14 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "cliui": { "version": "3.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { "string-width": "^1.0.1", @@ -34645,7 +35072,8 @@ "dependencies": { "string-width": { "version": "1.0.2", - "bundled": true, + "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", @@ -34657,7 +35085,8 @@ }, "string-width": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -34666,12 +35095,14 @@ "dependencies": { "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "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", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -34683,7 +35114,8 @@ }, "yargs-parser": { "version": "8.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.0.0.tgz", + "integrity": "sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY=", "dev": true, "requires": { "camelcase": "^4.1.0" @@ -34691,7 +35123,8 @@ "dependencies": { "camelcase": { "version": "4.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true } } @@ -34963,12 +35396,14 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "append-transform": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { "default-require-extensions": "^2.0.0" @@ -34976,17 +35411,20 @@ }, "archy": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, "arrify": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "async": { "version": "2.6.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "dev": true, "requires": { "lodash": "^4.17.11" @@ -34994,12 +35432,14 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": false, + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -35008,7 +35448,8 @@ }, "caching-transform": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-Y1KTLNwSPd4ljsDrFOtyXVmm7Gnk42yQitNq43AhE+cwUR/e4T+rmOHs1IPtzBg8066GBJfTOj1rQYFSWSsH2g==", "dev": true, "requires": { "hasha": "^3.0.0", @@ -35019,12 +35460,14 @@ }, "camelcase": { "version": "5.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", "dev": true }, "cliui": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { "string-width": "^2.1.1", @@ -35034,28 +35477,33 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "commander": { "version": "2.17.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true, "optional": true }, "commondir": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "convert-source-map": { "version": "1.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -35063,7 +35511,8 @@ }, "cross-spawn": { "version": "4.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "dev": true, "requires": { "lru-cache": "^4.0.1", @@ -35072,7 +35521,8 @@ }, "debug": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -35080,12 +35530,14 @@ }, "decamelize": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "default-require-extensions": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "dev": true, "requires": { "strip-bom": "^3.0.0" @@ -35093,7 +35545,8 @@ }, "end-of-stream": { "version": "1.4.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -35101,7 +35554,8 @@ }, "error-ex": { "version": "1.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" @@ -35109,12 +35563,14 @@ }, "es6-error": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, "execa": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "^6.0.0", @@ -35128,7 +35584,8 @@ "dependencies": { "cross-spawn": { "version": "6.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -35142,7 +35599,8 @@ }, "find-cache-dir": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -35152,7 +35610,8 @@ }, "find-up": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" @@ -35160,7 +35619,8 @@ }, "foreground-child": { "version": "1.5.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { "cross-spawn": "^4", @@ -35169,17 +35629,20 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "get-caller-file": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "get-stream": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" @@ -35187,7 +35650,8 @@ }, "glob": { "version": "7.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -35200,12 +35664,14 @@ }, "graceful-fs": { "version": "4.1.15", - "bundled": true, + "resolved": false, + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, "handlebars": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", "dev": true, "requires": { "async": "^2.5.0", @@ -35216,19 +35682,22 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "has-flag": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "hasha": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", "dev": true, "requires": { "is-stream": "^1.0.1" @@ -35236,17 +35705,20 @@ }, "hosted-git-info": { "version": "2.7.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, "imurmurhash": { "version": "0.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -35255,42 +35727,50 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "invert-kv": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "is-arrayish": { "version": "0.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-stream": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "istanbul-lib-coverage": { "version": "2.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", "dev": true }, "istanbul-lib-hook": { "version": "2.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA==", "dev": true, "requires": { "append-transform": "^1.0.0" @@ -35327,7 +35807,8 @@ }, "istanbul-lib-report": { "version": "2.0.4", - "bundled": true, + "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": { "istanbul-lib-coverage": "^2.0.3", @@ -35337,7 +35818,8 @@ "dependencies": { "supports-color": { "version": "6.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -35347,7 +35829,8 @@ }, "istanbul-lib-source-maps": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz", + "integrity": "sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ==", "dev": true, "requires": { "debug": "^4.1.1", @@ -35359,14 +35842,16 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "istanbul-reports": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.1.1.tgz", + "integrity": "sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw==", "dev": true, "requires": { "handlebars": "^4.1.0" @@ -35374,12 +35859,14 @@ }, "json-parse-better-errors": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "lcid": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { "invert-kv": "^2.0.0" @@ -35387,7 +35874,8 @@ }, "load-json-file": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -35398,7 +35886,8 @@ }, "locate-path": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -35407,17 +35896,20 @@ }, "lodash": { "version": "4.17.11", - "bundled": true, + "resolved": false, + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "lodash.flattendeep": { "version": "4.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, "lru-cache": { "version": "4.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -35426,7 +35918,8 @@ }, "make-dir": { "version": "1.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { "pify": "^3.0.0" @@ -35434,7 +35927,8 @@ }, "map-age-cleaner": { "version": "0.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { "p-defer": "^1.0.0" @@ -35442,7 +35936,8 @@ }, "mem": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", @@ -35452,7 +35947,8 @@ }, "merge-source-map": { "version": "1.1.0", - "bundled": true, + "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": { "source-map": "^0.6.1" @@ -35460,19 +35956,22 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "mimic-fn": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -35480,12 +35979,14 @@ }, "minimist": { "version": "0.0.10", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -35493,24 +35994,28 @@ "dependencies": { "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, "ms": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "nice-try": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "normalize-package-data": { "version": "2.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", @@ -35521,7 +36026,8 @@ }, "npm-run-path": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "^2.0.0" @@ -35529,12 +36035,14 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" @@ -35542,7 +36050,8 @@ }, "optimist": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { "minimist": "~0.0.1", @@ -35551,12 +36060,14 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-locale": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { "execa": "^1.0.0", @@ -35566,22 +36077,26 @@ }, "p-defer": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, "p-finally": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-is-promise": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", "dev": true }, "p-limit": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -35589,7 +36104,8 @@ }, "p-locate": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" @@ -35597,12 +36113,14 @@ }, "p-try": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, "package-hash": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", "dev": true, "requires": { "graceful-fs": "^4.1.15", @@ -35613,7 +36131,8 @@ }, "parse-json": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { "error-ex": "^1.3.1", @@ -35622,27 +36141,32 @@ }, "path-exists": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-parse": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-type": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { "pify": "^3.0.0" @@ -35650,12 +36174,14 @@ }, "pify": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "pkg-dir": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { "find-up": "^3.0.0" @@ -35663,12 +36189,14 @@ }, "pseudomap": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, "pump": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -35677,7 +36205,8 @@ }, "read-pkg": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { "load-json-file": "^4.0.0", @@ -35687,7 +36216,8 @@ }, "read-pkg-up": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "requires": { "find-up": "^3.0.0", @@ -35696,7 +36226,8 @@ }, "release-zalgo": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", "dev": true, "requires": { "es6-error": "^4.0.1" @@ -35704,17 +36235,20 @@ }, "require-directory": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "resolve": { "version": "1.10.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -35722,12 +36256,14 @@ }, "resolve-from": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "rimraf": { "version": "2.6.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -35735,22 +36271,26 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "semver": { "version": "5.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "shebang-command": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -35758,17 +36298,20 @@ }, "shebang-regex": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "spawn-wrap": { "version": "1.4.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", "dev": true, "requires": { "foreground-child": "^1.5.6", @@ -35781,7 +36324,8 @@ }, "spdx-correct": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -35790,12 +36334,14 @@ }, "spdx-exceptions": { "version": "2.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -35804,12 +36350,14 @@ }, "spdx-license-ids": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "string-width": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -35818,7 +36366,8 @@ }, "strip-ansi": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -35826,17 +36375,20 @@ }, "strip-bom": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "strip-eof": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "test-exclude": { "version": "5.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.1.0.tgz", + "integrity": "sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA==", "dev": true, "requires": { "arrify": "^1.0.1", @@ -35847,7 +36399,8 @@ }, "uglify-js": { "version": "3.4.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, "optional": true, "requires": { @@ -35857,7 +36410,8 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true } @@ -35865,12 +36419,14 @@ }, "uuid": { "version": "3.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -35879,7 +36435,8 @@ }, "which": { "version": "1.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -35887,17 +36444,20 @@ }, "which-module": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wordwrap": { "version": "0.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, "wrap-ansi": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { "string-width": "^1.0.1", @@ -35906,12 +36466,14 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -35919,7 +36481,8 @@ }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -35929,7 +36492,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -35939,12 +36503,14 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "2.4.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -35954,17 +36520,20 @@ }, "y18n": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yallist": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, "yargs": { "version": "12.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { "cliui": "^4.0.0", @@ -35983,7 +36552,8 @@ }, "yargs-parser": { "version": "11.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -39137,9 +39707,9 @@ } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { "version": "0.14.5", @@ -40237,12 +40807,12 @@ "integrity": "sha1-9RWxoWLek8LM7y/AyjPztVQ+OMg=" }, "selenium-standalone": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.0.4.tgz", - "integrity": "sha512-WK94SCjofq/V4uFxeT9yJjyVTpzqpiqhv7UR4Q98n1il9yxNAWsKRtfgT+2DA3Kwv8CZCk9zPWU7kBW5i2oaxw==", + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.0.8.tgz", + "integrity": "sha512-2NCHoK12dbLbtXPIdMe1ljiLAMflJDBezPhjJBwmnYz5/yGjCPv2R9ojHO6W1ctD9DOlqyi3AxoAvlT2nmB7Fw==", "dev": true, "requires": { - "commander": "^7.2.0", + "commander": "^8.3.0", "cross-spawn": "^7.0.3", "debug": "^4.3.1", "fs-extra": "^10.0.0", @@ -40289,9 +40859,9 @@ } }, "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true }, "cross-spawn": { @@ -46274,6 +46844,27 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + } + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/package.json b/package.json index e04be0c418..52ce130052 100644 --- a/package.json +++ b/package.json @@ -197,7 +197,8 @@ "tslib": "^2.3.0", "web3": "^1.5.1", "winston": "^3.3.3", - "ws": "^7.3.0" + "ws": "^7.3.0", + "xml2js": "^0.4.23" }, "devDependencies": { "@babel/core": "^7.4.5", From d2a2e89a52b3872801f7ed61108bcb78081c48c0 Mon Sep 17 00:00:00 2001 From: lianahus Date: Tue, 26 Oct 2021 12:29:50 +0200 Subject: [PATCH 12/43] using old medium scripts --- .../src/app/ui/landing-page/landing-page.js | 2 - .../home-tab/src/lib/remix-ui-home-tab.css | 2 +- .../home-tab/src/lib/remix-ui-home-tab.tsx | 72 ++++++++++++------- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/apps/remix-ide/src/app/ui/landing-page/landing-page.js b/apps/remix-ide/src/app/ui/landing-page/landing-page.js index af3ad9dc04..825948cf6c 100644 --- a/apps/remix-ide/src/app/ui/landing-page/landing-page.js +++ b/apps/remix-ide/src/app/ui/landing-page/landing-page.js @@ -33,8 +33,6 @@ export class LandingPage extends ViewPlugin { this.el.setAttribute('id', 'landingPageHomeContainer') this.el.setAttribute('class', 'remixui_homeContainer justify-content-between bg-light d-flex') this.el.setAttribute('data-id', 'landingPageHomeContainer') - // to retrieve medium posts - //document.body.appendChild(yo``) } render () { diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css index 045719e03a..1f92cdd9e5 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css @@ -73,7 +73,7 @@ } .remixui_media { overflow: hidden; - width: 400px; + max-width: 400px; transition: .5s ease-out; z-index: 1000; } diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx index 6ebb414806..8af8978080 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -3,11 +3,9 @@ import React, { useState, useRef, useEffect } from 'react' // eslint-disable-lin import './remix-ui-home-tab.css' import { ModalDialog } from '@remix-ui/modal-dialog' // eslint-disable-line import { Toaster } from '@remix-ui/toaster' // eslint-disable-line -import Mediumfeed from './components/mediumFeed' // eslint-disable-line import PluginButton from './components/pluginButton' // eslint-disable-line import QueryParams from '../../../../../apps/remix-ide/src/lib/query-params' import { ThemeContext, themes } from './themeContext' -import { TwitterTimelineEmbed } from 'react-twitter-embed' import { stat } from 'fs' declare global { @@ -65,6 +63,20 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { setState(prevState => { return { ...prevState, showMediaPanel: 'none' } }) } }) + // to retrieve twitter feed + const scriptTwitter = document.createElement('script') + scriptTwitter.src = 'https://platform.twitter.com/widgets.js' + scriptTwitter.async = true + document.body.appendChild(scriptTwitter) + // to retrieve medium publications + const scriptMedium = document.createElement('script') + scriptMedium.src = 'https://www.twilik.com/assets/retainable/rss-embed/retainable-rss-embed.js' + scriptMedium.async = true + document.body.appendChild(scriptMedium) + return () => { + document.body.removeChild(scriptTwitter) + document.body.removeChild(scriptMedium) + } }, []) const toast = (message: string) => { @@ -205,10 +217,13 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => {
    -
    -
    -
    - playRemi() } alt=""> +
    +
    +
    + +
    +
    + playRemi() } alt="">
    -
    +

    Featured Plugins

    @@ -308,25 +323,34 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { }} >
    -
    - { (state.showMediaPanel === 'medium') &&
    -
    - +
    +
    + -
    } - { (state.showMediaPanel === 'twitter') &&
    -
    - +
    + } +
    From 9c48b3f9bf855309f3657d00c8f452b3d5682205 Mon Sep 17 00:00:00 2001 From: lianahus Date: Tue, 26 Oct 2021 13:09:00 +0200 Subject: [PATCH 13/43] fix the layout --- .../src/app/ui/landing-page/landing-page.js | 1 - .../home-tab/src/lib/remix-ui-home-tab.tsx | 4 +--- package-lock.json | 21 ------------------- package.json | 3 +-- 4 files changed, 2 insertions(+), 27 deletions(-) diff --git a/apps/remix-ide/src/app/ui/landing-page/landing-page.js b/apps/remix-ide/src/app/ui/landing-page/landing-page.js index 825948cf6c..8393bdd407 100644 --- a/apps/remix-ide/src/app/ui/landing-page/landing-page.js +++ b/apps/remix-ide/src/app/ui/landing-page/landing-page.js @@ -5,7 +5,6 @@ import * as packageJson from '../../../../../../package.json' import { ViewPlugin } from '@remixproject/engine-web' import { RemixUiHomeTab } from '@remix-ui/home-tab' // eslint-disable-line -const yo = require('yo-yo') const globalRegistry = require('../../../global/registry') const GistHandler = require('../../../lib/gist-handler') diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx index 8af8978080..6ebdabdf20 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -6,8 +6,6 @@ import { Toaster } from '@remix-ui/toaster' // eslint-disable-line import PluginButton from './components/pluginButton' // eslint-disable-line import QueryParams from '../../../../../apps/remix-ide/src/lib/query-params' import { ThemeContext, themes } from './themeContext' -import { stat } from 'fs' - declare global { interface Window { _paq: any @@ -222,7 +220,7 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => {
    -
    +
    playRemi() } alt="">
    From 15a1f44dadb5639cb2e4e317c1406cff631208e1 Mon Sep 17 00:00:00 2001 From: lianahus Date: Tue, 21 Dec 2021 12:43:57 +0100 Subject: [PATCH 18/43] added a script to run a new test --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index e04be0c418..693012f115 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "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", "nightwatch_local_debugger": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/debugger_*.test.js --env=chrome", "nightwatch_local_editor": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/editor.test.js --env=chrome", + "nightwatch_local_importFromGithub": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/importFromGithub.test.js --env=chrome", "nightwatch_local_compiler": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/compiler_api.test.js --env=chrome", "nightwatch_local_txListener": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/txListener.test.js --env=chrome", "nightwatch_local_fileManager": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/fileManager_api.test.js --env=chrome", From 7f357733fe39034c1c55742216e454ecedf5513b Mon Sep 17 00:00:00 2001 From: lianahus Date: Tue, 21 Dec 2021 14:11:31 +0100 Subject: [PATCH 19/43] adding a test file --- .../src/tests/importFromGithub.test.ts | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 apps/remix-ide-e2e/src/tests/importFromGithub.test.ts diff --git a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts new file mode 100644 index 0000000000..0cc3a0b533 --- /dev/null +++ b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts @@ -0,0 +1,57 @@ +'use strict' +import { NightwatchBrowser } from 'nightwatch' +import init from '../helpers/init' + +const testData = { + validURL: 'https://github.com/OpenZeppelin/openzeppelin-solidity/blob/67bca857eedf99bf44a4b6a0fc5b5ed553135316/contracts/access/Roles.sol', + invalidURL: 'https://github.com/Oppelin/Roles.sol' +} + +module.exports = { + before: function (browser: NightwatchBrowser, done: VoidFunction) { + init(browser, done) + }, + + 'Import from GitHub Modal': function (browser: NightwatchBrowser) { + browser.clickLaunchIcon('home') + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .clickLaunchIcon('filePanel') + .click('div[title="home"]') + .waitForElementVisible('button[data-id="landingPageImportFromGitHubButton"]') + .pause(1000) + .scrollAndClick('button[data-id="landingPageImportFromGitHubButton"]') + .waitForElementVisible('*[data-id="modalDialogModalTitle"]') + .assert.containsText('*[data-id="modalDialogModalTitle"]', 'Import from Github') + .waitForElementVisible('*[data-id="modalDialogModalBody"]') + .assert.containsText('*[data-id="modalDialogModalBody"]', 'Enter the github URL you would like to load.') + .waitForElementVisible('*[data-id="importModalDialogCustomPromptText"]') + .modalFooterCancelClick() + }, + + 'Display Error Message For Invalid GitHub URL Modal': function (browser: NightwatchBrowser) { + browser + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .clickLaunchIcon('filePanel') + .scrollAndClick('*[data-id="landingPageImportFromGitHubButton"]') + .waitForElementVisible('*[data-id="importModalDialogCustomPromptText"]') + .setValue('*[data-id="importModalDialogCustomPromptText"]', testData.invalidURL) + .modalFooterOKClick() + .waitForElementVisible('*[data-id="modalDialogModalBody"]') + .assert.containsText('*[data-id="modalDialogModalBody"]', 'Not Found') + .modalFooterOKClick() + }, + + 'Import From Github For Valid URL': function (browser: NightwatchBrowser) { + browser + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .clickLaunchIcon('settings') + .clickLaunchIcon('filePanel') + .scrollAndClick('*[data-id="landingPageImportFromGitHubButton"]') + .waitForElementVisible('*[data-id="importModalDialogCustomPromptText"]') + .setValue('*[data-id="importModalDialogCustomPromptText"]', testData.validURL) + .modalFooterOKClick() + .openFile('default_workspace/github/OpenZeppelin/openzeppelin-solidity/contracts/access/Roles.sol') + .waitForElementVisible("div[title='default_workspace/github/OpenZeppelin/openzeppelin-solidity/contracts/access/Roles.sol'") + .end() + } +} From a61d75b8ee92bc005b7846c9fb11482839fe1bf3 Mon Sep 17 00:00:00 2001 From: lianahus Date: Tue, 21 Dec 2021 14:44:26 +0100 Subject: [PATCH 20/43] made id mandatory prop for modal dialog as it is used and undefined --- .../src/tests/importFromGithub.test.ts | 31 +++--- .../home-tab/src/lib/remix-ui-home-tab.tsx | 3 +- .../modal-dialog/src/lib/types/index.ts | 2 +- .../lib/components/permissionsSettings.tsx | 1 + .../terminal/src/lib/remix-ui-terminal.tsx | 1 + libs/remix-ui/toaster/src/lib/toaster.tsx | 1 + package-lock.json | 101 +++++++----------- 7 files changed, 58 insertions(+), 82 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts index 0cc3a0b533..dcd6de5137 100644 --- a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts +++ b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts @@ -20,12 +20,12 @@ module.exports = { .waitForElementVisible('button[data-id="landingPageImportFromGitHubButton"]') .pause(1000) .scrollAndClick('button[data-id="landingPageImportFromGitHubButton"]') - .waitForElementVisible('*[data-id="modalDialogModalTitle"]') - .assert.containsText('*[data-id="modalDialogModalTitle"]', 'Import from Github') - .waitForElementVisible('*[data-id="modalDialogModalBody"]') - .assert.containsText('*[data-id="modalDialogModalBody"]', 'Enter the github URL you would like to load.') - .waitForElementVisible('*[data-id="importModalDialogCustomPromptText"]') - .modalFooterCancelClick() + .waitForElementVisible('*[data-id="homeTabModalDialogModalTitle-react"]') + .assert.containsText('*[data-id="homeTabModalDialogModalTitle-react"]', 'Import from Github') + .waitForElementVisible('*[data-id="homeTabModalDialogModalBody-react"]') + .assert.containsText('*[data-id="homeTabModalDialogModalBody-react"]', 'Enter the github URL you would like to load.') + .waitForElementVisible('*[data-id="homeTabModalDialogCustomPromptText"]') + .refresh() }, 'Display Error Message For Invalid GitHub URL Modal': function (browser: NightwatchBrowser) { @@ -33,12 +33,12 @@ module.exports = { .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) .clickLaunchIcon('filePanel') .scrollAndClick('*[data-id="landingPageImportFromGitHubButton"]') - .waitForElementVisible('*[data-id="importModalDialogCustomPromptText"]') - .setValue('*[data-id="importModalDialogCustomPromptText"]', testData.invalidURL) - .modalFooterOKClick() - .waitForElementVisible('*[data-id="modalDialogModalBody"]') - .assert.containsText('*[data-id="modalDialogModalBody"]', 'Not Found') - .modalFooterOKClick() + .waitForElementVisible('*[data-id="homeTabModalDialogCustomPromptText"]') + .setValue('*[data-id="homeTabModalDialogCustomPromptText"]', testData.invalidURL) + .waitForElementVisible('*[data-id="homeTab-modal-footer-ok-react"]') + .scrollAndClick('[data-id="homeTab-modal-footer-ok-react"]') // submitted + .waitForElementVisible('*[data-shared="tooltipPopup"]') + .assert.containsText('*[data-shared="tooltipPopup"] span', 'not found ' + testData.invalidURL) }, 'Import From Github For Valid URL': function (browser: NightwatchBrowser) { @@ -47,9 +47,10 @@ module.exports = { .clickLaunchIcon('settings') .clickLaunchIcon('filePanel') .scrollAndClick('*[data-id="landingPageImportFromGitHubButton"]') - .waitForElementVisible('*[data-id="importModalDialogCustomPromptText"]') - .setValue('*[data-id="importModalDialogCustomPromptText"]', testData.validURL) - .modalFooterOKClick() + .waitForElementVisible('*[data-id="homeTabModalDialogCustomPromptText"]') + .setValue('*[data-id="homeTabModalDialogCustomPromptText"]', testData.validURL) + .waitForElementVisible('*[data-id="homeTab-modal-footer-ok-react"]') + .scrollAndClick('[data-id="homeTab-modal-footer-ok-react"]') .openFile('default_workspace/github/OpenZeppelin/openzeppelin-solidity/contracts/access/Roles.sol') .waitForElementVisible("div[title='default_workspace/github/OpenZeppelin/openzeppelin-solidity/contracts/access/Roles.sol'") .end() diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx index 8fec99aece..28e26657b4 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -186,6 +186,7 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { return ( <> { name='prompt_text' id='inputPrompt_text' className="w-100 mt-1 form-control" - data-id="importModalDialogCustomPromptText" + data-id="homeTabModalDialogCustomPromptText" value={state.importSource} onInput={(e) => { setState(prevState => { diff --git a/libs/remix-ui/modal-dialog/src/lib/types/index.ts b/libs/remix-ui/modal-dialog/src/lib/types/index.ts index ccdd374ef4..b03cb16c94 100644 --- a/libs/remix-ui/modal-dialog/src/lib/types/index.ts +++ b/libs/remix-ui/modal-dialog/src/lib/types/index.ts @@ -1,6 +1,6 @@ /* eslint-disable no-undef */ export interface ModalDialogProps { - id?: string + id: string title?: string, message?: string | JSX.Element, okLabel?: string, diff --git a/libs/remix-ui/plugin-manager/src/lib/components/permissionsSettings.tsx b/libs/remix-ui/plugin-manager/src/lib/components/permissionsSettings.tsx index dd41957fbe..690dadad8a 100644 --- a/libs/remix-ui/plugin-manager/src/lib/components/permissionsSettings.tsx +++ b/libs/remix-ui/plugin-manager/src/lib/components/permissionsSettings.tsx @@ -106,6 +106,7 @@ function PermisssionsSettings ({ pluginSettings }: PermissionSettingsProps) { return ( {
    { return ( <> {}} diff --git a/package-lock.json b/package-lock.json index ecc8e4454f..bfa28d89a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1782,6 +1782,14 @@ "requires": { "core-js": "^2.6.5", "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + } } }, "@babel/preset-env": { @@ -4607,7 +4615,6 @@ "jest-haste-map": "^27.3.1", "jest-pnp-resolver": "^1.2.2", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", "slash": "^3.0.0" } }, @@ -11596,8 +11603,7 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -13299,6 +13305,12 @@ "regenerator-runtime": "^0.11.0" }, "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -27830,7 +27842,6 @@ "version": "16.0.4", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, "requires": { "@types/yargs-parser": "*" } @@ -27847,7 +27858,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -27877,7 +27887,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -27885,44 +27894,34 @@ "camelcase": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", - "dev": true + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==" }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "requires": { - "@jest/types": "^27.2.5", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.3.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.3.1", - "jest-validate": "^27.3.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "dependencies": { "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } }, "jest-get-type": { "version": "27.4.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", - "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", - "dev": true + "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==" }, "jest-haste-map": { "version": "27.4.5", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.5.tgz", "integrity": "sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q==", - "dev": true, "requires": { "@jest/types": "^27.4.2", "@types/graceful-fs": "^4.1.2", @@ -27943,7 +27942,6 @@ "version": "27.4.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -27957,14 +27955,12 @@ "jest-regex-util": { "version": "27.4.0", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", - "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==", - "dev": true + "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==" }, "jest-serializer": { "version": "27.4.0", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", - "dev": true, "requires": { "@types/node": "*", "graceful-fs": "^4.2.4" @@ -27974,7 +27970,6 @@ "version": "27.4.2", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", - "dev": true, "requires": { "@jest/types": "^27.4.2", "@types/node": "*", @@ -27988,7 +27983,6 @@ "version": "27.4.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -28003,7 +27997,6 @@ "version": "27.4.2", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.2.tgz", "integrity": "sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A==", - "dev": true, "requires": { "@jest/types": "^27.4.2", "camelcase": "^6.2.0", @@ -28017,7 +28010,6 @@ "version": "27.4.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -28032,22 +28024,18 @@ "version": "27.4.5", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", - "dev": true, "requires": { "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "merge-stream": "^2.0.0" } }, "pretty-format": { "version": "27.4.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz", "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==", - "dev": true, "requires": { "@jest/types": "^27.4.2", "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "dependencies": { @@ -28055,7 +28043,6 @@ "version": "27.4.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -28067,10 +28054,9 @@ } }, "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -28080,16 +28066,14 @@ "ci-info": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" + "color-name": "~1.1.4" } }, "color-name": { @@ -28101,7 +28085,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -28110,7 +28093,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "has-flag": { @@ -28130,8 +28112,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "jest-haste-map": { "version": "27.2.5", @@ -28247,7 +28228,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -28276,8 +28256,7 @@ "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "semver": { "version": "7.3.5", @@ -28306,7 +28285,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -29390,8 +29368,7 @@ "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, "levn": { "version": "0.3.0", @@ -30271,8 +30248,7 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.4.1", @@ -40803,11 +40779,6 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==" - }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", From 0778cb871d19cf6c5564b0b771f037cd9e3ffe1b Mon Sep 17 00:00:00 2001 From: lianahus Date: Tue, 21 Dec 2021 22:02:57 +0100 Subject: [PATCH 21/43] test --- apps/remix-ide-e2e/src/tests/importFromGithub.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts index dcd6de5137..124538a708 100644 --- a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts +++ b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts @@ -31,6 +31,7 @@ module.exports = { 'Display Error Message For Invalid GitHub URL Modal': function (browser: NightwatchBrowser) { browser .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .clickLaunchIcon('settings') .clickLaunchIcon('filePanel') .scrollAndClick('*[data-id="landingPageImportFromGitHubButton"]') .waitForElementVisible('*[data-id="homeTabModalDialogCustomPromptText"]') From a7faa6f6588619282f137347db686646f209e5a9 Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 22 Dec 2021 10:57:48 +0100 Subject: [PATCH 22/43] fix test --- apps/remix-ide-e2e/src/tests/importFromGithub.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts index 124538a708..56d0de9d6c 100644 --- a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts +++ b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts @@ -52,7 +52,7 @@ module.exports = { .setValue('*[data-id="homeTabModalDialogCustomPromptText"]', testData.validURL) .waitForElementVisible('*[data-id="homeTab-modal-footer-ok-react"]') .scrollAndClick('[data-id="homeTab-modal-footer-ok-react"]') - .openFile('default_workspace/github/OpenZeppelin/openzeppelin-solidity/contracts/access/Roles.sol') + .openFile('github/OpenZeppelin/openzeppelin-solidity/contracts/access/Roles.sol') .waitForElementVisible("div[title='default_workspace/github/OpenZeppelin/openzeppelin-solidity/contracts/access/Roles.sol'") .end() } From cf04ebcdc8337eb9cee31f450415255fdc6d64cc Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 22 Dec 2021 11:29:55 +0100 Subject: [PATCH 23/43] fix E2E --- apps/remix-ide-e2e/src/tests/importFromGithub.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts index 56d0de9d6c..8c8830c067 100644 --- a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts +++ b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts @@ -35,6 +35,7 @@ module.exports = { .clickLaunchIcon('filePanel') .scrollAndClick('*[data-id="landingPageImportFromGitHubButton"]') .waitForElementVisible('*[data-id="homeTabModalDialogCustomPromptText"]') + .clearValue('*[data-id="homeTabModalDialogCustomPromptText"]') .setValue('*[data-id="homeTabModalDialogCustomPromptText"]', testData.invalidURL) .waitForElementVisible('*[data-id="homeTab-modal-footer-ok-react"]') .scrollAndClick('[data-id="homeTab-modal-footer-ok-react"]') // submitted @@ -49,6 +50,7 @@ module.exports = { .clickLaunchIcon('filePanel') .scrollAndClick('*[data-id="landingPageImportFromGitHubButton"]') .waitForElementVisible('*[data-id="homeTabModalDialogCustomPromptText"]') + .clearValue('*[data-id="homeTabModalDialogCustomPromptText"]') .setValue('*[data-id="homeTabModalDialogCustomPromptText"]', testData.validURL) .waitForElementVisible('*[data-id="homeTab-modal-footer-ok-react"]') .scrollAndClick('[data-id="homeTab-modal-footer-ok-react"]') From 1ce0bbb31ad6a155ba45ad8187d6312636917d53 Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 22 Dec 2021 12:52:25 +0100 Subject: [PATCH 24/43] fix E2E --- .../src/tests/importFromGithub.test.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts index 8c8830c067..3fc73c2430 100644 --- a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts +++ b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts @@ -34,9 +34,13 @@ module.exports = { .clickLaunchIcon('settings') .clickLaunchIcon('filePanel') .scrollAndClick('*[data-id="landingPageImportFromGitHubButton"]') - .waitForElementVisible('*[data-id="homeTabModalDialogCustomPromptText"]') - .clearValue('*[data-id="homeTabModalDialogCustomPromptText"]') - .setValue('*[data-id="homeTabModalDialogCustomPromptText"]', testData.invalidURL) + .waitForElementVisible('input[data-id="homeTabModalDialogCustomPromptText"]') + .execute(() => { + // browser.setValue(query, content) is not working in this context for chrome. + // so we focus on it and use browser.keys() + (document.querySelector('input[data-id="homeTabModalDialogCustomPromptText"]') as any).focus() + }, [], () => {}) + .keys(testData.invalidURL) .waitForElementVisible('*[data-id="homeTab-modal-footer-ok-react"]') .scrollAndClick('[data-id="homeTab-modal-footer-ok-react"]') // submitted .waitForElementVisible('*[data-shared="tooltipPopup"]') @@ -51,7 +55,12 @@ module.exports = { .scrollAndClick('*[data-id="landingPageImportFromGitHubButton"]') .waitForElementVisible('*[data-id="homeTabModalDialogCustomPromptText"]') .clearValue('*[data-id="homeTabModalDialogCustomPromptText"]') - .setValue('*[data-id="homeTabModalDialogCustomPromptText"]', testData.validURL) + .execute(() => { + // browser.setValue(query, content) is not working in this context for chrome. + // so we focus on it and use browser.keys() + (document.querySelector('input[data-id="homeTabModalDialogCustomPromptText"]') as any).focus() + }, [], () => {}) + .keys(testData.validURL) .waitForElementVisible('*[data-id="homeTab-modal-footer-ok-react"]') .scrollAndClick('[data-id="homeTab-modal-footer-ok-react"]') .openFile('github/OpenZeppelin/openzeppelin-solidity/contracts/access/Roles.sol') From 9d6f8a413e61a38ff760107cfd2ff41b9fc6a184 Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 22 Dec 2021 13:26:21 +0100 Subject: [PATCH 25/43] refactor and remove use of registry --- .../src/app/ui/landing-page/landing-page.js | 2 -- .../home-tab/src/lib/remix-ui-home-tab.tsx | 23 ++++++++++++------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/apps/remix-ide/src/app/ui/landing-page/landing-page.js b/apps/remix-ide/src/app/ui/landing-page/landing-page.js index 8393bdd407..a100c4ea4e 100644 --- a/apps/remix-ide/src/app/ui/landing-page/landing-page.js +++ b/apps/remix-ide/src/app/ui/landing-page/landing-page.js @@ -5,7 +5,6 @@ import * as packageJson from '../../../../../../package.json' import { ViewPlugin } from '@remixproject/engine-web' import { RemixUiHomeTab } from '@remix-ui/home-tab' // eslint-disable-line -const globalRegistry = require('../../../global/registry') const GistHandler = require('../../../lib/gist-handler') const profile = { @@ -43,7 +42,6 @@ export class LandingPage extends ViewPlugin { ReactDOM.render( , this.el) } diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx index 28e26657b4..f4b43b98db 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -15,8 +15,7 @@ const _paq = window._paq = window._paq || [] //eslint-disable-line /* eslint-disable-next-line */ export interface RemixUiHomeTabProps { - plugin: any, - registry: any + plugin: any } const loadingInitialState = { @@ -30,7 +29,9 @@ const loadingReducer = (state = loadingInitialState, action) => { } export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { - const { plugin, registry } = props + const { plugin } = props + let fileManager = plugin.fileManager + const [state, setState] = useState<{ themeQuality: { filter: string, name: string }, showMediaPanel: 'none' | 'twitter' | 'medium', @@ -39,7 +40,7 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { importSource: string, toasterMsg: string }>({ - themeQuality: registry.get('themeModule').api.currentTheme().quality === 'dark' ? themes.dark : themes.light, + themeQuality: themes.light, showMediaPanel: 'none', showModalDialog: false, modalInfo: { title: '', loadItem: '', examples: [] }, @@ -49,7 +50,7 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { const processLoading = () => { const contentImport = plugin.contentImport - const fileProviders = registry.get('fileproviders').api + const workspace = fileManager.getProvider('workspace') contentImport.import( state.importSource, (loadingMsg) => dispatch({ tooltip: loadingMsg }), @@ -58,7 +59,7 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { toast(error.message || error) } else { try { - fileProviders.workspace.addExternal(type + '/' + cleanUrl, content, url) + workspace.addExternal(type + '/' + cleanUrl, content, url) plugin.call('menuicons', 'select', 'filePanel') } catch (e) { toast(e.message) @@ -81,7 +82,13 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { const inputValue = useRef(null) useEffect(() => { - registry.get('themeModule').api.events.on('themeChanged', (theme) => { + plugin.call('theme', 'currentTheme').then((theme) => { + // update theme quality. To be used for for images + setState(prevState => { + return { ...prevState, themeQuality: theme.quality === 'dark' ? themes.dark : themes.light } + }) + }) + plugin.on('theme', 'themeChanged', (theme) => { // update theme quality. To be used for for images setState(prevState => { return { ...prevState, themeQuality: theme.quality === 'dark' ? themes.dark : themes.light } @@ -129,7 +136,7 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { plugin.appManager.activatePlugin('remixd') } const importFromGist = () => { - plugin.gistHandler.loadFromGist({ gist: '' }, registry.get('filemanager').api) + plugin.gistHandler.loadFromGist({ gist: '' }, fileManager) plugin.verticalIcons.select('filePanel') } const switchToPreviousVersion = () => { From eb813d4e53556ffb57a8db4fc5bc50e5e7a9a72e Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 22 Dec 2021 13:55:11 +0100 Subject: [PATCH 26/43] linting --- libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx index f4b43b98db..13dec9d47d 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -30,8 +30,8 @@ const loadingReducer = (state = loadingInitialState, action) => { export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { const { plugin } = props - let fileManager = plugin.fileManager - + const fileManager = plugin.fileManager + const [state, setState] = useState<{ themeQuality: { filter: string, name: string }, showMediaPanel: 'none' | 'twitter' | 'medium', From e6f1e42dded7b9d715e3d1055195702b754ac9f7 Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 22 Dec 2021 14:16:02 +0100 Subject: [PATCH 27/43] fix E2E --- apps/remix-ide-e2e/src/tests/importFromGithub.test.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts index 3fc73c2430..036d9ceae9 100644 --- a/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts +++ b/apps/remix-ide-e2e/src/tests/importFromGithub.test.ts @@ -36,11 +36,9 @@ module.exports = { .scrollAndClick('*[data-id="landingPageImportFromGitHubButton"]') .waitForElementVisible('input[data-id="homeTabModalDialogCustomPromptText"]') .execute(() => { - // browser.setValue(query, content) is not working in this context for chrome. - // so we focus on it and use browser.keys() (document.querySelector('input[data-id="homeTabModalDialogCustomPromptText"]') as any).focus() }, [], () => {}) - .keys(testData.invalidURL) + .setValue('input[data-id="homeTabModalDialogCustomPromptText"]', testData.invalidURL) .waitForElementVisible('*[data-id="homeTab-modal-footer-ok-react"]') .scrollAndClick('[data-id="homeTab-modal-footer-ok-react"]') // submitted .waitForElementVisible('*[data-shared="tooltipPopup"]') @@ -56,11 +54,9 @@ module.exports = { .waitForElementVisible('*[data-id="homeTabModalDialogCustomPromptText"]') .clearValue('*[data-id="homeTabModalDialogCustomPromptText"]') .execute(() => { - // browser.setValue(query, content) is not working in this context for chrome. - // so we focus on it and use browser.keys() (document.querySelector('input[data-id="homeTabModalDialogCustomPromptText"]') as any).focus() }, [], () => {}) - .keys(testData.validURL) + .setValue('input[data-id="homeTabModalDialogCustomPromptText"]', testData.validURL) .waitForElementVisible('*[data-id="homeTab-modal-footer-ok-react"]') .scrollAndClick('[data-id="homeTab-modal-footer-ok-react"]') .openFile('github/OpenZeppelin/openzeppelin-solidity/contracts/access/Roles.sol') From ed7347e294635b818d1a61dea7dce335f6770ada Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 22 Dec 2021 14:38:28 +0100 Subject: [PATCH 28/43] remove unecessary config --- tsconfig.base.json | 1 - 1 file changed, 1 deletion(-) diff --git a/tsconfig.base.json b/tsconfig.base.json index 61cf768519..3633434dce 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -66,7 +66,6 @@ "@remix-ui/plugin-manager": ["libs/remix-ui/plugin-manager/src/index.ts"], "@remix-ui/home-tab": ["libs/remix-ui/home-tab/src/index.ts"], "@remix-ui/editor": ["libs/remix-ui/editor/src/index.ts"], - "@remix-project/remix-ui/home-tab": ["libs/remix-ui/home-tab/src/index.ts"], "@remix-ui/tabs": ["libs/remix-ui/tabs/src/index.ts"], "@remix-ui/helper": ["libs/remix-ui/helper/src/index.ts"], "@remix-ui/app": ["libs/remix-ui/app/src/index.ts"], From c8257644514f1a94e81c5a4dc2086c9550a3db52 Mon Sep 17 00:00:00 2001 From: Khachatour Date: Thu, 23 Dec 2021 11:17:15 +0400 Subject: [PATCH 29/43] feat: add first version for cairo lang support --- apps/remix-ide/src/app/editor/editor.js | 3 +- libs/remix-ui/editor/src/lib/cairoSyntax.ts | 133 ++++++++++++++++++ .../editor/src/lib/remix-ui-editor.tsx | 11 +- .../helper/src/lib/remix-ui-helper.ts | 3 +- 4 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 libs/remix-ui/editor/src/lib/cairoSyntax.ts diff --git a/apps/remix-ide/src/app/editor/editor.js b/apps/remix-ide/src/app/editor/editor.js index f25b04d21f..295d83fd59 100644 --- a/apps/remix-ide/src/app/editor/editor.js +++ b/apps/remix-ide/src/app/editor/editor.js @@ -46,7 +46,8 @@ class Editor extends Plugin { txt: 'text', json: 'json', abi: 'json', - rs: 'rust' + rs: 'rust', + cairo: 'cairo' } this.activated = false diff --git a/libs/remix-ui/editor/src/lib/cairoSyntax.ts b/libs/remix-ui/editor/src/lib/cairoSyntax.ts new file mode 100644 index 0000000000..c467b32a64 --- /dev/null +++ b/libs/remix-ui/editor/src/lib/cairoSyntax.ts @@ -0,0 +1,133 @@ +/* eslint-disable */ +export const cairoConf = { + comments: { + lineComment: '#' + }, + brackets: [ + ['{', '}'], + ['[', ']'], + ['(', ')'], + ['%{', '%}'] + ], + autoClosingPairs: [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '(', close: ')' }, + { open: '%{', close: '%}' }, + { open: "'", close: "'", notIn: ['string', 'comment'] } + ], + surroundingPairs: [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '(', close: ')' }, + { open: '%{', close: '%}' }, + { open: "'", close: "'" } + ] +} + + +export const cairoLang = { + defaultToken: '', + tokenPostfix: '.cairo', + + brackets: [ + { token: 'delimiter.curly', open: '{', close: '}' }, + { token: 'delimiter.parenthesis', open: '(', close: ')' }, + { token: 'delimiter.square', open: '[', close: ']' }, + { token: 'delimiter.curly', open: '%{', close: '%}' } + ], + + keywords: [ + // control + 'if', + 'else', + 'end', + + // meta + 'alloc_locals', + 'as', + 'assert', + 'cast', + 'const', + 'dw', + 'felt', + 'from', + 'func', + 'import', + 'let', + 'local', + 'member', + 'nondet', + 'return', + 'static_assert', + 'struct', + 'tempvar', + 'with_attr', + 'with', + + // register + 'ap', + 'fp', + + // opcode + 'call', + 'jmp', + 'ret', + 'abs', + 'rel' + ], + + operators: ['=', ':', '==', '++', '+', '-', '*', '**', '/', '&', '%', '_'], + + // we include these common regular expressions + symbols: /[=>](?!@symbols)/, '@brackets'], + [ + /@symbols/, + { + cases: { + '@operators': 'delimiter', + '@default': '' + } + } + ], + + // numbers + [/(@numberHex)/, 'number.hex'], + [/(@numberDecimal)/, 'number'], + + // strings + [/'[^']*'/, 'string'] + ], + + whitespace: [ + [/\s+/, 'white'], + [/(^#.*$)/, 'comment'] + ] + } +} diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx index 74bb646251..480b548be9 100644 --- a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx +++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx @@ -2,6 +2,7 @@ import React, { useState, useRef, useEffect, useReducer } from 'react' // eslint import Editor, { loader } from '@monaco-editor/react' import { reducerActions, reducerListener, initialState } from './actions/editor' import { language, conf } from './syntax' +import { cairoLang, cairoConf } from './cairoSyntax' import './remix-ui-editor.css' @@ -273,7 +274,11 @@ export const EditorUI = (props: EditorUIProps) => { const file = editorModelsState[props.currentFile] editorRef.current.setModel(file.model) editorRef.current.updateOptions({ readOnly: editorModelsState[props.currentFile].readOnly }) - if (file.language === 'sol') monacoRef.current.editor.setModelLanguage(file.model, 'remix-solidity') + if (file.language === 'sol') { + monacoRef.current.editor.setModelLanguage(file.model, 'remix-solidity') + } else if (file.language === 'cairo') { + monacoRef.current.editor.setModelLanguage(file.model, 'remix-cairo') + } setAnnotationsbyFile(props.currentFile) setMarkerbyFile(props.currentFile) }, [props.currentFile]) @@ -362,9 +367,13 @@ export const EditorUI = (props: EditorUIProps) => { monacoRef.current = monaco // Register a new language monacoRef.current.languages.register({ id: 'remix-solidity' }) + monacoRef.current.languages.register({ id: 'remix-cairo' }) // Register a tokens provider for the language monacoRef.current.languages.setMonarchTokensProvider('remix-solidity', language) monacoRef.current.languages.setLanguageConfiguration('remix-solidity', conf) + + monacoRef.current.languages.setMonarchTokensProvider('remix-cairo', cairoLang) + monacoRef.current.languages.setLanguageConfiguration('remix-cairo', cairoConf) } return ( diff --git a/libs/remix-ui/helper/src/lib/remix-ui-helper.ts b/libs/remix-ui/helper/src/lib/remix-ui-helper.ts index bd8e318366..88cd0ed7a6 100644 --- a/libs/remix-ui/helper/src/lib/remix-ui-helper.ts +++ b/libs/remix-ui/helper/src/lib/remix-ui-helper.ts @@ -59,5 +59,6 @@ export const getPathIcon = (path: string) => { ? 'fas fa-brackets-curly' : path.endsWith('.vy') ? 'fak fa-vyper-mono' : path.endsWith('.lex') ? 'fak fa-lexon' : path.endsWith('.contract') - ? 'fab fa-ethereum' : 'far fa-file' + ? 'fab fa-ethereum' : path.endsWith('.cairo') + ? 'fab fa-ethereum' : 'far fa-file' // TODO: add cairo icon } From c2c26da4bbe809ff5f2c9c8aeabe84ae3c458095 Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 24 Nov 2021 11:21:12 +0100 Subject: [PATCH 30/43] context view in react --- .../tests/{editor.spec.ts => editor.test.ts} | 70 ++++++- .../src/tests/fileExplorer.test.ts | 4 +- apps/remix-ide/src/app.js | 5 +- apps/remix-ide/src/app/editor/contextView.js | 194 ------------------ apps/remix-ide/src/app/editor/editor.js | 5 +- apps/remix-ide/src/app/panels/main-view.js | 50 +++-- libs/remix-core-plugin/src/index.ts | 1 + .../src/lib/compiler-artefacts.ts | 6 +- .../src/lib/editor-context-listener.ts | 98 ++++----- libs/remix-ui/editor-context-view/.babelrc | 4 + libs/remix-ui/editor-context-view/.eslintrc | 19 ++ libs/remix-ui/editor-context-view/README.md | 7 + .../remix-ui/editor-context-view/src/index.ts | 1 + .../src/lib/remix-ui-editor-context-view.css | 20 +- .../src/lib/remix-ui-editor-context-view.tsx | 159 ++++++++++++++ .../editor-context-view/tsconfig.json | 16 ++ .../editor-context-view/tsconfig.lib.json | 13 ++ nx.json | 3 + tsconfig.base.json | 7 +- workspace.json | 96 +++------ 20 files changed, 421 insertions(+), 357 deletions(-) rename apps/remix-ide-e2e/src/tests/{editor.spec.ts => editor.test.ts} (71%) delete mode 100644 apps/remix-ide/src/app/editor/contextView.js rename apps/remix-ide/src/app/editor/contextualListener.js => libs/remix-core-plugin/src/lib/editor-context-listener.ts (64%) create mode 100644 libs/remix-ui/editor-context-view/.babelrc create mode 100644 libs/remix-ui/editor-context-view/.eslintrc create mode 100644 libs/remix-ui/editor-context-view/README.md create mode 100644 libs/remix-ui/editor-context-view/src/index.ts rename apps/remix-ide/src/app/editor/styles/contextView-styles.js => libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.css (70%) create mode 100644 libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx create mode 100644 libs/remix-ui/editor-context-view/tsconfig.json create mode 100644 libs/remix-ui/editor-context-view/tsconfig.lib.json diff --git a/apps/remix-ide-e2e/src/tests/editor.spec.ts b/apps/remix-ide-e2e/src/tests/editor.test.ts similarity index 71% rename from apps/remix-ide-e2e/src/tests/editor.spec.ts rename to apps/remix-ide-e2e/src/tests/editor.test.ts index f0e88fe5cc..7b714a432b 100644 --- a/apps/remix-ide-e2e/src/tests/editor.spec.ts +++ b/apps/remix-ide-e2e/src/tests/editor.test.ts @@ -6,10 +6,10 @@ import init from '../helpers/init' module.exports = { before: function (browser: NightwatchBrowser, done: VoidFunction) { - init(browser, done) + init(browser, done, 'http://127.0.0.1:8080', true) }, - 'Should zoom in editor ': function (browser: NightwatchBrowser) { + 'Should zoom in editor #group1': function (browser: NightwatchBrowser) { browser.waitForElementVisible('div[data-id="mainPanelPluginsContainer"]') .clickLaunchIcon('filePanel') .waitForElementVisible('div[data-id="filePanelFileExplorerTree"]') @@ -22,7 +22,7 @@ module.exports = { .checkElementStyle('.view-lines', 'font-size', '16px') }, - 'Should zoom out editor ': function (browser: NightwatchBrowser) { + 'Should zoom out editor #group1': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#editorView') .checkElementStyle('.view-lines', 'font-size', '16px') .click('*[data-id="tabProxyZoomOut"]') @@ -30,7 +30,7 @@ module.exports = { .checkElementStyle('.view-lines', 'font-size', '14px') }, - 'Should display compile error in editor ': function (browser: NightwatchBrowser) { + 'Should display compile error in editor #group1': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#editorView') .setEditorValue(storageContractWithError + 'error') .pause(2000) @@ -42,7 +42,7 @@ module.exports = { .checkAnnotations('fa-exclamation-square', 29) // error }, - 'Should minimize and maximize codeblock in editor ': '' + function (browser: NightwatchBrowser) { + 'Should minimize and maximize codeblock in editor #group1': '' + function (browser: NightwatchBrowser) { browser.waitForElementVisible('#editorView') .waitForElementVisible('.ace_open') .click('.ace_start:nth-of-type(1)') @@ -51,7 +51,7 @@ module.exports = { .waitForElementVisible('.ace_open') }, - 'Should add breakpoint to editor ': function (browser: NightwatchBrowser) { + 'Should add breakpoint to editor #group1': function (browser: NightwatchBrowser) { browser.waitForElementVisible('#editorView') .waitForElementNotPresent('.margin-view-overlays .fa-circle') .execute(() => { @@ -60,7 +60,7 @@ module.exports = { .waitForElementVisible('.margin-view-overlays .fa-circle') }, - 'Should load syntax highlighter for ace light theme': '' + function (browser: NightwatchBrowser) { + 'Should load syntax highlighter for ace light theme #group1': '' + function (browser: NightwatchBrowser) { browser.waitForElementVisible('#editorView') .checkElementStyle('.ace_keyword', 'color', aceThemes.light.keyword) .checkElementStyle('.ace_comment.ace_doc', 'color', aceThemes.light.comment) @@ -68,7 +68,7 @@ module.exports = { .checkElementStyle('.ace_variable', 'color', aceThemes.light.variable) }, - 'Should load syntax highlighter for ace dark theme': '' + function (browser: NightwatchBrowser) { + 'Should load syntax highlighter for ace dark theme #group1': '' + function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="verticalIconsKindsettings"]') .click('*[data-id="verticalIconsKindsettings"]') .waitForElementVisible('*[data-id="settingsTabThemeLabelDark"]') @@ -83,7 +83,7 @@ module.exports = { */ }, - 'Should highlight source code ': function (browser: NightwatchBrowser) { + 'Should highlight source code #group1': function (browser: NightwatchBrowser) { // include all files here because switching between plugins in side-panel removes highlight browser .addFile('sourcehighlight.js', sourcehighlightScript) @@ -101,7 +101,7 @@ module.exports = { .checkElementStyle('.highlightLine51', 'background-color', 'rgb(52, 152, 219)') }, - 'Should remove 1 highlight from source code': '' + function (browser: NightwatchBrowser) { + 'Should remove 1 highlight from source code #group1': '' + function (browser: NightwatchBrowser) { browser.waitForElementVisible('li[data-id="treeViewLitreeViewItemremoveSourcehighlightScript.js"]') .click('li[data-id="treeViewLitreeViewItemremoveSourcehighlightScript.js"]') .pause(2000) @@ -115,7 +115,7 @@ module.exports = { .checkElementStyle('.highlightLine51', 'background-color', 'rgb(52, 152, 219)') }, - 'Should remove all highlights from source code ': function (browser: NightwatchBrowser) { + 'Should remove all highlights from source code #group1': function (browser: NightwatchBrowser) { browser.waitForElementVisible('li[data-id="treeViewLitreeViewItemremoveAllSourcehighlightScript.js"]') .click('li[data-id="treeViewLitreeViewItemremoveAllSourcehighlightScript.js"]') .pause(2000) @@ -126,6 +126,54 @@ module.exports = { .waitForElementNotPresent('.highlightLine33', 60000) .waitForElementNotPresent('.highlightLine41', 60000) .waitForElementNotPresent('.highlightLine51', 60000) + }, + + 'Should display the context view #group2': function (browser: NightwatchBrowser) { + browser + .openFile('contracts') + .openFile('contracts/1_Storage.sol') + .waitForElementVisible('#editorView') + .setEditorValue(storageContractWithError) + .pause(2000) + .execute(() => { + (document.getElementById('editorView') as any).gotoLine(17, 16) + }, [], () => {}) + .waitForElementVisible('.contextview') + .waitForElementContainsText('.contextview .type', 'FunctionDefinition') + .waitForElementContainsText('.contextview .name', 'store') + .execute(() => { + (document.getElementById('editorView') as any).gotoLine(18, 12) + }, [], () => {}) + .waitForElementContainsText('.contextview .type', 'uint256') + .waitForElementContainsText('.contextview .name', 'number') + .click('.contextview [data-action="previous"]') // declaration + .execute(() => { + return (document.getElementById('editorView') as any).getCursorPosition() + }, [], (result) => { + console.log('result', result) + browser.assert.equal(result.value, '180') + }) + .click('.contextview [data-action="next"]') // back to the initial state + .execute(() => { + return (document.getElementById('editorView') as any).getCursorPosition() + }, [], (result) => { + console.log('result', result) + browser.assert.equal(result.value, '323') + }) + .click('.contextview [data-action="next"]') // next reference + .execute(() => { + return (document.getElementById('editorView') as any).getCursorPosition() + }, [], (result) => { + console.log('result', result) + browser.assert.equal(result.value, '489') + }) + .click('.contextview [data-action="gotoref"]') // back to the declaration + .execute(() => { + return (document.getElementById('editorView') as any).getCursorPosition() + }, [], (result) => { + console.log('result', result) + browser.assert.equal(result.value, '180') + }) .end() } } diff --git a/apps/remix-ide-e2e/src/tests/fileExplorer.test.ts b/apps/remix-ide-e2e/src/tests/fileExplorer.test.ts index 267daa9e1c..663c1bb791 100644 --- a/apps/remix-ide-e2e/src/tests/fileExplorer.test.ts +++ b/apps/remix-ide-e2e/src/tests/fileExplorer.test.ts @@ -4,7 +4,7 @@ import init from '../helpers/init' import * as path from 'path' const testData = { - testFile1: path.resolve(__dirname + '/editor.spec.js'), // eslint-disable-line + testFile1: path.resolve(__dirname + '/editor.test.js'), // eslint-disable-line testFile2: path.resolve(__dirname + '/fileExplorer.test.js'), // eslint-disable-line testFile3: path.resolve(__dirname + '/generalSettings.test.js') // eslint-disable-line } @@ -105,7 +105,7 @@ module.exports = { .setValue('*[data-id="fileExplorerFileUpload"]', testData.testFile1) .setValue('*[data-id="fileExplorerFileUpload"]', testData.testFile2) .setValue('*[data-id="fileExplorerFileUpload"]', testData.testFile3) - .waitForElementVisible('[data-id="treeViewLitreeViewItemeditor.spec.js"]') + .waitForElementVisible('[data-id="treeViewLitreeViewItemeditor.test.js"]') .waitForElementVisible('[data-id="treeViewLitreeViewItemfileExplorer.test.js"]') .waitForElementVisible('[data-id="treeViewLitreeViewItemgeneralSettings.test.js"]') .end() diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index e569cc5e15..d2b8a690ae 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -15,7 +15,7 @@ import { FramingService } from './framingService' import { WalkthroughService } from './walkthroughService' -import { OffsetToLineColumnConverter, CompilerMetadata, CompilerArtefacts, FetchAndCompile, CompilerImports } from '@remix-project/core-plugin' +import { OffsetToLineColumnConverter, CompilerMetadata, CompilerArtefacts, FetchAndCompile, CompilerImports, EditorContextListener } from '@remix-project/core-plugin' import migrateFileSystem from './migrateFileSystem' @@ -48,7 +48,6 @@ const TestTab = require('./app/tabs/test-tab') const FilePanel = require('./app/panels/file-panel') const Editor = require('./app/editor/editor') const Terminal = require('./app/panels/terminal') -const ContextualListener = require('./app/editor/contextualListener') class AppComponent { constructor (api = {}, events = {}, opts = {}) { @@ -156,7 +155,7 @@ class AppComponent { } } ) - const contextualListener = new ContextualListener({ editor }) + const contextualListener = new EditorContextListener() self.engine.register([ blockchain, diff --git a/apps/remix-ide/src/app/editor/contextView.js b/apps/remix-ide/src/app/editor/contextView.js deleted file mode 100644 index da01321762..0000000000 --- a/apps/remix-ide/src/app/editor/contextView.js +++ /dev/null @@ -1,194 +0,0 @@ -'use strict' -import { sourceMappingDecoder } from '@remix-project/remix-debug' -const yo = require('yo-yo') -const globalRegistry = require('../../global/registry') - -const css = require('./styles/contextView-styles') - -/* - Display information about the current focused code: - - if it's a reference, display information about the declaration - - jump to the declaration - - number of references - - rename declaration/references -*/ -class ContextView { - constructor (opts, localRegistry) { - this._components = {} - this._components.registry = localRegistry || globalRegistry - this.contextualListener = opts.contextualListener - this.editor = opts.editor - this._deps = { - compilersArtefacts: this._components.registry.get('compilersartefacts').api, - offsetToLineColumnConverter: this._components.registry.get('offsettolinecolumnconverter').api, - config: this._components.registry.get('config').api, - fileManager: this._components.registry.get('filemanager').api - } - this._view = null - this._nodes = null - this._current = null - this.sourceMappingDecoder = sourceMappingDecoder - this.previousElement = null - this.contextualListener.event.register('contextChanged', nodes => { - this.show() - this._nodes = nodes - this.update() - }) - this.contextualListener.event.register('stopHighlighting', () => { - }) - } - - render () { - const view = yo` -
    -
    - ${this._renderTarget()} -
    -
    ` - if (!this._view) { - this._view = view - } - return view - } - - hide () { - if (this._view) { - this._view.style.display = 'none' - } - } - - show () { - if (this._view) { - this._view.style.display = 'block' - } - } - - update () { - if (this._view) { - yo.update(this._view, this.render()) - } - } - - _renderTarget () { - let last - const previous = this._current - if (this._nodes && this._nodes.length) { - last = this._nodes[this._nodes.length - 1] - if (isDefinition(last)) { - this._current = last - } else { - const target = this.contextualListener.declarationOf(last) - if (target) { - this._current = target - } else { - this._current = null - } - } - } - if (!this._current || !previous || previous.id !== this._current.id || (this.previousElement && !this.previousElement.children.length)) { - this.previousElement = this._render(this._current, last) - } - return this.previousElement - } - - _jumpToInternal (position) { - const jumpToLine = (lineColumn) => { - if (lineColumn.start && lineColumn.start.line && lineColumn.start.column) { - this.editor.gotoLine(lineColumn.start.line, lineColumn.end.column + 1) - } - } - const lastCompilationResult = this._deps.compilersArtefacts.__last - if (lastCompilationResult && lastCompilationResult.languageversion.indexOf('soljson') === 0 && lastCompilationResult.data) { - const lineColumn = this._deps.offsetToLineColumnConverter.offsetToLineColumn( - position, - position.file, - lastCompilationResult.getSourceCode().sources, - lastCompilationResult.getAsts()) - const filename = lastCompilationResult.getSourceName(position.file) - // TODO: refactor with rendererAPI.errorClick - if (filename !== this._deps.config.get('currentFile')) { - const provider = this._deps.fileManager.fileProviderOf(filename) - if (provider) { - provider.exists(filename).then(exist => { - this._deps.fileManager.open(filename) - jumpToLine(lineColumn) - }).catch(error => { - if (error) return console.log(error) - }) - } - } else { - jumpToLine(lineColumn) - } - } - } - - _render (node, nodeAtCursorPosition) { - if (!node) return yo`
    ` - let references = this.contextualListener.referencesOf(node) - const type = node.typeDescriptions && node.typeDescriptions.typeString ? node.typeDescriptions.typeString : node.nodeType - references = `${references ? references.length : '0'} reference(s)` - - let ref = 0 - const nodes = this.contextualListener.getActiveHighlights() - for (const k in nodes) { - if (nodeAtCursorPosition.id === nodes[k].nodeId) { - ref = k - break - } - } - - // JUMP BETWEEN REFERENCES - const jump = (e) => { - e.target.dataset.action === 'next' ? ref++ : ref-- - if (ref < 0) ref = nodes.length - 1 - if (ref >= nodes.length) ref = 0 - this._jumpToInternal(nodes[ref].position) - } - - const jumpTo = () => { - if (node && node.src) { - const position = this.sourceMappingDecoder.decode(node.src) - if (position) { - this._jumpToInternal(position) - } - } - } - - const showGasEstimation = () => { - if (node.nodeType === 'FunctionDefinition') { - const result = this.contextualListener.gasEstimation(node) - const executionCost = ' Execution cost: ' + result.executionCost + ' gas' - const codeDepositCost = 'Code deposit cost: ' + result.codeDepositCost + ' gas' - const estimatedGas = result.codeDepositCost ? `${codeDepositCost}, ${executionCost}` : `${executionCost}` - return yo` -
    - - ${estimatedGas} -
    - ` - } - } - - return yo` -
    ${showGasEstimation()} -
    ${type}
    -
    ${node.name}
    - - ${references} - - -
    - ` - } -} - -function isDefinition (node) { - return node.nodeType === 'ContractDefinition' || - node.nodeType === 'FunctionDefinition' || - node.nodeType === 'ModifierDefinition' || - node.nodeType === 'VariableDeclaration' || - node.nodeType === 'StructDefinition' || - node.nodeType === 'EventDefinition' -} - -module.exports = ContextView diff --git a/apps/remix-ide/src/app/editor/editor.js b/apps/remix-ide/src/app/editor/editor.js index 295d83fd59..013b1b9853 100644 --- a/apps/remix-ide/src/app/editor/editor.js +++ b/apps/remix-ide/src/app/editor/editor.js @@ -12,7 +12,7 @@ const profile = { name: 'editor', description: 'service - editor', version: packageJson.version, - methods: ['highlight', 'discardHighlight', 'clearAnnotations', 'addAnnotation', 'gotoLine'] + methods: ['highlight', 'discardHighlight', 'clearAnnotations', 'addAnnotation', 'gotoLine', 'getCursorPosition'] } class Editor extends Plugin { @@ -75,7 +75,8 @@ class Editor extends Plugin { this._onChange(this.currentFile) } } - this.el.gotoLine = (line) => this.gotoLine(line, 0) + this.el.gotoLine = (line, column) => this.gotoLine(line, column || 0) + this.el.getCursorPosition = () => this.getCursorPosition() return this.el } diff --git a/apps/remix-ide/src/app/panels/main-view.js b/apps/remix-ide/src/app/panels/main-view.js index 537b296796..cad19a58f3 100644 --- a/apps/remix-ide/src/app/panels/main-view.js +++ b/apps/remix-ide/src/app/panels/main-view.js @@ -1,11 +1,14 @@ + +import React from 'react' // eslint-disable-line +import ReactDOM from 'react-dom' +import { RemixUiEditorContextView } from '@remix-ui/editor-context-view' + var yo = require('yo-yo') var EventManager = require('../../lib/events') var globalRegistry = require('../../global/registry') var { TabProxy } = require('./tab-proxy.js') -var ContextView = require('../editor/contextView') - var csjs = require('csjs-inject') var css = csjs` @@ -15,6 +18,10 @@ var css = csjs` height : 100%; width : 100%; } + .contextview { + opacity : 1; + position : relative; + } ` // @todo(#650) Extract this into two classes: MainPanel (TabsProxy + Iframe/Editor) & BottomPanel (Terminal) @@ -25,12 +32,13 @@ export class MainView { self._view = {} self._components = {} self._components.registry = globalRegistry + self.contextualListener = contextualListener + self.hideContextView = false self.editor = editor self.fileManager = fileManager self.mainPanel = mainPanel self.txListener = globalRegistry.get('txlistener').api self._components.terminal = terminal - self._components.contextualListener = contextualListener this.appManager = appManager this.init() } @@ -39,7 +47,8 @@ export class MainView { this.fileManager.unselectCurrentFile() this.mainPanel.showContent(name) this._view.editor.style.display = 'none' - this._components.contextView.hide() + this.hideContextView = true + this.renderContextView() this._view.mainPanel.style.display = 'block' } @@ -63,19 +72,22 @@ export class MainView { // we check upstream for "fileChanged" self._view.editor.style.display = 'block' self._view.mainPanel.style.display = 'none' - self._components.contextView.show() + this.hideContextView = false + this.renderContextView() }) self.tabProxy.event.on('openFile', (file) => { self._view.editor.style.display = 'block' self._view.mainPanel.style.display = 'none' - self._components.contextView.show() + this.hideContextView = false + this.renderContextView() }) self.tabProxy.event.on('closeFile', (file) => { }) self.tabProxy.event.on('switchApp', self.showApp.bind(self)) self.tabProxy.event.on('closeApp', (name) => { self._view.editor.style.display = 'block' - self._components.contextView.show() + this.hideContextView = false + this.renderContextView() self._view.mainPanel.style.display = 'none' }) self.tabProxy.event.on('tabCountChanged', (count) => { @@ -90,10 +102,6 @@ export class MainView { } } - const contextView = new ContextView({ contextualListener: self._components.contextualListener, editor: self.editor }) - - self._components.contextView = contextView - self._components.terminal.event.register('resize', delta => self._adjustLayout('top', delta)) if (self.txListener) { self._components.terminal.event.register('listenOnNetWork', (listenOnNetWork) => { @@ -181,15 +189,17 @@ export class MainView { self._view.editor.style.display = 'none' self._view.mainPanel = self.mainPanel.render() self._view.terminal = self._components.terminal.render() + self._view.mainview = yo`
    ${self.tabProxy.renderTabsbar()} ${self._view.editor} ${self._view.mainPanel} - ${self._components.contextView.render()} +
    ${self._view.terminal}
    ` + // INIT self._adjustLayout('top', self.data._layout.top.offset) @@ -200,6 +210,22 @@ export class MainView { return self._view.mainview } + renderContextView () { + if (!this.contextualListener.activated) return + + ReactDOM.render( + this.contextualListener.call('editor', 'gotoLine', line, column)} + openFile={(file) => this.contextualListener.call('editor', 'openFile', file)} + getLastCompilationResult={_ => { return this.contextualListener.call('compilerArtefacts', 'getLastCompilationResult') } } + offsetToLineColumn={(position, file, sources, asts) => { return this.contextualListener.call('offsetToLineColumnConverter', 'offsetToLineColumn', position, file, sources, asts) } } + getCurrentFileName={() => { return this.contextualListener.call('fileManager', 'file') } } + /> + , this._view.mainview.querySelector('.contextview')) + } + registerCommand (name, command, opts) { var self = this return self._components.terminal.registerCommand(name, command, opts) diff --git a/libs/remix-core-plugin/src/index.ts b/libs/remix-core-plugin/src/index.ts index 73c98a6181..fe8a5c661e 100644 --- a/libs/remix-core-plugin/src/index.ts +++ b/libs/remix-core-plugin/src/index.ts @@ -3,3 +3,4 @@ export { CompilerMetadata } from './lib/compiler-metadata' export { FetchAndCompile } from './lib/compiler-fetch-and-compile' export { CompilerImports } from './lib/compiler-content-imports' export { CompilerArtefacts } from './lib/compiler-artefacts' +export { EditorContextListener } from './lib/editor-context-listener' diff --git a/libs/remix-core-plugin/src/lib/compiler-artefacts.ts b/libs/remix-core-plugin/src/lib/compiler-artefacts.ts index 148aa292c7..715bd2e9c4 100644 --- a/libs/remix-core-plugin/src/lib/compiler-artefacts.ts +++ b/libs/remix-core-plugin/src/lib/compiler-artefacts.ts @@ -4,7 +4,7 @@ import { CompilerAbstract } from '@remix-project/remix-solidity' const profile = { name: 'compilerArtefacts', - methods: ['get', 'addResolvedContract', 'getCompilerAbstract', 'getAllContractDatas'], + methods: ['get', 'addResolvedContract', 'getCompilerAbstract', 'getAllContractDatas', 'getLastCompilationResult'], events: [], version: '0.0.1' } @@ -59,6 +59,10 @@ export class CompilerArtefacts extends Plugin { }) } + getLastCompilationResult () { + return this.compilersArtefacts.__last + } + getAllContractDatas () { const contractsData = {} Object.keys(this.compilersArtefactsPerFile).map((targetFile) => { diff --git a/apps/remix-ide/src/app/editor/contextualListener.js b/libs/remix-core-plugin/src/lib/editor-context-listener.ts similarity index 64% rename from apps/remix-ide/src/app/editor/contextualListener.js rename to libs/remix-core-plugin/src/lib/editor-context-listener.ts index 9eea6aeaed..72ccee7457 100644 --- a/apps/remix-ide/src/app/editor/contextualListener.js +++ b/libs/remix-core-plugin/src/lib/editor-context-listener.ts @@ -1,47 +1,48 @@ 'use strict' import { Plugin } from '@remixproject/engine' -import * as packageJson from '../../../../../package.json' import { sourceMappingDecoder } from '@remix-project/remix-debug' const { AstWalker } = require('@remix-project/remix-astwalker') -const EventManager = require('../../lib/events') -const globalRegistry = require('../../global/registry') const profile = { name: 'contextualListener', methods: [], events: [], - version: packageJson.version + version: '0.0.1' } /* trigger contextChanged(nodes) */ -class ContextualListener extends Plugin { - constructor (opts) { +export class EditorContextListener extends Plugin { + _index: any + _activeHighlights: Array + astWalker: any + currentPosition: any + currentFile: String + nodes: Array + results: any + estimationObj: any + creationCost: any + codeDepositCost: any + contract: any + activated: boolean + + constructor () { super(profile) - this.event = new EventManager() - this._components = {} - this._components.registry = globalRegistry - this.editor = opts.editor - this.pluginManager = opts.pluginManager - this._deps = { - compilersArtefacts: this._components.registry.get('compilersartefacts').api, - config: this._components.registry.get('config').api, - offsetToLineColumnConverter: this._components.registry.get('offsettolinecolumnconverter').api - } + this.activated = false this._index = { Declarations: {}, FlatReferences: {} } this._activeHighlights = [] - this.editor.event.register('contentChanged', () => { this._stopHighlighting() }) - this.sourceMappingDecoder = sourceMappingDecoder this.astWalker = new AstWalker() } onActivation () { + this.on('editor', 'contentChanged', () => { this._stopHighlighting() }) + this.on('solidity', 'compilationFinished', (file, source, languageVersion, data) => { if (languageVersion.indexOf('soljson') !== 0) return this._stopHighlighting() @@ -52,11 +53,18 @@ class ContextualListener extends Plugin { this._buildIndex(data, source) }) - setInterval(() => { - if (this._deps.compilersArtefacts.__last && this._deps.compilersArtefacts.__last.languageversion.indexOf('soljson') === 0) { - this._highlightItems(this.editor.getCursorPosition(), this._deps.compilersArtefacts.__last, this._deps.config.get('currentFile')) + setInterval(async () => { + const compilationResult = await this.call('compilerArtefacts', 'getLastCompilationResult') + if (compilationResult && compilationResult.languageversion.indexOf('soljson') === 0) { + this._highlightItems( + await this.call('editor', 'getCursorPosition'), + compilationResult, + await this.call('fileManager', 'file') + ) } }, 1000) + + this.activated = true } getActiveHighlights () { @@ -74,7 +82,7 @@ class ContextualListener extends Plugin { return this._index.Declarations[node.id] } - _highlightItems (cursorPosition, compilationResult, file) { + async _highlightItems (cursorPosition, compilationResult, file) { if (this.currentPosition === cursorPosition) return if (this.currentFile !== file) { this.currentFile = file @@ -85,12 +93,12 @@ class ContextualListener extends Plugin { this.currentPosition = cursorPosition this.currentFile = file if (compilationResult && compilationResult.data && compilationResult.data.sources[file]) { - const nodes = this.sourceMappingDecoder.nodesAtPosition(null, cursorPosition, compilationResult.data.sources[file]) + const nodes = sourceMappingDecoder.nodesAtPosition(null, cursorPosition, compilationResult.data.sources[file]) this.nodes = nodes if (nodes && nodes.length && nodes[nodes.length - 1]) { - this._highlightExpressions(nodes[nodes.length - 1], compilationResult) + await this._highlightExpressions(nodes[nodes.length - 1], compilationResult) } - this.event.trigger('contextChanged', [nodes]) + this.emit('contextChanged', nodes) } } @@ -111,21 +119,19 @@ class ContextualListener extends Plugin { } } - _highlight (node, compilationResult) { + async _highlight (node, compilationResult) { if (!node) return - const position = this.sourceMappingDecoder.decode(node.src) - const eventId = this._highlightInternal(position, node) - const lastCompilationResult = this._deps.compilersArtefacts.__last - if (eventId && lastCompilationResult && lastCompilationResult.languageversion.indexOf('soljson') === 0) { - this._activeHighlights.push({ eventId, position, fileTarget: lastCompilationResult.getSourceName(position.file), nodeId: node.id }) + const position = sourceMappingDecoder.decode(node.src) + await this._highlightInternal(position, node, compilationResult) + if (compilationResult && compilationResult.languageversion.indexOf('soljson') === 0) { + this._activeHighlights.push({ position, fileTarget: compilationResult.getSourceName(position.file), nodeId: node.id }) } } - _highlightInternal (position, node) { + async _highlightInternal (position, node, compilationResult) { if (node.nodeType === 'Block') return - const lastCompilationResult = this._deps.compilersArtefacts.__last - if (lastCompilationResult && lastCompilationResult.languageversion.indexOf('soljson') === 0) { - let lineColumn = this._deps.offsetToLineColumnConverter.offsetToLineColumn(position, position.file, lastCompilationResult.getSourceCode().sources, lastCompilationResult.getAsts()) + if (compilationResult && compilationResult.languageversion.indexOf('soljson') === 0) { + let lineColumn = await this.call('offsetToLineColumnConverter', 'offsetToLineColumn', position, position.file, compilationResult.getSourceCode().sources, compilationResult.getAsts()) if (node.nodes && node.nodes.length) { // If node has children, highlight the entire line. if not, just highlight the current source position of the node. lineColumn = { @@ -139,38 +145,38 @@ class ContextualListener extends Plugin { } } } - const fileName = lastCompilationResult.getSourceName(position.file) + const fileName = compilationResult.getSourceName(position.file) if (fileName) { - return this.call('editor', 'highlight', lineColumn, fileName, '', { focus: false }) + return await this.call('editor', 'highlight', lineColumn, fileName, '', { focus: false }) } } return null } - _highlightExpressions (node, compilationResult) { - const highlights = (id) => { + async _highlightExpressions (node, compilationResult) { + const highlights = async (id) => { if (this._index.Declarations && this._index.Declarations[id]) { const refs = this._index.Declarations[id] for (const ref in refs) { const node = refs[ref] - this._highlight(node, compilationResult) + await this._highlight(node, compilationResult) } } } if (node && node.referencedDeclaration) { - highlights(node.referencedDeclaration) + await highlights(node.referencedDeclaration) const current = this._index.FlatReferences[node.referencedDeclaration] - this._highlight(current, compilationResult) + await this._highlight(current, compilationResult) } else { - highlights(node.id) - this._highlight(node, compilationResult) + await highlights(node.id) + await this._highlight(node, compilationResult) } this.results = compilationResult } _stopHighlighting () { this.call('editor', 'discardHighlight') - this.event.trigger('stopHighlighting', []) + this.emit('stopHighlighting') this._activeHighlights = [] } @@ -229,5 +235,3 @@ class ContextualListener extends Plugin { return '(' + params.toString() + ')' } } - -module.exports = ContextualListener diff --git a/libs/remix-ui/editor-context-view/.babelrc b/libs/remix-ui/editor-context-view/.babelrc new file mode 100644 index 0000000000..09d67939cc --- /dev/null +++ b/libs/remix-ui/editor-context-view/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["@nrwl/react/babel"], + "plugins": [] +} diff --git a/libs/remix-ui/editor-context-view/.eslintrc b/libs/remix-ui/editor-context-view/.eslintrc new file mode 100644 index 0000000000..9d709f91d0 --- /dev/null +++ b/libs/remix-ui/editor-context-view/.eslintrc @@ -0,0 +1,19 @@ +{ + "env": { + "browser": true, + "es6": true + }, + "extends": "../../../.eslintrc", + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 11, + "sourceType": "module" + }, + "rules": { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": "error" + } +} diff --git a/libs/remix-ui/editor-context-view/README.md b/libs/remix-ui/editor-context-view/README.md new file mode 100644 index 0000000000..0b9719fedb --- /dev/null +++ b/libs/remix-ui/editor-context-view/README.md @@ -0,0 +1,7 @@ +# remix-ui-editor-context-view + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test remix-ui-editor-context-view` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/libs/remix-ui/editor-context-view/src/index.ts b/libs/remix-ui/editor-context-view/src/index.ts new file mode 100644 index 0000000000..b595accc41 --- /dev/null +++ b/libs/remix-ui/editor-context-view/src/index.ts @@ -0,0 +1 @@ +export * from './lib/remix-ui-editor-context-view'; diff --git a/apps/remix-ide/src/app/editor/styles/contextView-styles.js b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.css similarity index 70% rename from apps/remix-ide/src/app/editor/styles/contextView-styles.js rename to libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.css index 5303a356fa..f57c88f78f 100644 --- a/apps/remix-ide/src/app/editor/styles/contextView-styles.js +++ b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.css @@ -1,17 +1,9 @@ -var csjs = require('csjs-inject') -var css = csjs` - .contextview { - opacity : 1; - position : relative; - height : 25px; - } - .container { + .container-context-view { padding : 1px 15px; } .line { display : flex; - justify-content : flex-end; align-items : center; text-overflow : ellipsis; overflow : hidden; @@ -48,12 +40,4 @@ var css = csjs` z-index : 50; border-radius : 1px; border : 2px solid var(--secondary); - } - .contextviewcontainer{ - z-index : 50; - border-radius : 1px; - border : 2px solid var(--secondary); - } -` - -module.exports = css + } \ No newline at end of file diff --git a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx new file mode 100644 index 0000000000..51b6f6bf9d --- /dev/null +++ b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx @@ -0,0 +1,159 @@ +import React, { useEffect, useState, useRef } from 'react' // eslint-disable-line +import { sourceMappingDecoder } from '@remix-project/remix-debug' + +import './remix-ui-editor-context-view.css'; + +/* eslint-disable-next-line */ +export interface RemixUiEditorContextViewProps { + hide: boolean, + contextualListener: any, + gotoLine: (line: number, column: number) => void, + openFile: (fileName: string) => void, + getLastCompilationResult: () => any, + offsetToLineColumn: (position: any, file: any, sources: any, asts: any) => any, + getCurrentFileName: () => String +} + +function isDefinition (node: any) { + return node.nodeType === 'ContractDefinition' || + node.nodeType === 'FunctionDefinition' || + node.nodeType === 'ModifierDefinition' || + node.nodeType === 'VariableDeclaration' || + node.nodeType === 'StructDefinition' || + node.nodeType === 'EventDefinition' +} + +type astNode = { + name: string, + id: number, + children: Array, + typeDescriptions: any, + nodeType: String, + src: any, + nodeId: any, + position: any +} + +type nullableAstNode = astNode | null + +export function RemixUiEditorContextView(props: RemixUiEditorContextViewProps) { + const nodesRef = useRef>([]) + /* + gotoLineDisableRef is used to temporarily disable the update of the view. + e.g when the user ask the component to "gotoLine" we don't want to rerender the component (but just to put the mouse on the desired line) + */ + const gotoLineDisableRef = useRef(false) + const [nodesState, setNode] = useState>([]) + const contextualListener = props.contextualListener + + useEffect(() => { + contextualListener.on('contextualListener', 'contextChanged', (nodes: Array) => { + if (gotoLineDisableRef.current) { + gotoLineDisableRef.current = false + return + } + nodesRef.current = nodes + setNode(nodes) + }) + }, []) + + const _render = (node: nullableAstNode) => { + if (!node) return (
    ) + let references = contextualListener.referencesOf(node) + const type = node.typeDescriptions && node.typeDescriptions.typeString ? node.typeDescriptions.typeString : node.nodeType + references = `${references ? references.length : '0'} reference(s)` + + let ref = 0 + const nodes: Array = contextualListener.getActiveHighlights() + + /* + * show gas estimation + */ + const gasEstimation = () => { + if (node.nodeType === 'FunctionDefinition') { + const result = contextualListener.gasEstimation(node) + const executionCost = ' Execution cost: ' + result.executionCost + ' gas' + const codeDepositCost = 'Code deposit cost: ' + result.codeDepositCost + ' gas' + const estimatedGas = result.codeDepositCost ? `${codeDepositCost}, ${executionCost}` : `${executionCost}` + return ( +
    + + {estimatedGas} +
    + ) + } else { + return (
    ) + } + } + + /* + * onClick jump to ast node in the editor + */ + const _jumpToInternal = async (position: any) => { + const jumpToLine = async (fileName: string, lineColumn: any) => { + if (fileName !== await props.getCurrentFileName()) { + await props.openFile(fileName) + } + if (lineColumn.start && lineColumn.start.line && lineColumn.start.column) { + gotoLineDisableRef.current = true + props.gotoLine(lineColumn.start.line, lineColumn.end.column + 1) + } + } + const lastCompilationResult = await props.getLastCompilationResult() + if (lastCompilationResult && lastCompilationResult.languageversion.indexOf('soljson') === 0 && lastCompilationResult.data) { + const lineColumn = await props.offsetToLineColumn( + position, + position.file, + lastCompilationResult.getSourceCode().sources, + lastCompilationResult.getAsts()) + const filename = lastCompilationResult.getSourceName(position.file) + // TODO: refactor with rendererAPI.errorClick + jumpToLine(filename, lineColumn) + } + } + + const jumpTo = () => { + if (node && node.src) { + const position = sourceMappingDecoder.decode(node.src) + if (position) { + _jumpToInternal(position) + } + } + } + + // JUMP BETWEEN REFERENCES + const jump = (e: any) => { + e.target.dataset.action === 'next' ? ref++ : ref-- + if (ref < 0) ref = nodes.length - 1 + if (ref >= nodes.length) ref = 0 + _jumpToInternal(nodes[ref].position) + } + + return ( +
    {gasEstimation()} +
    {type}
    +
    {node.name}
    + + {references} + + +
    + ) + } + + let last: nullableAstNode = null + if (!props.hide && nodesRef.current && nodesRef.current.length) { + last = nodesRef.current[nodesRef.current.length - 1] + if (!isDefinition(last)) { + last = contextualListener.declarationOf(last) + } + } + + return ( + !props.hide &&
    + {_render(last)} +
    + ); +} + +export default RemixUiEditorContextView diff --git a/libs/remix-ui/editor-context-view/tsconfig.json b/libs/remix-ui/editor-context-view/tsconfig.json new file mode 100644 index 0000000000..d52e31ad74 --- /dev/null +++ b/libs/remix-ui/editor-context-view/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/libs/remix-ui/editor-context-view/tsconfig.lib.json b/libs/remix-ui/editor-context-view/tsconfig.lib.json new file mode 100644 index 0000000000..b560bc4dec --- /dev/null +++ b/libs/remix-ui/editor-context-view/tsconfig.lib.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "types": ["node"] + }, + "files": [ + "../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../node_modules/@nrwl/react/typings/image.d.ts" + ], + "exclude": ["**/*.spec.ts", "**/*.spec.tsx"], + "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] +} diff --git a/nx.json b/nx.json index 8bc14e4e9d..a1a7131ff6 100644 --- a/nx.json +++ b/nx.json @@ -147,6 +147,9 @@ }, "remix-ui-theme-module": { "tags": [] + }, + "remix-ui-editor-context-view": { + "tags": [] } }, "targetDependencies": { diff --git a/tsconfig.base.json b/tsconfig.base.json index 3633434dce..68e1ae5175 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -69,10 +69,9 @@ "@remix-ui/tabs": ["libs/remix-ui/tabs/src/index.ts"], "@remix-ui/helper": ["libs/remix-ui/helper/src/index.ts"], "@remix-ui/app": ["libs/remix-ui/app/src/index.ts"], - "@remix-ui/vertical-icons-panel": [ - "libs/remix-ui/vertical-icons-panel/src/index.ts" - ], - "@remix-ui/theme-module": ["libs/remix-ui/theme-module/src/index.ts"] + "@remix-ui/vertical-icons-panel": ["libs/remix-ui/vertical-icons-panel/src/index.ts"], + "@remix-ui/theme-module": ["libs/remix-ui/theme-module/src/index.ts"], + "@remix-ui/editor-context-view": ["libs/remix-ui/editor-context-view/src/index.ts"] } }, "exclude": ["node_modules", "tmp"] diff --git a/workspace.json b/workspace.json index 8ce5f9f9ce..8850066499 100644 --- a/workspace.json +++ b/workspace.json @@ -1116,80 +1116,48 @@ } } } + }, + "remix-ui-editor-context-view": { + "root": "libs/remix-ui/editor-context-view", + "sourceRoot": "libs/remix-ui/editor-context-view/src", + "projectType": "library", + "architect": { + "lint": { + "builder": "@nrwl/linter:lint", + "options": { + "linter": "eslint", + "tsConfig": ["libs/remix-ui/vertical-icons-panel/tsconfig.lib.json"], + "exclude": ["**/node_modules/**", "!libs/remix-ui/vertical-icons-panel/**/*"] + } + } + } } }, - "remix-ui-editor": { - "root": "libs/remix-ui/editor", - "sourceRoot": "libs/remix-ui/editor/src", - "projectType": "library", - "schematics": {}, - "architect": { - "lint": { - "builder": "@nrwl/linter:lint", - "options": { - "linter": "eslint", - "babel": true - }, - "component": { - "style": "css" - }, - "library": { - "style": "css", - "linter": "eslint" - } - }, + "cli": { + "defaultCollection": "@nrwl/react" + }, + "schematics": { + "@nrwl/workspace": { "library": { "linter": "eslint" } }, - "@nrwl/nx-plugin": { - "plugin": { + "@nrwl/cypress": { + "cypress-project": { "linter": "eslint" } }, - "@nrwl/web": { - "application": { - "linter": "eslint" - } - }, - "@nrwl/node": { - "application": { - "linter": "eslint" - }, - "library": { - "linter": "eslint" - } - } - }, - "cli": { - "defaultCollection": "@nrwl/react" - }, - "schematics": { - "@nrwl/workspace": { - "library": { - "linter": "eslint" - } - }, - "@nrwl/cypress": { - "cypress-project": { - "linter": "eslint" - } + "@nrwl/react": { + "application": { + "style": "css", + "linter": "eslint", + "babel": true }, - "@nrwl/react": { - "application": { - "style": "css", - "linter": "eslint", - "babel": true - }, - "component": { - "style": "css" - }, - "library": { - "style": "css", - "linter": "eslint" - } + "component": { + "style": "css" }, "library": { + "style": "css", "linter": "eslint" } }, @@ -1199,4 +1167,6 @@ } }, "defaultProject": "remix-ide" -} \ No newline at end of file + } +} + From 15e49763452803c9d22b73568c8528f7756f0522 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 21 Dec 2021 15:35:17 +0100 Subject: [PATCH 31/43] fix css --- .../src/lib/remix-ui-editor-context-view.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx index 51b6f6bf9d..336c290ffc 100644 --- a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx +++ b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx @@ -150,7 +150,7 @@ export function RemixUiEditorContextView(props: RemixUiEditorContextViewProps) { } return ( - !props.hide &&
    + !props.hide &&
    {_render(last)}
    ); From 10365638d5a7806d54dd6f1af66de8e629b6a95f Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 21 Dec 2021 17:17:09 +0100 Subject: [PATCH 32/43] refactor contextview to be added in the editor --- apps/remix-ide/src/app/panels/main-view.js | 34 +---------- .../src/lib/editor-context-listener.ts | 2 +- .../src/lib/remix-ui-editor-context-view.tsx | 59 ++++++++++++------- .../editor/src/lib/remix-ui-editor.css | 7 ++- .../editor/src/lib/remix-ui-editor.tsx | 20 +++++++ 5 files changed, 67 insertions(+), 55 deletions(-) diff --git a/apps/remix-ide/src/app/panels/main-view.js b/apps/remix-ide/src/app/panels/main-view.js index cad19a58f3..cf8009b469 100644 --- a/apps/remix-ide/src/app/panels/main-view.js +++ b/apps/remix-ide/src/app/panels/main-view.js @@ -1,7 +1,6 @@ import React from 'react' // eslint-disable-line import ReactDOM from 'react-dom' -import { RemixUiEditorContextView } from '@remix-ui/editor-context-view' var yo = require('yo-yo') var EventManager = require('../../lib/events') @@ -17,11 +16,7 @@ var css = csjs` flex-direction : column; height : 100%; width : 100%; - } - .contextview { - opacity : 1; - position : relative; - } + } ` // @todo(#650) Extract this into two classes: MainPanel (TabsProxy + Iframe/Editor) & BottomPanel (Terminal) @@ -33,7 +28,6 @@ export class MainView { self._components = {} self._components.registry = globalRegistry self.contextualListener = contextualListener - self.hideContextView = false self.editor = editor self.fileManager = fileManager self.mainPanel = mainPanel @@ -47,8 +41,6 @@ export class MainView { this.fileManager.unselectCurrentFile() this.mainPanel.showContent(name) this._view.editor.style.display = 'none' - this.hideContextView = true - this.renderContextView() this._view.mainPanel.style.display = 'block' } @@ -72,22 +64,16 @@ export class MainView { // we check upstream for "fileChanged" self._view.editor.style.display = 'block' self._view.mainPanel.style.display = 'none' - this.hideContextView = false - this.renderContextView() }) self.tabProxy.event.on('openFile', (file) => { self._view.editor.style.display = 'block' - self._view.mainPanel.style.display = 'none' - this.hideContextView = false - this.renderContextView() + self._view.mainPanel.style.display = 'none' }) self.tabProxy.event.on('closeFile', (file) => { }) self.tabProxy.event.on('switchApp', self.showApp.bind(self)) self.tabProxy.event.on('closeApp', (name) => { self._view.editor.style.display = 'block' - this.hideContextView = false - this.renderContextView() self._view.mainPanel.style.display = 'none' }) self.tabProxy.event.on('tabCountChanged', (count) => { @@ -210,22 +196,6 @@ export class MainView { return self._view.mainview } - renderContextView () { - if (!this.contextualListener.activated) return - - ReactDOM.render( - this.contextualListener.call('editor', 'gotoLine', line, column)} - openFile={(file) => this.contextualListener.call('editor', 'openFile', file)} - getLastCompilationResult={_ => { return this.contextualListener.call('compilerArtefacts', 'getLastCompilationResult') } } - offsetToLineColumn={(position, file, sources, asts) => { return this.contextualListener.call('offsetToLineColumnConverter', 'offsetToLineColumn', position, file, sources, asts) } } - getCurrentFileName={() => { return this.contextualListener.call('fileManager', 'file') } } - /> - , this._view.mainview.querySelector('.contextview')) - } - registerCommand (name, command, opts) { var self = this return self._components.terminal.registerCommand(name, command, opts) diff --git a/libs/remix-core-plugin/src/lib/editor-context-listener.ts b/libs/remix-core-plugin/src/lib/editor-context-listener.ts index 72ccee7457..7bde42de11 100644 --- a/libs/remix-core-plugin/src/lib/editor-context-listener.ts +++ b/libs/remix-core-plugin/src/lib/editor-context-listener.ts @@ -6,7 +6,7 @@ const { AstWalker } = require('@remix-project/remix-astwalker') const profile = { name: 'contextualListener', - methods: [], + methods: ['referencesOf', 'getActiveHighlights', 'gasEstimation', 'declarationOf'], events: [], version: '0.0.1' } diff --git a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx index 336c290ffc..22672ad539 100644 --- a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx +++ b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx @@ -3,15 +3,21 @@ import { sourceMappingDecoder } from '@remix-project/remix-debug' import './remix-ui-editor-context-view.css'; +export type onContextListenerChangedListener = (nodes: Array) => void + /* eslint-disable-next-line */ export interface RemixUiEditorContextViewProps { hide: boolean, - contextualListener: any, gotoLine: (line: number, column: number) => void, openFile: (fileName: string) => void, getLastCompilationResult: () => any, offsetToLineColumn: (position: any, file: any, sources: any, asts: any) => any, getCurrentFileName: () => String + onContextListenerChanged: (listener: onContextListenerChangedListener) => void + referencesOf: (nodes: astNode) => Array + getActiveHighlights: () => Array + gasEstimation: (node: astNode) => gasEstimation + declarationOf: (node: astNode) => astNode } function isDefinition (node: any) { @@ -23,7 +29,12 @@ function isDefinition (node: any) { node.nodeType === 'EventDefinition' } -type astNode = { +export type gasEstimationType = { + executionCost: string, + codeDepositCost: string +} + +export type astNode = { name: string, id: number, children: Array, @@ -42,36 +53,50 @@ export function RemixUiEditorContextView(props: RemixUiEditorContextViewProps) { gotoLineDisableRef is used to temporarily disable the update of the view. e.g when the user ask the component to "gotoLine" we don't want to rerender the component (but just to put the mouse on the desired line) */ - const gotoLineDisableRef = useRef(false) + const referencesRef = useRef([]) + const activeHighlightsRef = useRef([]) + const currentNodeRef = useRef(null as nullableAstNode) + const gasEstimationRef = useRef({} as gasEstimationType) + const gotoLineDisableRef = useRef(false) const [nodesState, setNode] = useState>([]) - const contextualListener = props.contextualListener - + useEffect(() => { - contextualListener.on('contextualListener', 'contextChanged', (nodes: Array) => { + props.onContextListenerChanged(async (nodes: Array) => { if (gotoLineDisableRef.current) { gotoLineDisableRef.current = false return } nodesRef.current = nodes + if (!props.hide && nodesRef.current && nodesRef.current.length) { + currentNodeRef.current = nodesRef.current[nodesRef.current.length - 1] + if (!isDefinition(currentNodeRef.current)) { + currentNodeRef.current = await props.declarationOf(currentNodeRef.current) + } + } + if (currentNodeRef.current) { + referencesRef.current = await props.referencesOf(currentNodeRef.current) + gasEstimationRef.current = await props.gasEstimation(currentNodeRef.current) + } + activeHighlightsRef.current = await props.getActiveHighlights() setNode(nodes) }) }, []) const _render = (node: nullableAstNode) => { if (!node) return (
    ) - let references = contextualListener.referencesOf(node) + let references = referencesRef.current const type = node.typeDescriptions && node.typeDescriptions.typeString ? node.typeDescriptions.typeString : node.nodeType - references = `${references ? references.length : '0'} reference(s)` + let referencesCount = `${references ? references.length : '0'} reference(s)` let ref = 0 - const nodes: Array = contextualListener.getActiveHighlights() + const nodes: Array = activeHighlightsRef.current /* * show gas estimation */ const gasEstimation = () => { if (node.nodeType === 'FunctionDefinition') { - const result = contextualListener.gasEstimation(node) + const result: gasEstimationType = gasEstimationRef.current const executionCost = ' Execution cost: ' + result.executionCost + ' gas' const codeDepositCost = 'Code deposit cost: ' + result.codeDepositCost + ' gas' const estimatedGas = result.codeDepositCost ? `${codeDepositCost}, ${executionCost}` : `${executionCost}` @@ -134,24 +159,16 @@ export function RemixUiEditorContextView(props: RemixUiEditorContextViewProps) {
    {type}
    {node.name}
    - {references} + {referencesCount}
    ) - } - - let last: nullableAstNode = null - if (!props.hide && nodesRef.current && nodesRef.current.length) { - last = nodesRef.current[nodesRef.current.length - 1] - if (!isDefinition(last)) { - last = contextualListener.declarationOf(last) - } - } + } return ( !props.hide &&
    - {_render(last)} + {_render(currentNodeRef.current)}
    ); } diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.css b/libs/remix-ui/editor/src/lib/remix-ui-editor.css index a487d143f8..a078bfd498 100644 --- a/libs/remix-ui/editor/src/lib/remix-ui-editor.css +++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.css @@ -8,4 +8,9 @@ border-radius : 10px; height: auto; width: auto; -} \ No newline at end of file +} + +.contextview { + opacity : 1; + position : relative; + } \ No newline at end of file diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx index 480b548be9..d731084a59 100644 --- a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx +++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx @@ -1,4 +1,5 @@ import React, { useState, useRef, useEffect, useReducer } from 'react' // eslint-disable-line +import { RemixUiEditorContextView, astNode } from '@remix-ui/editor-context-view' import Editor, { loader } from '@monaco-editor/react' import { reducerActions, reducerListener, initialState } from './actions/editor' import { language, conf } from './syntax' @@ -49,6 +50,7 @@ loader.config({ paths: { vs: 'assets/js/monaco-editor/dev/vs' } }) /* eslint-disable-next-line */ export interface EditorUIProps { + contextualListener: any activated: boolean themeType: string currentFile: string @@ -62,6 +64,7 @@ export interface EditorUIProps { } plugin: { on: (plugin: string, event: string, listener: any) => void + call: (plugin: string, method: string, arg1?: any, arg2?: any, arg3?: any, arg4?: any) => any } editorAPI: { findMatches: (uri: string, value: string) => any @@ -377,6 +380,7 @@ export const EditorUI = (props: EditorUIProps) => { } return ( +
    { beforeMount={handleEditorWillMount} options={{ glyphMargin: true }} /> +
    + props.plugin.call('editor', 'gotoLine', line, column)} + openFile={(file) => props.plugin.call('editor', 'openFile', file)} + getLastCompilationResult={() => { return props.plugin.call('compilerArtefacts', 'getLastCompilationResult') } } + offsetToLineColumn={(position, file, sources, asts) => { return props.plugin.call('offsetToLineColumnConverter', 'offsetToLineColumn', position, file, sources, asts) } } + getCurrentFileName={() => { return props.plugin.call('fileManager', 'file') } } + onContextListenerChanged={(listener) => { props.plugin.on('contextualListener', 'contextChanged', listener) }} + referencesOf={(node: astNode) => { return props.plugin.call('contextualListener', 'referencesOf', node) }} + getActiveHighlights={() => { return props.plugin.call('contextualListener', 'getActiveHighlights') }} + gasEstimation={(node: astNode) => { return props.plugin.call('contextualListener', 'gasEstimation', node) }} + declarationOf={(node: astNode) => { return props.plugin.call('contextualListener', 'declarationOf', node) }} + /> +
    +
    ) } From 8422596553122d27f09b916182a56027c1d50656 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 21 Dec 2021 17:43:15 +0100 Subject: [PATCH 33/43] fix css --- libs/remix-ui/editor/src/lib/remix-ui-editor.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx index d731084a59..4f3dadd3cf 100644 --- a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx +++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx @@ -380,17 +380,16 @@ export const EditorUI = (props: EditorUIProps) => { } return ( -
    +
    -
    +
    props.plugin.call('editor', 'gotoLine', line, column)} From 4e6667d1937517558b1a6550d72fa363bd91514e Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 21 Dec 2021 21:10:23 +0100 Subject: [PATCH 34/43] fix_build --- .../src/lib/remix-ui-editor-context-view.tsx | 2 +- workspace.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx index 22672ad539..ea99c34b99 100644 --- a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx +++ b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx @@ -16,7 +16,7 @@ export interface RemixUiEditorContextViewProps { onContextListenerChanged: (listener: onContextListenerChangedListener) => void referencesOf: (nodes: astNode) => Array getActiveHighlights: () => Array - gasEstimation: (node: astNode) => gasEstimation + gasEstimation: (node: astNode) => gasEstimationType declarationOf: (node: astNode) => astNode } diff --git a/workspace.json b/workspace.json index 8850066499..f728458dbd 100644 --- a/workspace.json +++ b/workspace.json @@ -1165,8 +1165,8 @@ "plugin": { "linter": "eslint" } - }, - "defaultProject": "remix-ide" - } + } + }, + "defaultProject": "remix-ide" } From d92ff59b1bc6e64335a9270119ec37fc46c934b5 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 21 Dec 2021 21:34:04 +0100 Subject: [PATCH 35/43] linting --- apps/remix-ide/src/app/panels/main-view.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/apps/remix-ide/src/app/panels/main-view.js b/apps/remix-ide/src/app/panels/main-view.js index cf8009b469..1cb3b1ffa5 100644 --- a/apps/remix-ide/src/app/panels/main-view.js +++ b/apps/remix-ide/src/app/panels/main-view.js @@ -1,7 +1,3 @@ - -import React from 'react' // eslint-disable-line -import ReactDOM from 'react-dom' - var yo = require('yo-yo') var EventManager = require('../../lib/events') @@ -67,7 +63,7 @@ export class MainView { }) self.tabProxy.event.on('openFile', (file) => { self._view.editor.style.display = 'block' - self._view.mainPanel.style.display = 'none' + self._view.mainPanel.style.display = 'none' }) self.tabProxy.event.on('closeFile', (file) => { }) From 628aac0778c840506a36d732c6932552f6694dc6 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 21 Dec 2021 23:37:42 +0100 Subject: [PATCH 36/43] linting --- libs/remix-ui/editor/src/lib/remix-ui-editor.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx index 4f3dadd3cf..16a5e062f1 100644 --- a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx +++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx @@ -381,14 +381,14 @@ export const EditorUI = (props: EditorUIProps) => { return (
    - +
    Date: Wed, 22 Dec 2021 11:31:25 +0100 Subject: [PATCH 37/43] linter --- .../src/lib/remix-ui-editor-context-view.tsx | 64 ++++++++++--------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx index ea99c34b99..ca6ca5930c 100644 --- a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx +++ b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx @@ -1,11 +1,27 @@ import React, { useEffect, useState, useRef } from 'react' // eslint-disable-line import { sourceMappingDecoder } from '@remix-project/remix-debug' -import './remix-ui-editor-context-view.css'; +import './remix-ui-editor-context-view.css' + +/* eslint-disable-next-line */ + +export type astNode = { + name: string, + id: number, + children: Array, + typeDescriptions: any, + nodeType: String, + src: any, + nodeId: any, + position: any +} export type onContextListenerChangedListener = (nodes: Array) => void -/* eslint-disable-next-line */ +export type gasEstimationType = { + executionCost: string, + codeDepositCost: string +} export interface RemixUiEditorContextViewProps { hide: boolean, gotoLine: (line: number, column: number) => void, @@ -29,39 +45,25 @@ function isDefinition (node: any) { node.nodeType === 'EventDefinition' } -export type gasEstimationType = { - executionCost: string, - codeDepositCost: string -} -export type astNode = { - name: string, - id: number, - children: Array, - typeDescriptions: any, - nodeType: String, - src: any, - nodeId: any, - position: any -} type nullableAstNode = astNode | null -export function RemixUiEditorContextView(props: RemixUiEditorContextViewProps) { +export function RemixUiEditorContextView (props: RemixUiEditorContextViewProps) { const nodesRef = useRef>([]) /* - gotoLineDisableRef is used to temporarily disable the update of the view. + gotoLineDisableRef is used to temporarily disable the update of the view. e.g when the user ask the component to "gotoLine" we don't want to rerender the component (but just to put the mouse on the desired line) */ const referencesRef = useRef([]) const activeHighlightsRef = useRef([]) const currentNodeRef = useRef(null as nullableAstNode) const gasEstimationRef = useRef({} as gasEstimationType) - const gotoLineDisableRef = useRef(false) - const [nodesState, setNode] = useState>([]) - + const gotoLineDisableRef = useRef(false) + const [, setNode] = useState>([]) + useEffect(() => { - props.onContextListenerChanged(async (nodes: Array) => { + props.onContextListenerChanged(async (nodes: Array) => { if (gotoLineDisableRef.current) { gotoLineDisableRef.current = false return @@ -75,23 +77,23 @@ export function RemixUiEditorContextView(props: RemixUiEditorContextViewProps) { } if (currentNodeRef.current) { referencesRef.current = await props.referencesOf(currentNodeRef.current) - gasEstimationRef.current = await props.gasEstimation(currentNodeRef.current) + gasEstimationRef.current = await props.gasEstimation(currentNodeRef.current) } - activeHighlightsRef.current = await props.getActiveHighlights() + activeHighlightsRef.current = await props.getActiveHighlights() setNode(nodes) }) }, []) const _render = (node: nullableAstNode) => { if (!node) return (
    ) - let references = referencesRef.current + const references = referencesRef.current const type = node.typeDescriptions && node.typeDescriptions.typeString ? node.typeDescriptions.typeString : node.nodeType - let referencesCount = `${references ? references.length : '0'} reference(s)` + const referencesCount = `${references ? references.length : '0'} reference(s)` let ref = 0 const nodes: Array = activeHighlightsRef.current - - /* + + /* * show gas estimation */ const gasEstimation = () => { @@ -120,7 +122,7 @@ export function RemixUiEditorContextView(props: RemixUiEditorContextViewProps) { await props.openFile(fileName) } if (lineColumn.start && lineColumn.start.line && lineColumn.start.column) { - gotoLineDisableRef.current = true + gotoLineDisableRef.current = true props.gotoLine(lineColumn.start.line, lineColumn.end.column + 1) } } @@ -164,13 +166,13 @@ export function RemixUiEditorContextView(props: RemixUiEditorContextViewProps) {
    ) - } + } return ( !props.hide &&
    {_render(currentNodeRef.current)}
    - ); + ) } export default RemixUiEditorContextView From e52145f9eee735e7c5a0a1910413ed55fa3c61ac Mon Sep 17 00:00:00 2001 From: lianahus Date: Wed, 22 Dec 2021 13:42:31 +0100 Subject: [PATCH 38/43] fixes the resize of editor div --- libs/remix-ui/editor/src/lib/remix-ui-editor.css | 6 +++--- libs/remix-ui/editor/src/lib/remix-ui-editor.tsx | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.css b/libs/remix-ui/editor/src/lib/remix-ui-editor.css index a078bfd498..af7cd06bfd 100644 --- a/libs/remix-ui/editor/src/lib/remix-ui-editor.css +++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.css @@ -11,6 +11,6 @@ } .contextview { - opacity : 1; - position : relative; - } \ No newline at end of file + opacity: 1; + position: absolute; +} \ No newline at end of file diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx index 16a5e062f1..db1017f0e5 100644 --- a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx +++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx @@ -259,7 +259,7 @@ export const EditorUI = (props: EditorUIProps) => { range: new monacoRef.current.Range(marker.position.start.line + 1, marker.position.start.column + 1, marker.position.end.line + 1, marker.position.end.column + 1), options: { isWholeLine, - inlineClassName: `bg-info highlightLine${marker.position.start.line + 1}` + inlineClassName: `alert-info highlightLine${marker.position.start.line + 1}` } }) } @@ -380,7 +380,7 @@ export const EditorUI = (props: EditorUIProps) => { } return ( -
    +
    Date: Wed, 22 Dec 2021 16:37:17 +0100 Subject: [PATCH 39/43] fixed the colors of editor's content menu --- libs/remix-ui/editor/src/lib/remix-ui-editor.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx index db1017f0e5..67df7cd443 100644 --- a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx +++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx @@ -210,7 +210,12 @@ export const EditorUI = (props: EditorUIProps) => { 'editor.lineHighlightBorder': secondaryColor, 'editor.lineHighlightBackground': textbackground === darkColor ? lightColor : secondaryColor, 'editorGutter.background': lightColor, - 'minimap.background': lightColor + 'minimap.background': lightColor, + 'menu.foreground': textColor, + 'menu.background': textbackground, + 'menu.selectionBackground': secondaryColor, + 'menu.selectionForeground': textColor, + 'menu.selectionBorder': secondaryColor } }) monacoRef.current.editor.setTheme(themeName) From 224f6324b9f3bbd3226d2a0df9fbbfddfec87f1f Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 23 Dec 2021 11:03:04 +0100 Subject: [PATCH 40/43] use "useState" instead of "useRef" --- .../src/lib/remix-ui-editor-context-view.tsx | 55 ++++++++++++------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx index ca6ca5930c..13ceb93426 100644 --- a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx +++ b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx @@ -50,55 +50,68 @@ function isDefinition (node: any) { type nullableAstNode = astNode | null export function RemixUiEditorContextView (props: RemixUiEditorContextViewProps) { - const nodesRef = useRef>([]) /* gotoLineDisableRef is used to temporarily disable the update of the view. e.g when the user ask the component to "gotoLine" we don't want to rerender the component (but just to put the mouse on the desired line) */ - const referencesRef = useRef([]) - const activeHighlightsRef = useRef([]) - const currentNodeRef = useRef(null as nullableAstNode) - const gasEstimationRef = useRef({} as gasEstimationType) const gotoLineDisableRef = useRef(false) - const [, setNode] = useState>([]) - + const [state, setState] = useState<{ + nodes: Array, + references: Array, + activeHighlights: Array + currentNode: nullableAstNode, + gasEstimation: gasEstimationType + }>({ + nodes: [], + references: [], + activeHighlights: [], + currentNode: null, + gasEstimation: { executionCost: '', codeDepositCost: '' } + }) + useEffect(() => { props.onContextListenerChanged(async (nodes: Array) => { if (gotoLineDisableRef.current) { gotoLineDisableRef.current = false return } - nodesRef.current = nodes - if (!props.hide && nodesRef.current && nodesRef.current.length) { - currentNodeRef.current = nodesRef.current[nodesRef.current.length - 1] - if (!isDefinition(currentNodeRef.current)) { - currentNodeRef.current = await props.declarationOf(currentNodeRef.current) + let currentNode + if (!props.hide && nodes && nodes.length) { + currentNode = nodes[nodes.length - 1] + if (!isDefinition(currentNode)) { + currentNode = await props.declarationOf(currentNode) } } - if (currentNodeRef.current) { - referencesRef.current = await props.referencesOf(currentNodeRef.current) - gasEstimationRef.current = await props.gasEstimation(currentNodeRef.current) + let references + let gasEstimation + if (currentNode) { + references = await props.referencesOf(currentNode) + if (currentNode.nodeType === 'FunctionDefinition') { + gasEstimation = await props.gasEstimation(currentNode) + } } - activeHighlightsRef.current = await props.getActiveHighlights() - setNode(nodes) + let activeHighlights = await props.getActiveHighlights() + setState(prevState => { + return { ...prevState, nodes, references, activeHighlights, currentNode, gasEstimation } + }) }) }, []) const _render = (node: nullableAstNode) => { if (!node) return (
    ) - const references = referencesRef.current + const references = state.references const type = node.typeDescriptions && node.typeDescriptions.typeString ? node.typeDescriptions.typeString : node.nodeType const referencesCount = `${references ? references.length : '0'} reference(s)` let ref = 0 - const nodes: Array = activeHighlightsRef.current + const nodes: Array = state.activeHighlights /* * show gas estimation */ const gasEstimation = () => { if (node.nodeType === 'FunctionDefinition') { - const result: gasEstimationType = gasEstimationRef.current + const result: gasEstimationType = state.gasEstimation const executionCost = ' Execution cost: ' + result.executionCost + ' gas' const codeDepositCost = 'Code deposit cost: ' + result.codeDepositCost + ' gas' const estimatedGas = result.codeDepositCost ? `${codeDepositCost}, ${executionCost}` : `${executionCost}` @@ -170,7 +183,7 @@ export function RemixUiEditorContextView (props: RemixUiEditorContextViewProps) return ( !props.hide &&
    - {_render(currentNodeRef.current)} + {_render(state.currentNode)}
    ) } From 1d70aef400c98b9ed85a34f8cb81329931a4f19b Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 27 Dec 2021 10:57:03 +0100 Subject: [PATCH 41/43] put functions at top level --- .../src/lib/remix-ui-editor-context-view.tsx | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx index 13ceb93426..e0c0898868 100644 --- a/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx +++ b/libs/remix-ui/editor-context-view/src/lib/remix-ui-editor-context-view.tsx @@ -97,6 +97,52 @@ export function RemixUiEditorContextView (props: RemixUiEditorContextViewProps) }) }, []) + /* + * show gas estimation + */ + const gasEstimation = (node) => { + if (node.nodeType === 'FunctionDefinition') { + const result: gasEstimationType = state.gasEstimation + const executionCost = ' Execution cost: ' + result.executionCost + ' gas' + const codeDepositCost = 'Code deposit cost: ' + result.codeDepositCost + ' gas' + const estimatedGas = result.codeDepositCost ? `${codeDepositCost}, ${executionCost}` : `${executionCost}` + return ( +
    + + {estimatedGas} +
    + ) + } else { + return (
    ) + } + } + + /* + * onClick jump to ast node in the editor + */ + const _jumpToInternal = async (position: any) => { + const jumpToLine = async (fileName: string, lineColumn: any) => { + if (fileName !== await props.getCurrentFileName()) { + await props.openFile(fileName) + } + if (lineColumn.start && lineColumn.start.line && lineColumn.start.column) { + gotoLineDisableRef.current = true + props.gotoLine(lineColumn.start.line, lineColumn.end.column + 1) + } + } + const lastCompilationResult = await props.getLastCompilationResult() + if (lastCompilationResult && lastCompilationResult.languageversion.indexOf('soljson') === 0 && lastCompilationResult.data) { + const lineColumn = await props.offsetToLineColumn( + position, + position.file, + lastCompilationResult.getSourceCode().sources, + lastCompilationResult.getAsts()) + const filename = lastCompilationResult.getSourceName(position.file) + // TODO: refactor with rendererAPI.errorClick + jumpToLine(filename, lineColumn) + } + } + const _render = (node: nullableAstNode) => { if (!node) return (
    ) const references = state.references @@ -106,52 +152,6 @@ export function RemixUiEditorContextView (props: RemixUiEditorContextViewProps) let ref = 0 const nodes: Array = state.activeHighlights - /* - * show gas estimation - */ - const gasEstimation = () => { - if (node.nodeType === 'FunctionDefinition') { - const result: gasEstimationType = state.gasEstimation - const executionCost = ' Execution cost: ' + result.executionCost + ' gas' - const codeDepositCost = 'Code deposit cost: ' + result.codeDepositCost + ' gas' - const estimatedGas = result.codeDepositCost ? `${codeDepositCost}, ${executionCost}` : `${executionCost}` - return ( -
    - - {estimatedGas} -
    - ) - } else { - return (
    ) - } - } - - /* - * onClick jump to ast node in the editor - */ - const _jumpToInternal = async (position: any) => { - const jumpToLine = async (fileName: string, lineColumn: any) => { - if (fileName !== await props.getCurrentFileName()) { - await props.openFile(fileName) - } - if (lineColumn.start && lineColumn.start.line && lineColumn.start.column) { - gotoLineDisableRef.current = true - props.gotoLine(lineColumn.start.line, lineColumn.end.column + 1) - } - } - const lastCompilationResult = await props.getLastCompilationResult() - if (lastCompilationResult && lastCompilationResult.languageversion.indexOf('soljson') === 0 && lastCompilationResult.data) { - const lineColumn = await props.offsetToLineColumn( - position, - position.file, - lastCompilationResult.getSourceCode().sources, - lastCompilationResult.getAsts()) - const filename = lastCompilationResult.getSourceName(position.file) - // TODO: refactor with rendererAPI.errorClick - jumpToLine(filename, lineColumn) - } - } - const jumpTo = () => { if (node && node.src) { const position = sourceMappingDecoder.decode(node.src) @@ -170,7 +170,7 @@ export function RemixUiEditorContextView (props: RemixUiEditorContextViewProps) } return ( -
    {gasEstimation()} +
    {gasEstimation(node)}
    {type}
    {node.name}
    From 2d8ff4baf7182e363bfce57d0b80212ae2d1d4b3 Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 27 Dec 2021 11:02:47 +0100 Subject: [PATCH 42/43] linting --- .../src/lib/custom-hooks/useDragTerminal.tsx | 116 +++++++++--------- .../terminal/src/lib/remix-ui-terminal.tsx | 5 +- 2 files changed, 59 insertions(+), 62 deletions(-) diff --git a/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx b/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx index cdd4f6dc6a..1416ff2ddb 100644 --- a/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx +++ b/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx @@ -1,77 +1,77 @@ import { useEffect, useState } from 'react' export const useDragTerminal = (minHeight: number, defaultPosition: number) => { - const [isOpen, setIsOpen] = useState(defaultPosition > minHeight) - const [lastYPosition, setLastYPosition] = useState(0) - const [terminalPosition, setTerminalPosition] = useState(defaultPosition) - // Used to save position of the terminal when it is closed - const [lastTerminalPosition, setLastTerminalPosition] = useState(defaultPosition) - const [isDragging, setIsDragging] = useState(false) + const [isOpen, setIsOpen] = useState(defaultPosition > minHeight) + const [lastYPosition, setLastYPosition] = useState(0) + const [terminalPosition, setTerminalPosition] = useState(defaultPosition) + // Used to save position of the terminal when it is closed + const [lastTerminalPosition, setLastTerminalPosition] = useState(defaultPosition) + const [isDragging, setIsDragging] = useState(false) - const handleDraggingStart = (event: React.MouseEvent) => { - setLastYPosition(event.clientY) - setIsDragging(true) - } + const handleDraggingStart = (event: React.MouseEvent) => { + setLastYPosition(event.clientY) + setIsDragging(true) + } - const handleDragging = (event: MouseEvent) => { - event.preventDefault() + const handleDragging = (event: MouseEvent) => { + event.preventDefault() - if (isDragging) { - const mouseYPosition = event.clientY - const difference = lastYPosition - mouseYPosition - const newTerminalPosition = terminalPosition + difference - setTerminalPosition(newTerminalPosition) - setLastYPosition(mouseYPosition) - } + if (isDragging) { + const mouseYPosition = event.clientY + const difference = lastYPosition - mouseYPosition + const newTerminalPosition = terminalPosition + difference + setTerminalPosition(newTerminalPosition) + setLastYPosition(mouseYPosition) } + } - const handleDraggingEnd = () => { - if(!isDragging) return - - setIsDragging(false) + const handleDraggingEnd = () => { + if (!isDragging) return - // Check terminal position to determine if it should be open or closed - setIsOpen(terminalPosition > minHeight) - } + setIsDragging(false) - const handleToggleTerminal = (event: React.MouseEvent) => { - event.preventDefault() - event.stopPropagation() + // Check terminal position to determine if it should be open or closed + setIsOpen(terminalPosition > minHeight) + } - if(isOpen) { - setLastTerminalPosition(terminalPosition) - setLastYPosition(0) - setTerminalPosition(minHeight) - } else { - setTerminalPosition(lastTerminalPosition <= minHeight ? 323 : lastTerminalPosition) - } + const handleToggleTerminal = (event: React.MouseEvent) => { + event.preventDefault() + event.stopPropagation() - setIsOpen(!isOpen) + if (isOpen) { + setLastTerminalPosition(terminalPosition) + setLastYPosition(0) + setTerminalPosition(minHeight) + } else { + setTerminalPosition(lastTerminalPosition <= minHeight ? 323 : lastTerminalPosition) } - // Add event listeners for dragging - useEffect(() => { - document.addEventListener('mousemove', handleDragging) - document.addEventListener('mouseup', handleDraggingEnd) + setIsOpen(!isOpen) + } - return () => { - document.removeEventListener('mousemove', handleDragging) - document.removeEventListener('mouseup', handleDraggingEnd) - } - }, [handleDragging, handleDraggingEnd]) + // Add event listeners for dragging + useEffect(() => { + document.addEventListener('mousemove', handleDragging) + document.addEventListener('mouseup', handleDraggingEnd) - // Reset terminal position - useEffect(() => { - if(!terminalPosition){ - setTerminalPosition(defaultPosition) - } - }, [terminalPosition, setTerminalPosition]) + return () => { + document.removeEventListener('mousemove', handleDragging) + document.removeEventListener('mouseup', handleDraggingEnd) + } + }, [handleDragging, handleDraggingEnd]) - return { - isOpen, - terminalPosition, - isDragging, - handleDraggingStart, - handleToggleTerminal, + // Reset terminal position + useEffect(() => { + if (!terminalPosition) { + setTerminalPosition(defaultPosition) } + }, [terminalPosition, setTerminalPosition]) + + return { + isOpen, + terminalPosition, + isDragging, + handleDraggingStart, + handleToggleTerminal, + } } \ No newline at end of file diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx index de6de4eb23..8cc0829796 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx @@ -95,7 +95,7 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { useEffect(() => { event.trigger('resize', [terminalPosition]) - } , [terminalPosition]) + }, [terminalPosition]) const scrollToBottom = () => { messagesEndRef.current.scrollIntoView({ behavior: 'smooth' }) @@ -211,9 +211,6 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { } } - - - const focusinput = () => { inputEl.current.focus() } From 34e49bf909edf44d78b7b5947f89e6ec57562132 Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 27 Dec 2021 11:11:34 +0100 Subject: [PATCH 43/43] lintig --- .../terminal/src/lib/custom-hooks/useDragTerminal.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx b/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx index 1416ff2ddb..aba4bbf6a5 100644 --- a/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx +++ b/libs/remix-ui/terminal/src/lib/custom-hooks/useDragTerminal.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react' +import React, { useEffect, useState } from 'react' export const useDragTerminal = (minHeight: number, defaultPosition: number) => { const [isOpen, setIsOpen] = useState(defaultPosition > minHeight) @@ -72,6 +72,6 @@ export const useDragTerminal = (minHeight: number, defaultPosition: number) => { terminalPosition, isDragging, handleDraggingStart, - handleToggleTerminal, + handleToggleTerminal } -} \ No newline at end of file +}