changes towards reviews

pull/1344/head
joseph izang 3 years ago
parent fe94df66f0
commit ea76e6e42c
  1. 23
      apps/remix-ide/src/app/components/plugin-manager-component.js
  2. 14
      libs/remix-ui/plugin-manager/src/lib/components/ActivePluginCard.tsx
  3. 7
      libs/remix-ui/plugin-manager/src/lib/components/ActivePluginCardContainer.tsx
  4. 55
      libs/remix-ui/plugin-manager/src/lib/components/InactivePluginCard.tsx
  5. 12
      libs/remix-ui/plugin-manager/src/lib/components/InactivePluginCardContainer.tsx
  6. 77
      libs/remix-ui/plugin-manager/src/lib/components/pluginCard.tsx
  7. 12
      libs/remix-ui/plugin-manager/src/lib/remix-ui-plugin-manager.tsx
  8. 15
      libs/remix-ui/plugin-manager/src/pluginManagerStateMachine.ts
  9. 2
      libs/remix-ui/plugin-manager/src/types.d.ts
  10. 215
      package-lock.json
  11. 1
      package.json

@ -125,29 +125,6 @@ class PluginManagerComponent extends ViewPlugin {
document.getElementById('pluginManager'))
}
/***************
* SUB-COMPONENT
*/
/**
* Add a local plugin to the list of plugins
*/
// async openLocalPlugin () {
// try {
// const profile = await this.localPlugin.open(this.appManager.getAll())
// if (!profile) return
// if (this.appManager.getIds().includes(profile.name)) {
// throw new Error('This name has already been used')
// }
// const plugin = profile.type === 'iframe' ? new IframePlugin(profile) : new WebsocketPlugin(profile)
// this.engine.register(plugin)
// await this.appManager.activatePlugin(plugin.name)
// } catch (err) {
// // TODO : Use an alert to handle this error instead of a console.log
// console.log(`Cannot create Plugin : ${err.message}`)
// addToolTip(`Cannot create Plugin : ${err.message}`)
// }
// }
render () {
return this.htmlElement
}

