├── .gitignore ├── LICENSE ├── README.md ├── mockData ├── fiber.js ├── ticTacToe.js ├── ticTacToeFiberRoot.js ├── tinyFlameGraph.js └── treeGraph.js ├── package-lock.json ├── package.json ├── package ├── JSONStringify.js ├── README.md ├── ReactWorkTags.js ├── compareStateAndProps.js ├── containerWrapper.js ├── createTree.js ├── deleteParent.js ├── deleteParent.test.js ├── makeTreeCreator.js ├── makeTreeCreator.test.js ├── newNode.js ├── package-lock.json ├── package.json ├── sendContentScript.js ├── treeGraphFactory.js └── treeGraphFactory.test.js ├── src ├── app │ ├── App.js │ ├── components │ │ ├── d3tree.js │ │ ├── flameChart.js │ │ ├── helperFunctions.js │ │ ├── mainContainer.js │ │ ├── playButton.js │ │ ├── record.js │ │ ├── stateChange.js │ │ └── timeTravel.js │ ├── index.html │ └── style.scss ├── assets │ ├── readmeDemo.gif │ ├── rm-icon-128.png │ ├── rm-icon-48.png │ └── rm-icon16.png └── extension │ ├── backgroundScript.js │ ├── contentScript.js │ ├── devtools.html │ ├── devtools.js │ └── manifest.json ├── uml ├── devtools.plantuml ├── highLevelDiagram.plantuml └── treeCreator.plantuml └── webpack.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | /dist 3 | .vscode/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 OSLabs Beta 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ReactMonitor 2 | Quickly visualize React's component tree performance for improved onboarding and debugging 3 | 4 | ## What does it do 5 | By using the ReactMonitor Chrome DevTool, beginning and experienced developers alike are able to get a visual representation of an existing codebase that they are working on. Built with React, this tool will dynamically traverse the fiber root object behind the scenes, displaying state, props, render times and the type of components on the page. 6 | 7 | ![readmeDemo](./src/assets/readmeDemo.gif) 8 | 9 | ## How to install and run 10 | 11 | To be able to use the application, users can: 12 | 13 | - Download the 'ReactMonitor' Google Chrome extension from [The Chrome Web Store](https://chrome.google.com/webstore/detail/reactmonitor) 14 | 15 | - Navigate to the domain of your React application that you will be running React Monitor on 16 | 17 | - Open your Chrome Developer Tools and select React Monitor 18 | 19 | - You are now able to view state changes on your application in real time! 20 | 21 | ### Method 2: Clone this repository 22 | 23 | - in the root directory of the clone run `npm build` 24 | 25 | - in Chrome -> extensions, enable developer mode 26 | 27 | - select add new unpackaged extension 28 | 29 | - in the folder selection window, select the _dist_ folder 30 | 31 | Requirements: 32 | 33 | - reactmonitor will only search in children (depth 1) of `` for the HTML element where a React DOM is rendered only ([issue #10](https://github.com/React-Monitor-2-0/ReactMonitor/issues/10)) 34 | 35 | - app to be tested needs to include React versions that use Fiber Tree (such as React 16) 36 | 37 | - app to be tested need to be in a development build of React or a Production build with React Profiler enabled 38 | 39 | ## Contributing 40 | 41 | As an open-sourced project, ReactMonitor gladly accepts help whenever possible. If you have suggestions for improvements or run into any bugs, please feel free to open a github issue after checking whether no such issue has been filed yet. When you file a github issue, please include the following information: 42 | 43 | #### Description 44 | ##### Steps to Reproduce 45 | ###### 1. 46 | ###### 2. 47 | ###### 3. 48 | ##### Expected behavior: 49 | ##### Actual behavior: 50 | ##### Reproduces how often: 51 | ##### Versions: x.x 52 | ##### Additional Information: 53 | 54 | ## Authors 55 | 56 | **Rudo Hengst:** [@RudoH](https://github.com/RudoH)\ 57 | **Lia Pham:** [@lpham598](https://github.com/lpham598)\ 58 | **Tommy Han:** [@simple-sifu](https://github.com/simple-sifu) 59 | **Nay:** 60 | **Philip:** 61 | **Hamoud:** 62 | **Dan:** 63 | 64 | ## License 65 | 66 | This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details 67 | -------------------------------------------------------------------------------- /mockData/fiber.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | type: { 3 | name: "h1" 4 | }, 5 | tag: 5, 6 | effectTag: 1, 7 | actualDuration: 9.00, 8 | actualStartTime: 400, 9 | memorizedProps: {}, 10 | memorizedState: null, 11 | child: { 12 | type: { name: "div"}, 13 | tag: 1, 14 | effectTag: 0, 15 | actualDuration: 8.00, 16 | actualStartTime: 300, 17 | memorizedProps: {}, 18 | memorizedState: null, 19 | child: { 20 | type: "div", 21 | tag: 1, 22 | effectTag: 2, 23 | actualDuration: 8.00, 24 | actualStartTime: 300, 25 | memorizedProps: {}, 26 | memorizedState: null, 27 | } 28 | }, 29 | } 30 | -------------------------------------------------------------------------------- /mockData/ticTacToe.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | function TicTacToe() { 4 | return ( 5 |
6 |

Tic Tac Toe

