├── .gitignore
├── README.md
├── docker-compose.yml
├── images
├── snappy.png
└── snappy_login.png
├── public
├── .env.example
├── .gitignore
├── Dockerfile
├── README.md
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
├── src
│ ├── App.js
│ ├── assets
│ │ ├── loader.gif
│ │ ├── logo.svg
│ │ └── robot.gif
│ ├── components
│ │ ├── ChatContainer.jsx
│ │ ├── ChatInput.jsx
│ │ ├── Contacts.jsx
│ │ ├── Logout.jsx
│ │ ├── SetAvatar.jsx
│ │ └── Welcome.jsx
│ ├── index.css
│ ├── index.js
│ ├── pages
│ │ ├── Chat.jsx
│ │ ├── Login.jsx
│ │ └── Register.jsx
│ └── utils
│ │ └── APIRoutes.js
└── yarn.lock
└── server
├── .env
├── .env.example
├── Dockerfile
├── controllers
├── messageController.js
└── userController.js
├── index.js
├── models
├── messageModel.js
└── userModel.js
├── package.json
├── routes
├── auth.js
└── messages.js
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .env
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Snappy - Chat Application
2 | Snappy is chat application build with the power of MERN Stack. You can find the tutorial [here](https://www.youtube.com/watch?v=otaQKODEUFs)
3 |
4 |
5 | 
6 |
7 | 
8 |
9 | ## Installation Guide
10 |
11 | ### Requirements
12 | - [Nodejs](https://nodejs.org/en/download)
13 | - [Mongodb](https://www.mongodb.com/docs/manual/administration/install-community/)
14 |
15 | Both should be installed and make sure mongodb is running.
16 | ### Installation
17 |
18 | #### First Method
19 | ```shell
20 | git clone https://github.com/koolkishan/chat-app-react-nodejs
21 | cd chat-app-react-nodejs
22 | ```
23 | Now rename env files from .env.example to .env
24 | ```shell
25 | cd public
26 | mv .env.example .env
27 | cd ..
28 | cd server
29 | mv .env.example .env
30 | cd ..
31 | ```
32 |
33 | Now install the dependencies
34 | ```shell
35 | cd server
36 | yarn
37 | cd ..
38 | cd public
39 | yarn
40 | ```
41 | We are almost done, Now just start the development server.
42 |
43 | For Frontend.
44 | ```shell
45 | cd public
46 | yarn start
47 | ```
48 | For Backend.
49 |
50 | Open another terminal in folder, Also make sure mongodb is running in background.
51 | ```shell
52 | cd server
53 | yarn start
54 | ```
55 | Done! Now open localhost:3000 in your browser.
56 |
57 | #### Second Method
58 | - This method requires docker and docker-compose to be installed in your system.
59 | - Make sure you are in the root of your project and run the following command.
60 |
61 | ```shell
62 | docker compose build --no-cache
63 | ```
64 | after the build is complete run the containers using the following command
65 | ```shell
66 | docker compose up
67 | ```
68 | now open localhost:3000 in your browser.
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3.8'
2 | services:
3 | front:
4 | build: ./public
5 | ports:
6 | - 3000:3000
7 | api:
8 | build: ./server
9 | ports:
10 | - 5000:5000
11 |
--------------------------------------------------------------------------------
/images/snappy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koolkishan/chat-app-react-nodejs/acb6e130150d7eca375526c551b8342db881800a/images/snappy.png
--------------------------------------------------------------------------------
/images/snappy_login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koolkishan/chat-app-react-nodejs/acb6e130150d7eca375526c551b8342db881800a/images/snappy_login.png
--------------------------------------------------------------------------------
/public/.env.example:
--------------------------------------------------------------------------------
1 | REACT_APP_LOCALHOST_KEY="chat-app-current-user"
--------------------------------------------------------------------------------
/public/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/public/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:16-alpine
2 |
3 | WORKDIR /app
4 | COPY package*.json ./
5 | RUN npm install
6 | COPY . .
7 | EXPOSE 3000
8 |
9 | CMD ["npm","start"]
--------------------------------------------------------------------------------
/public/README.md:
--------------------------------------------------------------------------------
1 | # Getting Started with Create React App
2 |
3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
4 |
5 | ## Available Scripts
6 |
7 | In the project directory, you can run:
8 |
9 | ### `npm start`
10 |
11 | Runs the app in the development mode.\
12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
13 |
14 | The page will reload when you make changes.\
15 | You may also see any lint errors in the console.
16 |
17 | ### `npm test`
18 |
19 | Launches the test runner in the interactive watch mode.\
20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
21 |
22 | ### `npm run build`
23 |
24 | Builds the app for production to the `build` folder.\
25 | It correctly bundles React in production mode and optimizes the build for the best performance.
26 |
27 | The build is minified and the filenames include the hashes.\
28 | Your app is ready to be deployed!
29 |
30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
31 |
32 | ### `npm run eject`
33 |
34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!**
35 |
36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
37 |
38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
39 |
40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
41 |
42 | ## Learn More
43 |
44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
45 |
46 | To learn React, check out the [React documentation](https://reactjs.org/).
47 |
48 | ### Code Splitting
49 |
50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
51 |
52 | ### Analyzing the Bundle Size
53 |
54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
55 |
56 | ### Making a Progressive Web App
57 |
58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
59 |
60 | ### Advanced Configuration
61 |
62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
63 |
64 | ### Deployment
65 |
66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
67 |
68 | ### `npm run build` fails to minify
69 |
70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
71 |
--------------------------------------------------------------------------------
/public/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "chat-app",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@multiavatar/multiavatar": "^1.0.7",
7 | "@testing-library/jest-dom": "^5.16.2",
8 | "@testing-library/react": "^12.1.2",
9 | "@testing-library/user-event": "^13.5.0",
10 | "axios": "^0.28.1",
11 | "buffer": "^6.0.3",
12 | "emoji-picker-react": "^3.5.1",
13 | "react": "^17.0.2",
14 | "react-dom": "^17.0.2",
15 | "react-icons": "^4.3.1",
16 | "react-router-dom": "^6.2.1",
17 | "react-scripts": "5.0.0",
18 | "react-toastify": "^8.1.1",
19 | "socket.io-client": "^4.4.1",
20 | "styled-components": "^5.3.3",
21 | "uuid": "^8.3.2",
22 | "web-vitals": "^2.1.4"
23 | },
24 | "scripts": {
25 | "start": "react-scripts start",
26 | "build": "react-scripts build",
27 | "test": "react-scripts test",
28 | "eject": "react-scripts eject"
29 | },
30 | "eslintConfig": {
31 | "extends": [
32 | "react-app",
33 | "react-app/jest"
34 | ]
35 | },
36 | "browserslist": {
37 | "production": [
38 | ">0.2%",
39 | "not dead",
40 | "not op_mini all"
41 | ],
42 | "development": [
43 | "last 1 chrome version",
44 | "last 1 firefox version",
45 | "last 1 safari version"
46 | ]
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/public/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koolkishan/chat-app-react-nodejs/acb6e130150d7eca375526c551b8342db881800a/public/public/favicon.ico
--------------------------------------------------------------------------------
/public/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | React App
28 |
29 |
30 | You need to enable JavaScript to run this app.
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/public/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koolkishan/chat-app-react-nodejs/acb6e130150d7eca375526c551b8342db881800a/public/public/logo192.png
--------------------------------------------------------------------------------
/public/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koolkishan/chat-app-react-nodejs/acb6e130150d7eca375526c551b8342db881800a/public/public/logo512.png
--------------------------------------------------------------------------------
/public/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/public/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/public/src/App.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { BrowserRouter, Routes, Route } from "react-router-dom";
3 | import SetAvatar from "./components/SetAvatar";
4 | import Chat from "./pages/Chat";
5 | import Login from "./pages/Login";
6 | import Register from "./pages/Register";
7 | export default function App() {
8 | return (
9 |
10 |
11 | } />
12 | } />
13 | } />
14 | } />
15 |
16 |
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/public/src/assets/loader.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koolkishan/chat-app-react-nodejs/acb6e130150d7eca375526c551b8342db881800a/public/src/assets/loader.gif
--------------------------------------------------------------------------------
/public/src/assets/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
--------------------------------------------------------------------------------
/public/src/assets/robot.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/koolkishan/chat-app-react-nodejs/acb6e130150d7eca375526c551b8342db881800a/public/src/assets/robot.gif
--------------------------------------------------------------------------------
/public/src/components/ChatContainer.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect, useRef } from "react";
2 | import styled from "styled-components";
3 | import ChatInput from "./ChatInput";
4 | import Logout from "./Logout";
5 | import { v4 as uuidv4 } from "uuid";
6 | import axios from "axios";
7 | import { sendMessageRoute, recieveMessageRoute } from "../utils/APIRoutes";
8 |
9 | export default function ChatContainer({ currentChat, socket }) {
10 | const [messages, setMessages] = useState([]);
11 | const scrollRef = useRef();
12 | const [arrivalMessage, setArrivalMessage] = useState(null);
13 |
14 | useEffect(async () => {
15 | const data = await JSON.parse(
16 | localStorage.getItem(process.env.REACT_APP_LOCALHOST_KEY)
17 | );
18 | const response = await axios.post(recieveMessageRoute, {
19 | from: data._id,
20 | to: currentChat._id,
21 | });
22 | setMessages(response.data);
23 | }, [currentChat]);
24 |
25 | useEffect(() => {
26 | const getCurrentChat = async () => {
27 | if (currentChat) {
28 | await JSON.parse(
29 | localStorage.getItem(process.env.REACT_APP_LOCALHOST_KEY)
30 | )._id;
31 | }
32 | };
33 | getCurrentChat();
34 | }, [currentChat]);
35 |
36 | const handleSendMsg = async (msg) => {
37 | const data = await JSON.parse(
38 | localStorage.getItem(process.env.REACT_APP_LOCALHOST_KEY)
39 | );
40 | socket.current.emit("send-msg", {
41 | to: currentChat._id,
42 | from: data._id,
43 | msg,
44 | });
45 | await axios.post(sendMessageRoute, {
46 | from: data._id,
47 | to: currentChat._id,
48 | message: msg,
49 | });
50 |
51 | const msgs = [...messages];
52 | msgs.push({ fromSelf: true, message: msg });
53 | setMessages(msgs);
54 | };
55 |
56 | useEffect(() => {
57 | if (socket.current) {
58 | socket.current.on("msg-recieve", (msg) => {
59 | setArrivalMessage({ fromSelf: false, message: msg });
60 | });
61 | }
62 | }, []);
63 |
64 | useEffect(() => {
65 | arrivalMessage && setMessages((prev) => [...prev, arrivalMessage]);
66 | }, [arrivalMessage]);
67 |
68 | useEffect(() => {
69 | scrollRef.current?.scrollIntoView({ behavior: "smooth" });
70 | }, [messages]);
71 |
72 | return (
73 |
74 |
75 |
76 |
77 |
81 |
82 |
83 |
{currentChat.username}
84 |
85 |
86 |
87 |
88 |
89 | {messages.map((message) => {
90 | return (
91 |
92 |
97 |
98 |
{message.message}
99 |
100 |
101 |
102 | );
103 | })}
104 |
105 |
106 |
107 | );
108 | }
109 |
110 | const Container = styled.div`
111 | display: grid;
112 | grid-template-rows: 10% 80% 10%;
113 | gap: 0.1rem;
114 | overflow: hidden;
115 | @media screen and (min-width: 720px) and (max-width: 1080px) {
116 | grid-template-rows: 15% 70% 15%;
117 | }
118 | .chat-header {
119 | display: flex;
120 | justify-content: space-between;
121 | align-items: center;
122 | padding: 0 2rem;
123 | .user-details {
124 | display: flex;
125 | align-items: center;
126 | gap: 1rem;
127 | .avatar {
128 | img {
129 | height: 3rem;
130 | }
131 | }
132 | .username {
133 | h3 {
134 | color: white;
135 | }
136 | }
137 | }
138 | }
139 | .chat-messages {
140 | padding: 1rem 2rem;
141 | display: flex;
142 | flex-direction: column;
143 | gap: 1rem;
144 | overflow: auto;
145 | &::-webkit-scrollbar {
146 | width: 0.2rem;
147 | &-thumb {
148 | background-color: #ffffff39;
149 | width: 0.1rem;
150 | border-radius: 1rem;
151 | }
152 | }
153 | .message {
154 | display: flex;
155 | align-items: center;
156 | .content {
157 | max-width: 40%;
158 | overflow-wrap: break-word;
159 | padding: 1rem;
160 | font-size: 1.1rem;
161 | border-radius: 1rem;
162 | color: #d1d1d1;
163 | @media screen and (min-width: 720px) and (max-width: 1080px) {
164 | max-width: 70%;
165 | }
166 | }
167 | }
168 | .sended {
169 | justify-content: flex-end;
170 | .content {
171 | background-color: #4f04ff21;
172 | }
173 | }
174 | .recieved {
175 | justify-content: flex-start;
176 | .content {
177 | background-color: #9900ff20;
178 | }
179 | }
180 | }
181 | `;
182 |
--------------------------------------------------------------------------------
/public/src/components/ChatInput.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import { BsEmojiSmileFill } from "react-icons/bs";
3 | import { IoMdSend } from "react-icons/io";
4 | import styled from "styled-components";
5 | import Picker from "emoji-picker-react";
6 |
7 | export default function ChatInput({ handleSendMsg }) {
8 | const [msg, setMsg] = useState("");
9 | const [showEmojiPicker, setShowEmojiPicker] = useState(false);
10 | const handleEmojiPickerhideShow = () => {
11 | setShowEmojiPicker(!showEmojiPicker);
12 | };
13 |
14 | const handleEmojiClick = (event, emojiObject) => {
15 | let message = msg;
16 | message += emojiObject.emoji;
17 | setMsg(message);
18 | };
19 |
20 | const sendChat = (event) => {
21 | event.preventDefault();
22 | if (msg.length > 0) {
23 | handleSendMsg(msg);
24 | setMsg("");
25 | }
26 | };
27 |
28 | return (
29 |
30 |
31 |
32 |
33 | {showEmojiPicker &&
}
34 |
35 |
36 |
47 |
48 | );
49 | }
50 |
51 | const Container = styled.div`
52 | display: grid;
53 | align-items: center;
54 | grid-template-columns: 5% 95%;
55 | background-color: #080420;
56 | padding: 0 2rem;
57 | @media screen and (min-width: 720px) and (max-width: 1080px) {
58 | padding: 0 1rem;
59 | gap: 1rem;
60 | }
61 | .button-container {
62 | display: flex;
63 | align-items: center;
64 | color: white;
65 | gap: 1rem;
66 | .emoji {
67 | position: relative;
68 | svg {
69 | font-size: 1.5rem;
70 | color: #ffff00c8;
71 | cursor: pointer;
72 | }
73 | .emoji-picker-react {
74 | position: absolute;
75 | top: -350px;
76 | background-color: #080420;
77 | box-shadow: 0 5px 10px #9a86f3;
78 | border-color: #9a86f3;
79 | .emoji-scroll-wrapper::-webkit-scrollbar {
80 | background-color: #080420;
81 | width: 5px;
82 | &-thumb {
83 | background-color: #9a86f3;
84 | }
85 | }
86 | .emoji-categories {
87 | button {
88 | filter: contrast(0);
89 | }
90 | }
91 | .emoji-search {
92 | background-color: transparent;
93 | border-color: #9a86f3;
94 | }
95 | .emoji-group:before {
96 | background-color: #080420;
97 | }
98 | }
99 | }
100 | }
101 | .input-container {
102 | width: 100%;
103 | border-radius: 2rem;
104 | display: flex;
105 | align-items: center;
106 | gap: 2rem;
107 | background-color: #ffffff34;
108 | input {
109 | width: 90%;
110 | height: 60%;
111 | background-color: transparent;
112 | color: white;
113 | border: none;
114 | padding-left: 1rem;
115 | font-size: 1.2rem;
116 |
117 | &::selection {
118 | background-color: #9a86f3;
119 | }
120 | &:focus {
121 | outline: none;
122 | }
123 | }
124 | button {
125 | padding: 0.3rem 2rem;
126 | border-radius: 2rem;
127 | display: flex;
128 | justify-content: center;
129 | align-items: center;
130 | background-color: #9a86f3;
131 | border: none;
132 | @media screen and (min-width: 720px) and (max-width: 1080px) {
133 | padding: 0.3rem 1rem;
134 | svg {
135 | font-size: 1rem;
136 | }
137 | }
138 | svg {
139 | font-size: 2rem;
140 | color: white;
141 | }
142 | }
143 | }
144 | `;
145 |
--------------------------------------------------------------------------------
/public/src/components/Contacts.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import styled from "styled-components";
3 | import Logo from "../assets/logo.svg";
4 |
5 | export default function Contacts({ contacts, changeChat }) {
6 | const [currentUserName, setCurrentUserName] = useState(undefined);
7 | const [currentUserImage, setCurrentUserImage] = useState(undefined);
8 | const [currentSelected, setCurrentSelected] = useState(undefined);
9 | useEffect(async () => {
10 | const data = await JSON.parse(
11 | localStorage.getItem(process.env.REACT_APP_LOCALHOST_KEY)
12 | );
13 | setCurrentUserName(data.username);
14 | setCurrentUserImage(data.avatarImage);
15 | }, []);
16 | const changeCurrentChat = (index, contact) => {
17 | setCurrentSelected(index);
18 | changeChat(contact);
19 | };
20 | return (
21 | <>
22 | {currentUserImage && currentUserImage && (
23 |
24 |
25 |
26 |
snappy
27 |
28 |
29 | {contacts.map((contact, index) => {
30 | return (
31 |
changeCurrentChat(index, contact)}
37 | >
38 |
39 |
43 |
44 |
45 |
{contact.username}
46 |
47 |
48 | );
49 | })}
50 |
51 |
52 |
53 |
57 |
58 |
59 |
{currentUserName}
60 |
61 |
62 |
63 | )}
64 | >
65 | );
66 | }
67 | const Container = styled.div`
68 | display: grid;
69 | grid-template-rows: 10% 75% 15%;
70 | overflow: hidden;
71 | background-color: #080420;
72 | .brand {
73 | display: flex;
74 | align-items: center;
75 | gap: 1rem;
76 | justify-content: center;
77 | img {
78 | height: 2rem;
79 | }
80 | h3 {
81 | color: white;
82 | text-transform: uppercase;
83 | }
84 | }
85 | .contacts {
86 | display: flex;
87 | flex-direction: column;
88 | align-items: center;
89 | overflow: auto;
90 | gap: 0.8rem;
91 | &::-webkit-scrollbar {
92 | width: 0.2rem;
93 | &-thumb {
94 | background-color: #ffffff39;
95 | width: 0.1rem;
96 | border-radius: 1rem;
97 | }
98 | }
99 | .contact {
100 | background-color: #ffffff34;
101 | min-height: 5rem;
102 | cursor: pointer;
103 | width: 90%;
104 | border-radius: 0.2rem;
105 | padding: 0.4rem;
106 | display: flex;
107 | gap: 1rem;
108 | align-items: center;
109 | transition: 0.5s ease-in-out;
110 | .avatar {
111 | img {
112 | height: 3rem;
113 | }
114 | }
115 | .username {
116 | h3 {
117 | color: white;
118 | }
119 | }
120 | }
121 | .selected {
122 | background-color: #9a86f3;
123 | }
124 | }
125 |
126 | .current-user {
127 | background-color: #0d0d30;
128 | display: flex;
129 | justify-content: center;
130 | align-items: center;
131 | gap: 2rem;
132 | .avatar {
133 | img {
134 | height: 4rem;
135 | max-inline-size: 100%;
136 | }
137 | }
138 | .username {
139 | h2 {
140 | color: white;
141 | }
142 | }
143 | @media screen and (min-width: 720px) and (max-width: 1080px) {
144 | gap: 0.5rem;
145 | .username {
146 | h2 {
147 | font-size: 1rem;
148 | }
149 | }
150 | }
151 | }
152 | `;
153 |
--------------------------------------------------------------------------------
/public/src/components/Logout.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { useNavigate } from "react-router-dom";
3 | import { BiPowerOff } from "react-icons/bi";
4 | import styled from "styled-components";
5 | import axios from "axios";
6 | import { logoutRoute } from "../utils/APIRoutes";
7 | export default function Logout() {
8 | const navigate = useNavigate();
9 | const handleClick = async () => {
10 | const id = await JSON.parse(
11 | localStorage.getItem(process.env.REACT_APP_LOCALHOST_KEY)
12 | )._id;
13 | const data = await axios.get(`${logoutRoute}/${id}`);
14 | if (data.status === 200) {
15 | localStorage.clear();
16 | navigate("/login");
17 | }
18 | };
19 | return (
20 |
21 |
22 |
23 | );
24 | }
25 |
26 | const Button = styled.button`
27 | display: flex;
28 | justify-content: center;
29 | align-items: center;
30 | padding: 0.5rem;
31 | border-radius: 0.5rem;
32 | background-color: #9a86f3;
33 | border: none;
34 | cursor: pointer;
35 | svg {
36 | font-size: 1.3rem;
37 | color: #ebe7ff;
38 | }
39 | `;
40 |
--------------------------------------------------------------------------------
/public/src/components/SetAvatar.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from "react";
2 | import styled from "styled-components";
3 | import axios from "axios";
4 | import loader from "../assets/loader.gif";
5 | import { ToastContainer, toast } from "react-toastify";
6 | import "react-toastify/dist/ReactToastify.css";
7 | import { useNavigate } from "react-router-dom";
8 | import { setAvatarRoute } from "../utils/APIRoutes";
9 | import multiavatar from "@multiavatar/multiavatar/esm";
10 |
11 | export default function SetAvatar() {
12 | const navigate = useNavigate();
13 | const [avatars, setAvatars] = useState([]);
14 | const [isLoading, setIsLoading] = useState(true);
15 | const [selectedAvatar, setSelectedAvatar] = useState(undefined);
16 |
17 | const toastOptions = {
18 | position: "bottom-right",
19 | autoClose: 8000,
20 | pauseOnHover: true,
21 | draggable: true,
22 | theme: "dark",
23 | };
24 |
25 | useEffect(() => {
26 | const user = localStorage.getItem(process.env.REACT_APP_LOCALHOST_KEY);
27 | if (!user) navigate("/login");
28 | }, [navigate]);
29 |
30 | const generateRandomName = () => Math.random().toString(36).substring(2, 10);
31 |
32 | useEffect(() => {
33 | const generateAvatars = () => {
34 | const data = [];
35 | for (let i = 0; i < 4; i++) {
36 | const randomName = generateRandomName();
37 | const svgCode = multiavatar(randomName);
38 | const encoded = btoa(unescape(encodeURIComponent(svgCode)));
39 | data.push(encoded);
40 | }
41 | setAvatars(data);
42 | setIsLoading(false);
43 | };
44 |
45 | generateAvatars();
46 | }, []);
47 |
48 | const setProfilePicture = async () => {
49 | if (selectedAvatar === undefined) {
50 | toast.error("Please select an avatar", toastOptions);
51 | return;
52 | }
53 |
54 | const user = await JSON.parse(
55 | localStorage.getItem(process.env.REACT_APP_LOCALHOST_KEY)
56 | );
57 |
58 | const { data } = await axios.post(`${setAvatarRoute}/${user._id}`, {
59 | image: avatars[selectedAvatar],
60 | });
61 |
62 | if (data.isSet) {
63 | user.isAvatarImageSet = true;
64 | user.avatarImage = data.image;
65 | localStorage.setItem(
66 | process.env.REACT_APP_LOCALHOST_KEY,
67 | JSON.stringify(user)
68 | );
69 | navigate("/");
70 | } else {
71 | toast.error("Error setting avatar. Please try again.", toastOptions);
72 | }
73 | };
74 |
75 | return (
76 | <>
77 | {isLoading ? (
78 |
79 |
80 |
81 | ) : (
82 |
83 |
84 |
Pick an Avatar as your profile picture
85 |
86 |
87 | {avatars.map((avatar, index) => (
88 |
setSelectedAvatar(index)}
94 | >
95 |
99 |
100 | ))}
101 |
102 |
103 | Set as Profile Picture
104 |
105 |
106 |
107 | )}
108 | >
109 | );
110 | }
111 |
112 | const Container = styled.div`
113 | display: flex;
114 | justify-content: center;
115 | align-items: center;
116 | flex-direction: column;
117 | gap: 3rem;
118 | background-color: #131324;
119 | height: 100vh;
120 | width: 100vw;
121 |
122 | .loader {
123 | max-inline-size: 100%;
124 | }
125 |
126 | .title-container {
127 | h1 {
128 | color: white;
129 | }
130 | }
131 |
132 | .avatars {
133 | display: flex;
134 | gap: 2rem;
135 |
136 | .avatar {
137 | border: 0.4rem solid transparent;
138 | padding: 0.4rem;
139 | border-radius: 5rem;
140 | display: flex;
141 | justify-content: center;
142 | align-items: center;
143 | transition: 0.5s ease-in-out;
144 |
145 | img {
146 | height: 6rem;
147 | transition: 0.5s ease-in-out;
148 | }
149 |
150 | &:hover {
151 | cursor: pointer;
152 | transform: scale(1.1);
153 | }
154 | }
155 |
156 | .selected {
157 | border: 0.4rem solid #4e0eff;
158 | }
159 | }
160 |
161 | .submit-btn {
162 | background-color: #4e0eff;
163 | color: white;
164 | padding: 1rem 2rem;
165 | border: none;
166 | font-weight: bold;
167 | cursor: pointer;
168 | border-radius: 0.4rem;
169 | font-size: 1rem;
170 | text-transform: uppercase;
171 |
172 | &:hover {
173 | background-color: #3c0edc;
174 | }
175 | }
176 | `;
177 |
--------------------------------------------------------------------------------
/public/src/components/Welcome.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import styled from "styled-components";
3 | import Robot from "../assets/robot.gif";
4 | export default function Welcome() {
5 | const [userName, setUserName] = useState("");
6 | useEffect(async () => {
7 | setUserName(
8 | await JSON.parse(
9 | localStorage.getItem(process.env.REACT_APP_LOCALHOST_KEY)
10 | ).username
11 | );
12 | }, []);
13 | return (
14 |
15 |
16 |
17 | Welcome, {userName}!
18 |
19 | Please select a chat to Start messaging.
20 |
21 | );
22 | }
23 |
24 | const Container = styled.div`
25 | display: flex;
26 | justify-content: center;
27 | align-items: center;
28 | color: white;
29 | flex-direction: column;
30 | img {
31 | height: 20rem;
32 | }
33 | span {
34 | color: #4e0eff;
35 | }
36 | `;
37 |
--------------------------------------------------------------------------------
/public/src/index.css:
--------------------------------------------------------------------------------
1 | @import url("https://fonts.googleapis.com/css2?family=Josefin+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap");
2 |
3 | * {
4 | margin: 0;
5 | padding: 0;
6 | box-sizing: border-box;
7 | }
8 |
9 | body,
10 | button,
11 | input {
12 | font-family: "Josefin Sans", sans-serif;
13 | }
14 |
15 | body {
16 | max-height: 100vh;
17 | max-width: 100vw;
18 | overflow: hidden;
19 | }
20 |
21 | .Toastify__toast-theme--dark {
22 | background-color: #00000076 !important;
23 | }
24 |
--------------------------------------------------------------------------------
/public/src/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom";
3 | import App from "./App";
4 | import "./index.css";
5 | ReactDOM.render(
6 |
7 |
8 | ,
9 | document.getElementById("root")
10 | );
11 |
--------------------------------------------------------------------------------
/public/src/pages/Chat.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState, useRef } from "react";
2 | import axios from "axios";
3 | import { useNavigate } from "react-router-dom";
4 | import { io } from "socket.io-client";
5 | import styled from "styled-components";
6 | import { allUsersRoute, host } from "../utils/APIRoutes";
7 | import ChatContainer from "../components/ChatContainer";
8 | import Contacts from "../components/Contacts";
9 | import Welcome from "../components/Welcome";
10 |
11 | export default function Chat() {
12 | const navigate = useNavigate();
13 | const socket = useRef();
14 | const [contacts, setContacts] = useState([]);
15 | const [currentChat, setCurrentChat] = useState(undefined);
16 | const [currentUser, setCurrentUser] = useState(undefined);
17 | useEffect(async () => {
18 | if (!localStorage.getItem(process.env.REACT_APP_LOCALHOST_KEY)) {
19 | navigate("/login");
20 | } else {
21 | setCurrentUser(
22 | await JSON.parse(
23 | localStorage.getItem(process.env.REACT_APP_LOCALHOST_KEY)
24 | )
25 | );
26 | }
27 | }, []);
28 | useEffect(() => {
29 | if (currentUser) {
30 | socket.current = io(host);
31 | socket.current.emit("add-user", currentUser._id);
32 | }
33 | }, [currentUser]);
34 |
35 | useEffect(async () => {
36 | if (currentUser) {
37 | if (currentUser.isAvatarImageSet) {
38 | const data = await axios.get(`${allUsersRoute}/${currentUser._id}`);
39 | setContacts(data.data);
40 | } else {
41 | navigate("/setAvatar");
42 | }
43 | }
44 | }, [currentUser]);
45 | const handleChatChange = (chat) => {
46 | setCurrentChat(chat);
47 | };
48 | return (
49 | <>
50 |
51 |
52 |
53 | {currentChat === undefined ? (
54 |
55 | ) : (
56 |
57 | )}
58 |
59 |
60 | >
61 | );
62 | }
63 |
64 | const Container = styled.div`
65 | height: 100vh;
66 | width: 100vw;
67 | display: flex;
68 | flex-direction: column;
69 | justify-content: center;
70 | gap: 1rem;
71 | align-items: center;
72 | background-color: #131324;
73 | .container {
74 | height: 85vh;
75 | width: 85vw;
76 | background-color: #00000076;
77 | display: grid;
78 | grid-template-columns: 25% 75%;
79 | @media screen and (min-width: 720px) and (max-width: 1080px) {
80 | grid-template-columns: 35% 65%;
81 | }
82 | }
83 | `;
84 |
--------------------------------------------------------------------------------
/public/src/pages/Login.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import axios from "axios";
3 | import styled from "styled-components";
4 | import { useNavigate, Link } from "react-router-dom";
5 | import Logo from "../assets/logo.svg";
6 | import { ToastContainer, toast } from "react-toastify";
7 | import "react-toastify/dist/ReactToastify.css";
8 | import { loginRoute } from "../utils/APIRoutes";
9 |
10 | export default function Login() {
11 | const navigate = useNavigate();
12 | const [values, setValues] = useState({ username: "", password: "" });
13 | const toastOptions = {
14 | position: "bottom-right",
15 | autoClose: 8000,
16 | pauseOnHover: true,
17 | draggable: true,
18 | theme: "dark",
19 | };
20 | useEffect(() => {
21 | if (localStorage.getItem(process.env.REACT_APP_LOCALHOST_KEY)) {
22 | navigate("/");
23 | }
24 | }, []);
25 |
26 | const handleChange = (event) => {
27 | setValues({ ...values, [event.target.name]: event.target.value });
28 | };
29 |
30 | const validateForm = () => {
31 | const { username, password } = values;
32 | if (username === "") {
33 | toast.error("Email and Password is required.", toastOptions);
34 | return false;
35 | } else if (password === "") {
36 | toast.error("Email and Password is required.", toastOptions);
37 | return false;
38 | }
39 | return true;
40 | };
41 |
42 | const handleSubmit = async (event) => {
43 | event.preventDefault();
44 | if (validateForm()) {
45 | const { username, password } = values;
46 | const { data } = await axios.post(loginRoute, {
47 | username,
48 | password,
49 | });
50 | if (data.status === false) {
51 | toast.error(data.msg, toastOptions);
52 | }
53 | if (data.status === true) {
54 | localStorage.setItem(
55 | process.env.REACT_APP_LOCALHOST_KEY,
56 | JSON.stringify(data.user)
57 | );
58 |
59 | navigate("/");
60 | }
61 | }
62 | };
63 |
64 | return (
65 | <>
66 |
67 |
90 |
91 |
92 | >
93 | );
94 | }
95 |
96 | const FormContainer = styled.div`
97 | height: 100vh;
98 | width: 100vw;
99 | display: flex;
100 | flex-direction: column;
101 | justify-content: center;
102 | gap: 1rem;
103 | align-items: center;
104 | background-color: #131324;
105 | .brand {
106 | display: flex;
107 | align-items: center;
108 | gap: 1rem;
109 | justify-content: center;
110 | img {
111 | height: 5rem;
112 | }
113 | h1 {
114 | color: white;
115 | text-transform: uppercase;
116 | }
117 | }
118 |
119 | form {
120 | display: flex;
121 | flex-direction: column;
122 | gap: 2rem;
123 | background-color: #00000076;
124 | border-radius: 2rem;
125 | padding: 5rem;
126 | }
127 | input {
128 | background-color: transparent;
129 | padding: 1rem;
130 | border: 0.1rem solid #4e0eff;
131 | border-radius: 0.4rem;
132 | color: white;
133 | width: 100%;
134 | font-size: 1rem;
135 | &:focus {
136 | border: 0.1rem solid #997af0;
137 | outline: none;
138 | }
139 | }
140 | button {
141 | background-color: #4e0eff;
142 | color: white;
143 | padding: 1rem 2rem;
144 | border: none;
145 | font-weight: bold;
146 | cursor: pointer;
147 | border-radius: 0.4rem;
148 | font-size: 1rem;
149 | text-transform: uppercase;
150 | &:hover {
151 | background-color: #4e0eff;
152 | }
153 | }
154 | span {
155 | color: white;
156 | text-transform: uppercase;
157 | a {
158 | color: #4e0eff;
159 | text-decoration: none;
160 | font-weight: bold;
161 | }
162 | }
163 | `;
164 |
--------------------------------------------------------------------------------
/public/src/pages/Register.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import axios from "axios";
3 | import styled from "styled-components";
4 | import { useNavigate, Link } from "react-router-dom";
5 | import Logo from "../assets/logo.svg";
6 | import { ToastContainer, toast } from "react-toastify";
7 | import "react-toastify/dist/ReactToastify.css";
8 | import { registerRoute } from "../utils/APIRoutes";
9 |
10 | export default function Register() {
11 | const navigate = useNavigate();
12 | const toastOptions = {
13 | position: "bottom-right",
14 | autoClose: 8000,
15 | pauseOnHover: true,
16 | draggable: true,
17 | theme: "dark",
18 | };
19 | const [values, setValues] = useState({
20 | username: "",
21 | email: "",
22 | password: "",
23 | confirmPassword: "",
24 | });
25 |
26 | useEffect(() => {
27 | if (localStorage.getItem(process.env.REACT_APP_LOCALHOST_KEY)) {
28 | navigate("/");
29 | }
30 | }, []);
31 |
32 | const handleChange = (event) => {
33 | setValues({ ...values, [event.target.name]: event.target.value });
34 | };
35 |
36 | const handleValidation = () => {
37 | const { password, confirmPassword, username, email } = values;
38 | if (password !== confirmPassword) {
39 | toast.error(
40 | "Password and confirm password should be same.",
41 | toastOptions
42 | );
43 | return false;
44 | } else if (username.length < 3) {
45 | toast.error(
46 | "Username should be greater than 3 characters.",
47 | toastOptions
48 | );
49 | return false;
50 | } else if (password.length < 8) {
51 | toast.error(
52 | "Password should be equal or greater than 8 characters.",
53 | toastOptions
54 | );
55 | return false;
56 | } else if (email === "") {
57 | toast.error("Email is required.", toastOptions);
58 | return false;
59 | }
60 |
61 | return true;
62 | };
63 |
64 | const handleSubmit = async (event) => {
65 | event.preventDefault();
66 | if (handleValidation()) {
67 | const { email, username, password } = values;
68 | const { data } = await axios.post(registerRoute, {
69 | username,
70 | email,
71 | password,
72 | });
73 |
74 | if (data.status === false) {
75 | toast.error(data.msg, toastOptions);
76 | }
77 | if (data.status === true) {
78 | localStorage.setItem(
79 | process.env.REACT_APP_LOCALHOST_KEY,
80 | JSON.stringify(data.user)
81 | );
82 | navigate("/");
83 | }
84 | }
85 | };
86 |
87 | return (
88 | <>
89 |
90 |
124 |
125 |
126 | >
127 | );
128 | }
129 |
130 | const FormContainer = styled.div`
131 | height: 100vh;
132 | width: 100vw;
133 | display: flex;
134 | flex-direction: column;
135 | justify-content: center;
136 | gap: 1rem;
137 | align-items: center;
138 | background-color: #131324;
139 | .brand {
140 | display: flex;
141 | align-items: center;
142 | gap: 1rem;
143 | justify-content: center;
144 | img {
145 | height: 5rem;
146 | }
147 | h1 {
148 | color: white;
149 | text-transform: uppercase;
150 | }
151 | }
152 |
153 | form {
154 | display: flex;
155 | flex-direction: column;
156 | gap: 2rem;
157 | background-color: #00000076;
158 | border-radius: 2rem;
159 | padding: 3rem 5rem;
160 | }
161 | input {
162 | background-color: transparent;
163 | padding: 1rem;
164 | border: 0.1rem solid #4e0eff;
165 | border-radius: 0.4rem;
166 | color: white;
167 | width: 100%;
168 | font-size: 1rem;
169 | &:focus {
170 | border: 0.1rem solid #997af0;
171 | outline: none;
172 | }
173 | }
174 | button {
175 | background-color: #4e0eff;
176 | color: white;
177 | padding: 1rem 2rem;
178 | border: none;
179 | font-weight: bold;
180 | cursor: pointer;
181 | border-radius: 0.4rem;
182 | font-size: 1rem;
183 | text-transform: uppercase;
184 | &:hover {
185 | background-color: #4e0eff;
186 | }
187 | }
188 | span {
189 | color: white;
190 | text-transform: uppercase;
191 | a {
192 | color: #4e0eff;
193 | text-decoration: none;
194 | font-weight: bold;
195 | }
196 | }
197 | `;
198 |
--------------------------------------------------------------------------------
/public/src/utils/APIRoutes.js:
--------------------------------------------------------------------------------
1 | export const host = "http://localhost:5000";
2 | export const loginRoute = `${host}/api/auth/login`;
3 | export const registerRoute = `${host}/api/auth/register`;
4 | export const logoutRoute = `${host}/api/auth/logout`;
5 | export const allUsersRoute = `${host}/api/auth/allusers`;
6 | export const sendMessageRoute = `${host}/api/messages/addmsg`;
7 | export const recieveMessageRoute = `${host}/api/messages/getmsg`;
8 | export const setAvatarRoute = `${host}/api/auth/setavatar`;
9 |
--------------------------------------------------------------------------------
/server/.env:
--------------------------------------------------------------------------------
1 | PORT=5000
2 | MONGO_URL="mongodb://localhost:27017/chat"
--------------------------------------------------------------------------------
/server/.env.example:
--------------------------------------------------------------------------------
1 | PORT=5000
2 | MONGO_URL="mongodb://localhost:27017/chat"
--------------------------------------------------------------------------------
/server/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:16-alpine
2 |
3 | WORKDIR /app
4 | COPY package*.json ./
5 | RUN npm install
6 | COPY . .
7 | EXPOSE 5000
8 |
9 | CMD ["npm","start"]
--------------------------------------------------------------------------------
/server/controllers/messageController.js:
--------------------------------------------------------------------------------
1 | const Messages = require("../models/messageModel");
2 |
3 | module.exports.getMessages = async (req, res, next) => {
4 | try {
5 | const { from, to } = req.body;
6 |
7 | const messages = await Messages.find({
8 | users: {
9 | $all: [from, to],
10 | },
11 | }).sort({ updatedAt: 1 });
12 |
13 | const projectedMessages = messages.map((msg) => {
14 | return {
15 | fromSelf: msg.sender.toString() === from,
16 | message: msg.message.text,
17 | };
18 | });
19 | res.json(projectedMessages);
20 | } catch (ex) {
21 | next(ex);
22 | }
23 | };
24 |
25 | module.exports.addMessage = async (req, res, next) => {
26 | try {
27 | const { from, to, message } = req.body;
28 | const data = await Messages.create({
29 | message: { text: message },
30 | users: [from, to],
31 | sender: from,
32 | });
33 |
34 | if (data) return res.json({ msg: "Message added successfully." });
35 | else return res.json({ msg: "Failed to add message to the database" });
36 | } catch (ex) {
37 | next(ex);
38 | }
39 | };
40 |
--------------------------------------------------------------------------------
/server/controllers/userController.js:
--------------------------------------------------------------------------------
1 | const User = require("../models/userModel");
2 | const bcrypt = require("bcrypt");
3 |
4 | module.exports.login = async (req, res, next) => {
5 | try {
6 | const { username, password } = req.body;
7 | const user = await User.findOne({ username });
8 | if (!user)
9 | return res.json({ msg: "Incorrect Username or Password", status: false });
10 | const isPasswordValid = await bcrypt.compare(password, user.password);
11 | if (!isPasswordValid)
12 | return res.json({ msg: "Incorrect Username or Password", status: false });
13 | delete user.password;
14 | return res.json({ status: true, user });
15 | } catch (ex) {
16 | next(ex);
17 | }
18 | };
19 |
20 | module.exports.register = async (req, res, next) => {
21 | try {
22 | const { username, email, password } = req.body;
23 | const usernameCheck = await User.findOne({ username });
24 | if (usernameCheck)
25 | return res.json({ msg: "Username already used", status: false });
26 | const emailCheck = await User.findOne({ email });
27 | if (emailCheck)
28 | return res.json({ msg: "Email already used", status: false });
29 | const hashedPassword = await bcrypt.hash(password, 10);
30 | const user = await User.create({
31 | email,
32 | username,
33 | password: hashedPassword,
34 | });
35 | delete user.password;
36 | return res.json({ status: true, user });
37 | } catch (ex) {
38 | next(ex);
39 | }
40 | };
41 |
42 | module.exports.getAllUsers = async (req, res, next) => {
43 | try {
44 | const users = await User.find({ _id: { $ne: req.params.id } }).select([
45 | "email",
46 | "username",
47 | "avatarImage",
48 | "_id",
49 | ]);
50 | return res.json(users);
51 | } catch (ex) {
52 | next(ex);
53 | }
54 | };
55 |
56 | module.exports.setAvatar = async (req, res, next) => {
57 | try {
58 | const userId = req.params.id;
59 | const avatarImage = req.body.image;
60 | const userData = await User.findByIdAndUpdate(
61 | userId,
62 | {
63 | isAvatarImageSet: true,
64 | avatarImage,
65 | },
66 | { new: true }
67 | );
68 | return res.json({
69 | isSet: userData.isAvatarImageSet,
70 | image: userData.avatarImage,
71 | });
72 | } catch (ex) {
73 | next(ex);
74 | }
75 | };
76 |
77 | module.exports.logOut = (req, res, next) => {
78 | try {
79 | if (!req.params.id) return res.json({ msg: "User id is required " });
80 | onlineUsers.delete(req.params.id);
81 | return res.status(200).send();
82 | } catch (ex) {
83 | next(ex);
84 | }
85 | };
86 |
--------------------------------------------------------------------------------
/server/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const cors = require("cors");
3 | const mongoose = require("mongoose");
4 | const authRoutes = require("./routes/auth");
5 | const messageRoutes = require("./routes/messages");
6 | const app = express();
7 | const socket = require("socket.io");
8 | require("dotenv").config();
9 |
10 | app.use(cors());
11 | app.use(express.json());
12 |
13 | mongoose
14 | .connect(process.env.MONGO_URL, {
15 | useNewUrlParser: true,
16 | useUnifiedTopology: true,
17 | })
18 | .then(() => {
19 | console.log("DB Connetion Successfull");
20 | })
21 | .catch((err) => {
22 | console.log(err.message);
23 | });
24 |
25 | app.get("/ping", (_req, res) => {
26 | return res.json({ msg: "Ping Successful" });
27 | });
28 |
29 | app.use("/api/auth", authRoutes);
30 | app.use("/api/messages", messageRoutes);
31 |
32 | const server = app.listen(process.env.PORT, () =>
33 | console.log(`Server started on ${process.env.PORT}`)
34 | );
35 | const io = socket(server, {
36 | cors: {
37 | origin: "http://localhost:3000",
38 | credentials: true,
39 | },
40 | });
41 |
42 | global.onlineUsers = new Map();
43 | io.on("connection", (socket) => {
44 | global.chatSocket = socket;
45 | socket.on("add-user", (userId) => {
46 | onlineUsers.set(userId, socket.id);
47 | });
48 |
49 | socket.on("send-msg", (data) => {
50 | const sendUserSocket = onlineUsers.get(data.to);
51 | if (sendUserSocket) {
52 | socket.to(sendUserSocket).emit("msg-recieve", data.msg);
53 | }
54 | });
55 | });
56 |
--------------------------------------------------------------------------------
/server/models/messageModel.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | const MessageSchema = mongoose.Schema(
4 | {
5 | message: {
6 | text: { type: String, required: true },
7 | },
8 | users: Array,
9 | sender: {
10 | type: mongoose.Schema.Types.ObjectId,
11 | ref: "User",
12 | required: true,
13 | },
14 | },
15 | {
16 | timestamps: true,
17 | }
18 | );
19 |
20 | module.exports = mongoose.model("Messages", MessageSchema);
21 |
--------------------------------------------------------------------------------
/server/models/userModel.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | const userSchema = new mongoose.Schema({
4 | username: {
5 | type: String,
6 | required: true,
7 | min: 3,
8 | max: 20,
9 | unique: true,
10 | },
11 | email: {
12 | type: String,
13 | required: true,
14 | unique: true,
15 | max: 50,
16 | },
17 | password: {
18 | type: String,
19 | required: true,
20 | min: 8,
21 | },
22 | isAvatarImageSet: {
23 | type: Boolean,
24 | default: false,
25 | },
26 | avatarImage: {
27 | type: String,
28 | default: "",
29 | },
30 | });
31 |
32 | module.exports = mongoose.model("Users", userSchema);
33 |
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "chat-app-backend",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon index.js",
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "bcrypt": "^5.0.1",
14 | "cors": "^2.8.5",
15 | "dotenv": "^16.0.0",
16 | "express": "^4.17.2",
17 | "mongoose": "^6.2.1",
18 | "nodemon": "^2.0.15",
19 | "socket.io": "^4.4.1"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/server/routes/auth.js:
--------------------------------------------------------------------------------
1 | const {
2 | login,
3 | register,
4 | getAllUsers,
5 | setAvatar,
6 | logOut,
7 | } = require("../controllers/userController");
8 |
9 | const router = require("express").Router();
10 |
11 | router.post("/login", login);
12 | router.post("/register", register);
13 | router.get("/allusers/:id", getAllUsers);
14 | router.post("/setavatar/:id", setAvatar);
15 | router.get("/logout/:id", logOut);
16 |
17 | module.exports = router;
18 |
--------------------------------------------------------------------------------
/server/routes/messages.js:
--------------------------------------------------------------------------------
1 | const { addMessage, getMessages } = require("../controllers/messageController");
2 | const router = require("express").Router();
3 |
4 | router.post("/addmsg/", addMessage);
5 | router.post("/getmsg/", getMessages);
6 |
7 | module.exports = router;
8 |
--------------------------------------------------------------------------------
/server/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@mapbox/node-pre-gyp@^1.0.0":
6 | version "1.0.8"
7 | resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz#32abc8a5c624bc4e46c43d84dfb8b26d33a96f58"
8 | integrity sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==
9 | dependencies:
10 | detect-libc "^1.0.3"
11 | https-proxy-agent "^5.0.0"
12 | make-dir "^3.1.0"
13 | node-fetch "^2.6.5"
14 | nopt "^5.0.0"
15 | npmlog "^5.0.1"
16 | rimraf "^3.0.2"
17 | semver "^7.3.5"
18 | tar "^6.1.11"
19 |
20 | "@sindresorhus/is@^0.14.0":
21 | version "0.14.0"
22 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
23 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
24 |
25 | "@socket.io/base64-arraybuffer@~1.0.2":
26 | version "1.0.2"
27 | resolved "https://registry.yarnpkg.com/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#568d9beae00b0d835f4f8c53fd55714986492e61"
28 | integrity sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==
29 |
30 | "@szmarczak/http-timer@^1.1.2":
31 | version "1.1.2"
32 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
33 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
34 | dependencies:
35 | defer-to-connect "^1.0.1"
36 |
37 | "@types/component-emitter@^1.2.10":
38 | version "1.2.11"
39 | resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506"
40 | integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==
41 |
42 | "@types/cookie@^0.4.1":
43 | version "0.4.1"
44 | resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d"
45 | integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==
46 |
47 | "@types/cors@^2.8.12":
48 | version "2.8.12"
49 | resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080"
50 | integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==
51 |
52 | "@types/node@*":
53 | version "17.0.17"
54 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.17.tgz#a8ddf6e0c2341718d74ee3dc413a13a042c45a0c"
55 | integrity sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==
56 |
57 | "@types/node@>=10.0.0":
58 | version "17.0.18"
59 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.18.tgz#3b4fed5cfb58010e3a2be4b6e74615e4847f1074"
60 | integrity sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==
61 |
62 | "@types/webidl-conversions@*":
63 | version "6.1.1"
64 | resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz#e33bc8ea812a01f63f90481c666334844b12a09e"
65 | integrity sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==
66 |
67 | "@types/whatwg-url@^8.2.1":
68 | version "8.2.1"
69 | resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.1.tgz#f1aac222dab7c59e011663a0cb0a3117b2ef05d4"
70 | integrity sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==
71 | dependencies:
72 | "@types/node" "*"
73 | "@types/webidl-conversions" "*"
74 |
75 | abbrev@1:
76 | version "1.1.1"
77 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
78 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
79 |
80 | accepts@~1.3.4, accepts@~1.3.7:
81 | version "1.3.8"
82 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
83 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
84 | dependencies:
85 | mime-types "~2.1.34"
86 | negotiator "0.6.3"
87 |
88 | agent-base@6:
89 | version "6.0.2"
90 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
91 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
92 | dependencies:
93 | debug "4"
94 |
95 | ansi-align@^3.0.0:
96 | version "3.0.1"
97 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59"
98 | integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==
99 | dependencies:
100 | string-width "^4.1.0"
101 |
102 | ansi-regex@^5.0.1:
103 | version "5.0.1"
104 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
105 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
106 |
107 | ansi-styles@^4.0.0, ansi-styles@^4.1.0:
108 | version "4.3.0"
109 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
110 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
111 | dependencies:
112 | color-convert "^2.0.1"
113 |
114 | anymatch@~3.1.2:
115 | version "3.1.2"
116 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
117 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
118 | dependencies:
119 | normalize-path "^3.0.0"
120 | picomatch "^2.0.4"
121 |
122 | "aproba@^1.0.3 || ^2.0.0":
123 | version "2.0.0"
124 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
125 | integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
126 |
127 | are-we-there-yet@^2.0.0:
128 | version "2.0.0"
129 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c"
130 | integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==
131 | dependencies:
132 | delegates "^1.0.0"
133 | readable-stream "^3.6.0"
134 |
135 | array-flatten@1.1.1:
136 | version "1.1.1"
137 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
138 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
139 |
140 | balanced-match@^1.0.0:
141 | version "1.0.2"
142 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
143 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
144 |
145 | base64-js@^1.3.1:
146 | version "1.5.1"
147 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
148 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
149 |
150 | base64id@2.0.0, base64id@~2.0.0:
151 | version "2.0.0"
152 | resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6"
153 | integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==
154 |
155 | bcrypt@^5.0.1:
156 | version "5.0.1"
157 | resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.0.1.tgz#f1a2c20f208e2ccdceea4433df0c8b2c54ecdf71"
158 | integrity sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==
159 | dependencies:
160 | "@mapbox/node-pre-gyp" "^1.0.0"
161 | node-addon-api "^3.1.0"
162 |
163 | binary-extensions@^2.0.0:
164 | version "2.2.0"
165 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
166 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
167 |
168 | body-parser@1.19.1:
169 | version "1.19.1"
170 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4"
171 | integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==
172 | dependencies:
173 | bytes "3.1.1"
174 | content-type "~1.0.4"
175 | debug "2.6.9"
176 | depd "~1.1.2"
177 | http-errors "1.8.1"
178 | iconv-lite "0.4.24"
179 | on-finished "~2.3.0"
180 | qs "6.9.6"
181 | raw-body "2.4.2"
182 | type-is "~1.6.18"
183 |
184 | boxen@^5.0.0:
185 | version "5.1.2"
186 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50"
187 | integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==
188 | dependencies:
189 | ansi-align "^3.0.0"
190 | camelcase "^6.2.0"
191 | chalk "^4.1.0"
192 | cli-boxes "^2.2.1"
193 | string-width "^4.2.2"
194 | type-fest "^0.20.2"
195 | widest-line "^3.1.0"
196 | wrap-ansi "^7.0.0"
197 |
198 | brace-expansion@^1.1.7:
199 | version "1.1.11"
200 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
201 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
202 | dependencies:
203 | balanced-match "^1.0.0"
204 | concat-map "0.0.1"
205 |
206 | braces@~3.0.2:
207 | version "3.0.2"
208 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
209 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
210 | dependencies:
211 | fill-range "^7.0.1"
212 |
213 | bson@^4.2.2, bson@^4.6.1:
214 | version "4.6.1"
215 | resolved "https://registry.yarnpkg.com/bson/-/bson-4.6.1.tgz#2b5da517539bb0f7f3ffb54ac70a384ca899641c"
216 | integrity sha512-I1LQ7Hz5zgwR4QquilLNZwbhPw0Apx7i7X9kGMBTsqPdml/03Q9NBtD9nt/19ahjlphktQImrnderxqpzeVDjw==
217 | dependencies:
218 | buffer "^5.6.0"
219 |
220 | buffer@^5.6.0:
221 | version "5.7.1"
222 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
223 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
224 | dependencies:
225 | base64-js "^1.3.1"
226 | ieee754 "^1.1.13"
227 |
228 | bytes@3.1.1:
229 | version "3.1.1"
230 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a"
231 | integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==
232 |
233 | cacheable-request@^6.0.0:
234 | version "6.1.0"
235 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
236 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
237 | dependencies:
238 | clone-response "^1.0.2"
239 | get-stream "^5.1.0"
240 | http-cache-semantics "^4.0.0"
241 | keyv "^3.0.0"
242 | lowercase-keys "^2.0.0"
243 | normalize-url "^4.1.0"
244 | responselike "^1.0.2"
245 |
246 | camelcase@^6.2.0:
247 | version "6.3.0"
248 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
249 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
250 |
251 | chalk@^4.1.0:
252 | version "4.1.2"
253 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
254 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
255 | dependencies:
256 | ansi-styles "^4.1.0"
257 | supports-color "^7.1.0"
258 |
259 | chokidar@^3.5.2:
260 | version "3.5.3"
261 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
262 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
263 | dependencies:
264 | anymatch "~3.1.2"
265 | braces "~3.0.2"
266 | glob-parent "~5.1.2"
267 | is-binary-path "~2.1.0"
268 | is-glob "~4.0.1"
269 | normalize-path "~3.0.0"
270 | readdirp "~3.6.0"
271 | optionalDependencies:
272 | fsevents "~2.3.2"
273 |
274 | chownr@^2.0.0:
275 | version "2.0.0"
276 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
277 | integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
278 |
279 | ci-info@^2.0.0:
280 | version "2.0.0"
281 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
282 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
283 |
284 | cli-boxes@^2.2.1:
285 | version "2.2.1"
286 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
287 | integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==
288 |
289 | clone-response@^1.0.2:
290 | version "1.0.2"
291 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
292 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
293 | dependencies:
294 | mimic-response "^1.0.0"
295 |
296 | color-convert@^2.0.1:
297 | version "2.0.1"
298 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
299 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
300 | dependencies:
301 | color-name "~1.1.4"
302 |
303 | color-name@~1.1.4:
304 | version "1.1.4"
305 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
306 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
307 |
308 | color-support@^1.1.2:
309 | version "1.1.3"
310 | resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
311 | integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
312 |
313 | component-emitter@~1.3.0:
314 | version "1.3.0"
315 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
316 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
317 |
318 | concat-map@0.0.1:
319 | version "0.0.1"
320 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
321 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
322 |
323 | configstore@^5.0.1:
324 | version "5.0.1"
325 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
326 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==
327 | dependencies:
328 | dot-prop "^5.2.0"
329 | graceful-fs "^4.1.2"
330 | make-dir "^3.0.0"
331 | unique-string "^2.0.0"
332 | write-file-atomic "^3.0.0"
333 | xdg-basedir "^4.0.0"
334 |
335 | console-control-strings@^1.0.0, console-control-strings@^1.1.0:
336 | version "1.1.0"
337 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
338 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
339 |
340 | content-disposition@0.5.4:
341 | version "0.5.4"
342 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
343 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
344 | dependencies:
345 | safe-buffer "5.2.1"
346 |
347 | content-type@~1.0.4:
348 | version "1.0.4"
349 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
350 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
351 |
352 | cookie-signature@1.0.6:
353 | version "1.0.6"
354 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
355 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
356 |
357 | cookie@0.4.1:
358 | version "0.4.1"
359 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
360 | integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
361 |
362 | cookie@~0.4.1:
363 | version "0.4.2"
364 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
365 | integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
366 |
367 | cors@^2.8.5, cors@~2.8.5:
368 | version "2.8.5"
369 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
370 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
371 | dependencies:
372 | object-assign "^4"
373 | vary "^1"
374 |
375 | crypto-random-string@^2.0.0:
376 | version "2.0.0"
377 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
378 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
379 |
380 | debug@2.6.9:
381 | version "2.6.9"
382 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
383 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
384 | dependencies:
385 | ms "2.0.0"
386 |
387 | debug@4, debug@4.x, debug@~4.3.1, debug@~4.3.2:
388 | version "4.3.3"
389 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
390 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
391 | dependencies:
392 | ms "2.1.2"
393 |
394 | debug@^3.2.7:
395 | version "3.2.7"
396 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
397 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
398 | dependencies:
399 | ms "^2.1.1"
400 |
401 | decompress-response@^3.3.0:
402 | version "3.3.0"
403 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
404 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
405 | dependencies:
406 | mimic-response "^1.0.0"
407 |
408 | deep-extend@^0.6.0:
409 | version "0.6.0"
410 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
411 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
412 |
413 | defer-to-connect@^1.0.1:
414 | version "1.1.3"
415 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
416 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
417 |
418 | delegates@^1.0.0:
419 | version "1.0.0"
420 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
421 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
422 |
423 | denque@^2.0.1:
424 | version "2.0.1"
425 | resolved "https://registry.yarnpkg.com/denque/-/denque-2.0.1.tgz#bcef4c1b80dc32efe97515744f21a4229ab8934a"
426 | integrity sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==
427 |
428 | depd@~1.1.2:
429 | version "1.1.2"
430 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
431 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
432 |
433 | destroy@~1.0.4:
434 | version "1.0.4"
435 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
436 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
437 |
438 | detect-libc@^1.0.3:
439 | version "1.0.3"
440 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
441 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
442 |
443 | dot-prop@^5.2.0:
444 | version "5.3.0"
445 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
446 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
447 | dependencies:
448 | is-obj "^2.0.0"
449 |
450 | dotenv@^16.0.0:
451 | version "16.0.0"
452 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.0.tgz#c619001253be89ebb638d027b609c75c26e47411"
453 | integrity sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==
454 |
455 | duplexer3@^0.1.4:
456 | version "0.1.4"
457 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
458 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
459 |
460 | ee-first@1.1.1:
461 | version "1.1.1"
462 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
463 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
464 |
465 | emoji-regex@^8.0.0:
466 | version "8.0.0"
467 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
468 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
469 |
470 | encodeurl@~1.0.2:
471 | version "1.0.2"
472 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
473 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
474 |
475 | end-of-stream@^1.1.0:
476 | version "1.4.4"
477 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
478 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
479 | dependencies:
480 | once "^1.4.0"
481 |
482 | engine.io-parser@~5.0.0:
483 | version "5.0.3"
484 | resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.3.tgz#ca1f0d7b11e290b4bfda251803baea765ed89c09"
485 | integrity sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==
486 | dependencies:
487 | "@socket.io/base64-arraybuffer" "~1.0.2"
488 |
489 | engine.io@~6.1.0:
490 | version "6.1.2"
491 | resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.1.2.tgz#e7b9d546d90c62246ffcba4d88594be980d3855a"
492 | integrity sha512-v/7eGHxPvO2AWsksyx2PUsQvBafuvqs0jJJQ0FdmJG1b9qIvgSbqDRGwNhfk2XHaTTbTXiC4quRE8Q9nRjsrQQ==
493 | dependencies:
494 | "@types/cookie" "^0.4.1"
495 | "@types/cors" "^2.8.12"
496 | "@types/node" ">=10.0.0"
497 | accepts "~1.3.4"
498 | base64id "2.0.0"
499 | cookie "~0.4.1"
500 | cors "~2.8.5"
501 | debug "~4.3.1"
502 | engine.io-parser "~5.0.0"
503 | ws "~8.2.3"
504 |
505 | escape-goat@^2.0.0:
506 | version "2.1.1"
507 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
508 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==
509 |
510 | escape-html@~1.0.3:
511 | version "1.0.3"
512 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
513 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
514 |
515 | etag@~1.8.1:
516 | version "1.8.1"
517 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
518 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
519 |
520 | express@^4.17.2:
521 | version "4.17.2"
522 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3"
523 | integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==
524 | dependencies:
525 | accepts "~1.3.7"
526 | array-flatten "1.1.1"
527 | body-parser "1.19.1"
528 | content-disposition "0.5.4"
529 | content-type "~1.0.4"
530 | cookie "0.4.1"
531 | cookie-signature "1.0.6"
532 | debug "2.6.9"
533 | depd "~1.1.2"
534 | encodeurl "~1.0.2"
535 | escape-html "~1.0.3"
536 | etag "~1.8.1"
537 | finalhandler "~1.1.2"
538 | fresh "0.5.2"
539 | merge-descriptors "1.0.1"
540 | methods "~1.1.2"
541 | on-finished "~2.3.0"
542 | parseurl "~1.3.3"
543 | path-to-regexp "0.1.7"
544 | proxy-addr "~2.0.7"
545 | qs "6.9.6"
546 | range-parser "~1.2.1"
547 | safe-buffer "5.2.1"
548 | send "0.17.2"
549 | serve-static "1.14.2"
550 | setprototypeof "1.2.0"
551 | statuses "~1.5.0"
552 | type-is "~1.6.18"
553 | utils-merge "1.0.1"
554 | vary "~1.1.2"
555 |
556 | fill-range@^7.0.1:
557 | version "7.0.1"
558 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
559 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
560 | dependencies:
561 | to-regex-range "^5.0.1"
562 |
563 | finalhandler@~1.1.2:
564 | version "1.1.2"
565 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
566 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
567 | dependencies:
568 | debug "2.6.9"
569 | encodeurl "~1.0.2"
570 | escape-html "~1.0.3"
571 | on-finished "~2.3.0"
572 | parseurl "~1.3.3"
573 | statuses "~1.5.0"
574 | unpipe "~1.0.0"
575 |
576 | forwarded@0.2.0:
577 | version "0.2.0"
578 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
579 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
580 |
581 | fresh@0.5.2:
582 | version "0.5.2"
583 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
584 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
585 |
586 | fs-minipass@^2.0.0:
587 | version "2.1.0"
588 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
589 | integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
590 | dependencies:
591 | minipass "^3.0.0"
592 |
593 | fs.realpath@^1.0.0:
594 | version "1.0.0"
595 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
596 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
597 |
598 | fsevents@~2.3.2:
599 | version "2.3.2"
600 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
601 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
602 |
603 | gauge@^3.0.0:
604 | version "3.0.2"
605 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395"
606 | integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==
607 | dependencies:
608 | aproba "^1.0.3 || ^2.0.0"
609 | color-support "^1.1.2"
610 | console-control-strings "^1.0.0"
611 | has-unicode "^2.0.1"
612 | object-assign "^4.1.1"
613 | signal-exit "^3.0.0"
614 | string-width "^4.2.3"
615 | strip-ansi "^6.0.1"
616 | wide-align "^1.1.2"
617 |
618 | get-stream@^4.1.0:
619 | version "4.1.0"
620 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
621 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
622 | dependencies:
623 | pump "^3.0.0"
624 |
625 | get-stream@^5.1.0:
626 | version "5.2.0"
627 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
628 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
629 | dependencies:
630 | pump "^3.0.0"
631 |
632 | glob-parent@~5.1.2:
633 | version "5.1.2"
634 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
635 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
636 | dependencies:
637 | is-glob "^4.0.1"
638 |
639 | glob@^7.1.3:
640 | version "7.2.0"
641 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
642 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
643 | dependencies:
644 | fs.realpath "^1.0.0"
645 | inflight "^1.0.4"
646 | inherits "2"
647 | minimatch "^3.0.4"
648 | once "^1.3.0"
649 | path-is-absolute "^1.0.0"
650 |
651 | global-dirs@^3.0.0:
652 | version "3.0.0"
653 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686"
654 | integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==
655 | dependencies:
656 | ini "2.0.0"
657 |
658 | got@^9.6.0:
659 | version "9.6.0"
660 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
661 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
662 | dependencies:
663 | "@sindresorhus/is" "^0.14.0"
664 | "@szmarczak/http-timer" "^1.1.2"
665 | cacheable-request "^6.0.0"
666 | decompress-response "^3.3.0"
667 | duplexer3 "^0.1.4"
668 | get-stream "^4.1.0"
669 | lowercase-keys "^1.0.1"
670 | mimic-response "^1.0.1"
671 | p-cancelable "^1.0.0"
672 | to-readable-stream "^1.0.0"
673 | url-parse-lax "^3.0.0"
674 |
675 | graceful-fs@^4.1.2:
676 | version "4.2.9"
677 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
678 | integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
679 |
680 | has-flag@^3.0.0:
681 | version "3.0.0"
682 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
683 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
684 |
685 | has-flag@^4.0.0:
686 | version "4.0.0"
687 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
688 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
689 |
690 | has-unicode@^2.0.1:
691 | version "2.0.1"
692 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
693 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
694 |
695 | has-yarn@^2.1.0:
696 | version "2.1.0"
697 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
698 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
699 |
700 | http-cache-semantics@^4.0.0:
701 | version "4.1.0"
702 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
703 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
704 |
705 | http-errors@1.8.1:
706 | version "1.8.1"
707 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c"
708 | integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==
709 | dependencies:
710 | depd "~1.1.2"
711 | inherits "2.0.4"
712 | setprototypeof "1.2.0"
713 | statuses ">= 1.5.0 < 2"
714 | toidentifier "1.0.1"
715 |
716 | https-proxy-agent@^5.0.0:
717 | version "5.0.0"
718 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
719 | integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
720 | dependencies:
721 | agent-base "6"
722 | debug "4"
723 |
724 | iconv-lite@0.4.24:
725 | version "0.4.24"
726 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
727 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
728 | dependencies:
729 | safer-buffer ">= 2.1.2 < 3"
730 |
731 | ieee754@^1.1.13:
732 | version "1.2.1"
733 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
734 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
735 |
736 | ignore-by-default@^1.0.1:
737 | version "1.0.1"
738 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
739 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
740 |
741 | import-lazy@^2.1.0:
742 | version "2.1.0"
743 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
744 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
745 |
746 | imurmurhash@^0.1.4:
747 | version "0.1.4"
748 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
749 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
750 |
751 | inflight@^1.0.4:
752 | version "1.0.6"
753 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
754 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
755 | dependencies:
756 | once "^1.3.0"
757 | wrappy "1"
758 |
759 | inherits@2, inherits@2.0.4, inherits@^2.0.3:
760 | version "2.0.4"
761 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
762 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
763 |
764 | ini@2.0.0:
765 | version "2.0.0"
766 | resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
767 | integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
768 |
769 | ini@~1.3.0:
770 | version "1.3.8"
771 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
772 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
773 |
774 | ip@^1.1.5:
775 | version "1.1.5"
776 | resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
777 | integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
778 |
779 | ipaddr.js@1.9.1:
780 | version "1.9.1"
781 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
782 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
783 |
784 | is-binary-path@~2.1.0:
785 | version "2.1.0"
786 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
787 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
788 | dependencies:
789 | binary-extensions "^2.0.0"
790 |
791 | is-ci@^2.0.0:
792 | version "2.0.0"
793 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
794 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
795 | dependencies:
796 | ci-info "^2.0.0"
797 |
798 | is-extglob@^2.1.1:
799 | version "2.1.1"
800 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
801 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
802 |
803 | is-fullwidth-code-point@^3.0.0:
804 | version "3.0.0"
805 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
806 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
807 |
808 | is-glob@^4.0.1, is-glob@~4.0.1:
809 | version "4.0.3"
810 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
811 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
812 | dependencies:
813 | is-extglob "^2.1.1"
814 |
815 | is-installed-globally@^0.4.0:
816 | version "0.4.0"
817 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520"
818 | integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==
819 | dependencies:
820 | global-dirs "^3.0.0"
821 | is-path-inside "^3.0.2"
822 |
823 | is-npm@^5.0.0:
824 | version "5.0.0"
825 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8"
826 | integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==
827 |
828 | is-number@^7.0.0:
829 | version "7.0.0"
830 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
831 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
832 |
833 | is-obj@^2.0.0:
834 | version "2.0.0"
835 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
836 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
837 |
838 | is-path-inside@^3.0.2:
839 | version "3.0.3"
840 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
841 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
842 |
843 | is-typedarray@^1.0.0:
844 | version "1.0.0"
845 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
846 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
847 |
848 | is-yarn-global@^0.3.0:
849 | version "0.3.0"
850 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
851 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
852 |
853 | json-buffer@3.0.0:
854 | version "3.0.0"
855 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
856 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
857 |
858 | kareem@2.3.3:
859 | version "2.3.3"
860 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.3.tgz#a4432d7965a5bb06fc2b4eeae71317344c9a756a"
861 | integrity sha512-uESCXM2KdtOQ8LOvKyTUXEeg0MkYp4wGglTIpGcYHvjJcS5sn2Wkfrfit8m4xSbaNDAw2KdI9elgkOxZbrFYbg==
862 |
863 | keyv@^3.0.0:
864 | version "3.1.0"
865 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
866 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
867 | dependencies:
868 | json-buffer "3.0.0"
869 |
870 | latest-version@^5.1.0:
871 | version "5.1.0"
872 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
873 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==
874 | dependencies:
875 | package-json "^6.3.0"
876 |
877 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
878 | version "1.0.1"
879 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
880 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
881 |
882 | lowercase-keys@^2.0.0:
883 | version "2.0.0"
884 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
885 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
886 |
887 | lru-cache@^6.0.0:
888 | version "6.0.0"
889 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
890 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
891 | dependencies:
892 | yallist "^4.0.0"
893 |
894 | make-dir@^3.0.0, make-dir@^3.1.0:
895 | version "3.1.0"
896 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
897 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
898 | dependencies:
899 | semver "^6.0.0"
900 |
901 | media-typer@0.3.0:
902 | version "0.3.0"
903 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
904 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
905 |
906 | memory-pager@^1.0.2:
907 | version "1.5.0"
908 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5"
909 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==
910 |
911 | merge-descriptors@1.0.1:
912 | version "1.0.1"
913 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
914 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
915 |
916 | methods@~1.1.2:
917 | version "1.1.2"
918 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
919 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
920 |
921 | mime-db@1.51.0:
922 | version "1.51.0"
923 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
924 | integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
925 |
926 | mime-types@~2.1.24, mime-types@~2.1.34:
927 | version "2.1.34"
928 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
929 | integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
930 | dependencies:
931 | mime-db "1.51.0"
932 |
933 | mime@1.6.0:
934 | version "1.6.0"
935 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
936 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
937 |
938 | mimic-response@^1.0.0, mimic-response@^1.0.1:
939 | version "1.0.1"
940 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
941 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
942 |
943 | minimatch@^3.0.4:
944 | version "3.1.1"
945 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.1.tgz#879ad447200773912898b46cd516a7abbb5e50b0"
946 | integrity sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A==
947 | dependencies:
948 | brace-expansion "^1.1.7"
949 |
950 | minimist@^1.2.0:
951 | version "1.2.5"
952 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
953 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
954 |
955 | minipass@^3.0.0:
956 | version "3.1.6"
957 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee"
958 | integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==
959 | dependencies:
960 | yallist "^4.0.0"
961 |
962 | minizlib@^2.1.1:
963 | version "2.1.2"
964 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
965 | integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
966 | dependencies:
967 | minipass "^3.0.0"
968 | yallist "^4.0.0"
969 |
970 | mkdirp@^1.0.3:
971 | version "1.0.4"
972 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
973 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
974 |
975 | mongodb-connection-string-url@^2.4.1:
976 | version "2.4.2"
977 | resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.4.2.tgz#422861119764796420889f9b0416b957e1b0bde0"
978 | integrity sha512-mZUXF6nUzRWk5J3h41MsPv13ukWlH4jOMSk6astVeoZ1EbdTJyF5I3wxKkvqBAOoVtzLgyEYUvDjrGdcPlKjAw==
979 | dependencies:
980 | "@types/whatwg-url" "^8.2.1"
981 | whatwg-url "^11.0.0"
982 |
983 | mongodb@4.3.1:
984 | version "4.3.1"
985 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.3.1.tgz#e346f76e421ec6f47ddea5c8f5140e6181aaeb94"
986 | integrity sha512-sNa8APSIk+r4x31ZwctKjuPSaeKuvUeNb/fu/3B6dRM02HpEgig7hTHM8A/PJQTlxuC/KFWlDlQjhsk/S43tBg==
987 | dependencies:
988 | bson "^4.6.1"
989 | denque "^2.0.1"
990 | mongodb-connection-string-url "^2.4.1"
991 | socks "^2.6.1"
992 | optionalDependencies:
993 | saslprep "^1.0.3"
994 |
995 | mongoose@^6.2.1:
996 | version "6.2.1"
997 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.2.1.tgz#5791f46336f785080259c007ec16ad42e606e2ee"
998 | integrity sha512-VxY1wvlc4uBQKyKNVDoEkTU3/ayFOD//qVXYP+sFyvTRbAj9/M53UWTERd84pWogs2TqAC6DTvZbxCs2LoOd3Q==
999 | dependencies:
1000 | bson "^4.2.2"
1001 | kareem "2.3.3"
1002 | mongodb "4.3.1"
1003 | mpath "0.8.4"
1004 | mquery "4.0.2"
1005 | ms "2.1.2"
1006 | sift "13.5.2"
1007 |
1008 | mpath@0.8.4:
1009 | version "0.8.4"
1010 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.8.4.tgz#6b566d9581621d9e931dd3b142ed3618e7599313"
1011 | integrity sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==
1012 |
1013 | mquery@4.0.2:
1014 | version "4.0.2"
1015 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.2.tgz#a13add5ecd7c2e5a67e0f814b3c7acdfb6772804"
1016 | integrity sha512-oAVF0Nil1mT3rxty6Zln4YiD6x6QsUWYz927jZzjMxOK2aqmhEz5JQ7xmrKK7xRFA2dwV+YaOpKU/S+vfNqKxA==
1017 | dependencies:
1018 | debug "4.x"
1019 |
1020 | ms@2.0.0:
1021 | version "2.0.0"
1022 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
1023 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
1024 |
1025 | ms@2.1.2:
1026 | version "2.1.2"
1027 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
1028 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
1029 |
1030 | ms@2.1.3, ms@^2.1.1:
1031 | version "2.1.3"
1032 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
1033 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
1034 |
1035 | negotiator@0.6.3:
1036 | version "0.6.3"
1037 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
1038 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
1039 |
1040 | node-addon-api@^3.1.0:
1041 | version "3.2.1"
1042 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
1043 | integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
1044 |
1045 | node-fetch@^2.6.5:
1046 | version "2.6.7"
1047 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
1048 | integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
1049 | dependencies:
1050 | whatwg-url "^5.0.0"
1051 |
1052 | nodemon@^2.0.15:
1053 | version "2.0.15"
1054 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e"
1055 | integrity sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==
1056 | dependencies:
1057 | chokidar "^3.5.2"
1058 | debug "^3.2.7"
1059 | ignore-by-default "^1.0.1"
1060 | minimatch "^3.0.4"
1061 | pstree.remy "^1.1.8"
1062 | semver "^5.7.1"
1063 | supports-color "^5.5.0"
1064 | touch "^3.1.0"
1065 | undefsafe "^2.0.5"
1066 | update-notifier "^5.1.0"
1067 |
1068 | nopt@^5.0.0:
1069 | version "5.0.0"
1070 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
1071 | integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==
1072 | dependencies:
1073 | abbrev "1"
1074 |
1075 | nopt@~1.0.10:
1076 | version "1.0.10"
1077 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
1078 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
1079 | dependencies:
1080 | abbrev "1"
1081 |
1082 | normalize-path@^3.0.0, normalize-path@~3.0.0:
1083 | version "3.0.0"
1084 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
1085 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
1086 |
1087 | normalize-url@^4.1.0:
1088 | version "4.5.1"
1089 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
1090 | integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
1091 |
1092 | npmlog@^5.0.1:
1093 | version "5.0.1"
1094 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0"
1095 | integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==
1096 | dependencies:
1097 | are-we-there-yet "^2.0.0"
1098 | console-control-strings "^1.1.0"
1099 | gauge "^3.0.0"
1100 | set-blocking "^2.0.0"
1101 |
1102 | object-assign@^4, object-assign@^4.1.1:
1103 | version "4.1.1"
1104 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
1105 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
1106 |
1107 | on-finished@~2.3.0:
1108 | version "2.3.0"
1109 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
1110 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
1111 | dependencies:
1112 | ee-first "1.1.1"
1113 |
1114 | once@^1.3.0, once@^1.3.1, once@^1.4.0:
1115 | version "1.4.0"
1116 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
1117 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
1118 | dependencies:
1119 | wrappy "1"
1120 |
1121 | p-cancelable@^1.0.0:
1122 | version "1.1.0"
1123 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
1124 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
1125 |
1126 | package-json@^6.3.0:
1127 | version "6.5.0"
1128 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
1129 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==
1130 | dependencies:
1131 | got "^9.6.0"
1132 | registry-auth-token "^4.0.0"
1133 | registry-url "^5.0.0"
1134 | semver "^6.2.0"
1135 |
1136 | parseurl@~1.3.3:
1137 | version "1.3.3"
1138 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
1139 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
1140 |
1141 | path-is-absolute@^1.0.0:
1142 | version "1.0.1"
1143 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
1144 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
1145 |
1146 | path-to-regexp@0.1.7:
1147 | version "0.1.7"
1148 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
1149 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
1150 |
1151 | picomatch@^2.0.4, picomatch@^2.2.1:
1152 | version "2.3.1"
1153 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
1154 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
1155 |
1156 | prepend-http@^2.0.0:
1157 | version "2.0.0"
1158 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
1159 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
1160 |
1161 | proxy-addr@~2.0.7:
1162 | version "2.0.7"
1163 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
1164 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
1165 | dependencies:
1166 | forwarded "0.2.0"
1167 | ipaddr.js "1.9.1"
1168 |
1169 | pstree.remy@^1.1.8:
1170 | version "1.1.8"
1171 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
1172 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
1173 |
1174 | pump@^3.0.0:
1175 | version "3.0.0"
1176 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
1177 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
1178 | dependencies:
1179 | end-of-stream "^1.1.0"
1180 | once "^1.3.1"
1181 |
1182 | punycode@^2.1.1:
1183 | version "2.1.1"
1184 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
1185 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
1186 |
1187 | pupa@^2.1.1:
1188 | version "2.1.1"
1189 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62"
1190 | integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==
1191 | dependencies:
1192 | escape-goat "^2.0.0"
1193 |
1194 | qs@6.9.6:
1195 | version "6.9.6"
1196 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee"
1197 | integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==
1198 |
1199 | range-parser@~1.2.1:
1200 | version "1.2.1"
1201 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
1202 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
1203 |
1204 | raw-body@2.4.2:
1205 | version "2.4.2"
1206 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32"
1207 | integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==
1208 | dependencies:
1209 | bytes "3.1.1"
1210 | http-errors "1.8.1"
1211 | iconv-lite "0.4.24"
1212 | unpipe "1.0.0"
1213 |
1214 | rc@^1.2.8:
1215 | version "1.2.8"
1216 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
1217 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
1218 | dependencies:
1219 | deep-extend "^0.6.0"
1220 | ini "~1.3.0"
1221 | minimist "^1.2.0"
1222 | strip-json-comments "~2.0.1"
1223 |
1224 | readable-stream@^3.6.0:
1225 | version "3.6.0"
1226 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
1227 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
1228 | dependencies:
1229 | inherits "^2.0.3"
1230 | string_decoder "^1.1.1"
1231 | util-deprecate "^1.0.1"
1232 |
1233 | readdirp@~3.6.0:
1234 | version "3.6.0"
1235 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
1236 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
1237 | dependencies:
1238 | picomatch "^2.2.1"
1239 |
1240 | registry-auth-token@^4.0.0:
1241 | version "4.2.1"
1242 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250"
1243 | integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==
1244 | dependencies:
1245 | rc "^1.2.8"
1246 |
1247 | registry-url@^5.0.0:
1248 | version "5.1.0"
1249 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
1250 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==
1251 | dependencies:
1252 | rc "^1.2.8"
1253 |
1254 | responselike@^1.0.2:
1255 | version "1.0.2"
1256 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
1257 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
1258 | dependencies:
1259 | lowercase-keys "^1.0.0"
1260 |
1261 | rimraf@^3.0.2:
1262 | version "3.0.2"
1263 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
1264 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
1265 | dependencies:
1266 | glob "^7.1.3"
1267 |
1268 | safe-buffer@5.2.1, safe-buffer@~5.2.0:
1269 | version "5.2.1"
1270 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
1271 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
1272 |
1273 | "safer-buffer@>= 2.1.2 < 3":
1274 | version "2.1.2"
1275 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
1276 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
1277 |
1278 | saslprep@^1.0.3:
1279 | version "1.0.3"
1280 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226"
1281 | integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==
1282 | dependencies:
1283 | sparse-bitfield "^3.0.3"
1284 |
1285 | semver-diff@^3.1.1:
1286 | version "3.1.1"
1287 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
1288 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==
1289 | dependencies:
1290 | semver "^6.3.0"
1291 |
1292 | semver@^5.7.1:
1293 | version "5.7.1"
1294 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
1295 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
1296 |
1297 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
1298 | version "6.3.0"
1299 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
1300 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
1301 |
1302 | semver@^7.3.4, semver@^7.3.5:
1303 | version "7.3.5"
1304 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
1305 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
1306 | dependencies:
1307 | lru-cache "^6.0.0"
1308 |
1309 | send@0.17.2:
1310 | version "0.17.2"
1311 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820"
1312 | integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==
1313 | dependencies:
1314 | debug "2.6.9"
1315 | depd "~1.1.2"
1316 | destroy "~1.0.4"
1317 | encodeurl "~1.0.2"
1318 | escape-html "~1.0.3"
1319 | etag "~1.8.1"
1320 | fresh "0.5.2"
1321 | http-errors "1.8.1"
1322 | mime "1.6.0"
1323 | ms "2.1.3"
1324 | on-finished "~2.3.0"
1325 | range-parser "~1.2.1"
1326 | statuses "~1.5.0"
1327 |
1328 | serve-static@1.14.2:
1329 | version "1.14.2"
1330 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa"
1331 | integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==
1332 | dependencies:
1333 | encodeurl "~1.0.2"
1334 | escape-html "~1.0.3"
1335 | parseurl "~1.3.3"
1336 | send "0.17.2"
1337 |
1338 | set-blocking@^2.0.0:
1339 | version "2.0.0"
1340 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
1341 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
1342 |
1343 | setprototypeof@1.2.0:
1344 | version "1.2.0"
1345 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
1346 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
1347 |
1348 | sift@13.5.2:
1349 | version "13.5.2"
1350 | resolved "https://registry.yarnpkg.com/sift/-/sift-13.5.2.tgz#24a715e13c617b086166cd04917d204a591c9da6"
1351 | integrity sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==
1352 |
1353 | signal-exit@^3.0.0, signal-exit@^3.0.2:
1354 | version "3.0.7"
1355 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
1356 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
1357 |
1358 | smart-buffer@^4.2.0:
1359 | version "4.2.0"
1360 | resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
1361 | integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
1362 |
1363 | socket.io-adapter@~2.3.3:
1364 | version "2.3.3"
1365 | resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz#4d6111e4d42e9f7646e365b4f578269821f13486"
1366 | integrity sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==
1367 |
1368 | socket.io-parser@~4.0.4:
1369 | version "4.0.4"
1370 | resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0"
1371 | integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==
1372 | dependencies:
1373 | "@types/component-emitter" "^1.2.10"
1374 | component-emitter "~1.3.0"
1375 | debug "~4.3.1"
1376 |
1377 | socket.io@^4.4.1:
1378 | version "4.4.1"
1379 | resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.4.1.tgz#cd6de29e277a161d176832bb24f64ee045c56ab8"
1380 | integrity sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==
1381 | dependencies:
1382 | accepts "~1.3.4"
1383 | base64id "~2.0.0"
1384 | debug "~4.3.2"
1385 | engine.io "~6.1.0"
1386 | socket.io-adapter "~2.3.3"
1387 | socket.io-parser "~4.0.4"
1388 |
1389 | socks@^2.6.1:
1390 | version "2.6.2"
1391 | resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a"
1392 | integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==
1393 | dependencies:
1394 | ip "^1.1.5"
1395 | smart-buffer "^4.2.0"
1396 |
1397 | sparse-bitfield@^3.0.3:
1398 | version "3.0.3"
1399 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11"
1400 | integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE=
1401 | dependencies:
1402 | memory-pager "^1.0.2"
1403 |
1404 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
1405 | version "1.5.0"
1406 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
1407 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
1408 |
1409 | "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2, string-width@^4.2.3:
1410 | version "4.2.3"
1411 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
1412 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
1413 | dependencies:
1414 | emoji-regex "^8.0.0"
1415 | is-fullwidth-code-point "^3.0.0"
1416 | strip-ansi "^6.0.1"
1417 |
1418 | string_decoder@^1.1.1:
1419 | version "1.3.0"
1420 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
1421 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
1422 | dependencies:
1423 | safe-buffer "~5.2.0"
1424 |
1425 | strip-ansi@^6.0.0, strip-ansi@^6.0.1:
1426 | version "6.0.1"
1427 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
1428 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
1429 | dependencies:
1430 | ansi-regex "^5.0.1"
1431 |
1432 | strip-json-comments@~2.0.1:
1433 | version "2.0.1"
1434 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
1435 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
1436 |
1437 | supports-color@^5.5.0:
1438 | version "5.5.0"
1439 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
1440 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
1441 | dependencies:
1442 | has-flag "^3.0.0"
1443 |
1444 | supports-color@^7.1.0:
1445 | version "7.2.0"
1446 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
1447 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
1448 | dependencies:
1449 | has-flag "^4.0.0"
1450 |
1451 | tar@^6.1.11:
1452 | version "6.1.11"
1453 | resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
1454 | integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
1455 | dependencies:
1456 | chownr "^2.0.0"
1457 | fs-minipass "^2.0.0"
1458 | minipass "^3.0.0"
1459 | minizlib "^2.1.1"
1460 | mkdirp "^1.0.3"
1461 | yallist "^4.0.0"
1462 |
1463 | to-readable-stream@^1.0.0:
1464 | version "1.0.0"
1465 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
1466 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
1467 |
1468 | to-regex-range@^5.0.1:
1469 | version "5.0.1"
1470 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
1471 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
1472 | dependencies:
1473 | is-number "^7.0.0"
1474 |
1475 | toidentifier@1.0.1:
1476 | version "1.0.1"
1477 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
1478 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
1479 |
1480 | touch@^3.1.0:
1481 | version "3.1.0"
1482 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
1483 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
1484 | dependencies:
1485 | nopt "~1.0.10"
1486 |
1487 | tr46@^3.0.0:
1488 | version "3.0.0"
1489 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9"
1490 | integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==
1491 | dependencies:
1492 | punycode "^2.1.1"
1493 |
1494 | tr46@~0.0.3:
1495 | version "0.0.3"
1496 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
1497 | integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
1498 |
1499 | type-fest@^0.20.2:
1500 | version "0.20.2"
1501 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
1502 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
1503 |
1504 | type-is@~1.6.18:
1505 | version "1.6.18"
1506 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
1507 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
1508 | dependencies:
1509 | media-typer "0.3.0"
1510 | mime-types "~2.1.24"
1511 |
1512 | typedarray-to-buffer@^3.1.5:
1513 | version "3.1.5"
1514 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
1515 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
1516 | dependencies:
1517 | is-typedarray "^1.0.0"
1518 |
1519 | undefsafe@^2.0.5:
1520 | version "2.0.5"
1521 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c"
1522 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==
1523 |
1524 | unique-string@^2.0.0:
1525 | version "2.0.0"
1526 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
1527 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
1528 | dependencies:
1529 | crypto-random-string "^2.0.0"
1530 |
1531 | unpipe@1.0.0, unpipe@~1.0.0:
1532 | version "1.0.0"
1533 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
1534 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
1535 |
1536 | update-notifier@^5.1.0:
1537 | version "5.1.0"
1538 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9"
1539 | integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==
1540 | dependencies:
1541 | boxen "^5.0.0"
1542 | chalk "^4.1.0"
1543 | configstore "^5.0.1"
1544 | has-yarn "^2.1.0"
1545 | import-lazy "^2.1.0"
1546 | is-ci "^2.0.0"
1547 | is-installed-globally "^0.4.0"
1548 | is-npm "^5.0.0"
1549 | is-yarn-global "^0.3.0"
1550 | latest-version "^5.1.0"
1551 | pupa "^2.1.1"
1552 | semver "^7.3.4"
1553 | semver-diff "^3.1.1"
1554 | xdg-basedir "^4.0.0"
1555 |
1556 | url-parse-lax@^3.0.0:
1557 | version "3.0.0"
1558 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
1559 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
1560 | dependencies:
1561 | prepend-http "^2.0.0"
1562 |
1563 | util-deprecate@^1.0.1:
1564 | version "1.0.2"
1565 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
1566 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
1567 |
1568 | utils-merge@1.0.1:
1569 | version "1.0.1"
1570 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
1571 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
1572 |
1573 | vary@^1, vary@~1.1.2:
1574 | version "1.1.2"
1575 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
1576 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
1577 |
1578 | webidl-conversions@^3.0.0:
1579 | version "3.0.1"
1580 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
1581 | integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
1582 |
1583 | webidl-conversions@^7.0.0:
1584 | version "7.0.0"
1585 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
1586 | integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
1587 |
1588 | whatwg-url@^11.0.0:
1589 | version "11.0.0"
1590 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018"
1591 | integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==
1592 | dependencies:
1593 | tr46 "^3.0.0"
1594 | webidl-conversions "^7.0.0"
1595 |
1596 | whatwg-url@^5.0.0:
1597 | version "5.0.0"
1598 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
1599 | integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
1600 | dependencies:
1601 | tr46 "~0.0.3"
1602 | webidl-conversions "^3.0.0"
1603 |
1604 | wide-align@^1.1.2:
1605 | version "1.1.5"
1606 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
1607 | integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
1608 | dependencies:
1609 | string-width "^1.0.2 || 2 || 3 || 4"
1610 |
1611 | widest-line@^3.1.0:
1612 | version "3.1.0"
1613 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
1614 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
1615 | dependencies:
1616 | string-width "^4.0.0"
1617 |
1618 | wrap-ansi@^7.0.0:
1619 | version "7.0.0"
1620 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
1621 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
1622 | dependencies:
1623 | ansi-styles "^4.0.0"
1624 | string-width "^4.1.0"
1625 | strip-ansi "^6.0.0"
1626 |
1627 | wrappy@1:
1628 | version "1.0.2"
1629 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
1630 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
1631 |
1632 | write-file-atomic@^3.0.0:
1633 | version "3.0.3"
1634 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
1635 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
1636 | dependencies:
1637 | imurmurhash "^0.1.4"
1638 | is-typedarray "^1.0.0"
1639 | signal-exit "^3.0.2"
1640 | typedarray-to-buffer "^3.1.5"
1641 |
1642 | ws@~8.2.3:
1643 | version "8.2.3"
1644 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"
1645 | integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==
1646 |
1647 | xdg-basedir@^4.0.0:
1648 | version "4.0.0"
1649 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
1650 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
1651 |
1652 | yallist@^4.0.0:
1653 | version "4.0.0"
1654 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
1655 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
1656 |
--------------------------------------------------------------------------------