├── cypress.json ├── .gitignore ├── example ├── sse │ ├── constants.js │ ├── sse-server.js │ └── SSE.js ├── socketio │ ├── constants.js │ ├── socketio-server.js │ └── SocketIo.js ├── websocket │ ├── constants.js │ ├── websocket-server.js │ └── Websocket.js ├── index.js ├── index.html ├── server.js ├── server-helpers.js └── App.js ├── lerna.json ├── packages ├── use-socketio │ ├── .npmignore │ ├── src │ │ ├── index.tsx │ │ ├── context.ts │ │ ├── provider.tsx │ │ └── hooks.ts │ ├── tslint.json │ ├── tsconfig.json │ ├── package.json │ ├── README.md │ └── package-lock.json ├── use-websockets │ ├── .npmignore │ ├── src │ │ ├── index.tsx │ │ ├── context.ts │ │ ├── provider.tsx │ │ └── hooks.ts │ ├── tslint.json │ ├── tsconfig.json │ ├── package.json │ └── README.md └── use-server-sent-events │ ├── .npmignore │ ├── src │ ├── index.tsx │ ├── context.ts │ ├── provider.tsx │ └── hooks.ts │ ├── tslint.json │ ├── tsconfig.json │ ├── package.json │ └── README.md ├── cypress ├── fixtures │ └── example.json ├── plugins │ └── index.js ├── support │ ├── index.js │ └── commands.js └── integration │ ├── sse.spec.js │ ├── websocket.spec.js │ └── socketio.spec.js ├── package.json ├── README.md ├── LICENSE.md └── .github └── workflows └── test_pr.yml /cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultCommandTimeout": 10000 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .cache 3 | dist 4 | cypress/videos 5 | lib -------------------------------------------------------------------------------- /example/sse/constants.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | port: 3123, 3 | }; 4 | -------------------------------------------------------------------------------- /example/socketio/constants.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | port: 3000, 3 | }; 4 | -------------------------------------------------------------------------------- /example/websocket/constants.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | port: 3124, 3 | }; 4 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": [ 3 | "packages/*" 4 | ], 5 | "version": "2.1.1" 6 | } 7 | -------------------------------------------------------------------------------- /packages/use-socketio/.npmignore: -------------------------------------------------------------------------------- 1 | example 2 | cypress 3 | src 4 | node_modules 5 | dist 6 | .cache -------------------------------------------------------------------------------- /packages/use-websockets/.npmignore: -------------------------------------------------------------------------------- 1 | example 2 | cypress 3 | src 4 | node_modules 5 | dist 6 | .cache -------------------------------------------------------------------------------- /packages/use-server-sent-events/.npmignore: -------------------------------------------------------------------------------- 1 | example 2 | cypress 3 | src 4 | node_modules 5 | dist 6 | .cache -------------------------------------------------------------------------------- /packages/use-socketio/src/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./context"; 2 | export * from "./provider"; 3 | export * from "./hooks"; 4 | -------------------------------------------------------------------------------- /packages/use-websockets/src/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./context"; 2 | export * from "./provider"; 3 | export * from "./hooks"; 4 | -------------------------------------------------------------------------------- /packages/use-server-sent-events/src/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./context"; 2 | export * from "./provider"; 3 | export * from "./hooks"; 4 | -------------------------------------------------------------------------------- /packages/use-server-sent-events/src/context.ts: -------------------------------------------------------------------------------- 1 | import { createContext } from "react"; 2 | 3 | export const SSEContext = createContext(undefined); 4 | -------------------------------------------------------------------------------- /packages/use-websockets/src/context.ts: -------------------------------------------------------------------------------- 1 | import { createContext } from "react"; 2 | 3 | export const WebsocketContext = createContext(undefined); 4 | -------------------------------------------------------------------------------- /packages/use-socketio/src/context.ts: -------------------------------------------------------------------------------- 1 | import { createContext } from "react"; 2 | 3 | export const SocketIOContext = createContext(undefined); 4 | -------------------------------------------------------------------------------- /cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } -------------------------------------------------------------------------------- /example/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import { App } from "./App"; 4 | 5 | const mountNode = document.getElementById("app"); 6 | 7 | ReactDOM.render(, mountNode); 8 | -------------------------------------------------------------------------------- /example/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | React starter app 5 | 6 | 7 |
8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /packages/use-socketio/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "tslint:latest", 4 | "tslint-plugin-prettier", 5 | "tslint-config-prettier" 6 | ], 7 | "jsRules": {}, 8 | "rules": {}, 9 | "rulesDirectory": [] 10 | } 11 | -------------------------------------------------------------------------------- /packages/use-websockets/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "tslint:latest", 4 | "tslint-plugin-prettier", 5 | "tslint-config-prettier" 6 | ], 7 | "jsRules": {}, 8 | "rules": {}, 9 | "rulesDirectory": [] 10 | } 11 | -------------------------------------------------------------------------------- /packages/use-server-sent-events/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "tslint:latest", 4 | "tslint-plugin-prettier", 5 | "tslint-config-prettier" 6 | ], 7 | "jsRules": {}, 8 | "rules": {}, 9 | "rulesDirectory": [] 10 | } 11 | -------------------------------------------------------------------------------- /example/server.js: -------------------------------------------------------------------------------- 1 | const startSocketIoServer = require("./socketio/socketio-server"); 2 | const startSSEServer = require("./sse/sse-server"); 3 | const startWebsocketServer = require("./websocket/websocket-server"); 4 | 5 | startSocketIoServer(); 6 | startSSEServer(); 7 | startWebsocketServer(); 8 | -------------------------------------------------------------------------------- /packages/use-socketio/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "esModuleInterop": true, 5 | "jsx": "react", 6 | "module": "commonjs", 7 | "noImplicitAny": false, 8 | "noImplicitReturns": true, 9 | "skipLibCheck": true 10 | }, 11 | "exclude": [], 12 | "include": ["./src/**/*"] 13 | } 14 | -------------------------------------------------------------------------------- /packages/use-websockets/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "esModuleInterop": true, 5 | "jsx": "react", 6 | "module": "commonjs", 7 | "noImplicitAny": false, 8 | "noImplicitReturns": true, 9 | "skipLibCheck": true 10 | }, 11 | "exclude": [], 12 | "include": ["./src/**/*"] 13 | } 14 | -------------------------------------------------------------------------------- /packages/use-server-sent-events/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "esModuleInterop": true, 5 | "jsx": "react", 6 | "module": "commonjs", 7 | "noImplicitAny": false, 8 | "noImplicitReturns": true, 9 | "skipLibCheck": true 10 | }, 11 | "exclude": [], 12 | "include": ["./src/**/*"] 13 | } 14 | -------------------------------------------------------------------------------- /example/server-helpers.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const http = require("http"); 3 | const cors = require("cors"); 4 | 5 | const createHttpServer = () => { 6 | const app = express(); 7 | const server = http.createServer(app); 8 | 9 | app.use(cors()); 10 | 11 | return { server, app }; 12 | }; 13 | 14 | module.exports = createHttpServer; 15 | -------------------------------------------------------------------------------- /cypress/plugins/index.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example plugins/index.js can be used to load plugins 3 | // 4 | // You can change the location of this file or turn off loading 5 | // the plugins file with the 'pluginsFile' configuration option. 6 | // 7 | // You can read more here: 8 | // https://on.cypress.io/plugins-guide 9 | // *********************************************************** 10 | 11 | // This function is called when a project is opened or re-opened (e.g. due to 12 | // the project's config changing) 13 | 14 | module.exports = (on, config) => { 15 | // `on` is used to hook into various events Cypress emits 16 | // `config` is the resolved Cypress config 17 | } 18 | -------------------------------------------------------------------------------- /cypress/support/index.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/index.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import './commands' 18 | 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') 21 | -------------------------------------------------------------------------------- /packages/use-socketio/src/provider.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import io from "socket.io-client"; 3 | import { SocketIOContext } from "./context"; 4 | 5 | export interface ISocketIOProviderProps { 6 | url: string; 7 | opts?: SocketIOClient.ConnectOpts; 8 | } 9 | 10 | export const SocketIOProvider: React.FC = ({ 11 | url, 12 | opts, 13 | children, 14 | }) => { 15 | const socketRef = React.useRef(); 16 | 17 | if (typeof window === "undefined") { 18 | return <>{children}; 19 | } 20 | 21 | if (!socketRef.current) { 22 | socketRef.current = io(url, opts || {}); 23 | } 24 | 25 | return ( 26 | 27 | {children} 28 | 29 | ); 30 | }; 31 | -------------------------------------------------------------------------------- /example/App.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { SocketIoExample } from "./socketio/SocketIo"; 3 | import { AllSSEMessagesExample, LastSSEMessageExample } from "./sse/SSE"; 4 | import { WebsocketExample } from "./websocket/Websocket"; 5 | import { Link, Router } from "@reach/router"; 6 | 7 | export const App = () => ( 8 |
9 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | ); 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "root", 3 | "private": true, 4 | "scripts": { 5 | "bootstrap": "lerna bootstrap", 6 | "e2e:ci": "cypress run", 7 | "e2e": "cypress open", 8 | "build": "lerna run build", 9 | "format": "lerna run format", 10 | "lint": "lerna run lint", 11 | "check:lint": "lerna run check:lint", 12 | "start": "parcel example/index.html", 13 | "start:test-server": "node ./example/server", 14 | "release": "npm i && npm run bootstrap && npm run check:lint && npm run build && lerna version && lerna publish" 15 | }, 16 | "devDependencies": { 17 | "@reach/router": "^1.3.4", 18 | "cors": "^2.8.5", 19 | "cypress": "^5.2.0", 20 | "express": "^4.17.1", 21 | "lerna": "^3.22.1", 22 | "parcel-bundler": "^1.12.4", 23 | "react": "^16.13.1", 24 | "react-dom": "^16.13.1", 25 | "socket.io": "^3.0.3", 26 | "ws": "^7.3.1" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /example/sse/sse-server.js: -------------------------------------------------------------------------------- 1 | const createHttpServer = require("../server-helpers"); 2 | const { port } = require("./constants"); 3 | 4 | const sseRequestHandler = (req, res) => { 5 | res.set("Content-Type", "text/event-stream"); 6 | 7 | const firstData = { name: "Marvin" }; 8 | 9 | res.write(`data: ${JSON.stringify(firstData)}`); 10 | res.write("\n\n"); 11 | 12 | setTimeout(() => { 13 | const secondData = { name: "Laetitia" }; 14 | 15 | res.write(`data: ${JSON.stringify(secondData)}`); 16 | res.write("\n\n"); 17 | }, 500); 18 | }; 19 | 20 | const startSSEServer = () => { 21 | const { server: sseServer, app: appSSE } = createHttpServer(); 22 | 23 | appSSE.get("/last-sse", sseRequestHandler); 24 | appSSE.get("/all-sse", sseRequestHandler); 25 | 26 | sseServer.listen(port, () => { 27 | console.log(`[SSE] Started on port :${port}`); 28 | }); 29 | }; 30 | 31 | module.exports = startSSEServer; 32 | -------------------------------------------------------------------------------- /cypress/support/commands.js: -------------------------------------------------------------------------------- 1 | // *********************************************** 2 | // This example commands.js shows you how to 3 | // create various custom commands and overwrite 4 | // existing commands. 5 | // 6 | // For more comprehensive examples of custom 7 | // commands please read more here: 8 | // https://on.cypress.io/custom-commands 9 | // *********************************************** 10 | // 11 | // 12 | // -- This is a parent command -- 13 | // Cypress.Commands.add("login", (email, password) => { ... }) 14 | // 15 | // 16 | // -- This is a child command -- 17 | // Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) 18 | // 19 | // 20 | // -- This is a dual command -- 21 | // Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) 22 | // 23 | // 24 | // -- This will overwrite an existing command -- 25 | // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) 26 | -------------------------------------------------------------------------------- /cypress/integration/sse.spec.js: -------------------------------------------------------------------------------- 1 | context("Server sent event", () => { 2 | describe("Last message for SSE", () => { 3 | beforeEach(() => { 4 | cy.visit("http://localhost:1234/last-sse"); 5 | }); 6 | 7 | it("should be an empty section at the beginning", () => { 8 | cy.get("[data-cy=last-sse-message]").invoke("text").should("eq", ""); 9 | }); 10 | 11 | it("should have 'Marvin' as first SSE message", () => { 12 | cy.get("[data-cy=last-sse-message]").should("contain", "Marvin"); 13 | }); 14 | 15 | it("should have 'Laetitia' as second SSE message", () => { 16 | cy.get("[data-cy=last-sse-message]").should("contain", "Laetitia"); 17 | }); 18 | }); 19 | 20 | describe("All messages from SSE", () => { 21 | beforeEach(() => { 22 | cy.visit("http://localhost:1234/all-sse"); 23 | }); 24 | 25 | it("should display all the names", () => { 26 | cy.get("[data-cy=all-sse-messages]").should("contain", "Marvin"); 27 | 28 | cy.get("[data-cy=all-sse-messages]").should("contain", "Laetitia"); 29 | }); 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /packages/use-websockets/src/provider.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import { WebsocketContext } from "./context"; 3 | 4 | export interface IWebSocketProviderProps { 5 | url: string; 6 | protocols?: string | string[]; 7 | onOpen?: (ev: Event) => void; 8 | } 9 | 10 | export const WebSocketProvider: React.FC = ({ 11 | url, 12 | protocols, 13 | children, 14 | onOpen, 15 | }) => { 16 | const ws = React.useRef(); 17 | const onOpenRef = React.useRef<(ev: Event) => void>(); 18 | 19 | if (!window) { 20 | return <>{children}; 21 | } 22 | 23 | if (!ws.current) { 24 | ws.current = new WebSocket(url, protocols); 25 | } 26 | 27 | onOpenRef.current = onOpen; 28 | 29 | React.useEffect(() => { 30 | if (onOpenRef?.current) { 31 | ws.current.onopen = onOpenRef.current; 32 | } 33 | 34 | return () => { 35 | ws?.current?.close(); 36 | }; 37 | }, []); 38 | 39 | return ( 40 | 41 | {children} 42 | 43 | ); 44 | }; 45 | -------------------------------------------------------------------------------- /packages/use-server-sent-events/src/provider.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import { SSEContext } from "./context"; 3 | 4 | export interface ISSEProviderProps { 5 | url: string; 6 | opts?: EventSourceInit; 7 | onOpen?: (ev: Event) => void; 8 | } 9 | 10 | export const SSEProvider: React.FC = ({ 11 | url, 12 | opts, 13 | children, 14 | onOpen, 15 | }) => { 16 | const eventSourceRef = React.useRef(); 17 | const onOpenRef = React.useRef<(ev: Event) => void>(); 18 | 19 | if (!window) { 20 | return <>{children}; 21 | } 22 | 23 | if (!eventSourceRef.current) { 24 | eventSourceRef.current = new EventSource(url, opts); 25 | } 26 | 27 | onOpenRef.current = onOpen; 28 | 29 | React.useEffect(() => { 30 | if (onOpenRef?.current) { 31 | eventSourceRef.current.onopen = onOpenRef.current; 32 | } 33 | 34 | return () => { 35 | eventSourceRef?.current?.close(); 36 | }; 37 | }, []); 38 | 39 | return ( 40 | 41 | {children} 42 | 43 | ); 44 | }; 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://travis-ci.org/mfrachet/use-socketio.svg?branch=master)](https://travis-ci.org/mfrachet/use-socketio) 2 | 3 | React hooks for handling server-push technologies: 4 | 5 | - [use-socketio](./packages/use-socketio) for [Socket.io](https://socket.io/) 6 | - [use-server-sent-events](./packages/use-server-sent-events) for [Server Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events) 7 | - [use-websockets](./packages/use-websockets) for [Websocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) 8 | 9 | ## Running samples 10 | 11 | To run samples locally, you can: 12 | 13 | ```sh 14 | $ git clone https://github.com/mfrachet/server-push-hooks 15 | $ cd server-push-hooks 16 | $ npm install # install lerna and dependencies at the root 17 | $ npm run bootstrap # install lerna packages dependencies 18 | $ npm run build # build the lerna packages 19 | $ npm start # start the web application 20 | $ npm start:test-server # start the backend services in another terminal 21 | $ npm run e2e # run E2E tests of the projects in another terminal 22 | ``` 23 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2004-Today Marvin Frachet 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /packages/use-websockets/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "use-websockets", 3 | "version": "2.1.1", 4 | "description": "React hooks for https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API", 5 | "main": "./lib/index.js", 6 | "author": "Marvin Frachet ", 7 | "license": "MIT", 8 | "private": false, 9 | "homepage": "https://github.com/mfrachet/server-push-hooks", 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/mfrachet/server-push-hooks" 13 | }, 14 | "keywords": [ 15 | "react", 16 | "context" 17 | ], 18 | "scripts": { 19 | "build": "yarn lint && tsc --outDir lib", 20 | "format": "prettier --write './src/**/*.tsx'", 21 | "lint": "tslint -c tslint.json 'src/**/**'", 22 | "check:lint": "tsc --noEmit && yarn lint" 23 | }, 24 | "devDependencies": { 25 | "@babel/core": "^7.11.6", 26 | "@babel/preset-env": "^7.11.5", 27 | "@babel/preset-react": "^7.10.4", 28 | "@types/react": "^16.9.49", 29 | "@types/react-dom": "^16.9.8", 30 | "prettier": "^2.1.2", 31 | "tslint": "^6.1.3", 32 | "tslint-config-prettier": "^1.18.0", 33 | "tslint-plugin-prettier": "^2.3.0", 34 | "typescript": "^4.0.3" 35 | }, 36 | "peerDependencies": { 37 | "react": "^16.13.1" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /example/sse/SSE.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import { 3 | useLastSSE, 4 | useSSE, 5 | SSEProvider, 6 | } from "../../packages/use-server-sent-events"; 7 | import { port } from "./constants"; 8 | 9 | export const LastSSEMessage = () => { 10 | const { data } = useLastSSE(); 11 | 12 | return ( 13 |
14 |

Last SSE Message

15 |

{data && data.name}

16 |
17 | ); 18 | }; 19 | 20 | export const AllSSEMessages = () => { 21 | const [names, setNames] = useState([]); 22 | 23 | useSSE((nextName) => setNames([...names, nextName])); 24 | 25 | return ( 26 |
27 |

All SSE messages

28 |
    29 | {names.map(({ name }) => ( 30 |
  • {name}
  • 31 | ))} 32 |
33 |
34 | ); 35 | }; 36 | 37 | export const LastSSEMessageExample = () => { 38 | return ( 39 | 40 | 41 | 42 | ); 43 | }; 44 | 45 | export const AllSSEMessagesExample = () => { 46 | return ( 47 | 48 | 49 | 50 | ); 51 | }; 52 | -------------------------------------------------------------------------------- /example/socketio/socketio-server.js: -------------------------------------------------------------------------------- 1 | const socketIo = require("socket.io"); 2 | const createHttpServer = require("../server-helpers"); 3 | const { port } = require("./constants"); 4 | 5 | const startSocketIoServer = () => { 6 | const { server: socketIoServer } = createHttpServer(); 7 | const io = socketIo(socketIoServer, { 8 | cors: { 9 | origin: "http://localhost:1234", 10 | methods: ["GET", "POST"] 11 | } 12 | }); 13 | 14 | io.on("connection", function (socket) { 15 | socket.on("one-last-message", () => { 16 | socket.emit("last-messages", "This is one new message"); 17 | }); 18 | 19 | socket.on("three-last-messages", () => { 20 | socket.emit("last-messages", "This is one new message"); 21 | socket.emit("last-messages", "This is a second new message"); 22 | socket.emit("last-messages", "This is a third new message"); 23 | }); 24 | 25 | socket.on("three-messages", () => { 26 | socket.emit("new-message", "This is one new message"); 27 | socket.emit("new-message", "This is a second new message"); 28 | socket.emit("new-message", "This is a third new message"); 29 | }); 30 | }); 31 | 32 | socketIoServer.listen(port, () => 33 | console.log(`[Socket.io] Started on port :${port}`) 34 | ); 35 | }; 36 | 37 | module.exports = startSocketIoServer; 38 | -------------------------------------------------------------------------------- /packages/use-server-sent-events/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "use-server-sent-events", 3 | "version": "2.1.0", 4 | "description": "React hooks for https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events", 5 | "main": "./lib/index.js", 6 | "author": "Marvin Frachet ", 7 | "license": "MIT", 8 | "private": false, 9 | "homepage": "https://github.com/mfrachet/server-push-hooks", 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/mfrachet/server-push-hooks" 13 | }, 14 | "keywords": [ 15 | "react", 16 | "context" 17 | ], 18 | "scripts": { 19 | "build": "yarn lint && tsc --outDir lib", 20 | "format": "prettier --write './src/**/*.tsx'", 21 | "lint": "tslint -c tslint.json 'src/**/**'", 22 | "check:lint": "tsc --noEmit && yarn lint" 23 | }, 24 | "devDependencies": { 25 | "@babel/core": "^7.11.6", 26 | "@babel/preset-env": "^7.11.5", 27 | "@babel/preset-react": "^7.10.4", 28 | "@types/react": "^16.9.49", 29 | "@types/react-dom": "^16.9.8", 30 | "prettier": "^2.1.2", 31 | "tslint": "^6.1.3", 32 | "tslint-config-prettier": "^1.18.0", 33 | "tslint-plugin-prettier": "^2.3.0", 34 | "typescript": "^4.0.3" 35 | }, 36 | "peerDependencies": { 37 | "react": "^16.13.1" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /packages/use-socketio/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "use-socketio", 3 | "version": "2.1.0", 4 | "description": "React hooks for https://socket.io/", 5 | "main": "./lib/index.js", 6 | "author": "Marvin Frachet ", 7 | "license": "MIT", 8 | "private": false, 9 | "homepage": "https://github.com/mfrachet/server-push-hooks", 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/mfrachet/server-push-hooks" 13 | }, 14 | "keywords": [ 15 | "react", 16 | "context" 17 | ], 18 | "scripts": { 19 | "build": "yarn lint && tsc --outDir lib", 20 | "format": "prettier --write './src/**/*.tsx'", 21 | "lint": "tslint -c tslint.json 'src/**/**'", 22 | "check:lint": "tsc --noEmit && yarn lint" 23 | }, 24 | "devDependencies": { 25 | "@babel/core": "^7.11.6", 26 | "@babel/preset-env": "^7.11.5", 27 | "@babel/preset-react": "^7.10.4", 28 | "@types/react": "^16.9.49", 29 | "@types/react-dom": "^16.9.8", 30 | "@types/socket.io-client": "^1.4.33", 31 | "prettier": "^2.1.2", 32 | "tslint": "^6.1.3", 33 | "tslint-config-prettier": "^1.18.0", 34 | "tslint-plugin-prettier": "^2.3.0", 35 | "typescript": "^4.0.3" 36 | }, 37 | "peerDependencies": { 38 | "react": "^16.13.1" 39 | }, 40 | "dependencies": { 41 | "socket.io-client": "^3.0.3" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /packages/use-server-sent-events/src/hooks.ts: -------------------------------------------------------------------------------- 1 | import { useContext, useEffect, useRef, useState } from "react"; 2 | import { SSEContext } from "./context"; 3 | 4 | export const useLastSSE = () => { 5 | const [data, setData] = useState(undefined); 6 | const [error, setError] = useState(undefined); 7 | 8 | const eventSource = useContext(SSEContext); 9 | 10 | useEffect(() => { 11 | eventSource.onmessage = (e) => { 12 | let message; 13 | 14 | try { 15 | message = JSON.parse(e.data); 16 | } catch { 17 | message = e.data; 18 | } 19 | 20 | setData(message); 21 | }; 22 | 23 | eventSource.onerror = (e) => { 24 | setError(e); 25 | }; 26 | }, []); 27 | 28 | return { data, error }; 29 | }; 30 | 31 | export const useSSE = (onMessage: (data: JSON) => void) => { 32 | const [error, setError] = useState(undefined); 33 | const onMessageRef = useRef(undefined); 34 | 35 | onMessageRef.current = onMessage; 36 | 37 | const eventSource = useContext(SSEContext); 38 | 39 | useEffect(() => { 40 | eventSource.onmessage = (e) => { 41 | let message; 42 | 43 | try { 44 | message = JSON.parse(e.data); 45 | } catch { 46 | message = e.data; 47 | } 48 | 49 | onMessageRef.current(message); 50 | }; 51 | 52 | eventSource.onerror = (e) => { 53 | setError(e); 54 | }; 55 | }, []); 56 | 57 | return error; 58 | }; 59 | -------------------------------------------------------------------------------- /packages/use-websockets/src/hooks.ts: -------------------------------------------------------------------------------- 1 | import { useContext, useEffect, useRef, useState } from "react"; 2 | import { WebsocketContext } from "./context"; 3 | 4 | export const useLastWebsocketMessage = () => { 5 | const [data, setData] = useState(undefined); 6 | const [error, setError] = useState(undefined); 7 | 8 | const ws = useContext(WebsocketContext); 9 | 10 | useEffect(() => { 11 | ws.onmessage = (e) => { 12 | let message; 13 | 14 | try { 15 | message = JSON.parse(e.data); 16 | } catch { 17 | message = e.data; 18 | } 19 | 20 | setData(message); 21 | }; 22 | 23 | ws.onerror = (e) => { 24 | setError(e); 25 | }; 26 | }, []); 27 | 28 | return { data, error, ws }; 29 | }; 30 | 31 | export const useWebsocket = (onMessage: (data: T) => void) => { 32 | const [error, setError] = useState(undefined); 33 | const onMessageRef = useRef(undefined); 34 | 35 | onMessageRef.current = onMessage; 36 | 37 | const ws = useContext(WebsocketContext); 38 | 39 | useEffect(() => { 40 | ws.onmessage = (event) => { 41 | let message; 42 | 43 | try { 44 | message = JSON.parse(event.data); 45 | } catch { 46 | message = event.data; 47 | } 48 | 49 | onMessageRef.current(message); 50 | }; 51 | 52 | ws.onerror = (e) => { 53 | setError(e); 54 | }; 55 | }, []); 56 | 57 | return { error, ws }; 58 | }; 59 | -------------------------------------------------------------------------------- /example/websocket/websocket-server.js: -------------------------------------------------------------------------------- 1 | const WebSocket = require("ws"); 2 | const createHttpServer = require("../server-helpers"); 3 | const { port } = require("./constants"); 4 | 5 | const startWebsocketServer = () => { 6 | const { server } = createHttpServer(); 7 | const wss = new WebSocket.Server({ server }); 8 | 9 | wss.on("connection", function connection(ws) { 10 | const sendMessage = (type, message) => { 11 | ws.send(JSON.stringify({ type, message })); 12 | }; 13 | 14 | ws.on("message", function incoming(message) { 15 | switch (message) { 16 | case "one-last": 17 | sendMessage("one-last", "One last message"); 18 | break; 19 | 20 | case "three-last-messages": 21 | sendMessage("three-last-messages", "One last message of three"); 22 | sendMessage("three-last-messages", "Two last message of three"); 23 | sendMessage("three-last-messages", "Three last message of three"); 24 | break; 25 | 26 | case "all-messages": 27 | sendMessage("all-messages", "One of three messages"); 28 | sendMessage("all-messages", "Two of three messages"); 29 | sendMessage("all-messages", "Three of three messages"); 30 | break; 31 | } 32 | }); 33 | 34 | ws.send("Opened from the server"); 35 | }); 36 | 37 | server.listen(port, () => { 38 | console.log(`[Websocket] Started on port :${port}`); 39 | }); 40 | }; 41 | 42 | module.exports = startWebsocketServer; 43 | -------------------------------------------------------------------------------- /packages/use-socketio/src/hooks.ts: -------------------------------------------------------------------------------- 1 | import { useContext, useEffect, useRef, useState } from "react"; 2 | import { SocketIOContext } from "./context"; 3 | 4 | export const useSocket = ( 5 | eventKey?: string, 6 | callback?: (...args: any) => void 7 | ) => { 8 | const socket = useContext(SocketIOContext); 9 | const callbackRef = useRef(callback); 10 | 11 | callbackRef.current = callback; 12 | 13 | const socketHandlerRef = useRef(function() { 14 | if (callbackRef.current) { 15 | callbackRef.current.apply(this, arguments); 16 | } 17 | }); 18 | 19 | const subscribe = () => { 20 | if (eventKey) { 21 | socket.on(eventKey, socketHandlerRef.current); 22 | } 23 | }; 24 | 25 | const unsubscribe = () => { 26 | if (eventKey) { 27 | socket.removeListener(eventKey, socketHandlerRef.current); 28 | } 29 | }; 30 | 31 | useEffect(() => { 32 | subscribe(); 33 | 34 | return unsubscribe; 35 | }, [eventKey]); 36 | 37 | return { socket, unsubscribe, subscribe }; 38 | }; 39 | 40 | export const useLastMessage = (eventKey: string) => { 41 | const socket = useContext(SocketIOContext); 42 | const [data, setData] = useState(); 43 | 44 | const subscribe = () => { 45 | if (eventKey) { 46 | socket.on(eventKey, setData); 47 | } 48 | }; 49 | 50 | const unsubscribe = () => { 51 | if (eventKey) { 52 | socket.removeListener(eventKey, setData); 53 | } 54 | }; 55 | 56 | useEffect(() => { 57 | subscribe(); 58 | 59 | return unsubscribe; 60 | }, [eventKey]); 61 | 62 | return { data, socket, unsubscribe, subscribe }; 63 | }; 64 | -------------------------------------------------------------------------------- /cypress/integration/websocket.spec.js: -------------------------------------------------------------------------------- 1 | context("Socket.io", () => { 2 | beforeEach(() => { 3 | cy.visit("http://localhost:1234/websocket"); 4 | cy.contains("Clear all messages").click(); 5 | }); 6 | 7 | describe("Connection", () => { 8 | it("should open a websocket connection", () => { 9 | cy.contains("Connection is opened.").should("be.visible"); 10 | }); 11 | }); 12 | 13 | describe("Last message section", () => { 14 | beforeEach(() => { 15 | cy.contains("Switch to Last message").click(); 16 | }); 17 | 18 | it("should be an empty section at the beginning", () => { 19 | cy.contains("No last messages").should("be.visible"); 20 | }); 21 | 22 | it("should show one last message", () => { 23 | cy.contains("Ask for one last message").click(); 24 | cy.contains("One last message").should("be.visible"); 25 | }); 26 | 27 | it("should show three last message", () => { 28 | cy.contains("Ask for three last messages").click(); 29 | cy.contains("Three last message of three").should("be.visible"); 30 | }); 31 | }); 32 | 33 | describe("All message section", () => { 34 | it("should be an empty section at the beginning", () => { 35 | cy.contains("No messages").should("be.visible"); 36 | }); 37 | 38 | it("should show three messages", () => { 39 | cy.contains("Ask for messages").click(); 40 | cy.contains("One of three messages").should("be.visible"); 41 | cy.contains("Two of three messages").should("be.visible"); 42 | cy.contains("Three of three messages").should("be.visible"); 43 | }); 44 | }); 45 | }); 46 | -------------------------------------------------------------------------------- /.github/workflows/test_pr.yml: -------------------------------------------------------------------------------- 1 | # This workflow will run when a pull request event is triggered (push, open, whatever happens) 2 | name: Node.js test 3 | on: 4 | pull_request: 5 | branches: ['main'] 6 | workflow_dispatch: # just in case when you need to trigger the thing manually without pull requests 7 | 8 | jobs: 9 | cypress-run: 10 | runs-on: ubuntu-16.04 11 | continue-on-error: true 12 | steps: 13 | - name: Install libgconf-2-4 14 | run: sudo apt-get install libgconf-2-4 # Don't worry about passwords, sudo won't prompt for any, cuz there isn't a password here. 15 | - uses: actions/checkout@v2 16 | - name: Setup Node.js v10 🎁 17 | uses: actions/setup-node@v1 18 | with: 19 | node-version: 10.x 20 | - name: Install dependencies 📦 21 | run: npm ci 22 | - name: Setup cache 23 | uses: actions/cache@v2 24 | with: 25 | path: ~/.npm 26 | key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} 27 | restore-keys: | 28 | ${{ runner.os }}-node- 29 | - name: Bootstrap 🥾 30 | run: npm run bootstrap 31 | - name: restore lerna 32 | uses: actions/cache@v2 33 | with: 34 | path: | 35 | node_modules 36 | */*/node_modules 37 | key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} 38 | - name: Lint 🔍 39 | run: npm run check:lint 40 | - name: Build the hooks 🛠 41 | run: npm run build 42 | - name: Test the hooks ✔ 43 | uses: cypress-io/github-action@v2 44 | with: 45 | start: npm start, npm run start:test-server 46 | 47 | - name: Upload the videos 48 | uses: actions/upload-artifact@v2 49 | with: 50 | name: cypress-videos 51 | path: cypress/videos/* 52 | 53 | 54 | -------------------------------------------------------------------------------- /packages/use-server-sent-events/README.md: -------------------------------------------------------------------------------- 1 | Use [Server Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events) with React, in hooks (React v16.8+). 2 | 3 | # Usage 4 | 5 | ## Installation 6 | 7 | ```sh 8 | $ yarn add use-server-sent-events 9 | ``` 10 | 11 | ## In your code 12 | 13 | ### useSSE hook 14 | 15 | Listen to a specific event and trigger the according callback every time there's one. **This hooks doesn't trigger a re-render. You have to manage it yourself.** 16 | 17 | ```jsx 18 | import { SSEProvider, useSSE } from "use-server-sent-events"; 19 | 20 | const Parent = () => ( 21 | console.log("connection opened")} 24 | > 25 | 26 | 27 | ); 28 | 29 | const Children = () => { 30 | const [messages, setMessages] = useState([]); 31 | const error = useSSE((nextMessage) => 32 | setMessages([...messages, nextMessage]) 33 | ); 34 | 35 | return ( 36 |
    37 | {messages.map((msg, index) => ( 38 |
  • {msg}
  • 39 | ))} 40 |