@ -1,6 +1,8 @@
/* eslint-disable no-debugger */
import { Profile } from '@remixproject/plugin-utils'
import React, { Dispatch, useState } from 'react'
import '../remix-ui-plugin-manager.css'
import * as _ from 'lodash'
interface PluginCardProps {
// profile: Profile & {
// icon?: string
@ -49,17 +51,13 @@ function ActivePluginCard ({
{<button
onClick={() => {
deactivatePlugin(profile.name)
const inactivesList = JSON.parse(localStorage.getItem('updatedInactives'))
if (inactivesList && inactivesList.length > 0) {
const temp = [...inactivesList, profile]
localStorage.setItem('updatedInactives', JSON.stringify(temp))
setInactivePlugins(temp)
}
// localStorage.setItem('updatedInactives', JSON.stringify(inactivePlugins))
const actives: Profile[] = JSON.parse(localStorage.getItem('newActivePlugins'))
if (actives && actives.length) {
const newList = actives.filter(active => active.name !== profile.name)
// const newList = actives.filter(active => active.name !== profile.name)
const newList = _.remove(actives, active => active.name !== profile.name)
console.log('removed using lodash and this is the result', newList)
localStorage.setItem('newActivePlugins', JSON.stringify(newList))
setActivePlugins([])
setActivePlugins(newList)
}
} }

@ -16,9 +16,6 @@ function ActivePluginCardContainer ({ pluginComponent }: ActivePluginCardContain
useEffect(() => {
const savedActiveProfiles = JSON.parse(localStorage.getItem('newActivePlugins'))
if (savedActiveProfiles === null) {
localStorage.setItem('newActivePlugins', '[]')
}
if (pluginComponent.activePlugins && pluginComponent.activePlugins.length > 0) {
setActiveProfiles(pluginComponent.activePlugins)
} else if (savedActiveProfiles && savedActiveProfiles.length > 0 && pluginComponent.activePlugins.length === 0) {
@ -28,12 +25,12 @@ function ActivePluginCardContainer ({ pluginComponent }: ActivePluginCardContain
return (
<Fragment>
{(activeProfiles && activeProfiles.length) ? <ModuleHeading headingLabel="Active Modules" count={activeProfiles.length} /> : null}
{activeProfiles && activeProfiles.map(profile => (
{activeProfiles && activeProfiles.map((profile, idx) => (
<ActivePluginCard
buttonText="Deactivate"
profile={profile}
deactivatePlugin={deactivatePlugin}
key={profile.version}
key={idx}
setInactivePlugins={setinactiveProfiles}
inactivePlugins={inactiveProfiles}
activePlugins={activeProfiles}

@ -1,7 +1,6 @@
/* eslint-disable no-debugger */
import { Profile } from '@remixproject/plugin-utils'
import React, { Dispatch, useState } from 'react'
import { getSolidity } from '../../pluginManagerStateMachine'
import { PluginManagerComponent } from '../../types'
import React, { useState } from 'react'
import '../remix-ui-plugin-manager.css'
interface PluginCardProps {
profile: Profile & {
@ -9,23 +8,18 @@ interface PluginCardProps {
}
buttonText: string
activatePlugin: (plugin: Profile) => void
inactivePlugins: Profile[]
setInactivePlugins: Dispatch<React.SetStateAction<Profile<any>[]>>
setActivePlugins: Dispatch<React.SetStateAction<Profile<any>[]>>
activePlugins: Profile[]
pluginComponent: PluginManagerComponent
// inactivePlugins: Profile[]
// setInactivePlugins: Dispatch<React.SetStateAction<Profile<any>[]>>
// setActivePlugins: Dispatch<React.SetStateAction<Profile<any>[]>>
// activePlugins: Profile[]
// pluginComponent: PluginManagerComponent
}
// eslint-disable-next-line no-empty-pattern
function InactivePluginCard ({
profile,
buttonText,
activatePlugin,
inactivePlugins,
activePlugins,
setInactivePlugins,
setActivePlugins,
pluginComponent
activatePlugin
}: PluginCardProps) {
const [displayName] = useState<string>((profile.displayName) ? profile.displayName : profile.name)
const [docLink] = useState<JSX.Element>((profile.documentation) ? (
@ -52,36 +46,13 @@ function InactivePluginCard ({
</div>
{
<button
onClick={async () => {
onClick={() => {
activatePlugin(profile)
const actives: Profile[] = JSON.parse(localStorage.getItem('newActivePlugins'))
const workspacePlugins = JSON.parse(localStorage.getItem('workspace'))
const tempList = []
if (actives && actives.length >= 0) {
actives.forEach(active => {
if (pluginComponent.activeProfiles.includes(active.name) === false) {
const tempActives = actives.filter(target => target.name !== active.name)
tempList.push(...tempActives)
}
})
if (activePlugins && activePlugins.length > 0) {
tempList.push(...activePlugins)
}
if (workspacePlugins.includes('solidity') === true && workspacePlugins.includes('solidity-logic') === true) {
if (pluginComponent.activeProfiles.includes('solidity') && pluginComponent.activeProfiles.includes('solidity-logic')) {
const result = await getSolidity(pluginComponent)
// check to make sure that solidity isn't already in tempList so that it won't be persisted to lcoalstorage twice.
tempList.push(...result)
}
}
const newActives: Profile[] = JSON.parse(localStorage.getItem('newActivePlugins'))
if (!newActives.includes(profile)) {
newActives.push(profile)
localStorage.setItem('newActivePlugins', JSON.stringify(newActives))
}
tempList.push(...actives, profile)
localStorage.setItem('newActivePlugins', JSON.stringify(tempList))
setActivePlugins([...tempList, profile])
const temp = inactivePlugins.filter(plugin => plugin.name !== profile.name).filter(plugin => plugin.name !== 'solidity' && plugin.name !== 'solidity-logic')
setInactivePlugins(temp)
localStorage.setItem('updatedInactives', JSON.stringify(temp))
}}
className="btn btn-success btn-sm"
data-id={`pluginManagerComponentActivateButton${profile.name}`}

@ -21,7 +21,6 @@ interface LocalPluginInterface {
function InactivePluginCardContainer ({ pluginComponent }: InactivePluginCardContainerProps) {
const [activeProfiles, setActiveProfiles] = useState<Profile[]>()
const [inactiveProfiles, setinactiveProfiles] = useState<Profile[]>([])
const activatePlugin = (profile: Profile) => {
pluginComponent.activateP(profile.name)
}
@ -29,12 +28,6 @@ function InactivePluginCardContainer ({ pluginComponent }: InactivePluginCardCon
useEffect(() => {
const savedInactiveProfiles: Profile[] = JSON.parse(localStorage.getItem('updatedInactives'))
const savedLocalPlugins: LocalPluginInterface = JSON.parse(localStorage.getItem('plugins/local'))
if (savedInactiveProfiles === null) {
localStorage.setItem('updatedInactives', '[]')
}
if (savedLocalPlugins === null) {
localStorage.setItem('plugins/local', '{}')
}
if (savedInactiveProfiles && savedInactiveProfiles.length > 0 && pluginComponent.inactivePlugins.length > savedInactiveProfiles.length) {
if (Object.keys(savedLocalPlugins).length > 0 && !pluginComponent.inactivePlugins.includes(savedLocalPlugins.profile as Profile)) {
const inactiveLocalPlugin = savedLocalPlugins.profile
@ -62,11 +55,6 @@ function InactivePluginCardContainer ({ pluginComponent }: InactivePluginCardCon
profile={profile}
key={profile.name}
activatePlugin={activatePlugin}
setInactivePlugins={setinactiveProfiles}
inactivePlugins={inactiveProfiles}
activePlugins={activeProfiles}
setActivePlugins={setActiveProfiles}
pluginComponent={pluginComponent}
/>
))
}

@ -1,77 +0,0 @@
import { Profile } from '@remixproject/plugin-utils'
import React, { useState } from 'react'
import { PersistActivatedPlugin, RemoveActivatedPlugin } from '../../pluginManagerStateMachine'
import { PluginManagerComponent } from '../../types'
import '../remix-ui-plugin-manager.css'
interface PluginCardProps {
profile: Profile & {
icon?: string
}
pluginComponent: PluginManagerComponent
buttonText: string
}
// eslint-disable-next-line no-empty-pattern
function PluginCard ({
profile,
pluginComponent,
buttonText
}: PluginCardProps) {
const [displayName] = useState<string>((profile.displayName) ? profile.displayName : profile.name)
const [docLink] = useState<JSX.Element>((profile.documentation) ? (
<a href={profile.documentation} className="px-1" title="link to documentation" target="_blank" rel="noreferrer">
<i aria-hidden="true" className="fas fa-book"/>
</a>
) : null)
const [versionWarning] = useState<JSX.Element>((profile.version && profile.version.match(/\b(\w*alpha\w*)\b/g)) ? (
<small title="Version Alpha" className="remixui_versionWarning plugin-version">alpha</small>
) : (profile.version && profile.version.match(/\b(\w*beta\w*)\b/g)) ? (
<small title="Version Beta" className="remixui_versionWarning plugin-version">beta</small>
) : null)
// const [stateManager] = useState<PluginManagerStateMachine>(new PluginManagerStateMachine(pluginComponent))
return (
<div className="list-group list-group-flush plugins-list-group" data-id="pluginManagerComponentActiveTile">
<article className="list-group-item py-1 mb-1 plugins-list-group-item" title={displayName}>
<div className="remixui_row justify-content-between align-items-center mb-2">
<h6 className="remixui_displayName plugin-name">
<div>
{displayName}
{docLink}
{versionWarning}
</div>
{ pluginComponent.isActive(profile.name)
? <button
onClick={() => {
pluginComponent.deactivateP(profile.name)
RemoveActivatedPlugin(profile.name)
}}
className="btn btn-secondary btn-sm"
data-id={`pluginManagerComponentDeactivateButton${profile.name}`}
>
{buttonText}
</button>
: <button
onClick={() => {
pluginComponent.activateP(profile.name)
PersistActivatedPlugin(pluginComponent, profile)
}}
className="btn btn-success btn-sm"
data-id={`pluginManagerComponentActivateButton${profile.name}`}
>
{buttonText}
</button>
}
</h6>
</div>
<div className="remixui_description d-flex text-body plugin-text mb-2">
{ profile.icon ? <img src={profile.icon} className="mr-1 mt-1 remixui_pluginIcon" alt="profile icon"/> : null }
<span className="remixui_descriptiontext">{profile.description}</span>
</div>
</article>
</div>
)
}
export default PluginCard

@ -6,6 +6,18 @@ import RootView from './components/rootView'
import './remix-ui-plugin-manager.css'
export const RemixUiPluginManager = ({ pluginComponent }: RemixUiPluginManagerProps) => {
if (JSON.parse(localStorage.getItem('newActivePlugins')) === null) {
localStorage.setItem('newActivePlugins', '[]')
}
if (JSON.parse(localStorage.getItem('updatedInactives')) === null) {
localStorage.setItem('updatedInactives', '[]')
}
if (JSON.parse(localStorage.getItem('plugins/local')) === null) {
localStorage.setItem('plugins/local', '{}')
}
if (JSON.parse(localStorage.getItem('activatedPluginNames'))) {
localStorage.setItem('activatedPluginNames', '[]')
}
return (
<RootView pluginComponent={pluginComponent}>
<section data-id="pluginManagerComponentPluginManagerSection">

@ -1,3 +1,5 @@
import { Profile } from '@remixproject/plugin-utils'
import { useState } from 'react'
import { PluginManagerComponent } from './types'
export const defaultActivatedPlugins = [
@ -35,3 +37,16 @@ export function getSolidity (pluginComponent: PluginManagerComponent) {
const materializeFetch = fetchSolidity()
return materializeFetch
}
export async function CheckSolidity (pluginComponent: PluginManagerComponent, workspacePlugins: string[]) {
if (workspacePlugins.includes('solidity') === true && workspacePlugins.includes('solidity-logic') === true) {
if (pluginComponent.activeProfiles.includes('solidity') && pluginComponent.activeProfiles.includes('solidity-logic')) {
const result = await getSolidity(pluginComponent)
if (result && result.length > 0) {
return result
}
} else {
return []
}
}
}

@ -103,7 +103,7 @@ export class PluginManagerComponent extends ViewPlugin extends Plugin implements
renderComponent(): void
openLocalPlugin(): Promise<void>
render(): HTMLDivElement
getAndFilterPlugins: (filter?: string) => void
getAndFilterPlugins: (filter?: string, profiles?: Profile[]) => void
triggerEngineEventListener: () => void
activateAndRegisterLocalPlugin: (localPlugin: IframePlugin | WebsocketPlugin) => Promise<void>
activeProfiles: string[]

215
package-lock.json generated

@ -7407,6 +7407,12 @@
"defer-to-connect": "^1.0.1"
}
},
"@testim/chrome-version": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.0.7.tgz",
"integrity": "sha512-8UT/J+xqCYfn3fKtOznAibsHpiuDshCb0fwgWxRazTT19Igp9ovoXMPhXyLD6m3CKQGTMHgqoxaFfMWaL40Rnw==",
"dev": true
},
"@testing-library/dom": {
"version": "7.29.1",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.29.1.tgz",
@ -7955,6 +7961,16 @@
"resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
"integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw=="
},
"@types/yauzl": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz",
"integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==",
"dev": true,
"optional": true,
"requires": {
"@types/node": "*"
}
},
"@typescript-eslint/eslint-plugin": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.6.1.tgz",
@ -12153,6 +12169,159 @@
}
}
},
"chromedriver": {
"version": "92.0.1",
"resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-92.0.1.tgz",
"integrity": "sha512-LptlDVCs1GgyFNVbRoHzzy948JDVzTgGiVPXjNj385qXKQP3hjAVBIgyvb/Hco0xSEW8fjwJfsm1eQRmu6t4pQ==",
"dev": true,
"requires": {
"@testim/chrome-version": "^1.0.7",
"axios": "^0.21.1",
"del": "^6.0.0",
"extract-zip": "^2.0.1",
"https-proxy-agent": "^5.0.0",
"proxy-from-env": "^1.1.0",
"tcp-port-used": "^1.0.1"
},
"dependencies": {
"agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dev": true,
"requires": {
"debug": "4"
}
},
"array-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true
},
"debug": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
"del": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
"integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
"dev": true,
"requires": {
"globby": "^11.0.1",
"graceful-fs": "^4.2.4",
"is-glob": "^4.0.1",
"is-path-cwd": "^2.2.0",
"is-path-inside": "^3.0.2",
"p-map": "^4.0.0",
"rimraf": "^3.0.2",
"slash": "^3.0.0"
}
},
"dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
"requires": {
"path-type": "^4.0.0"
}
},
"extract-zip": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
"integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
"dev": true,
"requires": {
"@types/yauzl": "^2.9.1",
"debug": "^4.1.1",
"get-stream": "^5.1.0",
"yauzl": "^2.10.0"
}
},
"get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"globby": {
"version": "11.0.4",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
"integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
"fast-glob": "^3.1.1",
"ignore": "^5.1.4",
"merge2": "^1.3.0",
"slash": "^3.0.0"
}
},
"https-proxy-agent": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
"integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
"dev": true,
"requires": {
"agent-base": "6",
"debug": "4"
}
},
"ignore": {
"version": "5.1.8",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
"integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"dev": true
},
"is-path-inside": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
"dev": true
},
"p-map": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
"integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
"dev": true,
"requires": {
"aggregate-error": "^3.0.0"
}
},
"path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true
},
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
}
},
"slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
}
}
},
"ci-info": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
@ -20835,6 +21004,12 @@
"unc-path-regex": "^0.1.2"
}
},
"is-url": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
"integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==",
"dev": true
},
"is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
@ -20864,6 +21039,25 @@
"integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
"dev": true
},
"is2": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/is2/-/is2-2.0.7.tgz",
"integrity": "sha512-4vBQoURAXC6hnLFxD4VW7uc04XiwTTl/8ydYJxKvPwkWQrSjInkuM5VZVg6BGr1/natq69zDuvO9lGpLClJqvA==",
"dev": true,
"requires": {
"deep-is": "^0.1.3",
"ip-regex": "^4.1.0",
"is-url": "^1.2.4"
},
"dependencies": {
"ip-regex": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz",
"integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==",
"dev": true
}
}
},
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
@ -36788,6 +36982,27 @@
"readable-stream": "^3.1.1"
}
},
"tcp-port-used": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz",
"integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==",
"dev": true,
"requires": {
"debug": "4.3.1",
"is2": "^2.0.6"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
}
}
},
"temp-dir": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz",

@ -233,6 +233,7 @@
"babelify": "^10.0.0",
"browserify": "^16.2.3",
"browserify-reload": "^1.0.3",
"chromedriver": "^92.0.1",
"component-type": "^1.2.1",
"copy-text-to-clipboard": "^1.0.4",
"csjs-inject": "^1.0.1",

Loading…
Cancel
Save