7 |
8 |
9 | 12 | 15 | 18 |
19 |
20 | 23 | 26 | 29 |
30 |
31 | 34 | 37 | 40 |
41 |
42 |
43 | ); 44 | } 45 | 46 | export default TicTacToe; 47 | -------------------------------------------------------------------------------- /mockData/ticTacToeFiberRoot.js: -------------------------------------------------------------------------------- 1 | container - HTMLDivElement { 2 | '__reactContainere$3ovmxfu0tzp': FiberNode { 3 | tag: 3, 4 | key: null, 5 | elementType: null, 6 | type: null, 7 | stateNode: FiberRootNode { 8 | tag: 0, 9 | current: [FiberNode], 10 | containerInfo: [Circular], 11 | pendingChildren: null, 12 | pingCache: null, 13 | finishedExpirationTime: 0, 14 | finishedWork: null, 15 | timeoutHandle: -1, 16 | context: {}, 17 | pendingContext: null, 18 | hydrate: false, 19 | callbackNode: null, 20 | callbackPriority: 90, 21 | firstPendingTime: 0, 22 | firstSuspendedTime: 0, 23 | lastSuspendedTime: 0, 24 | nextKnownPendingLevel: 0, 25 | lastPingedTime: 0, 26 | lastExpiredTime: 0, 27 | interactionThreadID: 1, 28 | memoizedInteractions: Set {}, 29 | pendingInteractionMap: Map {}, 30 | callbackExpirationTime: 0 31 | }, 32 | return: null, 33 | child: null, 34 | sibling: null, 35 | index: 0, 36 | ref: null, 37 | pendingProps: null, 38 | memoizedProps: null, 39 | updateQueue: { 40 | baseState: null, 41 | baseQueue: [Object], 42 | shared: [Object], 43 | effects: null 44 | }, 45 | memoizedState: null, 46 | dependencies: null, 47 | mode: 0, 48 | effectTag: 0, 49 | nextEffect: null, 50 | firstEffect: null, 51 | lastEffect: null, 52 | expirationTime: 1073741823, 53 | childExpirationTime: 0, 54 | alternate: FiberNode { 55 | tag: 3, 56 | key: null, 57 | elementType: null, 58 | type: null, 59 | stateNode: [FiberRootNode], 60 | return: null, 61 | child: [FiberNode], 62 | sibling: null, 63 | index: 0, 64 | ref: null, 65 | pendingProps: null, 66 | memoizedProps: null, 67 | updateQueue: [Object], 68 | memoizedState: [Object], 69 | dependencies: null, 70 | mode: 0, 71 | effectTag: 0, 72 | nextEffect: null, 73 | firstEffect: [FiberNode], 74 | lastEffect: [FiberNode], 75 | expirationTime: 0, 76 | childExpirationTime: 0, 77 | alternate: [Circular], 78 | actualDuration: 0, 79 | actualStartTime: -1, 80 | selfBaseDuration: 0, 81 | treeBaseDuration: 0, 82 | _debugID: 1, 83 | _debugIsCurrentlyTiming: false, 84 | _debugSource: null, 85 | _debugOwner: null, 86 | _debugNeedsRemount: false, 87 | _debugHookTypes: null 88 | }, 89 | actualDuration: 0, 90 | actualStartTime: -1, 91 | selfBaseDuration: 0, 92 | treeBaseDuration: 0, 93 | _debugID: 1, 94 | _debugIsCurrentlyTiming: false, 95 | _debugSource: null, 96 | _debugOwner: null, 97 | _debugNeedsRemount: false, 98 | _debugHookTypes: null 99 | }, 100 | _reactRootContainer: ReactDOMBlockingRoot { 101 | _internalRoot: FiberRootNode { 102 | tag: 0, 103 | current: [FiberNode], 104 | containerInfo: [Circular], 105 | pendingChildren: null, 106 | pingCache: null, 107 | finishedExpirationTime: 0, 108 | finishedWork: null, 109 | timeoutHandle: -1, 110 | context: {}, 111 | pendingContext: null, 112 | hydrate: false, 113 | callbackNode: null, 114 | callbackPriority: 90, 115 | firstPendingTime: 0, 116 | firstSuspendedTime: 0, 117 | lastSuspendedTime: 0, 118 | nextKnownPendingLevel: 0, 119 | lastPingedTime: 0, 120 | lastExpiredTime: 0, 121 | interactionThreadID: 1, 122 | memoizedInteractions: Set {}, 123 | pendingInteractionMap: Map {}, 124 | callbackExpirationTime: 0 125 | } 126 | } 127 | } -------------------------------------------------------------------------------- /mockData/tinyFlameGraph.js: -------------------------------------------------------------------------------- 1 | const flameGraphData = { 2 | "children": [ 3 | { 4 | "name": "genunix`syscall_mstate", 5 | "value": 89 6 | }, 7 | { 8 | "children": [ 9 | { 10 | "name": "unix`page_lookup_create", 11 | "value": 1 12 | } 13 | ], 14 | "name": "america", 15 | "value": 99 16 | }], 17 | "name": "codesmith", 18 | "value": 56 19 | } 20 | 21 | export default flameGraphData; -------------------------------------------------------------------------------- /mockData/treeGraph.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitsmith1010/ReactMonitor/c0f21d04e7d91d66c65ed16e897898f19992e35a/mockData/treeGraph.js -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "reactmonitor", 3 | "version": "1.0.1", 4 | "description": "Visualize React's component tree performance and optimization suggestions", 5 | "main": "App.js", 6 | "babel": { 7 | "presets": [ 8 | "@babel/preset-env", 9 | "@babel/preset-react" 10 | ] 11 | }, 12 | "scripts": { 13 | "build": "rm -rf dist && cpy src/extension/manifest.json dist && NODE_ENV=production webpack", 14 | "start": "webpack-dev-server --open", 15 | "test": "jest" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "git+https://github.com/oslabs-beta/ReactMonitor" 20 | }, 21 | "author": "", 22 | "license": "ISC", 23 | "bugs": { 24 | "url": "https://github.com/oslabs-beta/ReactMonitor/issues" 25 | }, 26 | "homepage": "https://github.com/oslabs-beta/ReactMonitor#readme", 27 | "dependencies": { 28 | "cpy-cli": "^3.1.1", 29 | "d3": "^5.16.0", 30 | "d3-flame-graph": "^3.1.1", 31 | "d3-hierarchy": "^1.1.9", 32 | "immutable": "^4.0.0-rc.12", 33 | "react": "^16.13.1", 34 | "react-dom": "^16.13.1", 35 | "react-flame-graph": "^1.4.0", 36 | "react-router-dom": "^5.2.0", 37 | "react-treeview": "^0.4.7" 38 | }, 39 | "devDependencies": { 40 | "@babel/core": "^7.9.6", 41 | "@babel/preset-env": "^7.9.6", 42 | "@babel/preset-react": "^7.9.4", 43 | "@testing-library/jest-dom": "^5.8.0", 44 | "@testing-library/react": "^10.0.4", 45 | "babel-loader": "^8.1.0", 46 | "copy-webpack-plugin": "^6.0.2", 47 | "css-loader": "^3.5.3", 48 | "file-loader": "^6.0.0", 49 | "html-webpack-plugin": "^4.3.0", 50 | "jest": "^26.0.1", 51 | "mini-css-extract-plugin": "^0.9.0", 52 | "node-sass": "^4.14.1", 53 | "react-test-render": "^1.1.2", 54 | "sass-loader": "^8.0.2", 55 | "style-loader": "^1.2.1", 56 | "url-loader": "^4.1.0", 57 | "webpack": "^4.43.0", 58 | "webpack-cli": "^3.3.11", 59 | "webpack-dev-server": "^3.11.0" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /package/JSONStringify.js: -------------------------------------------------------------------------------- 1 | module.exports = function (object){ 2 | 3 | let cache = []; 4 | const string = JSON.stringify( 5 | object, 6 | // custom replacer - gets around "TypeError: Converting circular structure to JSON" 7 | (key, value) => { 8 | if (typeof value === 'object' && value !== null) { 9 | if (cache.indexOf(value) !== -1) { 10 | // Circular reference found, discard key 11 | return; 12 | } 13 | // Store value in collection 14 | cache.push(value); 15 | } 16 | return value; 17 | }, 18 | 4 19 | ); 20 | cache = null; // garbage collection 21 | return string; 22 | } -------------------------------------------------------------------------------- /package/README.md: -------------------------------------------------------------------------------- 1 | # ReactMonitor 2 | Quickly visualize React's component tree performance for improved onboarding and debugging 3 | 4 | ## What does it do 5 | By using the ReactMonitor Chrome DevTool, beginning and experienced developers alike are able to get a visual representation of an existing codebase that they are working on. Built with React, this tool will dynamically traverse the fiber root object behind the scenes, displaying state, props, render times and the type of components on the page. 6 | 7 | 8 | ![readmeDemo](./src/assets/readmeDemo.gif) 9 | 10 | ## How to install and run 11 | To be able to use the application, users can: 12 | - Download the 'ReactMonitor' Google Chrome extension from [The Chrome Web Store](https://chrome.google.com/webstore/detail/reactmonitor) 13 | - Run the NPM package in your own codebase by following these steps: 14 | - Install the [package](https://www.npmjs.com/package/reactmonitorfiber)\ 15 | `npm install reactmonitorfiber` 16 | - Require/Import the package\ 17 | `import reactMonitor from 'reactmonitorfiber'`\ 18 | or\ 19 | `const reactMonitor = require('reactmonitorfiber')` 20 | - Invoke React Monitor with an input of the DOM element that you are rendering the React Element into 21 | ``` 22 | const container = document.querySelector('#root'); 23 | reactDOM.render(, container); 24 | reactMonitor(container); 25 | ``` 26 | - Navigate to the domain of your React application that you will be running React Monitor on 27 | - Open your Chrome Developer Tools and select React Monitor 28 | > Placeholder for Screenshot/Gif 29 | - You are now able to view state changes on your application in real time! 30 | 31 | ## Contributing 32 | 33 | As an open-sourced project, ReactMonitor gladly accepts help whenever possible. If you have suggestions for improvements or run into any bugs, please feel free to open a github issue after checking whether no such issue has been filed yet. When you file a github issue, please include the following information: 34 | 35 | #### Description 36 | ##### Steps to Reproduce 37 | ###### 1. 38 | ###### 2. 39 | ###### 3. 40 | ##### Expected behavior: 41 | ##### Actual behavior: 42 | ##### Reproduces how often: 43 | ##### Versions: x.x 44 | ##### Additional Information: 45 | 46 | ## Authors 47 | 48 | Rudo Hengst: [@RudoH](https://github.com/RudoH)\ 49 | Lia Pham: [@lpham598](https://github.com/lpham598)\ 50 | Tommy Han: [@simple-sifu](https://github.com/simple-sifu) 51 | 52 | ## License 53 | 54 | This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details -------------------------------------------------------------------------------- /package/ReactWorkTags.js: -------------------------------------------------------------------------------- 1 | export const FunctionComponent = 0; 2 | export const ClassComponent = 1; 3 | export const IndeterminateComponent = 2; // Before we know whether it is function or class 4 | export const HostRoot = 3; // Root of a host tree. Could be nested inside another node. 5 | export const HostPortal = 4; // A subtree. Could be an entry point to a different renderer. 6 | export const HostComponent = 5; 7 | export const HostText = 6; 8 | export const Fragment = 7; 9 | export const Mode = 8; 10 | export const ContextConsumer = 9; 11 | export const ContextProvider = 10; 12 | export const ForwardRef = 11; 13 | export const Profiler = 12; 14 | export const SuspenseComponent = 13; 15 | export const MemoComponent = 14; 16 | export const SimpleMemoComponent = 15; 17 | export const LazyComponent = 16; -------------------------------------------------------------------------------- /package/compareStateAndProps.js: -------------------------------------------------------------------------------- 1 | function compareStateAndProps(wasMounted, node, prevNode, parentShapeProps) { 2 | // compare state and props properties on stats properties for both nodes 3 | // if same - treeGraph.stats.stateOrPropsChanged - false 4 | if (node && prevNode) { 5 | // check if the node's type is a string 6 | // yes? give it a color of the parent - because Composite Component renders(or not) Host Component 7 | if (node.stats.type === 'string') { 8 | node.nodeSvgShape.shapeProps = parentShapeProps; 9 | delete node.stats.state; 10 | delete node.stats.props; 11 | } else if ( 12 | prevNode.stats.state === node.stats.state && 13 | prevNode.stats.props === node.stats.props 14 | ) { 15 | if ( 16 | (node.stats.effectTag === 0 || node.stats.effectTag === 4) && 17 | wasMounted 18 | ) { 19 | node.nodeSvgShape.shapeProps.fill = 'gray'; 20 | } else { 21 | node.nodeSvgShape.shapeProps.fill = 'red'; 22 | node.nodeSvgShape.shapeProps.rx = 12; 23 | node.nodeSvgShape.shapeProps.ry = 12; 24 | } 25 | } 26 | 27 | // delete node.stats; 28 | 29 | // recursively invoke the function for each children 30 | if (node.children.length) { 31 | for (let i = 0; i < node.children.length; i += 1) { 32 | compareStateAndProps( 33 | wasMounted, 34 | node.children[i], 35 | prevNode.children[i], 36 | node.nodeSvgShape.shapeProps 37 | ); 38 | } 39 | } 40 | } else if (node) { 41 | // delete node.stats; 42 | if (node.stats.type === 'string') { 43 | delete node.stats.state; 44 | delete node.stats.props; 45 | } 46 | 47 | // recursively invoke the function for each children 48 | if (node.children.length) { 49 | for (let i = 0; i < node.children.length; i += 1) { 50 | compareStateAndProps( 51 | wasMounted, 52 | node.children[i], 53 | null, 54 | node.nodeSvgShape.shapeProps 55 | ); 56 | } 57 | } 58 | } 59 | 60 | if (!wasMounted) { 61 | // delete node.stats; 62 | if (node.stats.type === 'string') { 63 | delete node.stats.state; 64 | delete node.stats.props; 65 | } 66 | if (node.children.length) { 67 | for (let i = 0; i < node.children.length; i += 1) { 68 | compareStateAndProps(wasMounted, node.children[i]); 69 | } 70 | } 71 | } 72 | }; 73 | 74 | 75 | module.exports = compareStateAndProps; 76 | 77 | -------------------------------------------------------------------------------- /package/containerWrapper.js: -------------------------------------------------------------------------------- 1 | const reactMonitor = require("./createTree.js"); 2 | 3 | //grabbing the Dom element that has the property of react_RootContiner 4 | function get_fiber_root(document_children) { 5 | for (let ele of document_children) { 6 | if (ele.hasOwnProperty("_reactRootContainer")) return ele; 7 | } 8 | } 9 | 10 | const container = get_fiber_root(document.body.children); 11 | 12 | //invoking the createTree function by passing the DOM element that contain the property of react_RootContainer 13 | reactMonitor(container); 14 | -------------------------------------------------------------------------------- /package/createTree.js: -------------------------------------------------------------------------------- 1 | const sendContentScript = require("./sendContentScript"); 2 | 3 | //this function will be invoked in containerWrapper.js 4 | 5 | module.exports = function (container) { 6 | 7 | console.log("***IN CREATE TREE***"); 8 | console.log("*** container ***", container ); 9 | const fiberRoot = container._reactRootContainer._internalRoot; 10 | console.log("*** fiberroot ***", fiberRoot ); 11 | let hostRoot = fiberRoot.current; 12 | const treeCreator = require("./makeTreeCreator")(); 13 | let time_last = -Infinity; 14 | console.log("[info] actualStartTime:", hostRoot.actualStartTime); 15 | 16 | setInterval( function() { 17 | hostRoot = fiberRoot.current; 18 | if (hostRoot.actualStartTime != time_last) { 19 | console.log( 20 | "[info] actualStartTime:", hostRoot.actualStartTime); 21 | // sendContentScript( 22 | // treeCreator, hostRoot, fiberRoot.current 23 | // ); 24 | sendContentScript( 25 | treeCreator, undefined, hostRoot 26 | ); 27 | time_last = hostRoot.actualStartTime; 28 | } 29 | }, 100 ); 30 | /* 31 | // on first load use initial render. 32 | window.addEventListener("load", () => { 33 | console.log("LOAD"); 34 | sendContentScript(treeCreator, hostRoot); 35 | }); 36 | 37 | window.addEventListener("click", () => { 38 | setTimeout(() => { 39 | console.log("CLICK"); 40 | sendContentScript(treeCreator, hostRoot, fiberRoot.current); 41 | hostRoot=fiberRoot.current// to prevent none changing clicks from afecting the tree graph 42 | }, 200); 43 | }); 44 | 45 | window.addEventListener("keyup", () => { 46 | setTimeout(() => { 47 | console.log("KEYUP"); 48 | sendContentScript(treeCreator, hostRoot, fiberRoot.current); 49 | hostRoot=fiberRoot.current// to prevent none changing clicks from afecting the tree graph 50 | }, 200); 51 | }); 52 | */ 53 | }; 54 | -------------------------------------------------------------------------------- /package/deleteParent.js: -------------------------------------------------------------------------------- 1 | 2 | function deleteParent(root){ 3 | 4 | if (root.parent) { 5 | delete root.parent; 6 | } 7 | if (root.children) { 8 | root.children.forEach((child) => deleteParent(child)); 9 | } 10 | 11 | } 12 | 13 | 14 | 15 | module.exports = deleteParent; -------------------------------------------------------------------------------- /package/deleteParent.test.js: -------------------------------------------------------------------------------- 1 | const treeGraph = require('../mockData/treeGraph'); 2 | const deleteParent = require('./deleteParent'); 3 | 4 | 5 | describe('test deleteParent', () => { 6 | 7 | 8 | xit('test deleteParent deletes Parents', () => { 9 | 10 | const prunedTreeGraph = deleteParent(treeGraph); 11 | 12 | console.log("prunedTreeGraph -", prunedTreeGraph); 13 | expect(prunedTreeGraph.name).toBe('h1'); 14 | expect(prunedTreeGraph.value).toBe(9); 15 | expect(prunedTreeGraph.tag).toBe(5); 16 | expect(prunedTreeGraph.stats.effectTag).toBe(1); 17 | expect(prunedTreeGraph.stats.renderStart).toBe('400.00'); 18 | expect(prunedTreeGraph.stats.renderTotal).toBe('9.00'); 19 | expect(prunedTreeGraph.children[0].name).toBe('div'); 20 | expect(prunedTreeGraph.children[0].value).toBe(8); 21 | expect(prunedTreeGraph.children[0].tag).toBe(1); 22 | expect(prunedTreeGraph.children[0].stats.effectTag).toBe(2) 23 | }); 24 | 25 | 26 | }); 27 | -------------------------------------------------------------------------------- /package/makeTreeCreator.js: -------------------------------------------------------------------------------- 1 | const treeGraphFactory = require('./treeGraphFactory'); 2 | const deleteParent = require('./deleteParent'); 3 | const compareStateAndProps = require('./compareStateAndProps'); 4 | 5 | 6 | module.exports = function (){ 7 | 8 | // first time load these closure variables 9 | // need to be initialized accordingly. 10 | let wasMounted = false; 11 | let prevTreeGraph = null; 12 | 13 | function treeCreator(hostRoot, treeGraph = null) { 14 | 15 | // 1.) create treeGraph 16 | if (hostRoot.child) { 17 | // recursively traverse App Fiber Tree and create treeGraph 18 | treeGraph = treeGraphFactory(hostRoot.child); 19 | } 20 | 21 | // 2.) prune treeGraph 22 | deleteParent(treeGraph); 23 | delete treeGraph.parent; 24 | 25 | // 3.) enhance treeGraph 26 | // by comparing state and props in prevTreeGraph and treeGraph(current) 27 | const tempTreeGraph = JSON.parse(JSON.stringify(treeGraph)); 28 | compareStateAndProps(wasMounted, treeGraph, prevTreeGraph, null); 29 | prevTreeGraph = tempTreeGraph; 30 | wasMounted = true; 31 | 32 | 33 | return treeGraph; 34 | 35 | } 36 | return treeCreator; 37 | } 38 | -------------------------------------------------------------------------------- /package/makeTreeCreator.test.js: -------------------------------------------------------------------------------- 1 | const makeTreeCreator = require('./makeTreeCreator'); 2 | const fiber = require('../mockData/fiber'); 3 | 4 | 5 | describe('test makeTreeCreator', () => { 6 | 7 | 8 | it('test makeTreeCreator returns a function', () => { 9 | 10 | const treeCreator = makeTreeCreator(); 11 | const treeGraph = treeCreator(fiber); 12 | 13 | expect( treeCreator ).toBeInstanceOf( Function ) 14 | expect( treeGraph.name ).toBe('div'); 15 | }); 16 | 17 | it('test makeTreeCreator has valid value', () => { 18 | 19 | const treeCreator = makeTreeCreator(); 20 | const treeGraph = treeCreator(fiber); 21 | 22 | expect( treeGraph.name ).toBe('div'); 23 | }); 24 | 25 | 26 | }); 27 | -------------------------------------------------------------------------------- /package/newNode.js: -------------------------------------------------------------------------------- 1 | const JSONStringify = require('./JSONStringify'); 2 | 3 | function Node(name, parent, children, fiber) { 4 | 5 | this.name = name; 6 | this.parent = parent; 7 | this.value = Number(fiber.actualDuration.toFixed(2)); 8 | this.children = children; 9 | this.stats = { 10 | state: JSONStringify(fiber.memoizedState), 11 | props: JSONStringify(fiber.memoizedProps), 12 | effectTag: fiber.effectTag, 13 | type: typeof fiber.type, 14 | renderStart: fiber.actualStartTime.toFixed(2), 15 | renderTotal: fiber.actualDuration.toFixed(2), 16 | }; 17 | this.nodeSvgShape = { 18 | shape: 'ellipse', 19 | shapeProps: { 20 | rx: 10, 21 | ry: 10, 22 | fill: 'lightgreen', 23 | }, 24 | }; 25 | if (typeof this.type === "string") { 26 | this.type = fiber.type; 27 | } 28 | this.tag = fiber.tag; 29 | 30 | } 31 | 32 | module.exports = { 33 | Node: Node 34 | } 35 | -------------------------------------------------------------------------------- /package/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "reactmonitorfiber", 3 | "version": "1.0.11", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@webassemblyjs/ast": { 8 | "version": "1.9.0", 9 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", 10 | "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", 11 | "dev": true, 12 | "requires": { 13 | "@webassemblyjs/helper-module-context": "1.9.0", 14 | "@webassemblyjs/helper-wasm-bytecode": "1.9.0", 15 | "@webassemblyjs/wast-parser": "1.9.0" 16 | } 17 | }, 18 | "@webassemblyjs/floating-point-hex-parser": { 19 | "version": "1.9.0", 20 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", 21 | "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", 22 | "dev": true 23 | }, 24 | "@webassemblyjs/helper-api-error": { 25 | "version": "1.9.0", 26 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", 27 | "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", 28 | "dev": true 29 | }, 30 | "@webassemblyjs/helper-buffer": { 31 | "version": "1.9.0", 32 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", 33 | "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", 34 | "dev": true 35 | }, 36 | "@webassemblyjs/helper-code-frame": { 37 | "version": "1.9.0", 38 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", 39 | "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", 40 | "dev": true, 41 | "requires": { 42 | "@webassemblyjs/wast-printer": "1.9.0" 43 | } 44 | }, 45 | "@webassemblyjs/helper-fsm": { 46 | "version": "1.9.0", 47 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", 48 | "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", 49 | "dev": true 50 | }, 51 | "@webassemblyjs/helper-module-context": { 52 | "version": "1.9.0", 53 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", 54 | "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", 55 | "dev": true, 56 | "requires": { 57 | "@webassemblyjs/ast": "1.9.0" 58 | } 59 | }, 60 | "@webassemblyjs/helper-wasm-bytecode": { 61 | "version": "1.9.0", 62 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", 63 | "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", 64 | "dev": true 65 | }, 66 | "@webassemblyjs/helper-wasm-section": { 67 | "version": "1.9.0", 68 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", 69 | "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", 70 | "dev": true, 71 | "requires": { 72 | "@webassemblyjs/ast": "1.9.0", 73 | "@webassemblyjs/helper-buffer": "1.9.0", 74 | "@webassemblyjs/helper-wasm-bytecode": "1.9.0", 75 | "@webassemblyjs/wasm-gen": "1.9.0" 76 | } 77 | }, 78 | "@webassemblyjs/ieee754": { 79 | "version": "1.9.0", 80 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", 81 | "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", 82 | "dev": true, 83 | "requires": { 84 | "@xtuc/ieee754": "^1.2.0" 85 | } 86 | }, 87 | "@webassemblyjs/leb128": { 88 | "version": "1.9.0", 89 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", 90 | "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", 91 | "dev": true, 92 | "requires": { 93 | "@xtuc/long": "4.2.2" 94 | } 95 | }, 96 | "@webassemblyjs/utf8": { 97 | "version": "1.9.0", 98 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", 99 | "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", 100 | "dev": true 101 | }, 102 | "@webassemblyjs/wasm-edit": { 103 | "version": "1.9.0", 104 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", 105 | "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", 106 | "dev": true, 107 | "requires": { 108 | "@webassemblyjs/ast": "1.9.0", 109 | "@webassemblyjs/helper-buffer": "1.9.0", 110 | "@webassemblyjs/helper-wasm-bytecode": "1.9.0", 111 | "@webassemblyjs/helper-wasm-section": "1.9.0", 112 | "@webassemblyjs/wasm-gen": "1.9.0", 113 | "@webassemblyjs/wasm-opt": "1.9.0", 114 | "@webassemblyjs/wasm-parser": "1.9.0", 115 | "@webassemblyjs/wast-printer": "1.9.0" 116 | } 117 | }, 118 | "@webassemblyjs/wasm-gen": { 119 | "version": "1.9.0", 120 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", 121 | "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", 122 | "dev": true, 123 | "requires": { 124 | "@webassemblyjs/ast": "1.9.0", 125 | "@webassemblyjs/helper-wasm-bytecode": "1.9.0", 126 | "@webassemblyjs/ieee754": "1.9.0", 127 | "@webassemblyjs/leb128": "1.9.0", 128 | "@webassemblyjs/utf8": "1.9.0" 129 | } 130 | }, 131 | "@webassemblyjs/wasm-opt": { 132 | "version": "1.9.0", 133 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", 134 | "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", 135 | "dev": true, 136 | "requires": { 137 | "@webassemblyjs/ast": "1.9.0", 138 | "@webassemblyjs/helper-buffer": "1.9.0", 139 | "@webassemblyjs/wasm-gen": "1.9.0", 140 | "@webassemblyjs/wasm-parser": "1.9.0" 141 | } 142 | }, 143 | "@webassemblyjs/wasm-parser": { 144 | "version": "1.9.0", 145 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", 146 | "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", 147 | "dev": true, 148 | "requires": { 149 | "@webassemblyjs/ast": "1.9.0", 150 | "@webassemblyjs/helper-api-error": "1.9.0", 151 | "@webassemblyjs/helper-wasm-bytecode": "1.9.0", 152 | "@webassemblyjs/ieee754": "1.9.0", 153 | "@webassemblyjs/leb128": "1.9.0", 154 | "@webassemblyjs/utf8": "1.9.0" 155 | } 156 | }, 157 | "@webassemblyjs/wast-parser": { 158 | "version": "1.9.0", 159 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", 160 | "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", 161 | "dev": true, 162 | "requires": { 163 | "@webassemblyjs/ast": "1.9.0", 164 | "@webassemblyjs/floating-point-hex-parser": "1.9.0", 165 | "@webassemblyjs/helper-api-error": "1.9.0", 166 | "@webassemblyjs/helper-code-frame": "1.9.0", 167 | "@webassemblyjs/helper-fsm": "1.9.0", 168 | "@xtuc/long": "4.2.2" 169 | } 170 | }, 171 | "@webassemblyjs/wast-printer": { 172 | "version": "1.9.0", 173 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", 174 | "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", 175 | "dev": true, 176 | "requires": { 177 | "@webassemblyjs/ast": "1.9.0", 178 | "@webassemblyjs/wast-parser": "1.9.0", 179 | "@xtuc/long": "4.2.2" 180 | } 181 | }, 182 | "@xtuc/ieee754": { 183 | "version": "1.2.0", 184 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", 185 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", 186 | "dev": true 187 | }, 188 | "@xtuc/long": { 189 | "version": "4.2.2", 190 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", 191 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", 192 | "dev": true 193 | }, 194 | "acorn": { 195 | "version": "6.4.1", 196 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", 197 | "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", 198 | "dev": true 199 | }, 200 | "ajv": { 201 | "version": "6.12.3", 202 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", 203 | "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", 204 | "dev": true, 205 | "requires": { 206 | "fast-deep-equal": "^3.1.1", 207 | "fast-json-stable-stringify": "^2.0.0", 208 | "json-schema-traverse": "^0.4.1", 209 | "uri-js": "^4.2.2" 210 | } 211 | }, 212 | "ajv-errors": { 213 | "version": "1.0.1", 214 | "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", 215 | "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", 216 | "dev": true 217 | }, 218 | "ajv-keywords": { 219 | "version": "3.5.1", 220 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.1.tgz", 221 | "integrity": "sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA==", 222 | "dev": true 223 | }, 224 | "ansi-regex": { 225 | "version": "4.1.0", 226 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 227 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 228 | "dev": true 229 | }, 230 | "ansi-styles": { 231 | "version": "3.2.1", 232 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 233 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 234 | "dev": true, 235 | "requires": { 236 | "color-convert": "^1.9.0" 237 | } 238 | }, 239 | "anymatch": { 240 | "version": "3.1.1", 241 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 242 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 243 | "dev": true, 244 | "optional": true, 245 | "requires": { 246 | "normalize-path": "^3.0.0", 247 | "picomatch": "^2.0.4" 248 | } 249 | }, 250 | "aproba": { 251 | "version": "1.2.0", 252 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 253 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", 254 | "dev": true 255 | }, 256 | "arr-diff": { 257 | "version": "4.0.0", 258 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 259 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", 260 | "dev": true 261 | }, 262 | "arr-flatten": { 263 | "version": "1.1.0", 264 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 265 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 266 | "dev": true 267 | }, 268 | "arr-union": { 269 | "version": "3.1.0", 270 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 271 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", 272 | "dev": true 273 | }, 274 | "array-unique": { 275 | "version": "0.3.2", 276 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 277 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", 278 | "dev": true 279 | }, 280 | "asn1.js": { 281 | "version": "4.10.1", 282 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", 283 | "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", 284 | "dev": true, 285 | "requires": { 286 | "bn.js": "^4.0.0", 287 | "inherits": "^2.0.1", 288 | "minimalistic-assert": "^1.0.0" 289 | }, 290 | "dependencies": { 291 | "bn.js": { 292 | "version": "4.11.9", 293 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", 294 | "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", 295 | "dev": true 296 | } 297 | } 298 | }, 299 | "assert": { 300 | "version": "1.5.0", 301 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", 302 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", 303 | "dev": true, 304 | "requires": { 305 | "object-assign": "^4.1.1", 306 | "util": "0.10.3" 307 | }, 308 | "dependencies": { 309 | "inherits": { 310 | "version": "2.0.1", 311 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 312 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 313 | "dev": true 314 | }, 315 | "util": { 316 | "version": "0.10.3", 317 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 318 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 319 | "dev": true, 320 | "requires": { 321 | "inherits": "2.0.1" 322 | } 323 | } 324 | } 325 | }, 326 | "assign-symbols": { 327 | "version": "1.0.0", 328 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", 329 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", 330 | "dev": true 331 | }, 332 | "async-each": { 333 | "version": "1.0.3", 334 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", 335 | "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", 336 | "dev": true, 337 | "optional": true 338 | }, 339 | "atob": { 340 | "version": "2.1.2", 341 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", 342 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", 343 | "dev": true 344 | }, 345 | "balanced-match": { 346 | "version": "1.0.0", 347 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 348 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 349 | "dev": true 350 | }, 351 | "base": { 352 | "version": "0.11.2", 353 | "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", 354 | "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", 355 | "dev": true, 356 | "requires": { 357 | "cache-base": "^1.0.1", 358 | "class-utils": "^0.3.5", 359 | "component-emitter": "^1.2.1", 360 | "define-property": "^1.0.0", 361 | "isobject": "^3.0.1", 362 | "mixin-deep": "^1.2.0", 363 | "pascalcase": "^0.1.1" 364 | }, 365 | "dependencies": { 366 | "define-property": { 367 | "version": "1.0.0", 368 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 369 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 370 | "dev": true, 371 | "requires": { 372 | "is-descriptor": "^1.0.0" 373 | } 374 | }, 375 | "is-accessor-descriptor": { 376 | "version": "1.0.0", 377 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 378 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 379 | "dev": true, 380 | "requires": { 381 | "kind-of": "^6.0.0" 382 | } 383 | }, 384 | "is-data-descriptor": { 385 | "version": "1.0.0", 386 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 387 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 388 | "dev": true, 389 | "requires": { 390 | "kind-of": "^6.0.0" 391 | } 392 | }, 393 | "is-descriptor": { 394 | "version": "1.0.2", 395 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 396 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 397 | "dev": true, 398 | "requires": { 399 | "is-accessor-descriptor": "^1.0.0", 400 | "is-data-descriptor": "^1.0.0", 401 | "kind-of": "^6.0.2" 402 | } 403 | } 404 | } 405 | }, 406 | "base64-js": { 407 | "version": "1.3.1", 408 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 409 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", 410 | "dev": true 411 | }, 412 | "big.js": { 413 | "version": "5.2.2", 414 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 415 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", 416 | "dev": true 417 | }, 418 | "binary-extensions": { 419 | "version": "2.1.0", 420 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", 421 | "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", 422 | "dev": true, 423 | "optional": true 424 | }, 425 | "bluebird": { 426 | "version": "3.7.2", 427 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 428 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", 429 | "dev": true 430 | }, 431 | "bn.js": { 432 | "version": "5.1.2", 433 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", 434 | "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", 435 | "dev": true 436 | }, 437 | "brace-expansion": { 438 | "version": "1.1.11", 439 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 440 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 441 | "dev": true, 442 | "requires": { 443 | "balanced-match": "^1.0.0", 444 | "concat-map": "0.0.1" 445 | } 446 | }, 447 | "braces": { 448 | "version": "2.3.2", 449 | "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", 450 | "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", 451 | "dev": true, 452 | "requires": { 453 | "arr-flatten": "^1.1.0", 454 | "array-unique": "^0.3.2", 455 | "extend-shallow": "^2.0.1", 456 | "fill-range": "^4.0.0", 457 | "isobject": "^3.0.1", 458 | "repeat-element": "^1.1.2", 459 | "snapdragon": "^0.8.1", 460 | "snapdragon-node": "^2.0.1", 461 | "split-string": "^3.0.2", 462 | "to-regex": "^3.0.1" 463 | }, 464 | "dependencies": { 465 | "extend-shallow": { 466 | "version": "2.0.1", 467 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 468 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 469 | "dev": true, 470 | "requires": { 471 | "is-extendable": "^0.1.0" 472 | } 473 | } 474 | } 475 | }, 476 | "brorand": { 477 | "version": "1.1.0", 478 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 479 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", 480 | "dev": true 481 | }, 482 | "browserify-aes": { 483 | "version": "1.2.0", 484 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 485 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 486 | "dev": true, 487 | "requires": { 488 | "buffer-xor": "^1.0.3", 489 | "cipher-base": "^1.0.0", 490 | "create-hash": "^1.1.0", 491 | "evp_bytestokey": "^1.0.3", 492 | "inherits": "^2.0.1", 493 | "safe-buffer": "^5.0.1" 494 | } 495 | }, 496 | "browserify-cipher": { 497 | "version": "1.0.1", 498 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 499 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 500 | "dev": true, 501 | "requires": { 502 | "browserify-aes": "^1.0.4", 503 | "browserify-des": "^1.0.0", 504 | "evp_bytestokey": "^1.0.0" 505 | } 506 | }, 507 | "browserify-des": { 508 | "version": "1.0.2", 509 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 510 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 511 | "dev": true, 512 | "requires": { 513 | "cipher-base": "^1.0.1", 514 | "des.js": "^1.0.0", 515 | "inherits": "^2.0.1", 516 | "safe-buffer": "^5.1.2" 517 | } 518 | }, 519 | "browserify-rsa": { 520 | "version": "4.0.1", 521 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", 522 | "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", 523 | "dev": true, 524 | "requires": { 525 | "bn.js": "^4.1.0", 526 | "randombytes": "^2.0.1" 527 | }, 528 | "dependencies": { 529 | "bn.js": { 530 | "version": "4.11.9", 531 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", 532 | "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", 533 | "dev": true 534 | } 535 | } 536 | }, 537 | "browserify-sign": { 538 | "version": "4.2.0", 539 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", 540 | "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", 541 | "dev": true, 542 | "requires": { 543 | "bn.js": "^5.1.1", 544 | "browserify-rsa": "^4.0.1", 545 | "create-hash": "^1.2.0", 546 | "create-hmac": "^1.1.7", 547 | "elliptic": "^6.5.2", 548 | "inherits": "^2.0.4", 549 | "parse-asn1": "^5.1.5", 550 | "readable-stream": "^3.6.0", 551 | "safe-buffer": "^5.2.0" 552 | }, 553 | "dependencies": { 554 | "readable-stream": { 555 | "version": "3.6.0", 556 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 557 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 558 | "dev": true, 559 | "requires": { 560 | "inherits": "^2.0.3", 561 | "string_decoder": "^1.1.1", 562 | "util-deprecate": "^1.0.1" 563 | } 564 | }, 565 | "safe-buffer": { 566 | "version": "5.2.1", 567 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 568 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 569 | "dev": true 570 | } 571 | } 572 | }, 573 | "browserify-zlib": { 574 | "version": "0.2.0", 575 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 576 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 577 | "dev": true, 578 | "requires": { 579 | "pako": "~1.0.5" 580 | } 581 | }, 582 | "buffer": { 583 | "version": "4.9.2", 584 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 585 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 586 | "dev": true, 587 | "requires": { 588 | "base64-js": "^1.0.2", 589 | "ieee754": "^1.1.4", 590 | "isarray": "^1.0.0" 591 | } 592 | }, 593 | "buffer-from": { 594 | "version": "1.1.1", 595 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 596 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 597 | "dev": true 598 | }, 599 | "buffer-xor": { 600 | "version": "1.0.3", 601 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 602 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", 603 | "dev": true 604 | }, 605 | "builtin-status-codes": { 606 | "version": "3.0.0", 607 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 608 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", 609 | "dev": true 610 | }, 611 | "cacache": { 612 | "version": "12.0.4", 613 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", 614 | "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", 615 | "dev": true, 616 | "requires": { 617 | "bluebird": "^3.5.5", 618 | "chownr": "^1.1.1", 619 | "figgy-pudding": "^3.5.1", 620 | "glob": "^7.1.4", 621 | "graceful-fs": "^4.1.15", 622 | "infer-owner": "^1.0.3", 623 | "lru-cache": "^5.1.1", 624 | "mississippi": "^3.0.0", 625 | "mkdirp": "^0.5.1", 626 | "move-concurrently": "^1.0.1", 627 | "promise-inflight": "^1.0.1", 628 | "rimraf": "^2.6.3", 629 | "ssri": "^6.0.1", 630 | "unique-filename": "^1.1.1", 631 | "y18n": "^4.0.0" 632 | } 633 | }, 634 | "cache-base": { 635 | "version": "1.0.1", 636 | "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", 637 | "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", 638 | "dev": true, 639 | "requires": { 640 | "collection-visit": "^1.0.0", 641 | "component-emitter": "^1.2.1", 642 | "get-value": "^2.0.6", 643 | "has-value": "^1.0.0", 644 | "isobject": "^3.0.1", 645 | "set-value": "^2.0.0", 646 | "to-object-path": "^0.3.0", 647 | "union-value": "^1.0.0", 648 | "unset-value": "^1.0.0" 649 | } 650 | }, 651 | "camelcase": { 652 | "version": "5.3.1", 653 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 654 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 655 | "dev": true 656 | }, 657 | "chalk": { 658 | "version": "2.4.2", 659 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 660 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 661 | "dev": true, 662 | "requires": { 663 | "ansi-styles": "^3.2.1", 664 | "escape-string-regexp": "^1.0.5", 665 | "supports-color": "^5.3.0" 666 | }, 667 | "dependencies": { 668 | "supports-color": { 669 | "version": "5.5.0", 670 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 671 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 672 | "dev": true, 673 | "requires": { 674 | "has-flag": "^3.0.0" 675 | } 676 | } 677 | } 678 | }, 679 | "chokidar": { 680 | "version": "3.4.1", 681 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", 682 | "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==", 683 | "dev": true, 684 | "optional": true, 685 | "requires": { 686 | "anymatch": "~3.1.1", 687 | "braces": "~3.0.2", 688 | "fsevents": "~2.1.2", 689 | "glob-parent": "~5.1.0", 690 | "is-binary-path": "~2.1.0", 691 | "is-glob": "~4.0.1", 692 | "normalize-path": "~3.0.0", 693 | "readdirp": "~3.4.0" 694 | }, 695 | "dependencies": { 696 | "braces": { 697 | "version": "3.0.2", 698 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 699 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 700 | "dev": true, 701 | "optional": true, 702 | "requires": { 703 | "fill-range": "^7.0.1" 704 | } 705 | }, 706 | "fill-range": { 707 | "version": "7.0.1", 708 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 709 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 710 | "dev": true, 711 | "optional": true, 712 | "requires": { 713 | "to-regex-range": "^5.0.1" 714 | } 715 | }, 716 | "is-number": { 717 | "version": "7.0.0", 718 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 719 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 720 | "dev": true, 721 | "optional": true 722 | }, 723 | "to-regex-range": { 724 | "version": "5.0.1", 725 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 726 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 727 | "dev": true, 728 | "optional": true, 729 | "requires": { 730 | "is-number": "^7.0.0" 731 | } 732 | } 733 | } 734 | }, 735 | "chownr": { 736 | "version": "1.1.4", 737 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 738 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 739 | "dev": true 740 | }, 741 | "chrome-trace-event": { 742 | "version": "1.0.2", 743 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", 744 | "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", 745 | "dev": true, 746 | "requires": { 747 | "tslib": "^1.9.0" 748 | } 749 | }, 750 | "cipher-base": { 751 | "version": "1.0.4", 752 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 753 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 754 | "dev": true, 755 | "requires": { 756 | "inherits": "^2.0.1", 757 | "safe-buffer": "^5.0.1" 758 | } 759 | }, 760 | "class-utils": { 761 | "version": "0.3.6", 762 | "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", 763 | "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", 764 | "dev": true, 765 | "requires": { 766 | "arr-union": "^3.1.0", 767 | "define-property": "^0.2.5", 768 | "isobject": "^3.0.0", 769 | "static-extend": "^0.1.1" 770 | }, 771 | "dependencies": { 772 | "define-property": { 773 | "version": "0.2.5", 774 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 775 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 776 | "dev": true, 777 | "requires": { 778 | "is-descriptor": "^0.1.0" 779 | } 780 | } 781 | } 782 | }, 783 | "cliui": { 784 | "version": "5.0.0", 785 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 786 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 787 | "dev": true, 788 | "requires": { 789 | "string-width": "^3.1.0", 790 | "strip-ansi": "^5.2.0", 791 | "wrap-ansi": "^5.1.0" 792 | } 793 | }, 794 | "collection-visit": { 795 | "version": "1.0.0", 796 | "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 797 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 798 | "dev": true, 799 | "requires": { 800 | "map-visit": "^1.0.0", 801 | "object-visit": "^1.0.0" 802 | } 803 | }, 804 | "color-convert": { 805 | "version": "1.9.3", 806 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 807 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 808 | "dev": true, 809 | "requires": { 810 | "color-name": "1.1.3" 811 | } 812 | }, 813 | "color-name": { 814 | "version": "1.1.3", 815 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 816 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 817 | "dev": true 818 | }, 819 | "commander": { 820 | "version": "2.20.3", 821 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 822 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 823 | "dev": true 824 | }, 825 | "commondir": { 826 | "version": "1.0.1", 827 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 828 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", 829 | "dev": true 830 | }, 831 | "component-emitter": { 832 | "version": "1.3.0", 833 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 834 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", 835 | "dev": true 836 | }, 837 | "concat-map": { 838 | "version": "0.0.1", 839 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 840 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 841 | "dev": true 842 | }, 843 | "concat-stream": { 844 | "version": "1.6.2", 845 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 846 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 847 | "dev": true, 848 | "requires": { 849 | "buffer-from": "^1.0.0", 850 | "inherits": "^2.0.3", 851 | "readable-stream": "^2.2.2", 852 | "typedarray": "^0.0.6" 853 | } 854 | }, 855 | "console-browserify": { 856 | "version": "1.2.0", 857 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", 858 | "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", 859 | "dev": true 860 | }, 861 | "constants-browserify": { 862 | "version": "1.0.0", 863 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 864 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", 865 | "dev": true 866 | }, 867 | "copy-concurrently": { 868 | "version": "1.0.5", 869 | "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", 870 | "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", 871 | "dev": true, 872 | "requires": { 873 | "aproba": "^1.1.1", 874 | "fs-write-stream-atomic": "^1.0.8", 875 | "iferr": "^0.1.5", 876 | "mkdirp": "^0.5.1", 877 | "rimraf": "^2.5.4", 878 | "run-queue": "^1.0.0" 879 | } 880 | }, 881 | "copy-descriptor": { 882 | "version": "0.1.1", 883 | "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 884 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", 885 | "dev": true 886 | }, 887 | "core-util-is": { 888 | "version": "1.0.2", 889 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 890 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 891 | "dev": true 892 | }, 893 | "create-ecdh": { 894 | "version": "4.0.3", 895 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", 896 | "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", 897 | "dev": true, 898 | "requires": { 899 | "bn.js": "^4.1.0", 900 | "elliptic": "^6.0.0" 901 | }, 902 | "dependencies": { 903 | "bn.js": { 904 | "version": "4.11.9", 905 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", 906 | "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", 907 | "dev": true 908 | } 909 | } 910 | }, 911 | "create-hash": { 912 | "version": "1.2.0", 913 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 914 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 915 | "dev": true, 916 | "requires": { 917 | "cipher-base": "^1.0.1", 918 | "inherits": "^2.0.1", 919 | "md5.js": "^1.3.4", 920 | "ripemd160": "^2.0.1", 921 | "sha.js": "^2.4.0" 922 | } 923 | }, 924 | "create-hmac": { 925 | "version": "1.1.7", 926 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 927 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 928 | "dev": true, 929 | "requires": { 930 | "cipher-base": "^1.0.3", 931 | "create-hash": "^1.1.0", 932 | "inherits": "^2.0.1", 933 | "ripemd160": "^2.0.0", 934 | "safe-buffer": "^5.0.1", 935 | "sha.js": "^2.4.8" 936 | } 937 | }, 938 | "cross-spawn": { 939 | "version": "6.0.5", 940 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 941 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 942 | "dev": true, 943 | "requires": { 944 | "nice-try": "^1.0.4", 945 | "path-key": "^2.0.1", 946 | "semver": "^5.5.0", 947 | "shebang-command": "^1.2.0", 948 | "which": "^1.2.9" 949 | } 950 | }, 951 | "crypto-browserify": { 952 | "version": "3.12.0", 953 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 954 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 955 | "dev": true, 956 | "requires": { 957 | "browserify-cipher": "^1.0.0", 958 | "browserify-sign": "^4.0.0", 959 | "create-ecdh": "^4.0.0", 960 | "create-hash": "^1.1.0", 961 | "create-hmac": "^1.1.0", 962 | "diffie-hellman": "^5.0.0", 963 | "inherits": "^2.0.1", 964 | "pbkdf2": "^3.0.3", 965 | "public-encrypt": "^4.0.0", 966 | "randombytes": "^2.0.0", 967 | "randomfill": "^1.0.3" 968 | } 969 | }, 970 | "cyclist": { 971 | "version": "1.0.1", 972 | "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", 973 | "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", 974 | "dev": true 975 | }, 976 | "debug": { 977 | "version": "2.6.9", 978 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 979 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 980 | "dev": true, 981 | "requires": { 982 | "ms": "2.0.0" 983 | } 984 | }, 985 | "decamelize": { 986 | "version": "1.2.0", 987 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 988 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 989 | "dev": true 990 | }, 991 | "decode-uri-component": { 992 | "version": "0.2.0", 993 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 994 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", 995 | "dev": true 996 | }, 997 | "define-property": { 998 | "version": "2.0.2", 999 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", 1000 | "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", 1001 | "dev": true, 1002 | "requires": { 1003 | "is-descriptor": "^1.0.2", 1004 | "isobject": "^3.0.1" 1005 | }, 1006 | "dependencies": { 1007 | "is-accessor-descriptor": { 1008 | "version": "1.0.0", 1009 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 1010 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 1011 | "dev": true, 1012 | "requires": { 1013 | "kind-of": "^6.0.0" 1014 | } 1015 | }, 1016 | "is-data-descriptor": { 1017 | "version": "1.0.0", 1018 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 1019 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 1020 | "dev": true, 1021 | "requires": { 1022 | "kind-of": "^6.0.0" 1023 | } 1024 | }, 1025 | "is-descriptor": { 1026 | "version": "1.0.2", 1027 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 1028 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 1029 | "dev": true, 1030 | "requires": { 1031 | "is-accessor-descriptor": "^1.0.0", 1032 | "is-data-descriptor": "^1.0.0", 1033 | "kind-of": "^6.0.2" 1034 | } 1035 | } 1036 | } 1037 | }, 1038 | "des.js": { 1039 | "version": "1.0.1", 1040 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", 1041 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", 1042 | "dev": true, 1043 | "requires": { 1044 | "inherits": "^2.0.1", 1045 | "minimalistic-assert": "^1.0.0" 1046 | } 1047 | }, 1048 | "detect-file": { 1049 | "version": "1.0.0", 1050 | "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", 1051 | "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", 1052 | "dev": true 1053 | }, 1054 | "diffie-hellman": { 1055 | "version": "5.0.3", 1056 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 1057 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 1058 | "dev": true, 1059 | "requires": { 1060 | "bn.js": "^4.1.0", 1061 | "miller-rabin": "^4.0.0", 1062 | "randombytes": "^2.0.0" 1063 | }, 1064 | "dependencies": { 1065 | "bn.js": { 1066 | "version": "4.11.9", 1067 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", 1068 | "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", 1069 | "dev": true 1070 | } 1071 | } 1072 | }, 1073 | "domain-browser": { 1074 | "version": "1.2.0", 1075 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 1076 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", 1077 | "dev": true 1078 | }, 1079 | "duplexify": { 1080 | "version": "3.7.1", 1081 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 1082 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 1083 | "dev": true, 1084 | "requires": { 1085 | "end-of-stream": "^1.0.0", 1086 | "inherits": "^2.0.1", 1087 | "readable-stream": "^2.0.0", 1088 | "stream-shift": "^1.0.0" 1089 | } 1090 | }, 1091 | "elliptic": { 1092 | "version": "6.5.3", 1093 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", 1094 | "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", 1095 | "dev": true, 1096 | "requires": { 1097 | "bn.js": "^4.4.0", 1098 | "brorand": "^1.0.1", 1099 | "hash.js": "^1.0.0", 1100 | "hmac-drbg": "^1.0.0", 1101 | "inherits": "^2.0.1", 1102 | "minimalistic-assert": "^1.0.0", 1103 | "minimalistic-crypto-utils": "^1.0.0" 1104 | }, 1105 | "dependencies": { 1106 | "bn.js": { 1107 | "version": "4.11.9", 1108 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", 1109 | "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", 1110 | "dev": true 1111 | } 1112 | } 1113 | }, 1114 | "emoji-regex": { 1115 | "version": "7.0.3", 1116 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1117 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 1118 | "dev": true 1119 | }, 1120 | "emojis-list": { 1121 | "version": "3.0.0", 1122 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", 1123 | "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", 1124 | "dev": true 1125 | }, 1126 | "end-of-stream": { 1127 | "version": "1.4.4", 1128 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1129 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1130 | "dev": true, 1131 | "requires": { 1132 | "once": "^1.4.0" 1133 | } 1134 | }, 1135 | "enhanced-resolve": { 1136 | "version": "4.3.0", 1137 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", 1138 | "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", 1139 | "dev": true, 1140 | "requires": { 1141 | "graceful-fs": "^4.1.2", 1142 | "memory-fs": "^0.5.0", 1143 | "tapable": "^1.0.0" 1144 | }, 1145 | "dependencies": { 1146 | "memory-fs": { 1147 | "version": "0.5.0", 1148 | "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", 1149 | "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", 1150 | "dev": true, 1151 | "requires": { 1152 | "errno": "^0.1.3", 1153 | "readable-stream": "^2.0.1" 1154 | } 1155 | } 1156 | } 1157 | }, 1158 | "errno": { 1159 | "version": "0.1.7", 1160 | "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", 1161 | "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", 1162 | "dev": true, 1163 | "requires": { 1164 | "prr": "~1.0.1" 1165 | } 1166 | }, 1167 | "escape-string-regexp": { 1168 | "version": "1.0.5", 1169 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1170 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1171 | "dev": true 1172 | }, 1173 | "eslint-scope": { 1174 | "version": "4.0.3", 1175 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 1176 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 1177 | "dev": true, 1178 | "requires": { 1179 | "esrecurse": "^4.1.0", 1180 | "estraverse": "^4.1.1" 1181 | } 1182 | }, 1183 | "esrecurse": { 1184 | "version": "4.2.1", 1185 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 1186 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 1187 | "dev": true, 1188 | "requires": { 1189 | "estraverse": "^4.1.0" 1190 | } 1191 | }, 1192 | "estraverse": { 1193 | "version": "4.3.0", 1194 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1195 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1196 | "dev": true 1197 | }, 1198 | "events": { 1199 | "version": "3.1.0", 1200 | "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", 1201 | "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", 1202 | "dev": true 1203 | }, 1204 | "evp_bytestokey": { 1205 | "version": "1.0.3", 1206 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 1207 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 1208 | "dev": true, 1209 | "requires": { 1210 | "md5.js": "^1.3.4", 1211 | "safe-buffer": "^5.1.1" 1212 | } 1213 | }, 1214 | "expand-brackets": { 1215 | "version": "2.1.4", 1216 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 1217 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 1218 | "dev": true, 1219 | "requires": { 1220 | "debug": "^2.3.3", 1221 | "define-property": "^0.2.5", 1222 | "extend-shallow": "^2.0.1", 1223 | "posix-character-classes": "^0.1.0", 1224 | "regex-not": "^1.0.0", 1225 | "snapdragon": "^0.8.1", 1226 | "to-regex": "^3.0.1" 1227 | }, 1228 | "dependencies": { 1229 | "define-property": { 1230 | "version": "0.2.5", 1231 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1232 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1233 | "dev": true, 1234 | "requires": { 1235 | "is-descriptor": "^0.1.0" 1236 | } 1237 | }, 1238 | "extend-shallow": { 1239 | "version": "2.0.1", 1240 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1241 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1242 | "dev": true, 1243 | "requires": { 1244 | "is-extendable": "^0.1.0" 1245 | } 1246 | } 1247 | } 1248 | }, 1249 | "expand-tilde": { 1250 | "version": "2.0.2", 1251 | "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", 1252 | "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", 1253 | "dev": true, 1254 | "requires": { 1255 | "homedir-polyfill": "^1.0.1" 1256 | } 1257 | }, 1258 | "extend-shallow": { 1259 | "version": "3.0.2", 1260 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", 1261 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 1262 | "dev": true, 1263 | "requires": { 1264 | "assign-symbols": "^1.0.0", 1265 | "is-extendable": "^1.0.1" 1266 | }, 1267 | "dependencies": { 1268 | "is-extendable": { 1269 | "version": "1.0.1", 1270 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 1271 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 1272 | "dev": true, 1273 | "requires": { 1274 | "is-plain-object": "^2.0.4" 1275 | } 1276 | } 1277 | } 1278 | }, 1279 | "extglob": { 1280 | "version": "2.0.4", 1281 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", 1282 | "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", 1283 | "dev": true, 1284 | "requires": { 1285 | "array-unique": "^0.3.2", 1286 | "define-property": "^1.0.0", 1287 | "expand-brackets": "^2.1.4", 1288 | "extend-shallow": "^2.0.1", 1289 | "fragment-cache": "^0.2.1", 1290 | "regex-not": "^1.0.0", 1291 | "snapdragon": "^0.8.1", 1292 | "to-regex": "^3.0.1" 1293 | }, 1294 | "dependencies": { 1295 | "define-property": { 1296 | "version": "1.0.0", 1297 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 1298 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 1299 | "dev": true, 1300 | "requires": { 1301 | "is-descriptor": "^1.0.0" 1302 | } 1303 | }, 1304 | "extend-shallow": { 1305 | "version": "2.0.1", 1306 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1307 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1308 | "dev": true, 1309 | "requires": { 1310 | "is-extendable": "^0.1.0" 1311 | } 1312 | }, 1313 | "is-accessor-descriptor": { 1314 | "version": "1.0.0", 1315 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 1316 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 1317 | "dev": true, 1318 | "requires": { 1319 | "kind-of": "^6.0.0" 1320 | } 1321 | }, 1322 | "is-data-descriptor": { 1323 | "version": "1.0.0", 1324 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 1325 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 1326 | "dev": true, 1327 | "requires": { 1328 | "kind-of": "^6.0.0" 1329 | } 1330 | }, 1331 | "is-descriptor": { 1332 | "version": "1.0.2", 1333 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 1334 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 1335 | "dev": true, 1336 | "requires": { 1337 | "is-accessor-descriptor": "^1.0.0", 1338 | "is-data-descriptor": "^1.0.0", 1339 | "kind-of": "^6.0.2" 1340 | } 1341 | } 1342 | } 1343 | }, 1344 | "fast-deep-equal": { 1345 | "version": "3.1.3", 1346 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1347 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1348 | "dev": true 1349 | }, 1350 | "fast-json-stable-stringify": { 1351 | "version": "2.1.0", 1352 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1353 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1354 | "dev": true 1355 | }, 1356 | "figgy-pudding": { 1357 | "version": "3.5.2", 1358 | "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", 1359 | "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", 1360 | "dev": true 1361 | }, 1362 | "fill-range": { 1363 | "version": "4.0.0", 1364 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", 1365 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 1366 | "dev": true, 1367 | "requires": { 1368 | "extend-shallow": "^2.0.1", 1369 | "is-number": "^3.0.0", 1370 | "repeat-string": "^1.6.1", 1371 | "to-regex-range": "^2.1.0" 1372 | }, 1373 | "dependencies": { 1374 | "extend-shallow": { 1375 | "version": "2.0.1", 1376 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1377 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1378 | "dev": true, 1379 | "requires": { 1380 | "is-extendable": "^0.1.0" 1381 | } 1382 | } 1383 | } 1384 | }, 1385 | "find-cache-dir": { 1386 | "version": "2.1.0", 1387 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", 1388 | "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", 1389 | "dev": true, 1390 | "requires": { 1391 | "commondir": "^1.0.1", 1392 | "make-dir": "^2.0.0", 1393 | "pkg-dir": "^3.0.0" 1394 | } 1395 | }, 1396 | "find-up": { 1397 | "version": "3.0.0", 1398 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 1399 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 1400 | "dev": true, 1401 | "requires": { 1402 | "locate-path": "^3.0.0" 1403 | } 1404 | }, 1405 | "findup-sync": { 1406 | "version": "3.0.0", 1407 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", 1408 | "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", 1409 | "dev": true, 1410 | "requires": { 1411 | "detect-file": "^1.0.0", 1412 | "is-glob": "^4.0.0", 1413 | "micromatch": "^3.0.4", 1414 | "resolve-dir": "^1.0.1" 1415 | } 1416 | }, 1417 | "flush-write-stream": { 1418 | "version": "1.1.1", 1419 | "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", 1420 | "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", 1421 | "dev": true, 1422 | "requires": { 1423 | "inherits": "^2.0.3", 1424 | "readable-stream": "^2.3.6" 1425 | } 1426 | }, 1427 | "for-in": { 1428 | "version": "1.0.2", 1429 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 1430 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 1431 | "dev": true 1432 | }, 1433 | "fragment-cache": { 1434 | "version": "0.2.1", 1435 | "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 1436 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 1437 | "dev": true, 1438 | "requires": { 1439 | "map-cache": "^0.2.2" 1440 | } 1441 | }, 1442 | "from2": { 1443 | "version": "2.3.0", 1444 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 1445 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 1446 | "dev": true, 1447 | "requires": { 1448 | "inherits": "^2.0.1", 1449 | "readable-stream": "^2.0.0" 1450 | } 1451 | }, 1452 | "fs-write-stream-atomic": { 1453 | "version": "1.0.10", 1454 | "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", 1455 | "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", 1456 | "dev": true, 1457 | "requires": { 1458 | "graceful-fs": "^4.1.2", 1459 | "iferr": "^0.1.5", 1460 | "imurmurhash": "^0.1.4", 1461 | "readable-stream": "1 || 2" 1462 | } 1463 | }, 1464 | "fs.realpath": { 1465 | "version": "1.0.0", 1466 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1467 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1468 | "dev": true 1469 | }, 1470 | "fsevents": { 1471 | "version": "2.1.3", 1472 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", 1473 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", 1474 | "dev": true, 1475 | "optional": true 1476 | }, 1477 | "get-caller-file": { 1478 | "version": "2.0.5", 1479 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1480 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1481 | "dev": true 1482 | }, 1483 | "get-value": { 1484 | "version": "2.0.6", 1485 | "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 1486 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", 1487 | "dev": true 1488 | }, 1489 | "glob": { 1490 | "version": "7.1.6", 1491 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1492 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1493 | "dev": true, 1494 | "requires": { 1495 | "fs.realpath": "^1.0.0", 1496 | "inflight": "^1.0.4", 1497 | "inherits": "2", 1498 | "minimatch": "^3.0.4", 1499 | "once": "^1.3.0", 1500 | "path-is-absolute": "^1.0.0" 1501 | } 1502 | }, 1503 | "glob-parent": { 1504 | "version": "5.1.1", 1505 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 1506 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 1507 | "dev": true, 1508 | "optional": true, 1509 | "requires": { 1510 | "is-glob": "^4.0.1" 1511 | } 1512 | }, 1513 | "global-modules": { 1514 | "version": "2.0.0", 1515 | "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", 1516 | "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", 1517 | "dev": true, 1518 | "requires": { 1519 | "global-prefix": "^3.0.0" 1520 | }, 1521 | "dependencies": { 1522 | "global-prefix": { 1523 | "version": "3.0.0", 1524 | "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", 1525 | "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", 1526 | "dev": true, 1527 | "requires": { 1528 | "ini": "^1.3.5", 1529 | "kind-of": "^6.0.2", 1530 | "which": "^1.3.1" 1531 | } 1532 | } 1533 | } 1534 | }, 1535 | "global-prefix": { 1536 | "version": "1.0.2", 1537 | "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", 1538 | "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", 1539 | "dev": true, 1540 | "requires": { 1541 | "expand-tilde": "^2.0.2", 1542 | "homedir-polyfill": "^1.0.1", 1543 | "ini": "^1.3.4", 1544 | "is-windows": "^1.0.1", 1545 | "which": "^1.2.14" 1546 | } 1547 | }, 1548 | "graceful-fs": { 1549 | "version": "4.2.4", 1550 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 1551 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 1552 | "dev": true 1553 | }, 1554 | "has-flag": { 1555 | "version": "3.0.0", 1556 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1557 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1558 | "dev": true 1559 | }, 1560 | "has-value": { 1561 | "version": "1.0.0", 1562 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", 1563 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 1564 | "dev": true, 1565 | "requires": { 1566 | "get-value": "^2.0.6", 1567 | "has-values": "^1.0.0", 1568 | "isobject": "^3.0.0" 1569 | } 1570 | }, 1571 | "has-values": { 1572 | "version": "1.0.0", 1573 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", 1574 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 1575 | "dev": true, 1576 | "requires": { 1577 | "is-number": "^3.0.0", 1578 | "kind-of": "^4.0.0" 1579 | }, 1580 | "dependencies": { 1581 | "kind-of": { 1582 | "version": "4.0.0", 1583 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1584 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1585 | "dev": true, 1586 | "requires": { 1587 | "is-buffer": "^1.1.5" 1588 | } 1589 | } 1590 | } 1591 | }, 1592 | "hash-base": { 1593 | "version": "3.1.0", 1594 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", 1595 | "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", 1596 | "dev": true, 1597 | "requires": { 1598 | "inherits": "^2.0.4", 1599 | "readable-stream": "^3.6.0", 1600 | "safe-buffer": "^5.2.0" 1601 | }, 1602 | "dependencies": { 1603 | "readable-stream": { 1604 | "version": "3.6.0", 1605 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1606 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1607 | "dev": true, 1608 | "requires": { 1609 | "inherits": "^2.0.3", 1610 | "string_decoder": "^1.1.1", 1611 | "util-deprecate": "^1.0.1" 1612 | } 1613 | }, 1614 | "safe-buffer": { 1615 | "version": "5.2.1", 1616 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1617 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1618 | "dev": true 1619 | } 1620 | } 1621 | }, 1622 | "hash.js": { 1623 | "version": "1.1.7", 1624 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 1625 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 1626 | "dev": true, 1627 | "requires": { 1628 | "inherits": "^2.0.3", 1629 | "minimalistic-assert": "^1.0.1" 1630 | } 1631 | }, 1632 | "hmac-drbg": { 1633 | "version": "1.0.1", 1634 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 1635 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 1636 | "dev": true, 1637 | "requires": { 1638 | "hash.js": "^1.0.3", 1639 | "minimalistic-assert": "^1.0.0", 1640 | "minimalistic-crypto-utils": "^1.0.1" 1641 | } 1642 | }, 1643 | "homedir-polyfill": { 1644 | "version": "1.0.3", 1645 | "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", 1646 | "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", 1647 | "dev": true, 1648 | "requires": { 1649 | "parse-passwd": "^1.0.0" 1650 | } 1651 | }, 1652 | "https-browserify": { 1653 | "version": "1.0.0", 1654 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 1655 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", 1656 | "dev": true 1657 | }, 1658 | "ieee754": { 1659 | "version": "1.1.13", 1660 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 1661 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", 1662 | "dev": true 1663 | }, 1664 | "iferr": { 1665 | "version": "0.1.5", 1666 | "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", 1667 | "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", 1668 | "dev": true 1669 | }, 1670 | "import-local": { 1671 | "version": "2.0.0", 1672 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", 1673 | "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", 1674 | "dev": true, 1675 | "requires": { 1676 | "pkg-dir": "^3.0.0", 1677 | "resolve-cwd": "^2.0.0" 1678 | } 1679 | }, 1680 | "imurmurhash": { 1681 | "version": "0.1.4", 1682 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1683 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1684 | "dev": true 1685 | }, 1686 | "infer-owner": { 1687 | "version": "1.0.4", 1688 | "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", 1689 | "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", 1690 | "dev": true 1691 | }, 1692 | "inflight": { 1693 | "version": "1.0.6", 1694 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1695 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1696 | "dev": true, 1697 | "requires": { 1698 | "once": "^1.3.0", 1699 | "wrappy": "1" 1700 | } 1701 | }, 1702 | "inherits": { 1703 | "version": "2.0.4", 1704 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1705 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1706 | "dev": true 1707 | }, 1708 | "ini": { 1709 | "version": "1.3.5", 1710 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1711 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 1712 | "dev": true 1713 | }, 1714 | "interpret": { 1715 | "version": "1.4.0", 1716 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 1717 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", 1718 | "dev": true 1719 | }, 1720 | "is-accessor-descriptor": { 1721 | "version": "0.1.6", 1722 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 1723 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 1724 | "dev": true, 1725 | "requires": { 1726 | "kind-of": "^3.0.2" 1727 | }, 1728 | "dependencies": { 1729 | "kind-of": { 1730 | "version": "3.2.2", 1731 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1732 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1733 | "dev": true, 1734 | "requires": { 1735 | "is-buffer": "^1.1.5" 1736 | } 1737 | } 1738 | } 1739 | }, 1740 | "is-binary-path": { 1741 | "version": "2.1.0", 1742 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1743 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1744 | "dev": true, 1745 | "optional": true, 1746 | "requires": { 1747 | "binary-extensions": "^2.0.0" 1748 | } 1749 | }, 1750 | "is-buffer": { 1751 | "version": "1.1.6", 1752 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1753 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1754 | "dev": true 1755 | }, 1756 | "is-data-descriptor": { 1757 | "version": "0.1.4", 1758 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 1759 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 1760 | "dev": true, 1761 | "requires": { 1762 | "kind-of": "^3.0.2" 1763 | }, 1764 | "dependencies": { 1765 | "kind-of": { 1766 | "version": "3.2.2", 1767 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1768 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1769 | "dev": true, 1770 | "requires": { 1771 | "is-buffer": "^1.1.5" 1772 | } 1773 | } 1774 | } 1775 | }, 1776 | "is-descriptor": { 1777 | "version": "0.1.6", 1778 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 1779 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 1780 | "dev": true, 1781 | "requires": { 1782 | "is-accessor-descriptor": "^0.1.6", 1783 | "is-data-descriptor": "^0.1.4", 1784 | "kind-of": "^5.0.0" 1785 | }, 1786 | "dependencies": { 1787 | "kind-of": { 1788 | "version": "5.1.0", 1789 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 1790 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", 1791 | "dev": true 1792 | } 1793 | } 1794 | }, 1795 | "is-extendable": { 1796 | "version": "0.1.1", 1797 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1798 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 1799 | "dev": true 1800 | }, 1801 | "is-extglob": { 1802 | "version": "2.1.1", 1803 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1804 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1805 | "dev": true 1806 | }, 1807 | "is-fullwidth-code-point": { 1808 | "version": "2.0.0", 1809 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1810 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1811 | "dev": true 1812 | }, 1813 | "is-glob": { 1814 | "version": "4.0.1", 1815 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1816 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1817 | "dev": true, 1818 | "requires": { 1819 | "is-extglob": "^2.1.1" 1820 | } 1821 | }, 1822 | "is-number": { 1823 | "version": "3.0.0", 1824 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1825 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1826 | "dev": true, 1827 | "requires": { 1828 | "kind-of": "^3.0.2" 1829 | }, 1830 | "dependencies": { 1831 | "kind-of": { 1832 | "version": "3.2.2", 1833 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1834 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1835 | "dev": true, 1836 | "requires": { 1837 | "is-buffer": "^1.1.5" 1838 | } 1839 | } 1840 | } 1841 | }, 1842 | "is-plain-object": { 1843 | "version": "2.0.4", 1844 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1845 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1846 | "dev": true, 1847 | "requires": { 1848 | "isobject": "^3.0.1" 1849 | } 1850 | }, 1851 | "is-windows": { 1852 | "version": "1.0.2", 1853 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1854 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 1855 | "dev": true 1856 | }, 1857 | "is-wsl": { 1858 | "version": "1.1.0", 1859 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 1860 | "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", 1861 | "dev": true 1862 | }, 1863 | "isarray": { 1864 | "version": "1.0.0", 1865 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1866 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1867 | "dev": true 1868 | }, 1869 | "isexe": { 1870 | "version": "2.0.0", 1871 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1872 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1873 | "dev": true 1874 | }, 1875 | "isobject": { 1876 | "version": "3.0.1", 1877 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1878 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", 1879 | "dev": true 1880 | }, 1881 | "json-parse-better-errors": { 1882 | "version": "1.0.2", 1883 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1884 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 1885 | "dev": true 1886 | }, 1887 | "json-schema-traverse": { 1888 | "version": "0.4.1", 1889 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1890 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1891 | "dev": true 1892 | }, 1893 | "json5": { 1894 | "version": "1.0.1", 1895 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 1896 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 1897 | "dev": true, 1898 | "requires": { 1899 | "minimist": "^1.2.0" 1900 | } 1901 | }, 1902 | "kind-of": { 1903 | "version": "6.0.3", 1904 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 1905 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 1906 | "dev": true 1907 | }, 1908 | "loader-runner": { 1909 | "version": "2.4.0", 1910 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", 1911 | "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", 1912 | "dev": true 1913 | }, 1914 | "loader-utils": { 1915 | "version": "1.4.0", 1916 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", 1917 | "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", 1918 | "dev": true, 1919 | "requires": { 1920 | "big.js": "^5.2.2", 1921 | "emojis-list": "^3.0.0", 1922 | "json5": "^1.0.1" 1923 | } 1924 | }, 1925 | "locate-path": { 1926 | "version": "3.0.0", 1927 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1928 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1929 | "dev": true, 1930 | "requires": { 1931 | "p-locate": "^3.0.0", 1932 | "path-exists": "^3.0.0" 1933 | } 1934 | }, 1935 | "lru-cache": { 1936 | "version": "5.1.1", 1937 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 1938 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 1939 | "dev": true, 1940 | "requires": { 1941 | "yallist": "^3.0.2" 1942 | } 1943 | }, 1944 | "make-dir": { 1945 | "version": "2.1.0", 1946 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", 1947 | "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", 1948 | "dev": true, 1949 | "requires": { 1950 | "pify": "^4.0.1", 1951 | "semver": "^5.6.0" 1952 | } 1953 | }, 1954 | "map-cache": { 1955 | "version": "0.2.2", 1956 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 1957 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", 1958 | "dev": true 1959 | }, 1960 | "map-visit": { 1961 | "version": "1.0.0", 1962 | "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 1963 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 1964 | "dev": true, 1965 | "requires": { 1966 | "object-visit": "^1.0.0" 1967 | } 1968 | }, 1969 | "md5.js": { 1970 | "version": "1.3.5", 1971 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 1972 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 1973 | "dev": true, 1974 | "requires": { 1975 | "hash-base": "^3.0.0", 1976 | "inherits": "^2.0.1", 1977 | "safe-buffer": "^5.1.2" 1978 | } 1979 | }, 1980 | "memory-fs": { 1981 | "version": "0.4.1", 1982 | "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", 1983 | "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", 1984 | "dev": true, 1985 | "requires": { 1986 | "errno": "^0.1.3", 1987 | "readable-stream": "^2.0.1" 1988 | } 1989 | }, 1990 | "micromatch": { 1991 | "version": "3.1.10", 1992 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", 1993 | "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", 1994 | "dev": true, 1995 | "requires": { 1996 | "arr-diff": "^4.0.0", 1997 | "array-unique": "^0.3.2", 1998 | "braces": "^2.3.1", 1999 | "define-property": "^2.0.2", 2000 | "extend-shallow": "^3.0.2", 2001 | "extglob": "^2.0.4", 2002 | "fragment-cache": "^0.2.1", 2003 | "kind-of": "^6.0.2", 2004 | "nanomatch": "^1.2.9", 2005 | "object.pick": "^1.3.0", 2006 | "regex-not": "^1.0.0", 2007 | "snapdragon": "^0.8.1", 2008 | "to-regex": "^3.0.2" 2009 | } 2010 | }, 2011 | "miller-rabin": { 2012 | "version": "4.0.1", 2013 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 2014 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 2015 | "dev": true, 2016 | "requires": { 2017 | "bn.js": "^4.0.0", 2018 | "brorand": "^1.0.1" 2019 | }, 2020 | "dependencies": { 2021 | "bn.js": { 2022 | "version": "4.11.9", 2023 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", 2024 | "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", 2025 | "dev": true 2026 | } 2027 | } 2028 | }, 2029 | "minimalistic-assert": { 2030 | "version": "1.0.1", 2031 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 2032 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", 2033 | "dev": true 2034 | }, 2035 | "minimalistic-crypto-utils": { 2036 | "version": "1.0.1", 2037 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 2038 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", 2039 | "dev": true 2040 | }, 2041 | "minimatch": { 2042 | "version": "3.0.4", 2043 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2044 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2045 | "dev": true, 2046 | "requires": { 2047 | "brace-expansion": "^1.1.7" 2048 | } 2049 | }, 2050 | "minimist": { 2051 | "version": "1.2.5", 2052 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 2053 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 2054 | "dev": true 2055 | }, 2056 | "mississippi": { 2057 | "version": "3.0.0", 2058 | "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", 2059 | "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", 2060 | "dev": true, 2061 | "requires": { 2062 | "concat-stream": "^1.5.0", 2063 | "duplexify": "^3.4.2", 2064 | "end-of-stream": "^1.1.0", 2065 | "flush-write-stream": "^1.0.0", 2066 | "from2": "^2.1.0", 2067 | "parallel-transform": "^1.1.0", 2068 | "pump": "^3.0.0", 2069 | "pumpify": "^1.3.3", 2070 | "stream-each": "^1.1.0", 2071 | "through2": "^2.0.0" 2072 | } 2073 | }, 2074 | "mixin-deep": { 2075 | "version": "1.3.2", 2076 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", 2077 | "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", 2078 | "dev": true, 2079 | "requires": { 2080 | "for-in": "^1.0.2", 2081 | "is-extendable": "^1.0.1" 2082 | }, 2083 | "dependencies": { 2084 | "is-extendable": { 2085 | "version": "1.0.1", 2086 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 2087 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 2088 | "dev": true, 2089 | "requires": { 2090 | "is-plain-object": "^2.0.4" 2091 | } 2092 | } 2093 | } 2094 | }, 2095 | "mkdirp": { 2096 | "version": "0.5.5", 2097 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 2098 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 2099 | "dev": true, 2100 | "requires": { 2101 | "minimist": "^1.2.5" 2102 | } 2103 | }, 2104 | "move-concurrently": { 2105 | "version": "1.0.1", 2106 | "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", 2107 | "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", 2108 | "dev": true, 2109 | "requires": { 2110 | "aproba": "^1.1.1", 2111 | "copy-concurrently": "^1.0.0", 2112 | "fs-write-stream-atomic": "^1.0.8", 2113 | "mkdirp": "^0.5.1", 2114 | "rimraf": "^2.5.4", 2115 | "run-queue": "^1.0.3" 2116 | } 2117 | }, 2118 | "ms": { 2119 | "version": "2.0.0", 2120 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2121 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 2122 | "dev": true 2123 | }, 2124 | "nanomatch": { 2125 | "version": "1.2.13", 2126 | "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", 2127 | "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", 2128 | "dev": true, 2129 | "requires": { 2130 | "arr-diff": "^4.0.0", 2131 | "array-unique": "^0.3.2", 2132 | "define-property": "^2.0.2", 2133 | "extend-shallow": "^3.0.2", 2134 | "fragment-cache": "^0.2.1", 2135 | "is-windows": "^1.0.2", 2136 | "kind-of": "^6.0.2", 2137 | "object.pick": "^1.3.0", 2138 | "regex-not": "^1.0.0", 2139 | "snapdragon": "^0.8.1", 2140 | "to-regex": "^3.0.1" 2141 | } 2142 | }, 2143 | "neo-async": { 2144 | "version": "2.6.2", 2145 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 2146 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", 2147 | "dev": true 2148 | }, 2149 | "nice-try": { 2150 | "version": "1.0.5", 2151 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 2152 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 2153 | "dev": true 2154 | }, 2155 | "node-libs-browser": { 2156 | "version": "2.2.1", 2157 | "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", 2158 | "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", 2159 | "dev": true, 2160 | "requires": { 2161 | "assert": "^1.1.1", 2162 | "browserify-zlib": "^0.2.0", 2163 | "buffer": "^4.3.0", 2164 | "console-browserify": "^1.1.0", 2165 | "constants-browserify": "^1.0.0", 2166 | "crypto-browserify": "^3.11.0", 2167 | "domain-browser": "^1.1.1", 2168 | "events": "^3.0.0", 2169 | "https-browserify": "^1.0.0", 2170 | "os-browserify": "^0.3.0", 2171 | "path-browserify": "0.0.1", 2172 | "process": "^0.11.10", 2173 | "punycode": "^1.2.4", 2174 | "querystring-es3": "^0.2.0", 2175 | "readable-stream": "^2.3.3", 2176 | "stream-browserify": "^2.0.1", 2177 | "stream-http": "^2.7.2", 2178 | "string_decoder": "^1.0.0", 2179 | "timers-browserify": "^2.0.4", 2180 | "tty-browserify": "0.0.0", 2181 | "url": "^0.11.0", 2182 | "util": "^0.11.0", 2183 | "vm-browserify": "^1.0.1" 2184 | }, 2185 | "dependencies": { 2186 | "punycode": { 2187 | "version": "1.4.1", 2188 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2189 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 2190 | "dev": true 2191 | } 2192 | } 2193 | }, 2194 | "normalize-path": { 2195 | "version": "3.0.0", 2196 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2197 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2198 | "dev": true, 2199 | "optional": true 2200 | }, 2201 | "object-assign": { 2202 | "version": "4.1.1", 2203 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2204 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 2205 | "dev": true 2206 | }, 2207 | "object-copy": { 2208 | "version": "0.1.0", 2209 | "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", 2210 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 2211 | "dev": true, 2212 | "requires": { 2213 | "copy-descriptor": "^0.1.0", 2214 | "define-property": "^0.2.5", 2215 | "kind-of": "^3.0.3" 2216 | }, 2217 | "dependencies": { 2218 | "define-property": { 2219 | "version": "0.2.5", 2220 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2221 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2222 | "dev": true, 2223 | "requires": { 2224 | "is-descriptor": "^0.1.0" 2225 | } 2226 | }, 2227 | "kind-of": { 2228 | "version": "3.2.2", 2229 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2230 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2231 | "dev": true, 2232 | "requires": { 2233 | "is-buffer": "^1.1.5" 2234 | } 2235 | } 2236 | } 2237 | }, 2238 | "object-visit": { 2239 | "version": "1.0.1", 2240 | "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", 2241 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 2242 | "dev": true, 2243 | "requires": { 2244 | "isobject": "^3.0.0" 2245 | } 2246 | }, 2247 | "object.pick": { 2248 | "version": "1.3.0", 2249 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 2250 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 2251 | "dev": true, 2252 | "requires": { 2253 | "isobject": "^3.0.1" 2254 | } 2255 | }, 2256 | "once": { 2257 | "version": "1.4.0", 2258 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2259 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2260 | "dev": true, 2261 | "requires": { 2262 | "wrappy": "1" 2263 | } 2264 | }, 2265 | "os-browserify": { 2266 | "version": "0.3.0", 2267 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 2268 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", 2269 | "dev": true 2270 | }, 2271 | "p-limit": { 2272 | "version": "2.3.0", 2273 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2274 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2275 | "dev": true, 2276 | "requires": { 2277 | "p-try": "^2.0.0" 2278 | } 2279 | }, 2280 | "p-locate": { 2281 | "version": "3.0.0", 2282 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 2283 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 2284 | "dev": true, 2285 | "requires": { 2286 | "p-limit": "^2.0.0" 2287 | } 2288 | }, 2289 | "p-try": { 2290 | "version": "2.2.0", 2291 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2292 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2293 | "dev": true 2294 | }, 2295 | "pako": { 2296 | "version": "1.0.11", 2297 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 2298 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 2299 | "dev": true 2300 | }, 2301 | "parallel-transform": { 2302 | "version": "1.2.0", 2303 | "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", 2304 | "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", 2305 | "dev": true, 2306 | "requires": { 2307 | "cyclist": "^1.0.1", 2308 | "inherits": "^2.0.3", 2309 | "readable-stream": "^2.1.5" 2310 | } 2311 | }, 2312 | "parse-asn1": { 2313 | "version": "5.1.5", 2314 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", 2315 | "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", 2316 | "dev": true, 2317 | "requires": { 2318 | "asn1.js": "^4.0.0", 2319 | "browserify-aes": "^1.0.0", 2320 | "create-hash": "^1.1.0", 2321 | "evp_bytestokey": "^1.0.0", 2322 | "pbkdf2": "^3.0.3", 2323 | "safe-buffer": "^5.1.1" 2324 | } 2325 | }, 2326 | "parse-passwd": { 2327 | "version": "1.0.0", 2328 | "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", 2329 | "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", 2330 | "dev": true 2331 | }, 2332 | "pascalcase": { 2333 | "version": "0.1.1", 2334 | "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", 2335 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", 2336 | "dev": true 2337 | }, 2338 | "path-browserify": { 2339 | "version": "0.0.1", 2340 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 2341 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", 2342 | "dev": true 2343 | }, 2344 | "path-dirname": { 2345 | "version": "1.0.2", 2346 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 2347 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", 2348 | "dev": true, 2349 | "optional": true 2350 | }, 2351 | "path-exists": { 2352 | "version": "3.0.0", 2353 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 2354 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 2355 | "dev": true 2356 | }, 2357 | "path-is-absolute": { 2358 | "version": "1.0.1", 2359 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2360 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2361 | "dev": true 2362 | }, 2363 | "path-key": { 2364 | "version": "2.0.1", 2365 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 2366 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 2367 | "dev": true 2368 | }, 2369 | "pbkdf2": { 2370 | "version": "3.1.1", 2371 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", 2372 | "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", 2373 | "dev": true, 2374 | "requires": { 2375 | "create-hash": "^1.1.2", 2376 | "create-hmac": "^1.1.4", 2377 | "ripemd160": "^2.0.1", 2378 | "safe-buffer": "^5.0.1", 2379 | "sha.js": "^2.4.8" 2380 | } 2381 | }, 2382 | "picomatch": { 2383 | "version": "2.2.2", 2384 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 2385 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 2386 | "dev": true, 2387 | "optional": true 2388 | }, 2389 | "pify": { 2390 | "version": "4.0.1", 2391 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 2392 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 2393 | "dev": true 2394 | }, 2395 | "pkg-dir": { 2396 | "version": "3.0.0", 2397 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", 2398 | "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", 2399 | "dev": true, 2400 | "requires": { 2401 | "find-up": "^3.0.0" 2402 | } 2403 | }, 2404 | "posix-character-classes": { 2405 | "version": "0.1.1", 2406 | "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", 2407 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", 2408 | "dev": true 2409 | }, 2410 | "process": { 2411 | "version": "0.11.10", 2412 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 2413 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 2414 | "dev": true 2415 | }, 2416 | "process-nextick-args": { 2417 | "version": "2.0.1", 2418 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2419 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 2420 | "dev": true 2421 | }, 2422 | "promise-inflight": { 2423 | "version": "1.0.1", 2424 | "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 2425 | "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", 2426 | "dev": true 2427 | }, 2428 | "prr": { 2429 | "version": "1.0.1", 2430 | "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", 2431 | "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", 2432 | "dev": true 2433 | }, 2434 | "public-encrypt": { 2435 | "version": "4.0.3", 2436 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 2437 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 2438 | "dev": true, 2439 | "requires": { 2440 | "bn.js": "^4.1.0", 2441 | "browserify-rsa": "^4.0.0", 2442 | "create-hash": "^1.1.0", 2443 | "parse-asn1": "^5.0.0", 2444 | "randombytes": "^2.0.1", 2445 | "safe-buffer": "^5.1.2" 2446 | }, 2447 | "dependencies": { 2448 | "bn.js": { 2449 | "version": "4.11.9", 2450 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", 2451 | "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", 2452 | "dev": true 2453 | } 2454 | } 2455 | }, 2456 | "pump": { 2457 | "version": "3.0.0", 2458 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2459 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2460 | "dev": true, 2461 | "requires": { 2462 | "end-of-stream": "^1.1.0", 2463 | "once": "^1.3.1" 2464 | } 2465 | }, 2466 | "pumpify": { 2467 | "version": "1.5.1", 2468 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 2469 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 2470 | "dev": true, 2471 | "requires": { 2472 | "duplexify": "^3.6.0", 2473 | "inherits": "^2.0.3", 2474 | "pump": "^2.0.0" 2475 | }, 2476 | "dependencies": { 2477 | "pump": { 2478 | "version": "2.0.1", 2479 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 2480 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 2481 | "dev": true, 2482 | "requires": { 2483 | "end-of-stream": "^1.1.0", 2484 | "once": "^1.3.1" 2485 | } 2486 | } 2487 | } 2488 | }, 2489 | "punycode": { 2490 | "version": "2.1.1", 2491 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2492 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2493 | "dev": true 2494 | }, 2495 | "querystring": { 2496 | "version": "0.2.0", 2497 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 2498 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 2499 | "dev": true 2500 | }, 2501 | "querystring-es3": { 2502 | "version": "0.2.1", 2503 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 2504 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", 2505 | "dev": true 2506 | }, 2507 | "randombytes": { 2508 | "version": "2.1.0", 2509 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2510 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2511 | "dev": true, 2512 | "requires": { 2513 | "safe-buffer": "^5.1.0" 2514 | } 2515 | }, 2516 | "randomfill": { 2517 | "version": "1.0.4", 2518 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 2519 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 2520 | "dev": true, 2521 | "requires": { 2522 | "randombytes": "^2.0.5", 2523 | "safe-buffer": "^5.1.0" 2524 | } 2525 | }, 2526 | "readable-stream": { 2527 | "version": "2.3.7", 2528 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 2529 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 2530 | "dev": true, 2531 | "requires": { 2532 | "core-util-is": "~1.0.0", 2533 | "inherits": "~2.0.3", 2534 | "isarray": "~1.0.0", 2535 | "process-nextick-args": "~2.0.0", 2536 | "safe-buffer": "~5.1.1", 2537 | "string_decoder": "~1.1.1", 2538 | "util-deprecate": "~1.0.1" 2539 | } 2540 | }, 2541 | "readdirp": { 2542 | "version": "3.4.0", 2543 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", 2544 | "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", 2545 | "dev": true, 2546 | "optional": true, 2547 | "requires": { 2548 | "picomatch": "^2.2.1" 2549 | } 2550 | }, 2551 | "regex-not": { 2552 | "version": "1.0.2", 2553 | "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", 2554 | "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", 2555 | "dev": true, 2556 | "requires": { 2557 | "extend-shallow": "^3.0.2", 2558 | "safe-regex": "^1.1.0" 2559 | } 2560 | }, 2561 | "remove-trailing-separator": { 2562 | "version": "1.1.0", 2563 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 2564 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 2565 | "dev": true, 2566 | "optional": true 2567 | }, 2568 | "repeat-element": { 2569 | "version": "1.1.3", 2570 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", 2571 | "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", 2572 | "dev": true 2573 | }, 2574 | "repeat-string": { 2575 | "version": "1.6.1", 2576 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2577 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 2578 | "dev": true 2579 | }, 2580 | "require-directory": { 2581 | "version": "2.1.1", 2582 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2583 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 2584 | "dev": true 2585 | }, 2586 | "require-main-filename": { 2587 | "version": "2.0.0", 2588 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 2589 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 2590 | "dev": true 2591 | }, 2592 | "resolve-cwd": { 2593 | "version": "2.0.0", 2594 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", 2595 | "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", 2596 | "dev": true, 2597 | "requires": { 2598 | "resolve-from": "^3.0.0" 2599 | } 2600 | }, 2601 | "resolve-dir": { 2602 | "version": "1.0.1", 2603 | "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", 2604 | "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", 2605 | "dev": true, 2606 | "requires": { 2607 | "expand-tilde": "^2.0.0", 2608 | "global-modules": "^1.0.0" 2609 | }, 2610 | "dependencies": { 2611 | "global-modules": { 2612 | "version": "1.0.0", 2613 | "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", 2614 | "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", 2615 | "dev": true, 2616 | "requires": { 2617 | "global-prefix": "^1.0.1", 2618 | "is-windows": "^1.0.1", 2619 | "resolve-dir": "^1.0.0" 2620 | } 2621 | } 2622 | } 2623 | }, 2624 | "resolve-from": { 2625 | "version": "3.0.0", 2626 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", 2627 | "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", 2628 | "dev": true 2629 | }, 2630 | "resolve-url": { 2631 | "version": "0.2.1", 2632 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 2633 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", 2634 | "dev": true 2635 | }, 2636 | "ret": { 2637 | "version": "0.1.15", 2638 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 2639 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", 2640 | "dev": true 2641 | }, 2642 | "rimraf": { 2643 | "version": "2.7.1", 2644 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 2645 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 2646 | "dev": true, 2647 | "requires": { 2648 | "glob": "^7.1.3" 2649 | } 2650 | }, 2651 | "ripemd160": { 2652 | "version": "2.0.2", 2653 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 2654 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 2655 | "dev": true, 2656 | "requires": { 2657 | "hash-base": "^3.0.0", 2658 | "inherits": "^2.0.1" 2659 | } 2660 | }, 2661 | "run-queue": { 2662 | "version": "1.0.3", 2663 | "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", 2664 | "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", 2665 | "dev": true, 2666 | "requires": { 2667 | "aproba": "^1.1.1" 2668 | } 2669 | }, 2670 | "safe-buffer": { 2671 | "version": "5.1.2", 2672 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2673 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2674 | "dev": true 2675 | }, 2676 | "safe-regex": { 2677 | "version": "1.1.0", 2678 | "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 2679 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 2680 | "dev": true, 2681 | "requires": { 2682 | "ret": "~0.1.10" 2683 | } 2684 | }, 2685 | "schema-utils": { 2686 | "version": "1.0.0", 2687 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", 2688 | "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", 2689 | "dev": true, 2690 | "requires": { 2691 | "ajv": "^6.1.0", 2692 | "ajv-errors": "^1.0.0", 2693 | "ajv-keywords": "^3.1.0" 2694 | } 2695 | }, 2696 | "semver": { 2697 | "version": "5.7.1", 2698 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2699 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2700 | "dev": true 2701 | }, 2702 | "serialize-javascript": { 2703 | "version": "3.1.0", 2704 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", 2705 | "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", 2706 | "dev": true, 2707 | "requires": { 2708 | "randombytes": "^2.1.0" 2709 | } 2710 | }, 2711 | "set-blocking": { 2712 | "version": "2.0.0", 2713 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2714 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 2715 | "dev": true 2716 | }, 2717 | "set-value": { 2718 | "version": "2.0.1", 2719 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", 2720 | "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", 2721 | "dev": true, 2722 | "requires": { 2723 | "extend-shallow": "^2.0.1", 2724 | "is-extendable": "^0.1.1", 2725 | "is-plain-object": "^2.0.3", 2726 | "split-string": "^3.0.1" 2727 | }, 2728 | "dependencies": { 2729 | "extend-shallow": { 2730 | "version": "2.0.1", 2731 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2732 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2733 | "dev": true, 2734 | "requires": { 2735 | "is-extendable": "^0.1.0" 2736 | } 2737 | } 2738 | } 2739 | }, 2740 | "setimmediate": { 2741 | "version": "1.0.5", 2742 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 2743 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", 2744 | "dev": true 2745 | }, 2746 | "sha.js": { 2747 | "version": "2.4.11", 2748 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 2749 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 2750 | "dev": true, 2751 | "requires": { 2752 | "inherits": "^2.0.1", 2753 | "safe-buffer": "^5.0.1" 2754 | } 2755 | }, 2756 | "shebang-command": { 2757 | "version": "1.2.0", 2758 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2759 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2760 | "dev": true, 2761 | "requires": { 2762 | "shebang-regex": "^1.0.0" 2763 | } 2764 | }, 2765 | "shebang-regex": { 2766 | "version": "1.0.0", 2767 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2768 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 2769 | "dev": true 2770 | }, 2771 | "snapdragon": { 2772 | "version": "0.8.2", 2773 | "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", 2774 | "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", 2775 | "dev": true, 2776 | "requires": { 2777 | "base": "^0.11.1", 2778 | "debug": "^2.2.0", 2779 | "define-property": "^0.2.5", 2780 | "extend-shallow": "^2.0.1", 2781 | "map-cache": "^0.2.2", 2782 | "source-map": "^0.5.6", 2783 | "source-map-resolve": "^0.5.0", 2784 | "use": "^3.1.0" 2785 | }, 2786 | "dependencies": { 2787 | "define-property": { 2788 | "version": "0.2.5", 2789 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2790 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2791 | "dev": true, 2792 | "requires": { 2793 | "is-descriptor": "^0.1.0" 2794 | } 2795 | }, 2796 | "extend-shallow": { 2797 | "version": "2.0.1", 2798 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2799 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2800 | "dev": true, 2801 | "requires": { 2802 | "is-extendable": "^0.1.0" 2803 | } 2804 | } 2805 | } 2806 | }, 2807 | "snapdragon-node": { 2808 | "version": "2.1.1", 2809 | "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", 2810 | "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", 2811 | "dev": true, 2812 | "requires": { 2813 | "define-property": "^1.0.0", 2814 | "isobject": "^3.0.0", 2815 | "snapdragon-util": "^3.0.1" 2816 | }, 2817 | "dependencies": { 2818 | "define-property": { 2819 | "version": "1.0.0", 2820 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 2821 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 2822 | "dev": true, 2823 | "requires": { 2824 | "is-descriptor": "^1.0.0" 2825 | } 2826 | }, 2827 | "is-accessor-descriptor": { 2828 | "version": "1.0.0", 2829 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 2830 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 2831 | "dev": true, 2832 | "requires": { 2833 | "kind-of": "^6.0.0" 2834 | } 2835 | }, 2836 | "is-data-descriptor": { 2837 | "version": "1.0.0", 2838 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 2839 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 2840 | "dev": true, 2841 | "requires": { 2842 | "kind-of": "^6.0.0" 2843 | } 2844 | }, 2845 | "is-descriptor": { 2846 | "version": "1.0.2", 2847 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 2848 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 2849 | "dev": true, 2850 | "requires": { 2851 | "is-accessor-descriptor": "^1.0.0", 2852 | "is-data-descriptor": "^1.0.0", 2853 | "kind-of": "^6.0.2" 2854 | } 2855 | } 2856 | } 2857 | }, 2858 | "snapdragon-util": { 2859 | "version": "3.0.1", 2860 | "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", 2861 | "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", 2862 | "dev": true, 2863 | "requires": { 2864 | "kind-of": "^3.2.0" 2865 | }, 2866 | "dependencies": { 2867 | "kind-of": { 2868 | "version": "3.2.2", 2869 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2870 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2871 | "dev": true, 2872 | "requires": { 2873 | "is-buffer": "^1.1.5" 2874 | } 2875 | } 2876 | } 2877 | }, 2878 | "source-list-map": { 2879 | "version": "2.0.1", 2880 | "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", 2881 | "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", 2882 | "dev": true 2883 | }, 2884 | "source-map": { 2885 | "version": "0.5.7", 2886 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2887 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 2888 | "dev": true 2889 | }, 2890 | "source-map-resolve": { 2891 | "version": "0.5.3", 2892 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", 2893 | "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", 2894 | "dev": true, 2895 | "requires": { 2896 | "atob": "^2.1.2", 2897 | "decode-uri-component": "^0.2.0", 2898 | "resolve-url": "^0.2.1", 2899 | "source-map-url": "^0.4.0", 2900 | "urix": "^0.1.0" 2901 | } 2902 | }, 2903 | "source-map-support": { 2904 | "version": "0.5.19", 2905 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 2906 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 2907 | "dev": true, 2908 | "requires": { 2909 | "buffer-from": "^1.0.0", 2910 | "source-map": "^0.6.0" 2911 | }, 2912 | "dependencies": { 2913 | "source-map": { 2914 | "version": "0.6.1", 2915 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2916 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2917 | "dev": true 2918 | } 2919 | } 2920 | }, 2921 | "source-map-url": { 2922 | "version": "0.4.0", 2923 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", 2924 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", 2925 | "dev": true 2926 | }, 2927 | "split-string": { 2928 | "version": "3.1.0", 2929 | "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", 2930 | "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", 2931 | "dev": true, 2932 | "requires": { 2933 | "extend-shallow": "^3.0.0" 2934 | } 2935 | }, 2936 | "ssri": { 2937 | "version": "6.0.1", 2938 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", 2939 | "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", 2940 | "dev": true, 2941 | "requires": { 2942 | "figgy-pudding": "^3.5.1" 2943 | } 2944 | }, 2945 | "static-extend": { 2946 | "version": "0.1.2", 2947 | "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", 2948 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 2949 | "dev": true, 2950 | "requires": { 2951 | "define-property": "^0.2.5", 2952 | "object-copy": "^0.1.0" 2953 | }, 2954 | "dependencies": { 2955 | "define-property": { 2956 | "version": "0.2.5", 2957 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2958 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2959 | "dev": true, 2960 | "requires": { 2961 | "is-descriptor": "^0.1.0" 2962 | } 2963 | } 2964 | } 2965 | }, 2966 | "stream-browserify": { 2967 | "version": "2.0.2", 2968 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", 2969 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", 2970 | "dev": true, 2971 | "requires": { 2972 | "inherits": "~2.0.1", 2973 | "readable-stream": "^2.0.2" 2974 | } 2975 | }, 2976 | "stream-each": { 2977 | "version": "1.2.3", 2978 | "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", 2979 | "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", 2980 | "dev": true, 2981 | "requires": { 2982 | "end-of-stream": "^1.1.0", 2983 | "stream-shift": "^1.0.0" 2984 | } 2985 | }, 2986 | "stream-http": { 2987 | "version": "2.8.3", 2988 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", 2989 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", 2990 | "dev": true, 2991 | "requires": { 2992 | "builtin-status-codes": "^3.0.0", 2993 | "inherits": "^2.0.1", 2994 | "readable-stream": "^2.3.6", 2995 | "to-arraybuffer": "^1.0.0", 2996 | "xtend": "^4.0.0" 2997 | } 2998 | }, 2999 | "stream-shift": { 3000 | "version": "1.0.1", 3001 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 3002 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", 3003 | "dev": true 3004 | }, 3005 | "string-width": { 3006 | "version": "3.1.0", 3007 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 3008 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 3009 | "dev": true, 3010 | "requires": { 3011 | "emoji-regex": "^7.0.1", 3012 | "is-fullwidth-code-point": "^2.0.0", 3013 | "strip-ansi": "^5.1.0" 3014 | } 3015 | }, 3016 | "string_decoder": { 3017 | "version": "1.1.1", 3018 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 3019 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 3020 | "dev": true, 3021 | "requires": { 3022 | "safe-buffer": "~5.1.0" 3023 | } 3024 | }, 3025 | "strip-ansi": { 3026 | "version": "5.2.0", 3027 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 3028 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 3029 | "dev": true, 3030 | "requires": { 3031 | "ansi-regex": "^4.1.0" 3032 | } 3033 | }, 3034 | "supports-color": { 3035 | "version": "6.1.0", 3036 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 3037 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 3038 | "dev": true, 3039 | "requires": { 3040 | "has-flag": "^3.0.0" 3041 | } 3042 | }, 3043 | "tapable": { 3044 | "version": "1.1.3", 3045 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", 3046 | "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", 3047 | "dev": true 3048 | }, 3049 | "terser": { 3050 | "version": "4.8.0", 3051 | "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", 3052 | "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", 3053 | "dev": true, 3054 | "requires": { 3055 | "commander": "^2.20.0", 3056 | "source-map": "~0.6.1", 3057 | "source-map-support": "~0.5.12" 3058 | }, 3059 | "dependencies": { 3060 | "source-map": { 3061 | "version": "0.6.1", 3062 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3063 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3064 | "dev": true 3065 | } 3066 | } 3067 | }, 3068 | "terser-webpack-plugin": { 3069 | "version": "1.4.4", 3070 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", 3071 | "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", 3072 | "dev": true, 3073 | "requires": { 3074 | "cacache": "^12.0.2", 3075 | "find-cache-dir": "^2.1.0", 3076 | "is-wsl": "^1.1.0", 3077 | "schema-utils": "^1.0.0", 3078 | "serialize-javascript": "^3.1.0", 3079 | "source-map": "^0.6.1", 3080 | "terser": "^4.1.2", 3081 | "webpack-sources": "^1.4.0", 3082 | "worker-farm": "^1.7.0" 3083 | }, 3084 | "dependencies": { 3085 | "source-map": { 3086 | "version": "0.6.1", 3087 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3088 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3089 | "dev": true 3090 | } 3091 | } 3092 | }, 3093 | "through2": { 3094 | "version": "2.0.5", 3095 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 3096 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 3097 | "dev": true, 3098 | "requires": { 3099 | "readable-stream": "~2.3.6", 3100 | "xtend": "~4.0.1" 3101 | } 3102 | }, 3103 | "timers-browserify": { 3104 | "version": "2.0.11", 3105 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", 3106 | "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", 3107 | "dev": true, 3108 | "requires": { 3109 | "setimmediate": "^1.0.4" 3110 | } 3111 | }, 3112 | "to-arraybuffer": { 3113 | "version": "1.0.1", 3114 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 3115 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", 3116 | "dev": true 3117 | }, 3118 | "to-object-path": { 3119 | "version": "0.3.0", 3120 | "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", 3121 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 3122 | "dev": true, 3123 | "requires": { 3124 | "kind-of": "^3.0.2" 3125 | }, 3126 | "dependencies": { 3127 | "kind-of": { 3128 | "version": "3.2.2", 3129 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 3130 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3131 | "dev": true, 3132 | "requires": { 3133 | "is-buffer": "^1.1.5" 3134 | } 3135 | } 3136 | } 3137 | }, 3138 | "to-regex": { 3139 | "version": "3.0.2", 3140 | "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", 3141 | "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", 3142 | "dev": true, 3143 | "requires": { 3144 | "define-property": "^2.0.2", 3145 | "extend-shallow": "^3.0.2", 3146 | "regex-not": "^1.0.2", 3147 | "safe-regex": "^1.1.0" 3148 | } 3149 | }, 3150 | "to-regex-range": { 3151 | "version": "2.1.1", 3152 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", 3153 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 3154 | "dev": true, 3155 | "requires": { 3156 | "is-number": "^3.0.0", 3157 | "repeat-string": "^1.6.1" 3158 | } 3159 | }, 3160 | "tslib": { 3161 | "version": "1.13.0", 3162 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 3163 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", 3164 | "dev": true 3165 | }, 3166 | "tty-browserify": { 3167 | "version": "0.0.0", 3168 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", 3169 | "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", 3170 | "dev": true 3171 | }, 3172 | "typedarray": { 3173 | "version": "0.0.6", 3174 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 3175 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 3176 | "dev": true 3177 | }, 3178 | "union-value": { 3179 | "version": "1.0.1", 3180 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", 3181 | "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", 3182 | "dev": true, 3183 | "requires": { 3184 | "arr-union": "^3.1.0", 3185 | "get-value": "^2.0.6", 3186 | "is-extendable": "^0.1.1", 3187 | "set-value": "^2.0.1" 3188 | } 3189 | }, 3190 | "unique-filename": { 3191 | "version": "1.1.1", 3192 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", 3193 | "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", 3194 | "dev": true, 3195 | "requires": { 3196 | "unique-slug": "^2.0.0" 3197 | } 3198 | }, 3199 | "unique-slug": { 3200 | "version": "2.0.2", 3201 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", 3202 | "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", 3203 | "dev": true, 3204 | "requires": { 3205 | "imurmurhash": "^0.1.4" 3206 | } 3207 | }, 3208 | "unset-value": { 3209 | "version": "1.0.0", 3210 | "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", 3211 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 3212 | "dev": true, 3213 | "requires": { 3214 | "has-value": "^0.3.1", 3215 | "isobject": "^3.0.0" 3216 | }, 3217 | "dependencies": { 3218 | "has-value": { 3219 | "version": "0.3.1", 3220 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", 3221 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 3222 | "dev": true, 3223 | "requires": { 3224 | "get-value": "^2.0.3", 3225 | "has-values": "^0.1.4", 3226 | "isobject": "^2.0.0" 3227 | }, 3228 | "dependencies": { 3229 | "isobject": { 3230 | "version": "2.1.0", 3231 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 3232 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 3233 | "dev": true, 3234 | "requires": { 3235 | "isarray": "1.0.0" 3236 | } 3237 | } 3238 | } 3239 | }, 3240 | "has-values": { 3241 | "version": "0.1.4", 3242 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", 3243 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", 3244 | "dev": true 3245 | } 3246 | } 3247 | }, 3248 | "upath": { 3249 | "version": "1.2.0", 3250 | "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", 3251 | "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", 3252 | "dev": true, 3253 | "optional": true 3254 | }, 3255 | "uri-js": { 3256 | "version": "4.2.2", 3257 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 3258 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 3259 | "dev": true, 3260 | "requires": { 3261 | "punycode": "^2.1.0" 3262 | } 3263 | }, 3264 | "urix": { 3265 | "version": "0.1.0", 3266 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 3267 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", 3268 | "dev": true 3269 | }, 3270 | "url": { 3271 | "version": "0.11.0", 3272 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 3273 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 3274 | "dev": true, 3275 | "requires": { 3276 | "punycode": "1.3.2", 3277 | "querystring": "0.2.0" 3278 | }, 3279 | "dependencies": { 3280 | "punycode": { 3281 | "version": "1.3.2", 3282 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 3283 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 3284 | "dev": true 3285 | } 3286 | } 3287 | }, 3288 | "use": { 3289 | "version": "3.1.1", 3290 | "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", 3291 | "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", 3292 | "dev": true 3293 | }, 3294 | "util": { 3295 | "version": "0.11.1", 3296 | "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", 3297 | "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", 3298 | "dev": true, 3299 | "requires": { 3300 | "inherits": "2.0.3" 3301 | }, 3302 | "dependencies": { 3303 | "inherits": { 3304 | "version": "2.0.3", 3305 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 3306 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 3307 | "dev": true 3308 | } 3309 | } 3310 | }, 3311 | "util-deprecate": { 3312 | "version": "1.0.2", 3313 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3314 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 3315 | "dev": true 3316 | }, 3317 | "v8-compile-cache": { 3318 | "version": "2.1.1", 3319 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", 3320 | "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", 3321 | "dev": true 3322 | }, 3323 | "vm-browserify": { 3324 | "version": "1.1.2", 3325 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", 3326 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", 3327 | "dev": true 3328 | }, 3329 | "watchpack": { 3330 | "version": "1.7.2", 3331 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", 3332 | "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", 3333 | "dev": true, 3334 | "requires": { 3335 | "chokidar": "^3.4.0", 3336 | "graceful-fs": "^4.1.2", 3337 | "neo-async": "^2.5.0", 3338 | "watchpack-chokidar2": "^2.0.0" 3339 | } 3340 | }, 3341 | "watchpack-chokidar2": { 3342 | "version": "2.0.0", 3343 | "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", 3344 | "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", 3345 | "dev": true, 3346 | "optional": true, 3347 | "requires": { 3348 | "chokidar": "^2.1.8" 3349 | }, 3350 | "dependencies": { 3351 | "anymatch": { 3352 | "version": "2.0.0", 3353 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", 3354 | "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", 3355 | "dev": true, 3356 | "optional": true, 3357 | "requires": { 3358 | "micromatch": "^3.1.4", 3359 | "normalize-path": "^2.1.1" 3360 | }, 3361 | "dependencies": { 3362 | "normalize-path": { 3363 | "version": "2.1.1", 3364 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 3365 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 3366 | "dev": true, 3367 | "optional": true, 3368 | "requires": { 3369 | "remove-trailing-separator": "^1.0.1" 3370 | } 3371 | } 3372 | } 3373 | }, 3374 | "binary-extensions": { 3375 | "version": "1.13.1", 3376 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", 3377 | "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", 3378 | "dev": true, 3379 | "optional": true 3380 | }, 3381 | "chokidar": { 3382 | "version": "2.1.8", 3383 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", 3384 | "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", 3385 | "dev": true, 3386 | "optional": true, 3387 | "requires": { 3388 | "anymatch": "^2.0.0", 3389 | "async-each": "^1.0.1", 3390 | "braces": "^2.3.2", 3391 | "fsevents": "^1.2.7", 3392 | "glob-parent": "^3.1.0", 3393 | "inherits": "^2.0.3", 3394 | "is-binary-path": "^1.0.0", 3395 | "is-glob": "^4.0.0", 3396 | "normalize-path": "^3.0.0", 3397 | "path-is-absolute": "^1.0.0", 3398 | "readdirp": "^2.2.1", 3399 | "upath": "^1.1.1" 3400 | } 3401 | }, 3402 | "fsevents": { 3403 | "version": "1.2.13", 3404 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", 3405 | "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", 3406 | "dev": true, 3407 | "optional": true 3408 | }, 3409 | "glob-parent": { 3410 | "version": "3.1.0", 3411 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 3412 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 3413 | "dev": true, 3414 | "optional": true, 3415 | "requires": { 3416 | "is-glob": "^3.1.0", 3417 | "path-dirname": "^1.0.0" 3418 | }, 3419 | "dependencies": { 3420 | "is-glob": { 3421 | "version": "3.1.0", 3422 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 3423 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 3424 | "dev": true, 3425 | "optional": true, 3426 | "requires": { 3427 | "is-extglob": "^2.1.0" 3428 | } 3429 | } 3430 | } 3431 | }, 3432 | "is-binary-path": { 3433 | "version": "1.0.1", 3434 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 3435 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 3436 | "dev": true, 3437 | "optional": true, 3438 | "requires": { 3439 | "binary-extensions": "^1.0.0" 3440 | } 3441 | }, 3442 | "readdirp": { 3443 | "version": "2.2.1", 3444 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", 3445 | "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", 3446 | "dev": true, 3447 | "optional": true, 3448 | "requires": { 3449 | "graceful-fs": "^4.1.11", 3450 | "micromatch": "^3.1.10", 3451 | "readable-stream": "^2.0.2" 3452 | } 3453 | } 3454 | } 3455 | }, 3456 | "webpack": { 3457 | "version": "4.43.0", 3458 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", 3459 | "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", 3460 | "dev": true, 3461 | "requires": { 3462 | "@webassemblyjs/ast": "1.9.0", 3463 | "@webassemblyjs/helper-module-context": "1.9.0", 3464 | "@webassemblyjs/wasm-edit": "1.9.0", 3465 | "@webassemblyjs/wasm-parser": "1.9.0", 3466 | "acorn": "^6.4.1", 3467 | "ajv": "^6.10.2", 3468 | "ajv-keywords": "^3.4.1", 3469 | "chrome-trace-event": "^1.0.2", 3470 | "enhanced-resolve": "^4.1.0", 3471 | "eslint-scope": "^4.0.3", 3472 | "json-parse-better-errors": "^1.0.2", 3473 | "loader-runner": "^2.4.0", 3474 | "loader-utils": "^1.2.3", 3475 | "memory-fs": "^0.4.1", 3476 | "micromatch": "^3.1.10", 3477 | "mkdirp": "^0.5.3", 3478 | "neo-async": "^2.6.1", 3479 | "node-libs-browser": "^2.2.1", 3480 | "schema-utils": "^1.0.0", 3481 | "tapable": "^1.1.3", 3482 | "terser-webpack-plugin": "^1.4.3", 3483 | "watchpack": "^1.6.1", 3484 | "webpack-sources": "^1.4.1" 3485 | } 3486 | }, 3487 | "webpack-cli": { 3488 | "version": "3.3.12", 3489 | "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", 3490 | "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", 3491 | "dev": true, 3492 | "requires": { 3493 | "chalk": "^2.4.2", 3494 | "cross-spawn": "^6.0.5", 3495 | "enhanced-resolve": "^4.1.1", 3496 | "findup-sync": "^3.0.0", 3497 | "global-modules": "^2.0.0", 3498 | "import-local": "^2.0.0", 3499 | "interpret": "^1.4.0", 3500 | "loader-utils": "^1.4.0", 3501 | "supports-color": "^6.1.0", 3502 | "v8-compile-cache": "^2.1.1", 3503 | "yargs": "^13.3.2" 3504 | } 3505 | }, 3506 | "webpack-sources": { 3507 | "version": "1.4.3", 3508 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", 3509 | "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", 3510 | "dev": true, 3511 | "requires": { 3512 | "source-list-map": "^2.0.0", 3513 | "source-map": "~0.6.1" 3514 | }, 3515 | "dependencies": { 3516 | "source-map": { 3517 | "version": "0.6.1", 3518 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3519 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3520 | "dev": true 3521 | } 3522 | } 3523 | }, 3524 | "which": { 3525 | "version": "1.3.1", 3526 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 3527 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 3528 | "dev": true, 3529 | "requires": { 3530 | "isexe": "^2.0.0" 3531 | } 3532 | }, 3533 | "which-module": { 3534 | "version": "2.0.0", 3535 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 3536 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 3537 | "dev": true 3538 | }, 3539 | "worker-farm": { 3540 | "version": "1.7.0", 3541 | "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", 3542 | "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", 3543 | "dev": true, 3544 | "requires": { 3545 | "errno": "~0.1.7" 3546 | } 3547 | }, 3548 | "wrap-ansi": { 3549 | "version": "5.1.0", 3550 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 3551 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 3552 | "dev": true, 3553 | "requires": { 3554 | "ansi-styles": "^3.2.0", 3555 | "string-width": "^3.0.0", 3556 | "strip-ansi": "^5.0.0" 3557 | } 3558 | }, 3559 | "wrappy": { 3560 | "version": "1.0.2", 3561 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3562 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3563 | "dev": true 3564 | }, 3565 | "xtend": { 3566 | "version": "4.0.2", 3567 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3568 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 3569 | "dev": true 3570 | }, 3571 | "y18n": { 3572 | "version": "4.0.0", 3573 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 3574 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 3575 | "dev": true 3576 | }, 3577 | "yallist": { 3578 | "version": "3.1.1", 3579 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3580 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3581 | "dev": true 3582 | }, 3583 | "yargs": { 3584 | "version": "13.3.2", 3585 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", 3586 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", 3587 | "dev": true, 3588 | "requires": { 3589 | "cliui": "^5.0.0", 3590 | "find-up": "^3.0.0", 3591 | "get-caller-file": "^2.0.1", 3592 | "require-directory": "^2.1.1", 3593 | "require-main-filename": "^2.0.0", 3594 | "set-blocking": "^2.0.0", 3595 | "string-width": "^3.0.0", 3596 | "which-module": "^2.0.0", 3597 | "y18n": "^4.0.0", 3598 | "yargs-parser": "^13.1.2" 3599 | } 3600 | }, 3601 | "yargs-parser": { 3602 | "version": "13.1.2", 3603 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 3604 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 3605 | "dev": true, 3606 | "requires": { 3607 | "camelcase": "^5.0.0", 3608 | "decamelize": "^1.2.0" 3609 | } 3610 | } 3611 | } 3612 | } 3613 | -------------------------------------------------------------------------------- /package/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_from": "reactmonitorfiber", 3 | "_id": "reactmonitorfiber@1.0.11", 4 | "_inBundle": false, 5 | "_integrity": "sha512-17ru2xLe/osiMB5Dfk2kBCX/1XMPjJ/YBb8B7eBzKlGhe7pevJ82CQgJwHgl/HsKWFJcbuLtiEibQdKTY4pGTQ==", 6 | "_location": "/reactmonitorfiber", 7 | "_phantomChildren": {}, 8 | "_requested": { 9 | "type": "tag", 10 | "registry": true, 11 | "raw": "reactmonitorfiber", 12 | "name": "reactmonitorfiber", 13 | "escapedName": "reactmonitorfiber", 14 | "rawSpec": "", 15 | "saveSpec": null, 16 | "fetchSpec": "latest" 17 | }, 18 | "_requiredBy": [ 19 | "#DEV:/", 20 | "#USER" 21 | ], 22 | "_resolved": "https://registry.npmjs.org/reactmonitorfiber/-/reactmonitorfiber-1.0.11.tgz", 23 | "_shasum": "ef17b17b90312e8ae1a006307905317118d88f9f", 24 | "_spec": "reactmonitorfiber", 25 | "_where": "/Users/usr1/edp/codesmith/react_p2", 26 | "author": "", 27 | "bugs": { 28 | "url": "https://github.com/oslabs-beta/ReactMonitor/issues" 29 | }, 30 | "bundleDependencies": false, 31 | "deprecated": false, 32 | "description": "Visualize React's component tree performance and optimization suggestions", 33 | "homepage": "https://github.com/oslabs-beta/ReactMonitor#readme", 34 | "license": "ISC", 35 | "main": "createTree.js", 36 | "name": "reactmonitorfiber", 37 | "repository": { 38 | "type": "git", 39 | "url": "git+https://github.com/oslabs-beta/ReactMonitor.git" 40 | }, 41 | "version": "1.0.11" 42 | } 43 | -------------------------------------------------------------------------------- /package/sendContentScript.js: -------------------------------------------------------------------------------- 1 | module.exports = function(treeCreator, prevTree, currentTree) 2 | { 3 | const treeGraph = treeCreator(currentTree); 4 | window.postMessage({ action: 'npmToContent', payload: treeGraph }); 5 | /* 6 | // do this on first load 7 | if (currentTree === undefined){ 8 | const treeGraph = treeCreator(prevTree); 9 | window.postMessage({ action: 'npmToContent', payload: treeGraph }); 10 | // if any changes between current DOM and Virtual DOM 11 | }else if (prevTree !== currentTree) { 12 | const treeGraph = treeCreator(currentTree); 13 | window.postMessage({ action: 'npmToContent', payload: treeGraph }); 14 | } 15 | */ 16 | } 17 | -------------------------------------------------------------------------------- /package/treeGraphFactory.js: -------------------------------------------------------------------------------- 1 | const { Node } = require('./newNode'); 2 | 3 | let i = 1; 4 | // helper function - that accepts the node - Host Root 5 | module.exports = function (fiber){ 6 | 7 | const helper = (fiber, treeGraph) => { 8 | // 2 different types of leaves observed in different 9 | // react builds: 10 | // 1 - a leaf react elements is also a leaf in fibertree 11 | // 2 - given a leaf react element, the fiber tree has 12 | // has 1 additional child bellow it 13 | // and it's type is null. 14 | // given that obervation, null_node() detects both cases: 15 | function null_node(node) 16 | { 17 | return ( (node == null) || ( 18 | (node.child == null) && 19 | (node.type == null) 20 | ) ); 21 | } 22 | // check if fiber.child !== null - traverse 23 | /* if child: create node and enter into child */ 24 | if (fiber.child) { 25 | // push the new Node to the treeGraph.children array 26 | // the parent will the tree graph we are currently working with 27 | // (do the type check for elements that are functions or html elements) 28 | let newGraphNode = treeGraph; 29 | // typeof child.type == object <==> child is null 30 | // condition: fiber child && fiber.ch.ch exists && type != null 31 | // <==> fiber.ch.ch is a leaf (?) 32 | if ( !null_node(fiber.child) ) 33 | { 34 | newGraphNode = new Node( 35 | fiber.child.key 36 | || (fiber.child.type ? fiber.child.type.name : fiber.child.type) 37 | || fiber.child.type, 38 | treeGraph, [], fiber.child 39 | ); 40 | treeGraph.children.push(newGraphNode); 41 | // recursively invoke the helper on child 42 | helper(fiber.child, newGraphNode); 43 | } 44 | } 45 | // check if fiber.sibling !== null - traverse 46 | if (fiber.sibling) 47 | { 48 | let newGraphNode = treeGraph; 49 | if ( !null_node(fiber.sibling) ) { 50 | // create new GraphNode based on it with parent being a treeGraph.parent 51 | newGraphNode = new Node( 52 | fiber.sibling.key 53 | || (fiber.sibling.type ? fiber.sibling.type.name : fiber.sibling.type) 54 | || fiber.sibling.type, 55 | treeGraph.parent, [], fiber.sibling 56 | ); 57 | // added - the if condition 58 | // push the node on to the treeGraph.parent.children array 59 | /*if (treeGraph.parent)*/ treeGraph.parent.children.push(newGraphNode); 60 | helper(fiber.sibling, newGraphNode); 61 | } 62 | } 63 | // name of the element can be found in child.type.name 64 | }; 65 | // create a treeGraph 66 | const treeGraph = new Node(fiber.type.name, null, [], fiber); // Represent the top most Element (like App); 67 | // invoke the helper function 68 | helper(fiber, treeGraph); // fiber is an App Fiber 69 | console.log("treeGraphFactory =", treeGraph); 70 | return treeGraph; 71 | } 72 | -------------------------------------------------------------------------------- /package/treeGraphFactory.test.js: -------------------------------------------------------------------------------- 1 | const fiber = require('../mockData/fiber'); 2 | const treeGraphFactory = require('./treeGraphFactory'); 3 | 4 | 5 | describe('test treeGraphFactory', () => { 6 | 7 | 8 | it('test treeGraph was created properly', () => { 9 | 10 | const treeGraph = treeGraphFactory(fiber); 11 | expect(treeGraph.name).toBe('h1'); 12 | expect(treeGraph.value).toBe(9); 13 | expect(treeGraph.tag).toBe(5); 14 | expect(treeGraph.stats.effectTag).toBe(1); 15 | expect(treeGraph.stats.renderStart).toBe('400.00'); 16 | expect(treeGraph.stats.renderTotal).toBe('9.00'); 17 | expect(treeGraph.children[0].name).toBe('div'); 18 | expect(treeGraph.children[0].value).toBe(8); 19 | expect(treeGraph.children[0].tag).toBe(1); 20 | expect(treeGraph.children[0].stats.effectTag).toBe(2) 21 | }); 22 | 23 | 24 | }); 25 | -------------------------------------------------------------------------------- /src/app/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { render } from 'react-dom'; 3 | import MainContainer from './components/mainContainer'; 4 | import './style.scss'; 5 | 6 | let port; 7 | 8 | export default class App extends Component { 9 | constructor(props) { 10 | super(props); 11 | this.state = { 12 | name: '', 13 | children: [], 14 | stats: '', 15 | value: 0, 16 | oldState:[] 17 | }; 18 | } 19 | 20 | componentDidMount() { 21 | if (!port) port = chrome.runtime.connect(); 22 | 23 | port.onMessage.addListener((message) => { 24 | let array=this.state.oldState 25 | array.push(message.payload.payload) 26 | this.setState({ 27 | value: message.payload.payload.value, 28 | name: message.payload.payload.name, 29 | children: message.payload.payload.children, 30 | stats: message.payload.payload.stats, 31 | oldstate:array 32 | }); 33 | }); 34 | } 35 | 36 | render() { 37 | 38 | return ( 39 |
40 | 47 |
48 | ); 49 | } 50 | } 51 | 52 | render(, document.getElementById('app')); 53 | -------------------------------------------------------------------------------- /src/app/components/d3tree.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import * as d3 from 'd3'; 3 | import TimeTravel from './timeTravel'; 4 | import {deleteHtmlElement} from './helperFunctions' 5 | import {componenetChangedState} from './helperFunctions' 6 | 7 | let root; 8 | 9 | 10 | export default class D3Tree extends Component { 11 | constructor(props) { 12 | super(props); 13 | this.state={ 14 | htmlElement:false, 15 | timeTravel:[], 16 | index:0, 17 | logofTime:[], 18 | playing:false 19 | } 20 | this.treeRef = React.createRef(); 21 | this.maked3Tree = this.maked3Tree.bind(this); 22 | this.removed3Tree = this.removed3Tree.bind(this); 23 | this.removeHtml=this.removeHtml.bind(this) 24 | this.handelPlay=this.handelPlay.bind(this) 25 | this.width = 500 26 | } 27 | 28 | componentDidMount() { 29 | const { name, children, stats } = this.props; 30 | const hierarchy = { name, children, stats }; 31 | root = JSON.parse(JSON.stringify(hierarchy)); 32 | this.maked3Tree(root); 33 | } 34 | 35 | componentDidUpdate() { 36 | console.log('last one',this.props.oldState[this.state.index]) 37 | if(this.state.playing){ 38 | var { name, children, stats } = this.props.oldState[this.state.index]; 39 | 40 | } 41 | if(!this.state.playing) var{ name, children, stats } = this.props.oldState[this.props.oldState.length-1]; 42 | 43 | const hierarchy = { name, children, stats }; 44 | root = JSON.parse(JSON.stringify(hierarchy)); 45 | this.maked3Tree(root); 46 | if(this.state.timeTravel.length !==this.props.oldState.length){ 47 | let tempTimeTravel =[...this.props.oldState] 48 | let tempLogofTime=[...this.state.logofTime] 49 | tempLogofTime.push([this.props.oldState[this.props.oldState.length-1].name,this.props.oldState[this.props.oldState.length-1].value]) 50 | this.setState({timeTravel:tempTimeTravel,logofTime:tempLogofTime}) 51 | } 52 | 53 | } 54 | 55 | componentWillUnmount() { 56 | this.removed3Tree(); 57 | } 58 | removeHtml(){ 59 | const state=this.state 60 | if(this.state.htmlElement) this.setState({...state,htmlElement:false}) 61 | if(!this.state.htmlElement) this.setState({...state,htmlElement:true}) 62 | } 63 | handelPlay(value){ 64 | let temp=this.state.index 65 | if(!value){ 66 | temp+=1 67 | this.setState({playing:true}) 68 | this.setState({index:temp}) 69 | }else if(value==='stop'){ 70 | return 71 | }else{ 72 | this.setState({index:0}) 73 | } 74 | } 75 | 76 | removed3Tree() { 77 | const { current } = this.treeRef; 78 | document.querySelectorAll('.tooltip').forEach(el => el.remove()); 79 | while (current.hasChildNodes()) { 80 | current.removeChild(current.lastChild); 81 | } 82 | } 83 | 84 | tree(data) { 85 | if(this.state.htmlElement){ 86 | data = deleteHtmlElement(data) 87 | const root = d3.hierarchy(data); 88 | root.dx = 10; 89 | root.dy = this.width / (root.height + 1); 90 | return d3.tree().nodeSize([root.dx, root.dy])(root); 91 | }else{ 92 | const root = d3.hierarchy(data); 93 | root.dx = 10; 94 | root.dy = this.width / (root.height + 1); 95 | return d3.tree().nodeSize([root.dx, root.dy])(root); 96 | } 97 | }; 98 | 99 | maked3Tree(data) { 100 | this.removed3Tree(); 101 | const root = this.tree(data); 102 | 103 | const margin = { 104 | top: 20, 105 | right: 20, 106 | bottom: 20, 107 | left: 20, 108 | } 109 | 110 | let x0 = 0; 111 | let x1 = -x0; 112 | root.each((d) => { 113 | if (d.x > x1) x1 = d.x; 114 | if (d.x < x0) x0 = d.x; 115 | }); 116 | 117 | const svg = d3 118 | .select(this.treeRef.current) 119 | .append('svg') 120 | .attr('viewBox', [ 121 | -margin.left, 122 | -margin.top, 123 | this.width + margin.left + margin.right, 124 | x1 - x0 + root.dx * 2 + margin.top + margin.bottom, 125 | ]); 126 | 127 | const g = svg 128 | .append('g') 129 | .attr('font-family', 'sans-serif') 130 | .attr('font-size', 10) 131 | .attr('transform', `translate(${root.dy / 3},${root.dx - x0})`); 132 | 133 | const link = g 134 | .append('g') 135 | .attr('fill', 'none') 136 | .attr('stroke', '#D4CDF4') 137 | .attr('stroke-opacity', 0.4) 138 | .attr('stroke-width', 1.5) 139 | .selectAll('path') 140 | .data(root.links()) 141 | .join('path') 142 | .attr( 143 | 'd', 144 | d3 145 | .linkHorizontal() 146 | .x((d) => d.y) 147 | .y((d) => d.x) 148 | ); 149 | 150 | const node = g 151 | .append('g') 152 | .attr('stroke-linejoin', 'round') 153 | .attr('stroke-width', 3) 154 | .selectAll('g') 155 | .data(root.descendants()) 156 | .join('g') 157 | .attr('transform', (d) => `translate(${d.y},${d.x})`); 158 | 159 | node 160 | .append('circle') 161 | .attr('stroke', (d) => (d.children ? '#555' : '#999')) 162 | .attr('stroke-width', (d) => 1) 163 | .attr('fill', function (d) { 164 | if (d.data.nodeSvgShape) { 165 | return d.data.nodeSvgShape.shapeProps.fill 166 | } 167 | return 'gray' 168 | }) 169 | .attr('r', 5) 170 | 171 | // tooltip MouseOver 172 | .on('mouseover', function (d) { 173 | 174 | d3.select(this) 175 | .transition(100) 176 | .duration(50) 177 | .attr('r', 8); 178 | 179 | tooltipDiv.transition() 180 | .duration(50) 181 | .style('opacity', 0.9); 182 | 183 | tooltipDiv.html(`

${d.data.name}

184 |
185 | State: ${d.data.stats.state}
186 |
Props: ${d.data.stats.props}
187 |
Tag: ${d.data.tag}
188 |
EffectTag: ${d.data.stats.effectTag}
189 |
Render Time: ${d.data.stats.renderTotal}ms

190 | `, this) 191 | .style('left', (d3.event.pageX) + 'px') 192 | .style('top', (d3.event.pageY) + 'px'); 193 | }) 194 | // eslint-disable-next-line no-unused-vars 195 | .on('mouseout', function (d) { 196 | d3.select(this) 197 | .transition() 198 | .duration(300) 199 | .attr('r', 5); 200 | 201 | tooltipDiv.transition() 202 | .duration(400) 203 | .style('opacity', 0); 204 | }) 205 | 206 | node 207 | .append('text') 208 | .attr('dy', '0.31em') 209 | .attr('x', (d) => (d.children ? -6 : 6)) 210 | .attr('text-anchor', (d) => (d.children ? 'end' : 'start')) 211 | .text((d) => d.data.name) 212 | .clone(true) 213 | .lower() 214 | .attr('stroke', 'white'); 215 | 216 | // define tooltip 217 | const tooltipDiv = d3.select('body').append('div') 218 | .attr('class', 'tooltip') 219 | .style('opacity', 0); 220 | } 221 | 222 | render() { 223 | return ( 224 |
225 |
226 | 227 |

Render Times Tree Graph

228 |
229 |
230 | 234 |
235 | ) 236 | } 237 | } -------------------------------------------------------------------------------- /src/app/components/flameChart.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import * as d3 from 'd3'; 3 | import { flamegraph, defaultFlamegraphTooltip } from 'd3-flame-graph'; 4 | 5 | 6 | export default class FlameChart extends Component { 7 | constructor(props) { 8 | super(props); 9 | this.flamegraphRef = React.createRef(); 10 | this.createFlameGraph = this.createFlameGraph.bind(this); 11 | } 12 | 13 | componentDidMount() { 14 | const { name, children, value } = this.props; 15 | document.querySelectorAll('.d3-flame-graph-tip').forEach(el => el.remove()); 16 | this.createFlameGraph({ name, children, value }) 17 | } 18 | 19 | componentDidUpdate() { 20 | const { name, children, value } = this.props; 21 | document.querySelectorAll('.d3-flame-graph-tip').forEach(el => el.remove()); 22 | this.createFlameGraph({ name, children, value }) 23 | } 24 | 25 | createFlameGraph(data) { 26 | let pageWidth = document.getElementById('flame-container').clientWidth; 27 | const margin = { right: 30, left: 30 } 28 | 29 | let chart = flamegraph() 30 | .width(pageWidth - margin.right - margin.left) 31 | .cellHeight(25) 32 | .transitionDuration(400) 33 | .minFrameSize(5) 34 | .transitionEase(d3.easeCubic) 35 | .sort(true) 36 | .differential(false) 37 | .elided(false) 38 | .selfValue(false) 39 | 40 | let tip = defaultFlamegraphTooltip() 41 | .html(function (d) { return "Name: " + d.data.name + "
Value: " + d.data.value + "ms"; }); 42 | chart.tooltip(tip); 43 | 44 | d3.select(this.flamegraphRef.current) 45 | .datum(data) 46 | .call(chart) 47 | 48 | 49 | if (document.querySelectorAll('.partition').length > 1) { 50 | document.querySelectorAll('.partition')[1].remove(); 51 | } 52 | } 53 | 54 | render() { 55 | return ( 56 |
57 |

Render Times Flame Graph

58 |
59 |
60 | ) 61 | } 62 | } -------------------------------------------------------------------------------- /src/app/components/helperFunctions.js: -------------------------------------------------------------------------------- 1 | const deleteHtmlElement=(obj)=>{ 2 | const helper=(object)=>{ 3 | if(!object.children) return 4 | for(let i=0;i acc.concat(val), []) 15 | i=i-1 16 | }else { 17 | // delete element 18 | delete object.children[i] 19 | i=0 20 | } 21 | } 22 | } 23 | return object 24 | } 25 | if(obj[0]){ 26 | return helper (obj[0]) 27 | }else{ 28 | return helper(obj) 29 | } 30 | } 31 | 32 | const componenetChangedState = (data) => { 33 | 34 | if(!data) return 35 | 36 | const noChanges=[] 37 | const helper = (obj) =>{ 38 | // console.log('obj',obj) 39 | if(!obj.children.length) { 40 | if(obj.nodeSvgShape.shapeProps.fill==='lightgreen'){ 41 | obj.state=obj.stats.state 42 | obj.props=obj.stats.props 43 | delete obj.nodeSvgShape 44 | delete obj.tag 45 | delete obj.stats 46 | }else{ 47 | noChanges.push({ 48 | name:obj.name, 49 | state:obj.stats.state, 50 | props:obj.stats.props, 51 | time:obj.value 52 | }) 53 | 54 | } 55 | }else{ 56 | if(obj.name==='ButtonPanel') console.log('target',obj) 57 | let run =true 58 | if(run){ 59 | if(obj.nodeSvgShape.shapeProps.fill==='lightgreen'){ 60 | obj.state=obj.stats.state 61 | obj.props=obj.stats.props 62 | obj.time=obj.stats.value 63 | delete obj.nodeSvgShape 64 | delete obj.tag 65 | delete obj.stats 66 | run =false 67 | }else{ 68 | noChanges.push({ 69 | name:obj.name, 70 | state:obj.stats.state, 71 | props:obj.stats.props, 72 | time:obj.stats.value, 73 | dark:true 74 | }) 75 | obj.state=obj.stats.state 76 | obj.props=obj.stats.props 77 | obj.time=obj.stats.value 78 | obj.dark=true 79 | delete obj.nodeSvgShape 80 | delete obj.tag 81 | delete obj.stats 82 | run = false 83 | } 84 | } 85 | for (let i=0;i 14 |
15 |
16 |
  • Tree
  • 17 |
  • Chart
  • 18 |
    19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
    28 | 29 | ); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/app/components/playButton.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | 3 | export default class playButton extends Component { 4 | constructor(props) { 5 | super(props) 6 | 7 | this.state = { 8 | percentage: 0, 9 | play:false 10 | } 11 | 12 | this.nextStep = this.nextStep.bind(this) 13 | } 14 | 15 | nextStep() { 16 | if(this.state.percentage === 100) return 17 | 18 | let timer = setInterval(() => { 19 | if(this.state.percentage===0){ 20 | this.setState(prevState => ({ percentage: prevState.percentage + (100/this.props.length) })) 21 | } 22 | if(this.state.percentage >= 100) { 23 | this.props.handelPlay('stop') 24 | clearInterval(timer) 25 | }else{ 26 | this.props.handelPlay() 27 | this.setState(prevState => ({ percentage: prevState.percentage + (100/this.props.length) })) 28 | } 29 | }, 1000); 30 | } 31 | 32 | render() { 33 | return ( 34 |
    35 |
    36 | 37 |
    38 |
    45 |
    51 |
    52 |
    53 | 58 |
    59 |
    60 | ) 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/app/components/record.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | 3 | export default class record extends Component { 4 | constructor(props){ 5 | super(props) 6 | } 7 | render() { 8 | if(this.props.logofTime){ 9 | return ( 10 |
      11 | {this.props.logofTime.map((elem,i) =>{ 12 | if(this.props.index===i){ 13 | return
    • Name:{elem[0]} Time:{elem[1]}
    • 14 | }else{ 15 | return
    • Name:{elem[0]} Time:{elem[1]}
    • 16 | } 17 | })} 18 |
    19 | ) 20 | }else{ 21 | return ( 22 |

    Will Nothing

    23 | ) 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/app/components/stateChange.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import {deleteHtmlElement} from './helperFunctions' 3 | import {componenetChangedState} from './helperFunctions' 4 | 5 | export default class stateChange extends Component { 6 | constructor(props){ 7 | super(props) 8 | this.state = { 9 | selectedcomponents: {}, 10 | graph:[] 11 | } 12 | } 13 | cleanTree(){ 14 | const {index} = this.props 15 | let current=this.props.currentState[index] 16 | let temp= JSON.parse(JSON.stringify(current? [current]:this.props.currentState)) 17 | temp = componenetChangedState(deleteHtmlElement(temp)) 18 | return temp 19 | } 20 | render() { 21 | const {selectedcomponents} = this.state; 22 | let current=this.cleanTree() 23 | if(this.props.currentState[this.props.index]){ 24 | return ( 25 |
    26 |
    27 |

    Tree

    28 | this.setState({selectedcomponents})} 31 | selectedcomponents={selectedcomponents} 32 | isFirst={true} 33 | /> 34 |
    35 |
    36 | ) 37 | }else{ 38 | return ( 39 |

    Nothing changed

    40 | ) 41 | } 42 | } 43 | } 44 | 45 | const ComponentsList2 = ({ components, selectedcomponents, onChange, isFirst, debug }) => { 46 | 47 | const handleCheckboxClicked = (selectedcomponentId) => { 48 | 49 | if(selectedcomponents[selectedcomponentId]){ 50 | delete selectedcomponents[selectedcomponentId]; 51 | } else { 52 | selectedcomponents[selectedcomponentId] = {} 53 | 54 | } 55 | 56 | onChange(selectedcomponents) 57 | } 58 | 59 | const handleSubcomponentsListChange = (componentId, subSelections) => { 60 | selectedcomponents[componentId] = subSelections; 61 | onChange(selectedcomponents); 62 | } 63 | console.log('comp',components) 64 | let counter=0 65 | return ( 66 |
    67 | {components.map(component => ( 68 |
      69 | {handleCheckboxClicked(component.name)}} 74 | /> 75 | {(component.children.length > 0 && selectedcomponents[component.name]) && 76 | handleSubcomponentsListChange(component.name, subSelections)} 81 | /> 82 | } 83 |
    84 | ) 85 | )} 86 |
    87 | ) 88 | } 89 | 90 | class Checkbox2 extends Component { 91 | constructor(props){ 92 | super(props) 93 | this.state={ 94 | didmount:true 95 | } 96 | } 97 | componentDidMount(){ 98 | // if(this.state.didmount){ 99 | this.props.onChange(!this.props.selected) 100 | // this.setState({didmount:false}) 101 | // } 102 | } 103 | render(){ 104 | console.log('state',this.props.state) 105 | console.log('props',this.props.state) 106 | return ( 107 |
    108 |
    this.props.onChange(!this.props.selected)}>{this.props.label}
    109 |
    State:{this.props.state}
    110 |
    Props:{this.props.props}
    111 |
    112 | ) 113 | } 114 | } -------------------------------------------------------------------------------- /src/app/components/timeTravel.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import Playbutton from './playButton' 3 | import Record from './record' 4 | import Statechange from './stateChange' 5 | import {deleteHtmlElement} from './helperFunctions' 6 | 7 | export default class timeTravel extends Component { 8 | constructor(props) { 9 | super(props); 10 | } 11 | render() { 12 | return ( 13 |
    14 | 15 | 16 | 17 |
    18 | ) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | React Monitor 8 | 9 | 10 | 11 |
    12 | 13 | 14 | -------------------------------------------------------------------------------- /src/app/style.scss: -------------------------------------------------------------------------------- 1 | $primary-color: #7A679B; 2 | $secondary-color: #685155; 3 | $tertiary-color: #8B85C1; 4 | $light-color: #D4CDF4; 5 | $other-color: #815E5B; 6 | 7 | 8 | body { 9 | margin: 0; 10 | background: $tertiary-color; 11 | } 12 | 13 | .navbar { 14 | padding: 15px; 15 | background: $primary-color; 16 | display: flex; 17 | justify-content: space-evenly; 18 | -webkit-box-shadow: 0px 4px 2px 0px $secondary-color; 19 | -moz-box-shadow: 0px 4px 2px 0px $secondary-color; 20 | box-shadow: 0px 4px 2px 0px $secondary-color; 21 | li { 22 | list-style: none; 23 | font-size: large; 24 | a { 25 | text-decoration: none; 26 | color: $light-color; 27 | font-weight: 900; 28 | &:hover { 29 | color: white; 30 | } 31 | } 32 | } 33 | } 34 | 35 | .tooltip { 36 | position: absolute; 37 | max-width: 250px; 38 | padding: 5px; 39 | background: $primary-color; 40 | border-radius: 5px; 41 | pointer-events: none; 42 | box-shadow: 3px 3px 3px $secondary-color; 43 | h3 { 44 | text-align: center; 45 | color: $light-color; 46 | } 47 | hr { 48 | border: none; 49 | border-top: 1px solid $light-color; 50 | } 51 | } 52 | 53 | .container { 54 | display: flex; 55 | flex-direction: column; 56 | align-items: center; 57 | margin: 20px 30px; 58 | padding: 0px 0px 20px 0; 59 | border: 1px solid $light-color; 60 | background: $secondary-color; 61 | border-radius: 10px; 62 | -webkit-box-shadow: 4px 6px 4px 0px $secondary-color; 63 | -moz-box-shadow: 4px 6px 4px 0px $secondary-color; 64 | box-shadow: 4px 6px 4px 0px $secondary-color; 65 | } 66 | 67 | .graphDiv { 68 | margin: 0 20px; 69 | padding: 0 20px; 70 | width: 100%; 71 | height: 100%; 72 | } 73 | 74 | .d3-flame-graph-tip { 75 | padding: 8px; 76 | border-radius: 5px; 77 | -webkit-box-shadow: 4px 4px 2px 0px $secondary-color; 78 | -moz-box-shadow: 4px 4px 2px 0px $secondary-color; 79 | box-shadow: 4px 4px 2px 0px $secondary-color; 80 | background-color: $primary-color; 81 | font-size: large; 82 | color: whitesmoke; 83 | } 84 | 85 | .partition { 86 | padding: 0 40px 20px 40px; 87 | } 88 | 89 | 90 | .graph-title { 91 | margin: 10px 0; 92 | text-align: center; 93 | color: $light-color; 94 | font-size: x-large; 95 | } 96 | 97 | foreignObject { 98 | box-sizing: border-box; 99 | border: solid 1px $primary-color; 100 | } 101 | -------------------------------------------------------------------------------- /src/assets/readmeDemo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitsmith1010/ReactMonitor/c0f21d04e7d91d66c65ed16e897898f19992e35a/src/assets/readmeDemo.gif -------------------------------------------------------------------------------- /src/assets/rm-icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitsmith1010/ReactMonitor/c0f21d04e7d91d66c65ed16e897898f19992e35a/src/assets/rm-icon-128.png -------------------------------------------------------------------------------- /src/assets/rm-icon-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitsmith1010/ReactMonitor/c0f21d04e7d91d66c65ed16e897898f19992e35a/src/assets/rm-icon-48.png -------------------------------------------------------------------------------- /src/assets/rm-icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitsmith1010/ReactMonitor/c0f21d04e7d91d66c65ed16e897898f19992e35a/src/assets/rm-icon16.png -------------------------------------------------------------------------------- /src/extension/backgroundScript.js: -------------------------------------------------------------------------------- 1 | // define a variable to store tree data structure from content script; 2 | let treeGraph; 3 | // connected port will be saved here 4 | let currentPort; 5 | 6 | // listen for connection from the chrome dev tool; 7 | chrome.runtime.onConnect.addListener((port) => { 8 | // save the port 9 | currentPort = port; 10 | console.log('Currentport: ', port); 11 | // send message to Chrome Dev Tool on initial connect 12 | port.postMessage({ 13 | payload: treeGraph, 14 | }); 15 | }); 16 | 17 | // listen for message from contentScript 18 | chrome.runtime.onMessage.addListener((msg) => { 19 | // reassign the treeGraph 20 | treeGraph = msg.payload; 21 | console.log('TreeGraph within the onmessage.addListener: ', treeGraph); 22 | // once the message is accepted from content script, send it to dev tool 23 | if (currentPort) { 24 | currentPort.postMessage({ 25 | payload: treeGraph, 26 | }); 27 | } 28 | }); 29 | 30 | chrome.runtime.onInstalled.addListener(() => { 31 | chrome.contextMenus.create({ 32 | id: 'reactmonitor', 33 | title: 'Reactmonitor', 34 | contexts: ['page', 'selection', 'image', 'link'], 35 | }); 36 | }) 37 | 38 | 39 | 40 | chrome.contextMenus.onClicked.addListener(({ menuItemId }) => { 41 | const options = { 42 | type: 'panel', 43 | width: 960, 44 | height: window.screen.availHeight, 45 | url: chrome.runtime.getURL('index.html'), 46 | }; 47 | if (menuItemId === 'reactmonitor') chrome.windows.create(options); 48 | }); 49 | -------------------------------------------------------------------------------- /src/extension/contentScript.js: -------------------------------------------------------------------------------- 1 | // listen for message from npm package 2 | window.addEventListener("message", (msg) => { 3 | // filter the incoming msg.data 4 | if (msg.data.action === "npmToContent") { 5 | // send the message to the chrome - backgroundScript 6 | chrome.runtime.sendMessage({ 7 | action: "ContentToBackground", 8 | payload: msg.data, 9 | }); 10 | } 11 | }); 12 | 13 | function injectScript(file, node) { 14 | // test - inject javascript, access fibergraph 15 | const body0 = document.getElementsByTagName(node)[0]; 16 | 17 | // iterating the file from web accessible resources 18 | for (let i = 0; i < file.length; i++) { 19 | const s0 = document.createElement("script"); // 20 | 21 | s0.setAttribute("type", "text/javascript"); 22 | 23 | //built in chrome method to get the path of the file to be injected to the user's app 24 | s0.setAttribute("src", chrome.extension.getURL(file[i])); 25 | // console.log(chrome.extension.getURL(file[0]), "injectedfile"); 26 | body0.appendChild(s0); 27 | } 28 | } 29 | /* 30 | ... this will inject the following HTML tags into index.html: 31 | 32 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/extension/devtools.js: -------------------------------------------------------------------------------- 1 | chrome.devtools.panels.create( 2 | 'React Monitor', // panel title 3 | './assets/rm-icon-128.png', // logo path 4 | 'index.html', // initial HTML page for the dev panel 5 | null 6 | ); 7 | -------------------------------------------------------------------------------- /src/extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "name": "React Monitor", 4 | "version": "0.0.0.1", 5 | "devtools_page": "devtools.html", 6 | "permissions": ["activeTab", "contextMenus", ""], 7 | "content_scripts": [ 8 | { 9 | "matches": [""], 10 | "js": ["contentScript.js"] 11 | } 12 | ], 13 | "background": { 14 | "scripts": ["backgroundScript.js"], 15 | "persistent": false 16 | }, 17 | "icons": { 18 | "16": "./assets/rm-icon16.png", 19 | "48": "./assets/rm-icon-48.png", 20 | "128": "./assets/rm-icon-128.png" 21 | }, 22 | "externally_connectable": { 23 | "ids": ["*"] 24 | }, 25 | "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", 26 | "web_accessible_resources": ["/containerWrapper.js", "/fiberTreeAnalyzer.js"] 27 | } 28 | -------------------------------------------------------------------------------- /uml/devtools.plantuml: -------------------------------------------------------------------------------- 1 | @startuml devtools 2 | entity npmPackage 3 | boundary Window 4 | control contentScript 5 | boundary Chrome 6 | boundary ChromePort 7 | 8 | control backgroundScript 9 | control MainContainer 10 | control D3Tree 11 | 12 | 13 | backgroundScript -> ChromePort : chrome.runtime.onConnect.\naddListener((port)); 14 | contentScript -> Window : window.\naddEventListener('message'); 15 | 16 | npmPackage -> Window : 1.) postMessage({action:'NpmToContent', \npayload: treeGraph}) 17 | Window <- contentScript : 2.) receives Window action \n'NpmToContent' 18 | contentScript -> Chrome : 3.) chrome.runtime.sendMessage 19 | Chrome <- backgroundScript : 4.) receives Chrome Message \nvia chrome.runtime.onMessage.\naddListener 20 | backgroundScript -> ChromePort : 5.) post message to ChromePort. 21 | ChromePort <- MainContainer : 6.) receives message. 22 | MainContainer -> D3Tree : 7.) get treeGraph and \npresent information on D3Tree 23 | 24 | @enduml -------------------------------------------------------------------------------- /uml/highLevelDiagram.plantuml: -------------------------------------------------------------------------------- 1 | @startuml windowUML 2 | 3 | boundary App 4 | boundary Container 5 | control Window 6 | control TreeCreator 7 | entity D3Tree 8 | entity D3Tree 9 | 10 | App -> Container : setState is called 11 | Container -> Container : render method called \nfiberRoot = container._reactRootContainer._internalRoot 12 | Container -> Window: check every 20ms \nif Virtual DOM has changed. 13 | Window -> TreeCreator : treeCreator(fiberTree) 14 | Window <- TreeCreator : returns treeGraph 15 | Window -> Container: sends treeGraph 16 | Container -> D3Tree: recieves treeGraph 17 | D3Tree -> D3Tree: present tree using \nD3Tree or D3Flame visual. 18 | 19 | @enduml -------------------------------------------------------------------------------- /uml/treeCreator.plantuml: -------------------------------------------------------------------------------- 1 | @startuml treeCreatorUML 2 | 3 | control MakeTreeCreator 4 | control TreeCreator 5 | control TreeGraphFactory 6 | entity Node 7 | control helper 8 | entity deleteParent 9 | entity compareStateAndProps 10 | entity Window 11 | 12 | MakeTreeCreator -> TreeCreator : closed over \nwasMounted, prevTreeGraph, \nreturns function 13 | TreeCreator -> TreeGraphFactory : treeGraphFactor(fiberRoot); 14 | TreeGraphFactory -> Node : treeGraph = new Node(name, null, [], fiber); 15 | TreeGraphFactory -> helper: helper(fiber, treeGraph) 16 | helper -> helper: recursively reads Fiber child, sibling \nand creates array of children, parent.children 17 | TreeCreator <- TreeGraphFactory: return treeGraph 18 | TreeCreator -> deleteParent: delete parents from treeGraph 19 | TreeCreator <- deleteParent: return pruned treeGraph 20 | TreeCreator -> compareStateAndProps: compareStateAndProps(treeGraph, prevTreeGraph, null) 21 | compareStateAndProps -> compareStateAndProps: update node colors based on \n1.)initial load \n2.) when nodes diff \n3.)no prevNode 22 | TreeCreator <- compareStateAndProps: return TreeGraph with colored nodes 23 | TreeCreator -> TreeCreator: prevTreeGraph = tempTreeGraph \nwasMounted = true; 24 | TreeCreator -> Window: send TreeGraph 25 | @enduml -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const HtmlWebPackPlugin = require("html-webpack-plugin"); 3 | const CopyPlugin = require("copy-webpack-plugin"); 4 | 5 | module.exports = { 6 | mode: "development", 7 | entry: { 8 | backgroundScript: "./src/extension/backgroundScript.js", 9 | contentScript: "./src/extension/contentScript.js", 10 | devtools: "./src/extension/devtools.js", 11 | bundle: "./src/app/App.js", 12 | fiberTreeAnalyzer: "./package/createTree.js", 13 | containerWrapper: "./package/containerWrapper.js", 14 | }, 15 | output: { 16 | path: path.resolve(__dirname, "dist"), 17 | filename: "[name].js", 18 | }, 19 | module: { 20 | rules: [ 21 | { 22 | test: /\.(js|jsx)$/, 23 | exclude: /node_modules/, 24 | use: ["babel-loader"], 25 | }, 26 | { 27 | test: /\.s[ac]ss$/, 28 | use: ["style-loader", "css-loader", "sass-loader"], 29 | }, 30 | { 31 | test: /\.(png|jpe?g|gif)$/i, 32 | loader: "file-loader", 33 | options: { 34 | outputPath: "images", 35 | }, 36 | }, 37 | ], 38 | }, 39 | plugins: [ 40 | new HtmlWebPackPlugin({ 41 | template: "./src/app/index.html", 42 | filename: "index.html", 43 | chunks: ["bundle"], 44 | }), 45 | new HtmlWebPackPlugin({ 46 | template: "./src/extension/devtools.html", 47 | filename: "devtools.html", 48 | chunks: ["devtools"], 49 | }), 50 | new CopyPlugin({ 51 | patterns: [ 52 | { 53 | from: "./src/assets/", 54 | to: "./assets/", 55 | }, 56 | ], 57 | options: { 58 | concurrency: 100, 59 | }, 60 | }), 61 | ], 62 | devServer: { 63 | contentBase: "./dist", 64 | }, 65 | devtool: "eval-source-map", 66 | }; 67 | --------------------------------------------------------------------------------