41 | ); 42 | }; 43 | ``` 44 | 45 | ### useLastSSE hook 46 | 47 | Listen to the latest message received on a specific event name. **This hook triggers a re-render so you don't have to.** 48 | 49 | ```jsx 50 | import { SSEProvider, useLastSSE } from "use-server-sent-events"; 51 | 52 | const Parent = () => ( 53 | 54 | 55 | 56 | ); 57 | 58 | const Children = () => { 59 | const { data, error } = useLastSSE(); 60 | 61 | return

{data || "No message yet"}

; 62 | }; 63 | ``` 64 | 65 | ## Notes 66 | 67 | For example on how to implement a Server Sent Event server, you can take a look at the [Server Sent Event example folder](../../example/sse/sse-server.js). 68 | -------------------------------------------------------------------------------- /packages/use-websockets/README.md: -------------------------------------------------------------------------------- 1 | Use [Websocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) with React, in hooks (React v16.8+). 2 | 3 | # Usage 4 | 5 | ## Installation 6 | 7 | ```sh 8 | $ yarn add use-websockets 9 | ``` 10 | 11 | ## In your code 12 | 13 | ### useWebsocket hook 14 | 15 | Listen to a specific event and trigger the according callback every time there's one. **This hooks doesn't trigger a re-render. You have to manage it yourself.** 16 | 17 | ```jsx 18 | import { WebsocketProvider, useWebsocket } from "use-websockets"; 19 | 20 | const Parent = () => ( 21 | console.log("connection opened")} 24 | > 25 | 26 | 27 | ); 28 | 29 | const Children = () => { 30 | const [messages, setMessages] = useState([]); 31 | const { ws, error } = useWebsocket((nextMessage) => 32 | setMessages([...messages, nextMessage]) 33 | ); 34 | 35 | return ( 36 |
    37 | {messages.map((msg, index) => ( 38 |
  • {msg}
  • 39 | ))} 40 |
41 | ); 42 | }; 43 | ``` 44 | 45 | ### useLastWebsocketMessage hook 46 | 47 | Listen to the latest message received on a specific event name. **This hook triggers a re-render so you don't have to.** 48 | 49 | ```jsx 50 | import { WebsocketProvider, useLastWebsocketMessage } from "use-websockets"; 51 | 52 | const Parent = () => ( 53 | 54 | 55 | 56 | ); 57 | 58 | const Children = () => { 59 | const { data, error, ws } = useLastWebsocketMessage(); 60 | 61 | return

{data || "No message yet"}

; 62 | }; 63 | ``` 64 | 65 | ## Notes 66 | 67 | For example on how to implement a Websocket server, you can take a look at the [Websocket example folder](../../example/websocket/websocket-server.js). 68 | -------------------------------------------------------------------------------- /example/websocket/Websocket.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { 3 | WebSocketProvider, 4 | useWebsocket, 5 | useLastWebsocketMessage, 6 | } from "../../packages/use-websockets"; 7 | import { port } from "./constants"; 8 | 9 | const LastMessage = () => { 10 | const { data, ws } = useLastWebsocketMessage(); 11 | 12 | return ( 13 |
14 |

Last message

15 | 18 | 21 | {data?.message || "No last messages"} 22 |
23 | ); 24 | }; 25 | 26 | const AllMessages = () => { 27 | const [messages, setMessages] = React.useState([]); 28 | const { ws } = useWebsocket((d) => setMessages([...messages, d.message])); 29 | 30 | return ( 31 |
32 |

All messages

33 | 34 | 35 | 36 | 37 | {messages.length === 0 && <>No messages} 38 | {messages.length > 0 && ( 39 |
    40 | {messages.map((msg, index) => ( 41 |
  • {msg}
  • 42 | ))} 43 |
44 | )} 45 |
46 | ); 47 | }; 48 | 49 | export const WebsocketExample = () => { 50 | const [isOpened, setIsOpened] = React.useState(false); 51 | const [tab, setTab] = React.useState("all"); 52 | 53 | return ( 54 | setIsOpened(true)} 57 | > 58 |

Connection is {isOpened ? "opened" : "closed"}.

59 | 60 | 61 | 62 | 63 | {tab === "all" && } 64 | {tab !== "all" && } 65 |
66 | ); 67 | }; 68 | -------------------------------------------------------------------------------- /packages/use-socketio/README.md: -------------------------------------------------------------------------------- 1 | Use [socket.io v3](https://socket.io/) with React, in hooks (React v16.8+). 2 | 3 | _If you want to use socket.io in v2, you might want to use the v2.0.4 of this package. The last commit related to the v2 version is [this one](https://github.com/mfrachet/server-push-hooks/tree/4636e16f6753c5a49a52b0091ec92fce44e9913b)._ 4 | 5 | # Usage 6 | 7 | ## Installation 8 | 9 | ```sh 10 | $ yarn add use-socketio 11 | ``` 12 | 13 | ## In your code 14 | 15 | ### useSocket hook 16 | 17 | Listen to a specific event and trigger the according callback every time there's one. **This hooks doesn't trigger a re-render. You have to manage it yourself.** 18 | 19 | ```jsx 20 | import { SocketIOProvider, useSocket } from "use-socketio"; 21 | 22 | const Twitter = () => { 23 | const [tweets, setTweet] = useState([]); 24 | 25 | const { socket, subscribe, unsubscribe } = useSocket("tweet", (newTweet) => 26 | setTweet([newTweet, ...tweets]) 27 | ); 28 | 29 | return tweets.length ? ( 30 |
    31 | {tweets.map((tweet) => ( 32 |
  • {tweet.text}
  • 33 | ))} 34 |
35 | ) : ( 36 |

Actually waiting for the websocket server...

37 | ); 38 | }; 39 | 40 | const App = () => ( 41 | 42 | 43 | 44 | ); 45 | ``` 46 | 47 | _The socketio options to pass to the provider are available here: https://socket.io/docs/client-api/#new-Manager-url-options._ 48 | 49 | ### useLastMessage hook 50 | 51 | Listen to the latest message received on a specific event name. **This hook triggers a re-render so you don't have to.** 52 | 53 | ```jsx 54 | import { SocketIOProvider, useLastMessage } from "use-socketio"; 55 | 56 | const Twitter = () => { 57 | const { data: lastMessage, socket, subscribe, unsubscribe } = useLastMessage( 58 | "tweet" 59 | ); 60 | 61 | return

{lastMessage || "Waiting for some tweets"}

; 62 | }; 63 | 64 | const App = () => ( 65 | 66 | 67 | 68 | ); 69 | ``` 70 | 71 | ## Notes 72 | 73 | For example on how to implement a Socket.io server, you can take a look at the [socket.io the example folder](../../example/socketio/socketio-server.js). 74 | -------------------------------------------------------------------------------- /example/socketio/SocketIo.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import { 3 | SocketIOProvider, 4 | useLastMessage, 5 | useSocket, 6 | } from "../../packages/use-socketio"; 7 | import { port } from "./constants"; 8 | 9 | const LastMessage = () => { 10 | const [lastMessage, setLastMessage] = useState(); 11 | const { data, socket, unsubscribe, subscribe } = useLastMessage( 12 | "last-messages" 13 | ); 14 | 15 | // synchronize state with data so that we can clear it in the ui 16 | useEffect(() => { 17 | setLastMessage(data); 18 | }, [data]); 19 | 20 | return ( 21 |
22 |

Last message

23 | 29 | 32 | 35 | 41 | 42 | 48 |

{lastMessage}

49 |
50 | ); 51 | }; 52 | 53 | const Message = () => { 54 | const [messages, setMessages] = useState([]); 55 | 56 | const { socket, subscribe, unsubscribe } = useSocket( 57 | "new-message", 58 | (newMessage) => setMessages([newMessage, ...messages]) 59 | ); 60 | 61 | return ( 62 |
63 |

All tweets

64 | 65 | 68 | 69 | 72 | 73 | 76 | 77 | 83 |
    84 | {messages.map((message, index) => ( 85 |
  • {message}
  • 86 | ))} 87 |
88 |
89 | ); 90 | }; 91 | 92 | export const SocketIoExample = () => ( 93 | 94 | 95 | 96 | 97 | ); 98 | -------------------------------------------------------------------------------- /cypress/integration/socketio.spec.js: -------------------------------------------------------------------------------- 1 | context("Socket.io", () => { 2 | beforeEach(() => { 3 | cy.visit("http://localhost:1234/socket-io"); 4 | }); 5 | 6 | describe("Last message section", () => { 7 | it("should be an empty section at the beginning", () => { 8 | cy.get("[data-cy=last-message]").invoke("text").should("eq", ""); 9 | }); 10 | 11 | it("should display a message in the last message section", () => { 12 | cy.get("[data-cy=add-one-last-message]").click(); 13 | 14 | cy.get("[data-cy=last-message]") 15 | .invoke("text") 16 | .should("eq", "This is one new message"); 17 | }); 18 | 19 | it("should display only the last message in the last message section while triggering three", () => { 20 | cy.get("[data-cy=add-three-last-messages]").click(); 21 | 22 | cy.get("[data-cy=last-message]") 23 | .invoke("text") 24 | .should("eq", "This is a third new message"); 25 | }); 26 | 27 | it("should successfully manage subscription and unsubscription for a specific event", () => { 28 | cy.get("[data-cy=add-one-last-message]").click(); 29 | cy.wait(100); 30 | cy.get("[data-cy=unsubscribe-last-message]").click(); 31 | cy.get("[data-cy=add-three-last-messages]").click(); 32 | 33 | cy.get("[data-cy=last-message]") 34 | .invoke("text") 35 | .should("eq", "This is one new message"); 36 | 37 | cy.get("[data-cy=subscribe-last-message]").click(); 38 | cy.wait(100); 39 | cy.get("[data-cy=add-three-last-messages]").click(); 40 | 41 | cy.get("[data-cy=last-message]") 42 | .invoke("text") 43 | .should("eq", "This is a third new message"); 44 | }); 45 | }); 46 | 47 | describe('All "message" event messages', () => { 48 | beforeEach(() => { 49 | cy.get("[data-cy=clear-messages]").click(); 50 | }); 51 | 52 | it("should be an empty section at the beginning", () => { 53 | cy.get("[data-cy=messages]").invoke("text").should("eq", ""); 54 | }); 55 | 56 | it("should display 3 messages", () => { 57 | cy.get("[data-cy=add-three-messages]").click(); 58 | 59 | cy.wait(100); 60 | 61 | cy.get("[data-cy=messages]") 62 | .children("li") 63 | .eq(2) 64 | .invoke("text") 65 | .should("eq", "This is one new message"); 66 | 67 | cy.get("[data-cy=messages]") 68 | .children("li") 69 | .eq(1) 70 | .invoke("text") 71 | .should("eq", "This is a second new message"); 72 | 73 | cy.get("[data-cy=messages]") 74 | .children("li") 75 | .eq(0) 76 | .invoke("text") 77 | .should("eq", "This is a third new message"); 78 | }); 79 | 80 | it("should manage the subscription and unsubscription flows", () => { 81 | cy.get("[data-cy=add-three-messages]").click(); 82 | cy.wait(100); 83 | 84 | cy.get("[data-cy=messages]").children("li").its("length").should("eq", 3); 85 | 86 | cy.get("[data-cy=unsubscribe-messages").click(); 87 | 88 | cy.get("[data-cy=add-three-messages]").click(); 89 | cy.wait(100); 90 | 91 | cy.get("[data-cy=messages]").children("li").its("length").should("eq", 3); 92 | 93 | cy.get("[data-cy=subscribe-messages").click(); 94 | 95 | cy.get("[data-cy=add-three-messages]").click(); 96 | cy.wait(100); 97 | 98 | cy.get("[data-cy=messages]").children("li").its("length").should("eq", 6); 99 | }); 100 | }); 101 | }); 102 | -------------------------------------------------------------------------------- /packages/use-socketio/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "use-socketio", 3 | "version": "2.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/compat-data": { 17 | "version": "7.11.0", 18 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", 19 | "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", 20 | "dev": true, 21 | "requires": { 22 | "browserslist": "^4.12.0", 23 | "invariant": "^2.2.4", 24 | "semver": "^5.5.0" 25 | } 26 | }, 27 | "@babel/core": { 28 | "version": "7.11.6", 29 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", 30 | "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", 31 | "dev": true, 32 | "requires": { 33 | "@babel/code-frame": "^7.10.4", 34 | "@babel/generator": "^7.11.6", 35 | "@babel/helper-module-transforms": "^7.11.0", 36 | "@babel/helpers": "^7.10.4", 37 | "@babel/parser": "^7.11.5", 38 | "@babel/template": "^7.10.4", 39 | "@babel/traverse": "^7.11.5", 40 | "@babel/types": "^7.11.5", 41 | "convert-source-map": "^1.7.0", 42 | "debug": "^4.1.0", 43 | "gensync": "^1.0.0-beta.1", 44 | "json5": "^2.1.2", 45 | "lodash": "^4.17.19", 46 | "resolve": "^1.3.2", 47 | "semver": "^5.4.1", 48 | "source-map": "^0.5.0" 49 | } 50 | }, 51 | "@babel/generator": { 52 | "version": "7.11.6", 53 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", 54 | "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", 55 | "dev": true, 56 | "requires": { 57 | "@babel/types": "^7.11.5", 58 | "jsesc": "^2.5.1", 59 | "source-map": "^0.5.0" 60 | } 61 | }, 62 | "@babel/helper-annotate-as-pure": { 63 | "version": "7.10.4", 64 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", 65 | "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", 66 | "dev": true, 67 | "requires": { 68 | "@babel/types": "^7.10.4" 69 | } 70 | }, 71 | "@babel/helper-builder-binary-assignment-operator-visitor": { 72 | "version": "7.10.4", 73 | "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", 74 | "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", 75 | "dev": true, 76 | "requires": { 77 | "@babel/helper-explode-assignable-expression": "^7.10.4", 78 | "@babel/types": "^7.10.4" 79 | } 80 | }, 81 | "@babel/helper-builder-react-jsx": { 82 | "version": "7.10.4", 83 | "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", 84 | "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", 85 | "dev": true, 86 | "requires": { 87 | "@babel/helper-annotate-as-pure": "^7.10.4", 88 | "@babel/types": "^7.10.4" 89 | } 90 | }, 91 | "@babel/helper-builder-react-jsx-experimental": { 92 | "version": "7.11.5", 93 | "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz", 94 | "integrity": "sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw==", 95 | "dev": true, 96 | "requires": { 97 | "@babel/helper-annotate-as-pure": "^7.10.4", 98 | "@babel/helper-module-imports": "^7.10.4", 99 | "@babel/types": "^7.11.5" 100 | } 101 | }, 102 | "@babel/helper-compilation-targets": { 103 | "version": "7.10.4", 104 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", 105 | "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", 106 | "dev": true, 107 | "requires": { 108 | "@babel/compat-data": "^7.10.4", 109 | "browserslist": "^4.12.0", 110 | "invariant": "^2.2.4", 111 | "levenary": "^1.1.1", 112 | "semver": "^5.5.0" 113 | } 114 | }, 115 | "@babel/helper-create-class-features-plugin": { 116 | "version": "7.10.5", 117 | "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", 118 | "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", 119 | "dev": true, 120 | "requires": { 121 | "@babel/helper-function-name": "^7.10.4", 122 | "@babel/helper-member-expression-to-functions": "^7.10.5", 123 | "@babel/helper-optimise-call-expression": "^7.10.4", 124 | "@babel/helper-plugin-utils": "^7.10.4", 125 | "@babel/helper-replace-supers": "^7.10.4", 126 | "@babel/helper-split-export-declaration": "^7.10.4" 127 | } 128 | }, 129 | "@babel/helper-create-regexp-features-plugin": { 130 | "version": "7.10.4", 131 | "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", 132 | "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", 133 | "dev": true, 134 | "requires": { 135 | "@babel/helper-annotate-as-pure": "^7.10.4", 136 | "@babel/helper-regex": "^7.10.4", 137 | "regexpu-core": "^4.7.0" 138 | } 139 | }, 140 | "@babel/helper-define-map": { 141 | "version": "7.10.5", 142 | "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", 143 | "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", 144 | "dev": true, 145 | "requires": { 146 | "@babel/helper-function-name": "^7.10.4", 147 | "@babel/types": "^7.10.5", 148 | "lodash": "^4.17.19" 149 | } 150 | }, 151 | "@babel/helper-explode-assignable-expression": { 152 | "version": "7.11.4", 153 | "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", 154 | "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", 155 | "dev": true, 156 | "requires": { 157 | "@babel/types": "^7.10.4" 158 | } 159 | }, 160 | "@babel/helper-function-name": { 161 | "version": "7.10.4", 162 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", 163 | "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", 164 | "dev": true, 165 | "requires": { 166 | "@babel/helper-get-function-arity": "^7.10.4", 167 | "@babel/template": "^7.10.4", 168 | "@babel/types": "^7.10.4" 169 | } 170 | }, 171 | "@babel/helper-get-function-arity": { 172 | "version": "7.10.4", 173 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", 174 | "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", 175 | "dev": true, 176 | "requires": { 177 | "@babel/types": "^7.10.4" 178 | } 179 | }, 180 | "@babel/helper-hoist-variables": { 181 | "version": "7.10.4", 182 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", 183 | "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", 184 | "dev": true, 185 | "requires": { 186 | "@babel/types": "^7.10.4" 187 | } 188 | }, 189 | "@babel/helper-member-expression-to-functions": { 190 | "version": "7.11.0", 191 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", 192 | "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", 193 | "dev": true, 194 | "requires": { 195 | "@babel/types": "^7.11.0" 196 | } 197 | }, 198 | "@babel/helper-module-imports": { 199 | "version": "7.10.4", 200 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", 201 | "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", 202 | "dev": true, 203 | "requires": { 204 | "@babel/types": "^7.10.4" 205 | } 206 | }, 207 | "@babel/helper-module-transforms": { 208 | "version": "7.11.0", 209 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", 210 | "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", 211 | "dev": true, 212 | "requires": { 213 | "@babel/helper-module-imports": "^7.10.4", 214 | "@babel/helper-replace-supers": "^7.10.4", 215 | "@babel/helper-simple-access": "^7.10.4", 216 | "@babel/helper-split-export-declaration": "^7.11.0", 217 | "@babel/template": "^7.10.4", 218 | "@babel/types": "^7.11.0", 219 | "lodash": "^4.17.19" 220 | } 221 | }, 222 | "@babel/helper-optimise-call-expression": { 223 | "version": "7.10.4", 224 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", 225 | "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", 226 | "dev": true, 227 | "requires": { 228 | "@babel/types": "^7.10.4" 229 | } 230 | }, 231 | "@babel/helper-plugin-utils": { 232 | "version": "7.10.4", 233 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", 234 | "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", 235 | "dev": true 236 | }, 237 | "@babel/helper-regex": { 238 | "version": "7.10.5", 239 | "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", 240 | "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", 241 | "dev": true, 242 | "requires": { 243 | "lodash": "^4.17.19" 244 | } 245 | }, 246 | "@babel/helper-remap-async-to-generator": { 247 | "version": "7.11.4", 248 | "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", 249 | "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", 250 | "dev": true, 251 | "requires": { 252 | "@babel/helper-annotate-as-pure": "^7.10.4", 253 | "@babel/helper-wrap-function": "^7.10.4", 254 | "@babel/template": "^7.10.4", 255 | "@babel/types": "^7.10.4" 256 | } 257 | }, 258 | "@babel/helper-replace-supers": { 259 | "version": "7.10.4", 260 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", 261 | "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", 262 | "dev": true, 263 | "requires": { 264 | "@babel/helper-member-expression-to-functions": "^7.10.4", 265 | "@babel/helper-optimise-call-expression": "^7.10.4", 266 | "@babel/traverse": "^7.10.4", 267 | "@babel/types": "^7.10.4" 268 | } 269 | }, 270 | "@babel/helper-simple-access": { 271 | "version": "7.10.4", 272 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", 273 | "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", 274 | "dev": true, 275 | "requires": { 276 | "@babel/template": "^7.10.4", 277 | "@babel/types": "^7.10.4" 278 | } 279 | }, 280 | "@babel/helper-skip-transparent-expression-wrappers": { 281 | "version": "7.11.0", 282 | "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", 283 | "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", 284 | "dev": true, 285 | "requires": { 286 | "@babel/types": "^7.11.0" 287 | } 288 | }, 289 | "@babel/helper-split-export-declaration": { 290 | "version": "7.11.0", 291 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", 292 | "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", 293 | "dev": true, 294 | "requires": { 295 | "@babel/types": "^7.11.0" 296 | } 297 | }, 298 | "@babel/helper-validator-identifier": { 299 | "version": "7.10.4", 300 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 301 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 302 | "dev": true 303 | }, 304 | "@babel/helper-wrap-function": { 305 | "version": "7.10.4", 306 | "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", 307 | "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", 308 | "dev": true, 309 | "requires": { 310 | "@babel/helper-function-name": "^7.10.4", 311 | "@babel/template": "^7.10.4", 312 | "@babel/traverse": "^7.10.4", 313 | "@babel/types": "^7.10.4" 314 | } 315 | }, 316 | "@babel/helpers": { 317 | "version": "7.10.4", 318 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", 319 | "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", 320 | "dev": true, 321 | "requires": { 322 | "@babel/template": "^7.10.4", 323 | "@babel/traverse": "^7.10.4", 324 | "@babel/types": "^7.10.4" 325 | } 326 | }, 327 | "@babel/highlight": { 328 | "version": "7.10.4", 329 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 330 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 331 | "dev": true, 332 | "requires": { 333 | "@babel/helper-validator-identifier": "^7.10.4", 334 | "chalk": "^2.0.0", 335 | "js-tokens": "^4.0.0" 336 | } 337 | }, 338 | "@babel/parser": { 339 | "version": "7.11.5", 340 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", 341 | "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", 342 | "dev": true 343 | }, 344 | "@babel/plugin-proposal-async-generator-functions": { 345 | "version": "7.10.5", 346 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", 347 | "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", 348 | "dev": true, 349 | "requires": { 350 | "@babel/helper-plugin-utils": "^7.10.4", 351 | "@babel/helper-remap-async-to-generator": "^7.10.4", 352 | "@babel/plugin-syntax-async-generators": "^7.8.0" 353 | } 354 | }, 355 | "@babel/plugin-proposal-class-properties": { 356 | "version": "7.10.4", 357 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", 358 | "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", 359 | "dev": true, 360 | "requires": { 361 | "@babel/helper-create-class-features-plugin": "^7.10.4", 362 | "@babel/helper-plugin-utils": "^7.10.4" 363 | } 364 | }, 365 | "@babel/plugin-proposal-dynamic-import": { 366 | "version": "7.10.4", 367 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", 368 | "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", 369 | "dev": true, 370 | "requires": { 371 | "@babel/helper-plugin-utils": "^7.10.4", 372 | "@babel/plugin-syntax-dynamic-import": "^7.8.0" 373 | } 374 | }, 375 | "@babel/plugin-proposal-export-namespace-from": { 376 | "version": "7.10.4", 377 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", 378 | "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", 379 | "dev": true, 380 | "requires": { 381 | "@babel/helper-plugin-utils": "^7.10.4", 382 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3" 383 | } 384 | }, 385 | "@babel/plugin-proposal-json-strings": { 386 | "version": "7.10.4", 387 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", 388 | "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", 389 | "dev": true, 390 | "requires": { 391 | "@babel/helper-plugin-utils": "^7.10.4", 392 | "@babel/plugin-syntax-json-strings": "^7.8.0" 393 | } 394 | }, 395 | "@babel/plugin-proposal-logical-assignment-operators": { 396 | "version": "7.11.0", 397 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", 398 | "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", 399 | "dev": true, 400 | "requires": { 401 | "@babel/helper-plugin-utils": "^7.10.4", 402 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" 403 | } 404 | }, 405 | "@babel/plugin-proposal-nullish-coalescing-operator": { 406 | "version": "7.10.4", 407 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", 408 | "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", 409 | "dev": true, 410 | "requires": { 411 | "@babel/helper-plugin-utils": "^7.10.4", 412 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" 413 | } 414 | }, 415 | "@babel/plugin-proposal-numeric-separator": { 416 | "version": "7.10.4", 417 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", 418 | "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", 419 | "dev": true, 420 | "requires": { 421 | "@babel/helper-plugin-utils": "^7.10.4", 422 | "@babel/plugin-syntax-numeric-separator": "^7.10.4" 423 | } 424 | }, 425 | "@babel/plugin-proposal-object-rest-spread": { 426 | "version": "7.11.0", 427 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", 428 | "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", 429 | "dev": true, 430 | "requires": { 431 | "@babel/helper-plugin-utils": "^7.10.4", 432 | "@babel/plugin-syntax-object-rest-spread": "^7.8.0", 433 | "@babel/plugin-transform-parameters": "^7.10.4" 434 | } 435 | }, 436 | "@babel/plugin-proposal-optional-catch-binding": { 437 | "version": "7.10.4", 438 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", 439 | "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", 440 | "dev": true, 441 | "requires": { 442 | "@babel/helper-plugin-utils": "^7.10.4", 443 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" 444 | } 445 | }, 446 | "@babel/plugin-proposal-optional-chaining": { 447 | "version": "7.11.0", 448 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", 449 | "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", 450 | "dev": true, 451 | "requires": { 452 | "@babel/helper-plugin-utils": "^7.10.4", 453 | "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", 454 | "@babel/plugin-syntax-optional-chaining": "^7.8.0" 455 | } 456 | }, 457 | "@babel/plugin-proposal-private-methods": { 458 | "version": "7.10.4", 459 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", 460 | "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", 461 | "dev": true, 462 | "requires": { 463 | "@babel/helper-create-class-features-plugin": "^7.10.4", 464 | "@babel/helper-plugin-utils": "^7.10.4" 465 | } 466 | }, 467 | "@babel/plugin-proposal-unicode-property-regex": { 468 | "version": "7.10.4", 469 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", 470 | "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", 471 | "dev": true, 472 | "requires": { 473 | "@babel/helper-create-regexp-features-plugin": "^7.10.4", 474 | "@babel/helper-plugin-utils": "^7.10.4" 475 | } 476 | }, 477 | "@babel/plugin-syntax-async-generators": { 478 | "version": "7.8.4", 479 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 480 | "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 481 | "dev": true, 482 | "requires": { 483 | "@babel/helper-plugin-utils": "^7.8.0" 484 | } 485 | }, 486 | "@babel/plugin-syntax-class-properties": { 487 | "version": "7.10.4", 488 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", 489 | "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", 490 | "dev": true, 491 | "requires": { 492 | "@babel/helper-plugin-utils": "^7.10.4" 493 | } 494 | }, 495 | "@babel/plugin-syntax-dynamic-import": { 496 | "version": "7.8.3", 497 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", 498 | "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", 499 | "dev": true, 500 | "requires": { 501 | "@babel/helper-plugin-utils": "^7.8.0" 502 | } 503 | }, 504 | "@babel/plugin-syntax-export-namespace-from": { 505 | "version": "7.8.3", 506 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", 507 | "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", 508 | "dev": true, 509 | "requires": { 510 | "@babel/helper-plugin-utils": "^7.8.3" 511 | } 512 | }, 513 | "@babel/plugin-syntax-json-strings": { 514 | "version": "7.8.3", 515 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 516 | "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 517 | "dev": true, 518 | "requires": { 519 | "@babel/helper-plugin-utils": "^7.8.0" 520 | } 521 | }, 522 | "@babel/plugin-syntax-jsx": { 523 | "version": "7.10.4", 524 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", 525 | "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", 526 | "dev": true, 527 | "requires": { 528 | "@babel/helper-plugin-utils": "^7.10.4" 529 | } 530 | }, 531 | "@babel/plugin-syntax-logical-assignment-operators": { 532 | "version": "7.10.4", 533 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", 534 | "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", 535 | "dev": true, 536 | "requires": { 537 | "@babel/helper-plugin-utils": "^7.10.4" 538 | } 539 | }, 540 | "@babel/plugin-syntax-nullish-coalescing-operator": { 541 | "version": "7.8.3", 542 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 543 | "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 544 | "dev": true, 545 | "requires": { 546 | "@babel/helper-plugin-utils": "^7.8.0" 547 | } 548 | }, 549 | "@babel/plugin-syntax-numeric-separator": { 550 | "version": "7.10.4", 551 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", 552 | "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", 553 | "dev": true, 554 | "requires": { 555 | "@babel/helper-plugin-utils": "^7.10.4" 556 | } 557 | }, 558 | "@babel/plugin-syntax-object-rest-spread": { 559 | "version": "7.8.3", 560 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 561 | "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 562 | "dev": true, 563 | "requires": { 564 | "@babel/helper-plugin-utils": "^7.8.0" 565 | } 566 | }, 567 | "@babel/plugin-syntax-optional-catch-binding": { 568 | "version": "7.8.3", 569 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 570 | "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 571 | "dev": true, 572 | "requires": { 573 | "@babel/helper-plugin-utils": "^7.8.0" 574 | } 575 | }, 576 | "@babel/plugin-syntax-optional-chaining": { 577 | "version": "7.8.3", 578 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 579 | "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 580 | "dev": true, 581 | "requires": { 582 | "@babel/helper-plugin-utils": "^7.8.0" 583 | } 584 | }, 585 | "@babel/plugin-syntax-top-level-await": { 586 | "version": "7.10.4", 587 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", 588 | "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", 589 | "dev": true, 590 | "requires": { 591 | "@babel/helper-plugin-utils": "^7.10.4" 592 | } 593 | }, 594 | "@babel/plugin-transform-arrow-functions": { 595 | "version": "7.10.4", 596 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", 597 | "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", 598 | "dev": true, 599 | "requires": { 600 | "@babel/helper-plugin-utils": "^7.10.4" 601 | } 602 | }, 603 | "@babel/plugin-transform-async-to-generator": { 604 | "version": "7.10.4", 605 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", 606 | "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", 607 | "dev": true, 608 | "requires": { 609 | "@babel/helper-module-imports": "^7.10.4", 610 | "@babel/helper-plugin-utils": "^7.10.4", 611 | "@babel/helper-remap-async-to-generator": "^7.10.4" 612 | } 613 | }, 614 | "@babel/plugin-transform-block-scoped-functions": { 615 | "version": "7.10.4", 616 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", 617 | "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", 618 | "dev": true, 619 | "requires": { 620 | "@babel/helper-plugin-utils": "^7.10.4" 621 | } 622 | }, 623 | "@babel/plugin-transform-block-scoping": { 624 | "version": "7.11.1", 625 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", 626 | "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", 627 | "dev": true, 628 | "requires": { 629 | "@babel/helper-plugin-utils": "^7.10.4" 630 | } 631 | }, 632 | "@babel/plugin-transform-classes": { 633 | "version": "7.10.4", 634 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", 635 | "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", 636 | "dev": true, 637 | "requires": { 638 | "@babel/helper-annotate-as-pure": "^7.10.4", 639 | "@babel/helper-define-map": "^7.10.4", 640 | "@babel/helper-function-name": "^7.10.4", 641 | "@babel/helper-optimise-call-expression": "^7.10.4", 642 | "@babel/helper-plugin-utils": "^7.10.4", 643 | "@babel/helper-replace-supers": "^7.10.4", 644 | "@babel/helper-split-export-declaration": "^7.10.4", 645 | "globals": "^11.1.0" 646 | } 647 | }, 648 | "@babel/plugin-transform-computed-properties": { 649 | "version": "7.10.4", 650 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", 651 | "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", 652 | "dev": true, 653 | "requires": { 654 | "@babel/helper-plugin-utils": "^7.10.4" 655 | } 656 | }, 657 | "@babel/plugin-transform-destructuring": { 658 | "version": "7.10.4", 659 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", 660 | "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", 661 | "dev": true, 662 | "requires": { 663 | "@babel/helper-plugin-utils": "^7.10.4" 664 | } 665 | }, 666 | "@babel/plugin-transform-dotall-regex": { 667 | "version": "7.10.4", 668 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", 669 | "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", 670 | "dev": true, 671 | "requires": { 672 | "@babel/helper-create-regexp-features-plugin": "^7.10.4", 673 | "@babel/helper-plugin-utils": "^7.10.4" 674 | } 675 | }, 676 | "@babel/plugin-transform-duplicate-keys": { 677 | "version": "7.10.4", 678 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", 679 | "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", 680 | "dev": true, 681 | "requires": { 682 | "@babel/helper-plugin-utils": "^7.10.4" 683 | } 684 | }, 685 | "@babel/plugin-transform-exponentiation-operator": { 686 | "version": "7.10.4", 687 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", 688 | "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", 689 | "dev": true, 690 | "requires": { 691 | "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", 692 | "@babel/helper-plugin-utils": "^7.10.4" 693 | } 694 | }, 695 | "@babel/plugin-transform-for-of": { 696 | "version": "7.10.4", 697 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", 698 | "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", 699 | "dev": true, 700 | "requires": { 701 | "@babel/helper-plugin-utils": "^7.10.4" 702 | } 703 | }, 704 | "@babel/plugin-transform-function-name": { 705 | "version": "7.10.4", 706 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", 707 | "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", 708 | "dev": true, 709 | "requires": { 710 | "@babel/helper-function-name": "^7.10.4", 711 | "@babel/helper-plugin-utils": "^7.10.4" 712 | } 713 | }, 714 | "@babel/plugin-transform-literals": { 715 | "version": "7.10.4", 716 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", 717 | "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", 718 | "dev": true, 719 | "requires": { 720 | "@babel/helper-plugin-utils": "^7.10.4" 721 | } 722 | }, 723 | "@babel/plugin-transform-member-expression-literals": { 724 | "version": "7.10.4", 725 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", 726 | "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", 727 | "dev": true, 728 | "requires": { 729 | "@babel/helper-plugin-utils": "^7.10.4" 730 | } 731 | }, 732 | "@babel/plugin-transform-modules-amd": { 733 | "version": "7.10.5", 734 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", 735 | "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", 736 | "dev": true, 737 | "requires": { 738 | "@babel/helper-module-transforms": "^7.10.5", 739 | "@babel/helper-plugin-utils": "^7.10.4", 740 | "babel-plugin-dynamic-import-node": "^2.3.3" 741 | } 742 | }, 743 | "@babel/plugin-transform-modules-commonjs": { 744 | "version": "7.10.4", 745 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", 746 | "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", 747 | "dev": true, 748 | "requires": { 749 | "@babel/helper-module-transforms": "^7.10.4", 750 | "@babel/helper-plugin-utils": "^7.10.4", 751 | "@babel/helper-simple-access": "^7.10.4", 752 | "babel-plugin-dynamic-import-node": "^2.3.3" 753 | } 754 | }, 755 | "@babel/plugin-transform-modules-systemjs": { 756 | "version": "7.10.5", 757 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", 758 | "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", 759 | "dev": true, 760 | "requires": { 761 | "@babel/helper-hoist-variables": "^7.10.4", 762 | "@babel/helper-module-transforms": "^7.10.5", 763 | "@babel/helper-plugin-utils": "^7.10.4", 764 | "babel-plugin-dynamic-import-node": "^2.3.3" 765 | } 766 | }, 767 | "@babel/plugin-transform-modules-umd": { 768 | "version": "7.10.4", 769 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", 770 | "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", 771 | "dev": true, 772 | "requires": { 773 | "@babel/helper-module-transforms": "^7.10.4", 774 | "@babel/helper-plugin-utils": "^7.10.4" 775 | } 776 | }, 777 | "@babel/plugin-transform-named-capturing-groups-regex": { 778 | "version": "7.10.4", 779 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", 780 | "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", 781 | "dev": true, 782 | "requires": { 783 | "@babel/helper-create-regexp-features-plugin": "^7.10.4" 784 | } 785 | }, 786 | "@babel/plugin-transform-new-target": { 787 | "version": "7.10.4", 788 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", 789 | "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", 790 | "dev": true, 791 | "requires": { 792 | "@babel/helper-plugin-utils": "^7.10.4" 793 | } 794 | }, 795 | "@babel/plugin-transform-object-super": { 796 | "version": "7.10.4", 797 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", 798 | "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", 799 | "dev": true, 800 | "requires": { 801 | "@babel/helper-plugin-utils": "^7.10.4", 802 | "@babel/helper-replace-supers": "^7.10.4" 803 | } 804 | }, 805 | "@babel/plugin-transform-parameters": { 806 | "version": "7.10.5", 807 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", 808 | "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", 809 | "dev": true, 810 | "requires": { 811 | "@babel/helper-get-function-arity": "^7.10.4", 812 | "@babel/helper-plugin-utils": "^7.10.4" 813 | } 814 | }, 815 | "@babel/plugin-transform-property-literals": { 816 | "version": "7.10.4", 817 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", 818 | "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", 819 | "dev": true, 820 | "requires": { 821 | "@babel/helper-plugin-utils": "^7.10.4" 822 | } 823 | }, 824 | "@babel/plugin-transform-react-display-name": { 825 | "version": "7.10.4", 826 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", 827 | "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", 828 | "dev": true, 829 | "requires": { 830 | "@babel/helper-plugin-utils": "^7.10.4" 831 | } 832 | }, 833 | "@babel/plugin-transform-react-jsx": { 834 | "version": "7.10.4", 835 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", 836 | "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", 837 | "dev": true, 838 | "requires": { 839 | "@babel/helper-builder-react-jsx": "^7.10.4", 840 | "@babel/helper-builder-react-jsx-experimental": "^7.10.4", 841 | "@babel/helper-plugin-utils": "^7.10.4", 842 | "@babel/plugin-syntax-jsx": "^7.10.4" 843 | } 844 | }, 845 | "@babel/plugin-transform-react-jsx-development": { 846 | "version": "7.11.5", 847 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz", 848 | "integrity": "sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw==", 849 | "dev": true, 850 | "requires": { 851 | "@babel/helper-builder-react-jsx-experimental": "^7.11.5", 852 | "@babel/helper-plugin-utils": "^7.10.4", 853 | "@babel/plugin-syntax-jsx": "^7.10.4" 854 | } 855 | }, 856 | "@babel/plugin-transform-react-jsx-self": { 857 | "version": "7.10.4", 858 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", 859 | "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", 860 | "dev": true, 861 | "requires": { 862 | "@babel/helper-plugin-utils": "^7.10.4", 863 | "@babel/plugin-syntax-jsx": "^7.10.4" 864 | } 865 | }, 866 | "@babel/plugin-transform-react-jsx-source": { 867 | "version": "7.10.5", 868 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", 869 | "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", 870 | "dev": true, 871 | "requires": { 872 | "@babel/helper-plugin-utils": "^7.10.4", 873 | "@babel/plugin-syntax-jsx": "^7.10.4" 874 | } 875 | }, 876 | "@babel/plugin-transform-react-pure-annotations": { 877 | "version": "7.10.4", 878 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", 879 | "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", 880 | "dev": true, 881 | "requires": { 882 | "@babel/helper-annotate-as-pure": "^7.10.4", 883 | "@babel/helper-plugin-utils": "^7.10.4" 884 | } 885 | }, 886 | "@babel/plugin-transform-regenerator": { 887 | "version": "7.10.4", 888 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", 889 | "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", 890 | "dev": true, 891 | "requires": { 892 | "regenerator-transform": "^0.14.2" 893 | } 894 | }, 895 | "@babel/plugin-transform-reserved-words": { 896 | "version": "7.10.4", 897 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", 898 | "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", 899 | "dev": true, 900 | "requires": { 901 | "@babel/helper-plugin-utils": "^7.10.4" 902 | } 903 | }, 904 | "@babel/plugin-transform-shorthand-properties": { 905 | "version": "7.10.4", 906 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", 907 | "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", 908 | "dev": true, 909 | "requires": { 910 | "@babel/helper-plugin-utils": "^7.10.4" 911 | } 912 | }, 913 | "@babel/plugin-transform-spread": { 914 | "version": "7.11.0", 915 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", 916 | "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", 917 | "dev": true, 918 | "requires": { 919 | "@babel/helper-plugin-utils": "^7.10.4", 920 | "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" 921 | } 922 | }, 923 | "@babel/plugin-transform-sticky-regex": { 924 | "version": "7.10.4", 925 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", 926 | "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", 927 | "dev": true, 928 | "requires": { 929 | "@babel/helper-plugin-utils": "^7.10.4", 930 | "@babel/helper-regex": "^7.10.4" 931 | } 932 | }, 933 | "@babel/plugin-transform-template-literals": { 934 | "version": "7.10.5", 935 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", 936 | "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", 937 | "dev": true, 938 | "requires": { 939 | "@babel/helper-annotate-as-pure": "^7.10.4", 940 | "@babel/helper-plugin-utils": "^7.10.4" 941 | } 942 | }, 943 | "@babel/plugin-transform-typeof-symbol": { 944 | "version": "7.10.4", 945 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", 946 | "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", 947 | "dev": true, 948 | "requires": { 949 | "@babel/helper-plugin-utils": "^7.10.4" 950 | } 951 | }, 952 | "@babel/plugin-transform-unicode-escapes": { 953 | "version": "7.10.4", 954 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", 955 | "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", 956 | "dev": true, 957 | "requires": { 958 | "@babel/helper-plugin-utils": "^7.10.4" 959 | } 960 | }, 961 | "@babel/plugin-transform-unicode-regex": { 962 | "version": "7.10.4", 963 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", 964 | "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", 965 | "dev": true, 966 | "requires": { 967 | "@babel/helper-create-regexp-features-plugin": "^7.10.4", 968 | "@babel/helper-plugin-utils": "^7.10.4" 969 | } 970 | }, 971 | "@babel/preset-env": { 972 | "version": "7.11.5", 973 | "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", 974 | "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", 975 | "dev": true, 976 | "requires": { 977 | "@babel/compat-data": "^7.11.0", 978 | "@babel/helper-compilation-targets": "^7.10.4", 979 | "@babel/helper-module-imports": "^7.10.4", 980 | "@babel/helper-plugin-utils": "^7.10.4", 981 | "@babel/plugin-proposal-async-generator-functions": "^7.10.4", 982 | "@babel/plugin-proposal-class-properties": "^7.10.4", 983 | "@babel/plugin-proposal-dynamic-import": "^7.10.4", 984 | "@babel/plugin-proposal-export-namespace-from": "^7.10.4", 985 | "@babel/plugin-proposal-json-strings": "^7.10.4", 986 | "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", 987 | "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", 988 | "@babel/plugin-proposal-numeric-separator": "^7.10.4", 989 | "@babel/plugin-proposal-object-rest-spread": "^7.11.0", 990 | "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", 991 | "@babel/plugin-proposal-optional-chaining": "^7.11.0", 992 | "@babel/plugin-proposal-private-methods": "^7.10.4", 993 | "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", 994 | "@babel/plugin-syntax-async-generators": "^7.8.0", 995 | "@babel/plugin-syntax-class-properties": "^7.10.4", 996 | "@babel/plugin-syntax-dynamic-import": "^7.8.0", 997 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3", 998 | "@babel/plugin-syntax-json-strings": "^7.8.0", 999 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", 1000 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", 1001 | "@babel/plugin-syntax-numeric-separator": "^7.10.4", 1002 | "@babel/plugin-syntax-object-rest-spread": "^7.8.0", 1003 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", 1004 | "@babel/plugin-syntax-optional-chaining": "^7.8.0", 1005 | "@babel/plugin-syntax-top-level-await": "^7.10.4", 1006 | "@babel/plugin-transform-arrow-functions": "^7.10.4", 1007 | "@babel/plugin-transform-async-to-generator": "^7.10.4", 1008 | "@babel/plugin-transform-block-scoped-functions": "^7.10.4", 1009 | "@babel/plugin-transform-block-scoping": "^7.10.4", 1010 | "@babel/plugin-transform-classes": "^7.10.4", 1011 | "@babel/plugin-transform-computed-properties": "^7.10.4", 1012 | "@babel/plugin-transform-destructuring": "^7.10.4", 1013 | "@babel/plugin-transform-dotall-regex": "^7.10.4", 1014 | "@babel/plugin-transform-duplicate-keys": "^7.10.4", 1015 | "@babel/plugin-transform-exponentiation-operator": "^7.10.4", 1016 | "@babel/plugin-transform-for-of": "^7.10.4", 1017 | "@babel/plugin-transform-function-name": "^7.10.4", 1018 | "@babel/plugin-transform-literals": "^7.10.4", 1019 | "@babel/plugin-transform-member-expression-literals": "^7.10.4", 1020 | "@babel/plugin-transform-modules-amd": "^7.10.4", 1021 | "@babel/plugin-transform-modules-commonjs": "^7.10.4", 1022 | "@babel/plugin-transform-modules-systemjs": "^7.10.4", 1023 | "@babel/plugin-transform-modules-umd": "^7.10.4", 1024 | "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", 1025 | "@babel/plugin-transform-new-target": "^7.10.4", 1026 | "@babel/plugin-transform-object-super": "^7.10.4", 1027 | "@babel/plugin-transform-parameters": "^7.10.4", 1028 | "@babel/plugin-transform-property-literals": "^7.10.4", 1029 | "@babel/plugin-transform-regenerator": "^7.10.4", 1030 | "@babel/plugin-transform-reserved-words": "^7.10.4", 1031 | "@babel/plugin-transform-shorthand-properties": "^7.10.4", 1032 | "@babel/plugin-transform-spread": "^7.11.0", 1033 | "@babel/plugin-transform-sticky-regex": "^7.10.4", 1034 | "@babel/plugin-transform-template-literals": "^7.10.4", 1035 | "@babel/plugin-transform-typeof-symbol": "^7.10.4", 1036 | "@babel/plugin-transform-unicode-escapes": "^7.10.4", 1037 | "@babel/plugin-transform-unicode-regex": "^7.10.4", 1038 | "@babel/preset-modules": "^0.1.3", 1039 | "@babel/types": "^7.11.5", 1040 | "browserslist": "^4.12.0", 1041 | "core-js-compat": "^3.6.2", 1042 | "invariant": "^2.2.2", 1043 | "levenary": "^1.1.1", 1044 | "semver": "^5.5.0" 1045 | } 1046 | }, 1047 | "@babel/preset-modules": { 1048 | "version": "0.1.4", 1049 | "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", 1050 | "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", 1051 | "dev": true, 1052 | "requires": { 1053 | "@babel/helper-plugin-utils": "^7.0.0", 1054 | "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", 1055 | "@babel/plugin-transform-dotall-regex": "^7.4.4", 1056 | "@babel/types": "^7.4.4", 1057 | "esutils": "^2.0.2" 1058 | } 1059 | }, 1060 | "@babel/preset-react": { 1061 | "version": "7.10.4", 1062 | "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", 1063 | "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", 1064 | "dev": true, 1065 | "requires": { 1066 | "@babel/helper-plugin-utils": "^7.10.4", 1067 | "@babel/plugin-transform-react-display-name": "^7.10.4", 1068 | "@babel/plugin-transform-react-jsx": "^7.10.4", 1069 | "@babel/plugin-transform-react-jsx-development": "^7.10.4", 1070 | "@babel/plugin-transform-react-jsx-self": "^7.10.4", 1071 | "@babel/plugin-transform-react-jsx-source": "^7.10.4", 1072 | "@babel/plugin-transform-react-pure-annotations": "^7.10.4" 1073 | } 1074 | }, 1075 | "@babel/runtime": { 1076 | "version": "7.11.2", 1077 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", 1078 | "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", 1079 | "dev": true, 1080 | "requires": { 1081 | "regenerator-runtime": "^0.13.4" 1082 | } 1083 | }, 1084 | "@babel/template": { 1085 | "version": "7.10.4", 1086 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", 1087 | "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", 1088 | "dev": true, 1089 | "requires": { 1090 | "@babel/code-frame": "^7.10.4", 1091 | "@babel/parser": "^7.10.4", 1092 | "@babel/types": "^7.10.4" 1093 | } 1094 | }, 1095 | "@babel/traverse": { 1096 | "version": "7.11.5", 1097 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", 1098 | "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", 1099 | "dev": true, 1100 | "requires": { 1101 | "@babel/code-frame": "^7.10.4", 1102 | "@babel/generator": "^7.11.5", 1103 | "@babel/helper-function-name": "^7.10.4", 1104 | "@babel/helper-split-export-declaration": "^7.11.0", 1105 | "@babel/parser": "^7.11.5", 1106 | "@babel/types": "^7.11.5", 1107 | "debug": "^4.1.0", 1108 | "globals": "^11.1.0", 1109 | "lodash": "^4.17.19" 1110 | } 1111 | }, 1112 | "@babel/types": { 1113 | "version": "7.11.5", 1114 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", 1115 | "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", 1116 | "dev": true, 1117 | "requires": { 1118 | "@babel/helper-validator-identifier": "^7.10.4", 1119 | "lodash": "^4.17.19", 1120 | "to-fast-properties": "^2.0.0" 1121 | } 1122 | }, 1123 | "@types/component-emitter": { 1124 | "version": "1.2.10", 1125 | "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", 1126 | "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" 1127 | }, 1128 | "@types/prop-types": { 1129 | "version": "15.7.3", 1130 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", 1131 | "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", 1132 | "dev": true 1133 | }, 1134 | "@types/react": { 1135 | "version": "16.9.49", 1136 | "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.49.tgz", 1137 | "integrity": "sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g==", 1138 | "dev": true, 1139 | "requires": { 1140 | "@types/prop-types": "*", 1141 | "csstype": "^3.0.2" 1142 | } 1143 | }, 1144 | "@types/react-dom": { 1145 | "version": "16.9.8", 1146 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.8.tgz", 1147 | "integrity": "sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==", 1148 | "dev": true, 1149 | "requires": { 1150 | "@types/react": "*" 1151 | } 1152 | }, 1153 | "@types/socket.io-client": { 1154 | "version": "1.4.34", 1155 | "resolved": "https://registry.npmjs.org/@types/socket.io-client/-/socket.io-client-1.4.34.tgz", 1156 | "integrity": "sha512-Lzia5OTQFJZJ5R4HsEEldywiiqT9+W2rDbyHJiiTGqOcju89sCsQ8aUXDljY6Ls33wKZZGC0bfMhr/VpOyjtXg==", 1157 | "dev": true 1158 | }, 1159 | "ansi-styles": { 1160 | "version": "3.2.1", 1161 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1162 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1163 | "dev": true, 1164 | "requires": { 1165 | "color-convert": "^1.9.0" 1166 | } 1167 | }, 1168 | "argparse": { 1169 | "version": "1.0.10", 1170 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 1171 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 1172 | "dev": true, 1173 | "requires": { 1174 | "sprintf-js": "~1.0.2" 1175 | } 1176 | }, 1177 | "babel-plugin-dynamic-import-node": { 1178 | "version": "2.3.3", 1179 | "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", 1180 | "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", 1181 | "dev": true, 1182 | "requires": { 1183 | "object.assign": "^4.1.0" 1184 | } 1185 | }, 1186 | "backo2": { 1187 | "version": "1.0.2", 1188 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 1189 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 1190 | }, 1191 | "balanced-match": { 1192 | "version": "1.0.0", 1193 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 1194 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 1195 | "dev": true 1196 | }, 1197 | "base64-arraybuffer": { 1198 | "version": "0.1.4", 1199 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", 1200 | "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" 1201 | }, 1202 | "brace-expansion": { 1203 | "version": "1.1.11", 1204 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1205 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1206 | "dev": true, 1207 | "requires": { 1208 | "balanced-match": "^1.0.0", 1209 | "concat-map": "0.0.1" 1210 | } 1211 | }, 1212 | "browserslist": { 1213 | "version": "4.14.3", 1214 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.3.tgz", 1215 | "integrity": "sha512-GcZPC5+YqyPO4SFnz48/B0YaCwS47Q9iPChRGi6t7HhflKBcINzFrJvRfC+jp30sRMKxF+d4EHGs27Z0XP1NaQ==", 1216 | "dev": true, 1217 | "requires": { 1218 | "caniuse-lite": "^1.0.30001131", 1219 | "electron-to-chromium": "^1.3.570", 1220 | "escalade": "^3.1.0", 1221 | "node-releases": "^1.1.61" 1222 | } 1223 | }, 1224 | "builtin-modules": { 1225 | "version": "1.1.1", 1226 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 1227 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 1228 | "dev": true 1229 | }, 1230 | "caniuse-lite": { 1231 | "version": "1.0.30001133", 1232 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001133.tgz", 1233 | "integrity": "sha512-s3XAUFaC/ntDb1O3lcw9K8MPeOW7KO3z9+GzAoBxfz1B0VdacXPMKgFUtG4KIsgmnbexmi013s9miVu4h+qMHw==", 1234 | "dev": true 1235 | }, 1236 | "chalk": { 1237 | "version": "2.4.2", 1238 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1239 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1240 | "dev": true, 1241 | "requires": { 1242 | "ansi-styles": "^3.2.1", 1243 | "escape-string-regexp": "^1.0.5", 1244 | "supports-color": "^5.3.0" 1245 | } 1246 | }, 1247 | "color-convert": { 1248 | "version": "1.9.3", 1249 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1250 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1251 | "dev": true, 1252 | "requires": { 1253 | "color-name": "1.1.3" 1254 | } 1255 | }, 1256 | "color-name": { 1257 | "version": "1.1.3", 1258 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1259 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1260 | "dev": true 1261 | }, 1262 | "commander": { 1263 | "version": "2.20.3", 1264 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1265 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 1266 | "dev": true 1267 | }, 1268 | "component-bind": { 1269 | "version": "1.0.0", 1270 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 1271 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" 1272 | }, 1273 | "component-emitter": { 1274 | "version": "1.3.0", 1275 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 1276 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 1277 | }, 1278 | "concat-map": { 1279 | "version": "0.0.1", 1280 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1281 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 1282 | "dev": true 1283 | }, 1284 | "convert-source-map": { 1285 | "version": "1.7.0", 1286 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", 1287 | "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", 1288 | "dev": true, 1289 | "requires": { 1290 | "safe-buffer": "~5.1.1" 1291 | } 1292 | }, 1293 | "core-js-compat": { 1294 | "version": "3.6.5", 1295 | "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", 1296 | "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", 1297 | "dev": true, 1298 | "requires": { 1299 | "browserslist": "^4.8.5", 1300 | "semver": "7.0.0" 1301 | }, 1302 | "dependencies": { 1303 | "semver": { 1304 | "version": "7.0.0", 1305 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1306 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1307 | "dev": true 1308 | } 1309 | } 1310 | }, 1311 | "csstype": { 1312 | "version": "3.0.3", 1313 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", 1314 | "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==", 1315 | "dev": true 1316 | }, 1317 | "debug": { 1318 | "version": "4.1.1", 1319 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1320 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1321 | "requires": { 1322 | "ms": "^2.1.1" 1323 | } 1324 | }, 1325 | "define-properties": { 1326 | "version": "1.1.3", 1327 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 1328 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 1329 | "dev": true, 1330 | "requires": { 1331 | "object-keys": "^1.0.12" 1332 | } 1333 | }, 1334 | "diff": { 1335 | "version": "4.0.2", 1336 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1337 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1338 | "dev": true 1339 | }, 1340 | "electron-to-chromium": { 1341 | "version": "1.3.570", 1342 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.570.tgz", 1343 | "integrity": "sha512-Y6OCoVQgFQBP5py6A/06+yWxUZHDlNr/gNDGatjH8AZqXl8X0tE4LfjLJsXGz/JmWJz8a6K7bR1k+QzZ+k//fg==", 1344 | "dev": true 1345 | }, 1346 | "engine.io-client": { 1347 | "version": "4.0.4", 1348 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-4.0.4.tgz", 1349 | "integrity": "sha512-and4JRvjv+BQ4WBLopYUFePxju3ms3aBRk0XjaLdh/t9TKv2LCKtKKWFRoRzIfUZsu3U38FcYqNLuXhfS16vqw==", 1350 | "requires": { 1351 | "base64-arraybuffer": "0.1.4", 1352 | "component-emitter": "~1.3.0", 1353 | "debug": "~4.1.0", 1354 | "engine.io-parser": "~4.0.1", 1355 | "has-cors": "1.1.0", 1356 | "parseqs": "0.0.6", 1357 | "parseuri": "0.0.6", 1358 | "ws": "~7.2.1", 1359 | "xmlhttprequest-ssl": "~1.5.4", 1360 | "yeast": "0.1.2" 1361 | } 1362 | }, 1363 | "engine.io-parser": { 1364 | "version": "4.0.1", 1365 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.1.tgz", 1366 | "integrity": "sha512-v5aZK1hlckcJDGmHz3W8xvI3NUHYc9t8QtTbqdR5OaH3S9iJZilPubauOm+vLWOMMWzpE3hiq92l9lTAHamRCg==" 1367 | }, 1368 | "es-abstract": { 1369 | "version": "1.18.0-next.0", 1370 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", 1371 | "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", 1372 | "dev": true, 1373 | "requires": { 1374 | "es-to-primitive": "^1.2.1", 1375 | "function-bind": "^1.1.1", 1376 | "has": "^1.0.3", 1377 | "has-symbols": "^1.0.1", 1378 | "is-callable": "^1.2.0", 1379 | "is-negative-zero": "^2.0.0", 1380 | "is-regex": "^1.1.1", 1381 | "object-inspect": "^1.8.0", 1382 | "object-keys": "^1.1.1", 1383 | "object.assign": "^4.1.0", 1384 | "string.prototype.trimend": "^1.0.1", 1385 | "string.prototype.trimstart": "^1.0.1" 1386 | } 1387 | }, 1388 | "es-to-primitive": { 1389 | "version": "1.2.1", 1390 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1391 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1392 | "dev": true, 1393 | "requires": { 1394 | "is-callable": "^1.1.4", 1395 | "is-date-object": "^1.0.1", 1396 | "is-symbol": "^1.0.2" 1397 | } 1398 | }, 1399 | "escalade": { 1400 | "version": "3.1.0", 1401 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", 1402 | "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", 1403 | "dev": true 1404 | }, 1405 | "escape-string-regexp": { 1406 | "version": "1.0.5", 1407 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1408 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1409 | "dev": true 1410 | }, 1411 | "eslint-plugin-prettier": { 1412 | "version": "2.7.0", 1413 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz", 1414 | "integrity": "sha512-CStQYJgALoQBw3FsBzH0VOVDRnJ/ZimUlpLm226U8qgqYJfPOY/CPK6wyRInMxh73HSKg5wyRwdS4BVYYHwokA==", 1415 | "dev": true, 1416 | "requires": { 1417 | "fast-diff": "^1.1.1", 1418 | "jest-docblock": "^21.0.0" 1419 | } 1420 | }, 1421 | "esprima": { 1422 | "version": "4.0.1", 1423 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1424 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1425 | "dev": true 1426 | }, 1427 | "esutils": { 1428 | "version": "2.0.3", 1429 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1430 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1431 | "dev": true 1432 | }, 1433 | "fast-diff": { 1434 | "version": "1.2.0", 1435 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", 1436 | "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", 1437 | "dev": true 1438 | }, 1439 | "fs.realpath": { 1440 | "version": "1.0.0", 1441 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1442 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1443 | "dev": true 1444 | }, 1445 | "function-bind": { 1446 | "version": "1.1.1", 1447 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1448 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1449 | "dev": true 1450 | }, 1451 | "gensync": { 1452 | "version": "1.0.0-beta.1", 1453 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", 1454 | "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", 1455 | "dev": true 1456 | }, 1457 | "glob": { 1458 | "version": "7.1.6", 1459 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1460 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1461 | "dev": true, 1462 | "requires": { 1463 | "fs.realpath": "^1.0.0", 1464 | "inflight": "^1.0.4", 1465 | "inherits": "2", 1466 | "minimatch": "^3.0.4", 1467 | "once": "^1.3.0", 1468 | "path-is-absolute": "^1.0.0" 1469 | } 1470 | }, 1471 | "globals": { 1472 | "version": "11.12.0", 1473 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1474 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1475 | "dev": true 1476 | }, 1477 | "has": { 1478 | "version": "1.0.3", 1479 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1480 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1481 | "dev": true, 1482 | "requires": { 1483 | "function-bind": "^1.1.1" 1484 | } 1485 | }, 1486 | "has-cors": { 1487 | "version": "1.1.0", 1488 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 1489 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" 1490 | }, 1491 | "has-flag": { 1492 | "version": "3.0.0", 1493 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1494 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1495 | "dev": true 1496 | }, 1497 | "has-symbols": { 1498 | "version": "1.0.1", 1499 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1500 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1501 | "dev": true 1502 | }, 1503 | "inflight": { 1504 | "version": "1.0.6", 1505 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1506 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1507 | "dev": true, 1508 | "requires": { 1509 | "once": "^1.3.0", 1510 | "wrappy": "1" 1511 | } 1512 | }, 1513 | "inherits": { 1514 | "version": "2.0.4", 1515 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1516 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1517 | "dev": true 1518 | }, 1519 | "invariant": { 1520 | "version": "2.2.4", 1521 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 1522 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 1523 | "dev": true, 1524 | "requires": { 1525 | "loose-envify": "^1.0.0" 1526 | } 1527 | }, 1528 | "is-callable": { 1529 | "version": "1.2.1", 1530 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", 1531 | "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", 1532 | "dev": true 1533 | }, 1534 | "is-date-object": { 1535 | "version": "1.0.2", 1536 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1537 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1538 | "dev": true 1539 | }, 1540 | "is-negative-zero": { 1541 | "version": "2.0.0", 1542 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", 1543 | "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", 1544 | "dev": true 1545 | }, 1546 | "is-regex": { 1547 | "version": "1.1.1", 1548 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", 1549 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", 1550 | "dev": true, 1551 | "requires": { 1552 | "has-symbols": "^1.0.1" 1553 | } 1554 | }, 1555 | "is-symbol": { 1556 | "version": "1.0.3", 1557 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1558 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1559 | "dev": true, 1560 | "requires": { 1561 | "has-symbols": "^1.0.1" 1562 | } 1563 | }, 1564 | "jest-docblock": { 1565 | "version": "21.2.0", 1566 | "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", 1567 | "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", 1568 | "dev": true 1569 | }, 1570 | "js-tokens": { 1571 | "version": "4.0.0", 1572 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1573 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1574 | "dev": true 1575 | }, 1576 | "js-yaml": { 1577 | "version": "3.14.0", 1578 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 1579 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 1580 | "dev": true, 1581 | "requires": { 1582 | "argparse": "^1.0.7", 1583 | "esprima": "^4.0.0" 1584 | } 1585 | }, 1586 | "jsesc": { 1587 | "version": "2.5.2", 1588 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1589 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1590 | "dev": true 1591 | }, 1592 | "json5": { 1593 | "version": "2.1.3", 1594 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", 1595 | "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", 1596 | "dev": true, 1597 | "requires": { 1598 | "minimist": "^1.2.5" 1599 | } 1600 | }, 1601 | "leven": { 1602 | "version": "3.1.0", 1603 | "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", 1604 | "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", 1605 | "dev": true 1606 | }, 1607 | "levenary": { 1608 | "version": "1.1.1", 1609 | "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", 1610 | "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", 1611 | "dev": true, 1612 | "requires": { 1613 | "leven": "^3.1.0" 1614 | } 1615 | }, 1616 | "lines-and-columns": { 1617 | "version": "1.1.6", 1618 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", 1619 | "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", 1620 | "dev": true 1621 | }, 1622 | "lodash": { 1623 | "version": "4.17.20", 1624 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 1625 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", 1626 | "dev": true 1627 | }, 1628 | "loose-envify": { 1629 | "version": "1.4.0", 1630 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1631 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1632 | "dev": true, 1633 | "requires": { 1634 | "js-tokens": "^3.0.0 || ^4.0.0" 1635 | } 1636 | }, 1637 | "minimatch": { 1638 | "version": "3.0.4", 1639 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1640 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1641 | "dev": true, 1642 | "requires": { 1643 | "brace-expansion": "^1.1.7" 1644 | } 1645 | }, 1646 | "minimist": { 1647 | "version": "1.2.5", 1648 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1649 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1650 | "dev": true 1651 | }, 1652 | "mkdirp": { 1653 | "version": "0.5.5", 1654 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1655 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1656 | "dev": true, 1657 | "requires": { 1658 | "minimist": "^1.2.5" 1659 | } 1660 | }, 1661 | "ms": { 1662 | "version": "2.1.2", 1663 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1664 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1665 | }, 1666 | "node-releases": { 1667 | "version": "1.1.61", 1668 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", 1669 | "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", 1670 | "dev": true 1671 | }, 1672 | "object-inspect": { 1673 | "version": "1.8.0", 1674 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", 1675 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", 1676 | "dev": true 1677 | }, 1678 | "object-keys": { 1679 | "version": "1.1.1", 1680 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1681 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1682 | "dev": true 1683 | }, 1684 | "object.assign": { 1685 | "version": "4.1.1", 1686 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", 1687 | "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", 1688 | "dev": true, 1689 | "requires": { 1690 | "define-properties": "^1.1.3", 1691 | "es-abstract": "^1.18.0-next.0", 1692 | "has-symbols": "^1.0.1", 1693 | "object-keys": "^1.1.1" 1694 | } 1695 | }, 1696 | "once": { 1697 | "version": "1.4.0", 1698 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1699 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1700 | "dev": true, 1701 | "requires": { 1702 | "wrappy": "1" 1703 | } 1704 | }, 1705 | "parseqs": { 1706 | "version": "0.0.6", 1707 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", 1708 | "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" 1709 | }, 1710 | "parseuri": { 1711 | "version": "0.0.6", 1712 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", 1713 | "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" 1714 | }, 1715 | "path-is-absolute": { 1716 | "version": "1.0.1", 1717 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1718 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1719 | "dev": true 1720 | }, 1721 | "path-parse": { 1722 | "version": "1.0.6", 1723 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1724 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1725 | "dev": true 1726 | }, 1727 | "prettier": { 1728 | "version": "2.1.2", 1729 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", 1730 | "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", 1731 | "dev": true 1732 | }, 1733 | "regenerate": { 1734 | "version": "1.4.1", 1735 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", 1736 | "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", 1737 | "dev": true 1738 | }, 1739 | "regenerate-unicode-properties": { 1740 | "version": "8.2.0", 1741 | "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", 1742 | "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", 1743 | "dev": true, 1744 | "requires": { 1745 | "regenerate": "^1.4.0" 1746 | } 1747 | }, 1748 | "regenerator-runtime": { 1749 | "version": "0.13.7", 1750 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", 1751 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", 1752 | "dev": true 1753 | }, 1754 | "regenerator-transform": { 1755 | "version": "0.14.5", 1756 | "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", 1757 | "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", 1758 | "dev": true, 1759 | "requires": { 1760 | "@babel/runtime": "^7.8.4" 1761 | } 1762 | }, 1763 | "regexpu-core": { 1764 | "version": "4.7.1", 1765 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", 1766 | "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", 1767 | "dev": true, 1768 | "requires": { 1769 | "regenerate": "^1.4.0", 1770 | "regenerate-unicode-properties": "^8.2.0", 1771 | "regjsgen": "^0.5.1", 1772 | "regjsparser": "^0.6.4", 1773 | "unicode-match-property-ecmascript": "^1.0.4", 1774 | "unicode-match-property-value-ecmascript": "^1.2.0" 1775 | } 1776 | }, 1777 | "regjsgen": { 1778 | "version": "0.5.2", 1779 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", 1780 | "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", 1781 | "dev": true 1782 | }, 1783 | "regjsparser": { 1784 | "version": "0.6.4", 1785 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", 1786 | "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", 1787 | "dev": true, 1788 | "requires": { 1789 | "jsesc": "~0.5.0" 1790 | }, 1791 | "dependencies": { 1792 | "jsesc": { 1793 | "version": "0.5.0", 1794 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 1795 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", 1796 | "dev": true 1797 | } 1798 | } 1799 | }, 1800 | "resolve": { 1801 | "version": "1.17.0", 1802 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 1803 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 1804 | "dev": true, 1805 | "requires": { 1806 | "path-parse": "^1.0.6" 1807 | } 1808 | }, 1809 | "safe-buffer": { 1810 | "version": "5.1.2", 1811 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1812 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1813 | "dev": true 1814 | }, 1815 | "semver": { 1816 | "version": "5.7.1", 1817 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1818 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1819 | "dev": true 1820 | }, 1821 | "socket.io-client": { 1822 | "version": "3.0.3", 1823 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-3.0.3.tgz", 1824 | "integrity": "sha512-kwCJAKb6JMqE9ZYXg78Dgt8rYLSwtJ/g/LJqpb/pOTFRZMSr1cKAsCaisHZ+IBwKHBY7DYOOkjtkHqseY3ZLpw==", 1825 | "requires": { 1826 | "@types/component-emitter": "^1.2.10", 1827 | "backo2": "1.0.2", 1828 | "component-bind": "1.0.0", 1829 | "component-emitter": "~1.3.0", 1830 | "debug": "~4.1.0", 1831 | "engine.io-client": "~4.0.0", 1832 | "parseuri": "0.0.6", 1833 | "socket.io-parser": "~4.0.1" 1834 | } 1835 | }, 1836 | "socket.io-parser": { 1837 | "version": "4.0.1", 1838 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.1.tgz", 1839 | "integrity": "sha512-5JfNykYptCwU2lkOI0ieoePWm+6stEhkZ2UnLDjqnE1YEjUlXXLd1lpxPZ+g+h3rtaytwWkWrLQCaJULlGqjOg==", 1840 | "requires": { 1841 | "component-emitter": "~1.3.0", 1842 | "debug": "~4.1.0" 1843 | } 1844 | }, 1845 | "source-map": { 1846 | "version": "0.5.7", 1847 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1848 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1849 | "dev": true 1850 | }, 1851 | "sprintf-js": { 1852 | "version": "1.0.3", 1853 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1854 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1855 | "dev": true 1856 | }, 1857 | "string.prototype.trimend": { 1858 | "version": "1.0.1", 1859 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 1860 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 1861 | "dev": true, 1862 | "requires": { 1863 | "define-properties": "^1.1.3", 1864 | "es-abstract": "^1.17.5" 1865 | }, 1866 | "dependencies": { 1867 | "es-abstract": { 1868 | "version": "1.17.6", 1869 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", 1870 | "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", 1871 | "dev": true, 1872 | "requires": { 1873 | "es-to-primitive": "^1.2.1", 1874 | "function-bind": "^1.1.1", 1875 | "has": "^1.0.3", 1876 | "has-symbols": "^1.0.1", 1877 | "is-callable": "^1.2.0", 1878 | "is-regex": "^1.1.0", 1879 | "object-inspect": "^1.7.0", 1880 | "object-keys": "^1.1.1", 1881 | "object.assign": "^4.1.0", 1882 | "string.prototype.trimend": "^1.0.1", 1883 | "string.prototype.trimstart": "^1.0.1" 1884 | } 1885 | } 1886 | } 1887 | }, 1888 | "string.prototype.trimstart": { 1889 | "version": "1.0.1", 1890 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 1891 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 1892 | "dev": true, 1893 | "requires": { 1894 | "define-properties": "^1.1.3", 1895 | "es-abstract": "^1.17.5" 1896 | }, 1897 | "dependencies": { 1898 | "es-abstract": { 1899 | "version": "1.17.6", 1900 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", 1901 | "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", 1902 | "dev": true, 1903 | "requires": { 1904 | "es-to-primitive": "^1.2.1", 1905 | "function-bind": "^1.1.1", 1906 | "has": "^1.0.3", 1907 | "has-symbols": "^1.0.1", 1908 | "is-callable": "^1.2.0", 1909 | "is-regex": "^1.1.0", 1910 | "object-inspect": "^1.7.0", 1911 | "object-keys": "^1.1.1", 1912 | "object.assign": "^4.1.0", 1913 | "string.prototype.trimend": "^1.0.1", 1914 | "string.prototype.trimstart": "^1.0.1" 1915 | } 1916 | } 1917 | } 1918 | }, 1919 | "supports-color": { 1920 | "version": "5.5.0", 1921 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1922 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1923 | "dev": true, 1924 | "requires": { 1925 | "has-flag": "^3.0.0" 1926 | } 1927 | }, 1928 | "to-fast-properties": { 1929 | "version": "2.0.0", 1930 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1931 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1932 | "dev": true 1933 | }, 1934 | "tslib": { 1935 | "version": "1.13.0", 1936 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 1937 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", 1938 | "dev": true 1939 | }, 1940 | "tslint": { 1941 | "version": "6.1.3", 1942 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", 1943 | "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", 1944 | "dev": true, 1945 | "requires": { 1946 | "@babel/code-frame": "^7.0.0", 1947 | "builtin-modules": "^1.1.1", 1948 | "chalk": "^2.3.0", 1949 | "commander": "^2.12.1", 1950 | "diff": "^4.0.1", 1951 | "glob": "^7.1.1", 1952 | "js-yaml": "^3.13.1", 1953 | "minimatch": "^3.0.4", 1954 | "mkdirp": "^0.5.3", 1955 | "resolve": "^1.3.2", 1956 | "semver": "^5.3.0", 1957 | "tslib": "^1.13.0", 1958 | "tsutils": "^2.29.0" 1959 | } 1960 | }, 1961 | "tslint-config-prettier": { 1962 | "version": "1.18.0", 1963 | "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", 1964 | "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", 1965 | "dev": true 1966 | }, 1967 | "tslint-plugin-prettier": { 1968 | "version": "2.3.0", 1969 | "resolved": "https://registry.npmjs.org/tslint-plugin-prettier/-/tslint-plugin-prettier-2.3.0.tgz", 1970 | "integrity": "sha512-F9e4K03yc9xuvv+A0v1EmjcnDwpz8SpCD8HzqSDe0eyg34cBinwn9JjmnnRrNAs4HdleRQj7qijp+P/JTxt4vA==", 1971 | "dev": true, 1972 | "requires": { 1973 | "eslint-plugin-prettier": "^2.2.0", 1974 | "lines-and-columns": "^1.1.6", 1975 | "tslib": "^1.7.1" 1976 | } 1977 | }, 1978 | "tsutils": { 1979 | "version": "2.29.0", 1980 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 1981 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 1982 | "dev": true, 1983 | "requires": { 1984 | "tslib": "^1.8.1" 1985 | } 1986 | }, 1987 | "typescript": { 1988 | "version": "4.0.3", 1989 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", 1990 | "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", 1991 | "dev": true 1992 | }, 1993 | "unicode-canonical-property-names-ecmascript": { 1994 | "version": "1.0.4", 1995 | "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", 1996 | "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", 1997 | "dev": true 1998 | }, 1999 | "unicode-match-property-ecmascript": { 2000 | "version": "1.0.4", 2001 | "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", 2002 | "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", 2003 | "dev": true, 2004 | "requires": { 2005 | "unicode-canonical-property-names-ecmascript": "^1.0.4", 2006 | "unicode-property-aliases-ecmascript": "^1.0.4" 2007 | } 2008 | }, 2009 | "unicode-match-property-value-ecmascript": { 2010 | "version": "1.2.0", 2011 | "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", 2012 | "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", 2013 | "dev": true 2014 | }, 2015 | "unicode-property-aliases-ecmascript": { 2016 | "version": "1.1.0", 2017 | "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", 2018 | "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", 2019 | "dev": true 2020 | }, 2021 | "wrappy": { 2022 | "version": "1.0.2", 2023 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2024 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2025 | "dev": true 2026 | }, 2027 | "ws": { 2028 | "version": "7.2.5", 2029 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", 2030 | "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==" 2031 | }, 2032 | "xmlhttprequest-ssl": { 2033 | "version": "1.5.5", 2034 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", 2035 | "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" 2036 | }, 2037 | "yeast": { 2038 | "version": "0.1.2", 2039 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", 2040 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" 2041 | } 2042 | } 2043 | } 2044 | --------------------------------------------------------------------------------