├── .github
└── FUNDING.yml
├── .gitignore
├── README.md
├── client
├── .gitignore
├── README.md
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
├── src
│ ├── App.css
│ ├── App.jsx
│ ├── assets
│ │ ├── AddChannel.js
│ │ ├── ChannelInfo.js
│ │ ├── CloseCreateChannel.js
│ │ ├── InviteIcon.js
│ │ ├── LightningBolt.js
│ │ ├── SearchIcon.js
│ │ ├── hospital.png
│ │ ├── index.js
│ │ ├── logout.png
│ │ └── signup.jpg
│ ├── components
│ │ ├── Auth.jsx
│ │ ├── ChannelContainer.jsx
│ │ ├── ChannelInner.jsx
│ │ ├── ChannelListContainer.jsx
│ │ ├── ChannelSearch.jsx
│ │ ├── CreateChannel.jsx
│ │ ├── EditChannel.jsx
│ │ ├── ResultsDropdown.jsx
│ │ ├── TeamChannelList.jsx
│ │ ├── TeamChannelPreview.jsx
│ │ ├── TeamMessage.jsx
│ │ ├── UserList.jsx
│ │ └── index.js
│ └── index.js
└── yarn.lock
└── server
├── .env
├── controllers
└── auth.js
├── index.js
├── package-lock.json
├── package.json
└── routes
└── auth.js
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | github: adrianhajdin
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Medical Pager Chat App
2 |
3 | 
4 |
5 | ### [🌟 Become a top 1% Next.js 13 developer in only one course](https://jsmastery.pro/next13)
6 | ### [🚀 Land your dream programming job in 6 months](https://jsmastery.pro/masterclass)
7 |
8 | ## Introduction
9 | This is a code repository for the corresponding video tutorial.
10 |
11 | In this video, we will create a full Realtime Chat Application. We're going to use React on the front end, NodeJS on the back end and the entire chat is powered with https://gstrm.io/js-mastery.
12 |
13 | By the end of this video, you will be able to build any real-time chat application you can think of.
14 |
15 | Setup:
16 | - run ```npm i && npm start``` for both client and server side to start the development server
17 |
18 | ## Stay up to date with new projects
19 | New major projects coming soon, subscribe to the mailing list to stay up to date https://resource.jsmasterypro.com/newsletter
20 |
--------------------------------------------------------------------------------
/client/.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 |
--------------------------------------------------------------------------------
/client/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 | ### `yarn start`
10 |
11 | Runs the app in the development mode.\
12 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
13 |
14 | The page will reload if you make edits.\
15 | You will also see any lint errors in the console.
16 |
17 | ### `yarn 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 | ### `yarn 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 | ### `yarn 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 | ### `yarn 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 |
--------------------------------------------------------------------------------
/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^5.11.4",
7 | "@testing-library/react": "^11.1.0",
8 | "@testing-library/user-event": "^12.1.10",
9 | "axios": "^0.21.1",
10 | "react": "^17.0.2",
11 | "react-dom": "^17.0.2",
12 | "react-scripts": "4.0.3",
13 | "stream-chat": "^4.1.0",
14 | "stream-chat-react": "^6.5.1",
15 | "universal-cookie": "^4.0.4",
16 | "web-vitals": "^1.0.1"
17 | },
18 | "scripts": {
19 | "start": "react-scripts start",
20 | "build": "react-scripts build",
21 | "test": "react-scripts test",
22 | "eject": "react-scripts eject"
23 | },
24 | "eslintConfig": {
25 | "extends": [
26 | "react-app",
27 | "react-app/jest"
28 | ]
29 | },
30 | "browserslist": {
31 | "production": [
32 | ">0.2%",
33 | "not dead",
34 | "not op_mini all"
35 | ],
36 | "development": [
37 | "last 1 chrome version",
38 | "last 1 firefox version",
39 | "last 1 safari version"
40 | ]
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/client/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adrianhajdin/project_medical_pager_chat/b5a536baf8092c76f4b88eb99c71d95f7f4baae9/client/public/favicon.ico
--------------------------------------------------------------------------------
/client/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | Medical Pager
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/client/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adrianhajdin/project_medical_pager_chat/b5a536baf8092c76f4b88eb99c71d95f7f4baae9/client/public/logo192.png
--------------------------------------------------------------------------------
/client/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adrianhajdin/project_medical_pager_chat/b5a536baf8092c76f4b88eb99c71d95f7f4baae9/client/public/logo512.png
--------------------------------------------------------------------------------
/client/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 |
--------------------------------------------------------------------------------
/client/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/client/src/App.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --primary-color: #005fff;
3 | --primary-color-alpha: #005fff1a;
4 | }
5 |
6 | html,
7 | body {
8 | margin: 0;
9 | padding: 0;
10 | height: 100%;
11 | }
12 |
13 | #root {
14 | height: 100%;
15 | }
16 |
17 | .auth__form-container {
18 | min-height: 100vh;
19 | display: flex;
20 | flex-direction: row;
21 | }
22 |
23 | .auth__form-container_fields {
24 | flex: 2;
25 | display: flex;
26 | flex-direction: column;
27 | justify-content: center;
28 |
29 | padding: 2rem;
30 | background: #005fff;
31 | }
32 |
33 | .auth__form-container_image {
34 | flex: 3;
35 | display: flex;
36 | box-shadow: 1px 0px 5px rgba(0, 0, 0, 0.05);
37 | }
38 |
39 | .auth__form-container_image img {
40 | width: 100%;
41 | height: 100%;
42 | }
43 |
44 | .auth__form-container_fields-content {
45 | display: flex;
46 | flex-direction: column;
47 | justify-content: flex-start;
48 |
49 | padding: 2rem;
50 | box-shadow: 0px 1px 5px rgb(0 0 0 / 10%);
51 | border-radius: 5px;
52 | transition: 0.8s ease;
53 | background: #fff;
54 | }
55 |
56 | .auth__form-container_fields-content p {
57 | font-size: 1.5rem;
58 | font-family: Arial, Helvetica, sans-serif;
59 | color: #05245a;
60 | font-weight: 900;
61 | }
62 |
63 | .auth__form-container_fields-content_input {
64 | display: flex;
65 | flex-direction: column;
66 | position: relative;
67 |
68 | margin: 1rem 0rem;
69 | }
70 |
71 | .auth__form-container_fields-content_input label {
72 | margin-bottom: 0.45rem;
73 | color: rgb(61, 79, 88);
74 | font-size: 12px;
75 | font-family: Arial, Helvetica, sans-serif;
76 | letter-spacing: 0.7px;
77 | line-height: 1.3;
78 | }
79 |
80 | .auth__form-container_fields-content_input input {
81 | padding: 0.55rem 0.4rem;
82 | border: 1px solid rgb(184, 196, 194);
83 | border-radius: 4px;
84 | font-size: 14px;
85 | outline: none;
86 | transition: all 150ms ease-in-out 0s;
87 | width: 85%;
88 | background: #fff;
89 | }
90 |
91 | .auth__form-container_fields-content_input input::placeholder {
92 | color: #b1b1b1;
93 | width: 100%;
94 | font-weight: unset;
95 | font-family: Arial, Helvetica, sans-serif;
96 | }
97 |
98 | .auth__form-container_fields-content_input input:hover {
99 | border-color: #dcdddd;
100 | }
101 |
102 | .auth__form-container_fields-content_input input:focus,
103 | .auth__form-container_fields-content_input input:active {
104 | box-shadow: 0px 0px 0px 1.5px #005fff;
105 | border-color: #005fff;
106 | }
107 |
108 | .auth__form-container_fields-content_input-password {
109 | position: absolute;
110 | right: 13%;
111 | top: 50%;
112 | cursor: pointer;
113 | }
114 |
115 | .auth__form-container_fields-content_button {
116 | margin-top: 2rem;
117 | display: flex;
118 | justify-content: flex-start;
119 | }
120 |
121 | .auth__form-container_fields-content_button button {
122 | border-radius: 4px;
123 | background: #005fff;
124 | border: 1px solid #005fff;
125 | color: #fff;
126 | font-family: Arial, Helvetica, sans-serif;
127 | font-weight: 500;
128 | padding: 0.7rem 1.2rem;
129 | outline: none;
130 | cursor: pointer;
131 | transition: 0.3s ease;
132 | }
133 |
134 | .auth__form-container_fields-content_button button:hover {
135 | background: #0066ff;
136 | }
137 |
138 | .auth__form-container_fields-account {
139 | display: flex;
140 | justify-content: flex-start;
141 | align-items: center;
142 |
143 | margin-top: 0.2rem;
144 | }
145 |
146 | .auth__form-container_fields-account p {
147 | font-size: 14px;
148 | color: #000;
149 | font-weight: 500;
150 | }
151 |
152 | .auth__form-container_fields-account span {
153 | color: #05245a;
154 | cursor: pointer;
155 | font-weight: 700;
156 | }
157 |
158 | @media screen and (max-width: 800px) {
159 | .auth__form-container {
160 | flex-direction: column-reverse;
161 | }
162 |
163 | .auth__form-container_fields {
164 | justify-content: flex-start;
165 | }
166 |
167 | .auth__form-container_image {
168 | height: 100px;
169 | flex: none;
170 | box-shadow: none;
171 | }
172 |
173 | .auth__form-container_image img {
174 | object-fit: cover;
175 | }
176 | }
177 |
178 | @media screen and (max-width: 375px) {
179 | .auth__form-container_fields {
180 | padding: 2rem 0.5rem;
181 | }
182 |
183 | .auth__form-container_fields-content_input input {
184 | width: 95%;
185 | }
186 |
187 | .auth__form-container_fields-content_input-password {
188 | right: 3%;
189 | }
190 | }
191 |
192 | .app__wrapper {
193 | display: flex;
194 | flex: 1;
195 | /* height: 800px; */
196 | height: 100%;
197 | /* border-radius: 16px; */
198 | box-shadow: rgba(0, 0, 0, 0.33) 0px 1px 4px 0px;
199 | }
200 |
201 | .str-chat-channel-list {
202 | height: fit-content;
203 | margin-bottom: 8px;
204 | }
205 |
206 | .str-chat-channel {
207 | height: 100%;
208 | }
209 |
210 | .str-chat__load-more-button {
211 | display: none;
212 | }
213 |
214 | .str-chat__input-footer {
215 | display: none;
216 | }
217 |
218 | .str-chat__date-separator {
219 | margin: 16px 24px;
220 | }
221 |
222 | .str-chat__message-notification {
223 | background: var(--primary-color);
224 | cursor: pointer;
225 | }
226 |
227 | @media screen and (max-width: 960px) {
228 | .str-chat-channel-list.team {
229 | position: unset;
230 | left: unset;
231 | top: unset;
232 | z-index: unset;
233 | min-height: unset;
234 | overflow-y: unset;
235 | box-shadow: unset;
236 | transition: unset;
237 | }
238 | }
239 |
240 | .channel-empty__container {
241 | display: flex;
242 | height: 100%;
243 | flex-direction: column;
244 | justify-content: flex-end;
245 | margin-left: 20px;
246 | margin-right: 20px;
247 | padding-bottom: 20px;
248 | }
249 |
250 | .channel-empty__avatars {
251 | display: flex;
252 | }
253 |
254 | .channel-empty__avatars div:first-child {
255 | z-index: 3;
256 | }
257 |
258 | .channel-empty__avatars div:nth-child(2) {
259 | position: relative;
260 | right: 32px;
261 | z-index: 2;
262 | }
263 |
264 | .channel-empty__avatars div:nth-child(3) {
265 | position: relative;
266 | right: 64px;
267 | z-index: 1;
268 | }
269 |
270 | .channel-empty__avatars .str-chat__avatar {
271 | margin-right: 0;
272 | }
273 |
274 | .channel-empty__first {
275 | font-family: Helvetica Neue, sans-serif;
276 | font-weight: bold;
277 | font-size: 18px;
278 | line-height: 120%;
279 | color: #2c2c30;
280 | margin-bottom: 10px;
281 | }
282 |
283 | .channel-empty__first .channel-empty__user-name {
284 | color: var(--primary-color);
285 | }
286 |
287 | .channel-empty__second {
288 | font-family: Helvetica Neue, sans-serif;
289 | font-size: 14px;
290 | line-height: 120%;
291 | margin: 0;
292 | color: #858688;
293 | }
294 |
295 | .channel__container {
296 | height: 100%;
297 | width: 100%;
298 | }
299 |
300 | .str-chat__thread {
301 | z-index: 1;
302 | }
303 |
304 | .str-chat__thread-list .str-chat__message-team {
305 | border-left: 1px solid rgba(0, 0, 0, 0.1);
306 | }
307 |
308 | .str-chat__thread-list .str-chat__message-actions-list button:first-child {
309 | display: none;
310 | }
311 |
312 | .str-chat__list .str-chat__reverse-infinite-scroll {
313 | padding-top: 0px;
314 | }
315 |
316 | .str-chat__thread-list .channel-empty__container {
317 | display: none;
318 | }
319 |
320 | .str-chat__date-separator {
321 | padding: 20px 40px;
322 | }
323 |
324 | .custom-thread-header {
325 | height: 62px;
326 | display: flex;
327 | align-items: center;
328 | justify-content: space-between;
329 | box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.1);
330 | }
331 |
332 | .custom-thread-header__left {
333 | display: flex;
334 | align-items: center;
335 | margin-left: 20px;
336 | }
337 |
338 | .custom-thread-header__left-title {
339 | font-family: Helvetica Neue, sans-serif;
340 | font-weight: bold;
341 | font-size: 18px;
342 | line-height: 22px;
343 | color: #2c2c30;
344 | margin-right: 10px;
345 | }
346 |
347 | .custom-thread-header__left-count {
348 | font-family: Helvetica Neue, sans-serif;
349 | font-size: 14px;
350 | color: #858688;
351 | }
352 |
353 | .close-thread-icon {
354 | cursor: pointer;
355 | margin-right: 10px;
356 | }
357 |
358 | .str-chat__list--thread
359 | .str-chat__message-simple__actions__action--options
360 | .str-chat__message-actions-box {
361 | left: initial;
362 | right: 100%;
363 | border-radius: var(--border-radius-md);
364 | }
365 |
366 | .channel-list__container {
367 | display: flex;
368 | /* height: 800px; */
369 | height: 100%;
370 | box-shadow: inset 1px 0px 0px rgba(0, 0, 0, 0.1);
371 | }
372 |
373 | .channel-list__sidebar {
374 | width: 72px;
375 | background: linear-gradient(0deg, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)),
376 | var(--primary-color);
377 | box-shadow: 1px 0px 0px rgba(0, 0, 0, 0.25);
378 | /* border-top-left-radius: 16px; */
379 | /* border-bottom-left-radius: 16px; */
380 | }
381 |
382 | .channel-list__sidebar__icon1 {
383 | width: 44px;
384 | height: 44px;
385 | margin: 14px;
386 | background: linear-gradient(
387 | 150.64deg,
388 | rgba(0, 0, 0, 0.1) 12.73%,
389 | rgba(0, 0, 0, 0) 89.32%
390 | ),
391 | #ffffff;
392 | border-radius: 9999px;
393 | box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.33);
394 | }
395 |
396 | .channel-list__list__wrapper {
397 | display: flex;
398 | flex-direction: column;
399 | background: var(--primary-color);
400 | width: 240px;
401 | }
402 |
403 | .icon1__inner {
404 | font-family: Helvetica Neue, sans-serif;
405 | height: 100%;
406 | display: flex;
407 | align-items: center;
408 | justify-content: center;
409 | }
410 |
411 | .channel-list__sidebar__icon2 {
412 | width: 44px;
413 | height: 44px;
414 | margin: 14px;
415 | background: linear-gradient(
416 | 150.64deg,
417 | rgba(0, 0, 0, 0.1) 12.73%,
418 | rgba(0, 0, 0, 0) 89.32%
419 | ),
420 | #ffffff;
421 | border-radius: 9999px;
422 | box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.33);
423 | cursor: pointer;
424 | }
425 |
426 | .icon2__inner {
427 | font-family: Helvetica Neue, sans-serif;
428 | height: 100%;
429 | display: flex;
430 | align-items: center;
431 | justify-content: center;
432 | }
433 |
434 | .channel-list__header {
435 | padding-left: 16px;
436 | height: 62px;
437 | }
438 |
439 | .channel-list__header__text {
440 | font-family: Helvetica Neue, sans-serif;
441 | font-style: normal;
442 | font-weight: bold;
443 | font-size: 18px;
444 | line-height: 28px;
445 | color: #ffffff;
446 | }
447 |
448 | .channel-search__container {
449 | position: relative;
450 | display: flex;
451 | justify-content: center;
452 | align-items: center;
453 | padding-top: 16px;
454 | border-top: 1px solid #00000033;
455 | }
456 |
457 | .channel-search__input__wrapper {
458 | display: flex;
459 | justify-content: center;
460 | align-items: center;
461 | height: 40px;
462 | background: rgba(255, 255, 255, 0.2);
463 | border-radius: 8px;
464 | margin-bottom: 8px;
465 | border: 1px solid transparent;
466 | width: 95%;
467 | }
468 |
469 | .channel-search__input__wrapper:focus-within {
470 | border: 1px solid #fff;
471 | }
472 |
473 | .channel-search__input__icon {
474 | width: 32px;
475 | display: flex;
476 | justify-content: center;
477 | }
478 |
479 | .channel-search__input__text {
480 | background: none;
481 | border: none;
482 | color: #fff;
483 | font-family: Helvetica Neue, sans-serif;
484 | font-size: 16px;
485 | outline: none;
486 | }
487 |
488 | ::placeholder {
489 | color: rgba(255, 255, 255, 0.66);
490 | white-space: nowrap;
491 | width: 150px;
492 | }
493 |
494 | .channel-search__results {
495 | position: absolute;
496 | height: fit-content;
497 | width: 300px;
498 | background: #fff;
499 | border: 1px solid #e9e9ea;
500 | box-sizing: border-box;
501 | box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.06);
502 | border-radius: 8px;
503 | z-index: 10;
504 | left: 230px;
505 | top: 16px;
506 | }
507 |
508 | .channel-search__results-header {
509 | width: fit-content;
510 | display: flex;
511 | align-items: center;
512 | font-family: Helvetica Neue, sans-serif;
513 | font-style: normal;
514 | font-weight: 500;
515 | font-size: 14px;
516 | line-height: 120%;
517 | color: #858688;
518 | margin-left: 12px;
519 | }
520 |
521 | .channel-search__results-header i {
522 | font-weight: normal;
523 | margin-left: 12px;
524 | }
525 |
526 | .channel-search__result-container {
527 | width: 100%;
528 | height: 48px;
529 | display: flex;
530 | align-items: center;
531 | }
532 |
533 | .channel-search__result-container__focused {
534 | width: 100%;
535 | height: 48px;
536 | display: flex;
537 | align-items: center;
538 | background: var(--primary-color-alpha);
539 | }
540 |
541 | .channel-search__result-container:hover {
542 | background: var(--primary-color-alpha);
543 | cursor: pointer;
544 | }
545 |
546 | .channel-search__result-user {
547 | display: flex;
548 | align-items: center;
549 | margin-left: 12px;
550 | }
551 |
552 | .result-hashtag {
553 | height: 24px;
554 | width: 28px;
555 | background: var(--primary-color);
556 | border-radius: 24px;
557 | margin: 12px;
558 | display: flex;
559 | align-items: center;
560 | justify-content: center;
561 | font-family: Helvetica Neue, sans-serif;
562 | font-weight: bold;
563 | font-size: 14px;
564 | line-height: 120%;
565 | color: #ffffff;
566 | }
567 |
568 | .channel-search__result-text {
569 | width: 100%;
570 | font-family: Helvetica Neue, sans-serif;
571 | font-weight: 500;
572 | font-size: 14px;
573 | line-height: 120%;
574 | color: #2c2c30;
575 | }
576 |
577 | .create-channel__container {
578 | display: flex;
579 | flex-direction: column;
580 | height: 100%;
581 | }
582 |
583 | .create-channel__header {
584 | display: flex;
585 | align-items: center;
586 | justify-content: space-between;
587 | height: 62px;
588 | box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.1);
589 | padding-right: 20px;
590 | }
591 |
592 | .create-channel__header p {
593 | font-family: Helvetica Neue, sans-serif;
594 | font-weight: bold;
595 | font-size: 18px;
596 | line-height: 22px;
597 | color: #2c2c30;
598 | margin-left: 20px;
599 | }
600 |
601 | .create-channel__header svg {
602 | cursor: pointer;
603 | }
604 |
605 | .channel-name-input__wrapper {
606 | display: flex;
607 | flex-direction: column;
608 | height: 169px;
609 | padding-left: 20px;
610 | box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.1);
611 | }
612 |
613 | .channel-name-input__wrapper p {
614 | font-family: Helvetica Neue, sans-serif;
615 | font-size: 16px;
616 | line-height: 120%;
617 | color: #2c2c30;
618 | margin-top: 30px;
619 | }
620 |
621 | .channel-name-input__wrapper input {
622 | font-family: Helvetica Neue, sans-serif;
623 | font-size: 18px;
624 | color: rgba(0, 0, 0, 0.5);
625 | height: 50px;
626 | width: 540px;
627 | background: #f7f6f8;
628 | border: 1px solid rgba(0, 0, 0, 0.1);
629 | box-sizing: border-box;
630 | border-radius: 8px;
631 | padding-left: 16px;
632 | }
633 |
634 | .channel-name-input__wrapper input:focus {
635 | border: 1px solid var(--primary-color);
636 | outline: none;
637 | }
638 |
639 | .channel-name-input__wrapper input::placeholder {
640 | font-weight: 300;
641 | color: rgba(0, 0, 0, 0.5);
642 | }
643 |
644 | .create-channel__button-wrapper {
645 | height: 82px;
646 | background: #f7f6f8;
647 | display: flex;
648 | align-items: center;
649 | justify-content: flex-end;
650 | border-bottom-right-radius: 16px;
651 |
652 | padding: 0px 10px;
653 | }
654 |
655 | .create-channel__button-wrapper p {
656 | background: var(--primary-color);
657 | font-family: Helvetica Neue, sans-serif;
658 | font-weight: bold;
659 | font-size: 18px;
660 | padding: 10px 20px;
661 | color: #ffffff;
662 | border-radius: 8px;
663 | cursor: pointer;
664 | }
665 |
666 | .user-list__container {
667 | display: flex;
668 | flex-direction: column;
669 | height: 100%;
670 | }
671 |
672 | .user-list__header {
673 | display: flex;
674 | align-items: center;
675 | margin: 0px 20px;
676 | justify-content: space-between;
677 | }
678 |
679 | .user-list__header p {
680 | font-family: Helvetica Neue, sans-serif;
681 | font-size: 14px;
682 | line-height: 17px;
683 | color: #858688;
684 | margin-top: 16px;
685 | }
686 |
687 | .user-list__header p:first-child {
688 | flex: 2;
689 | }
690 |
691 | .user-list__header p:nth-child(2) {
692 | flex: 0.5;
693 | text-align: right;
694 | margin: 0px 20px;
695 | }
696 |
697 | .user-list__message {
698 | font-family: Helvetica Neue, sans-serif;
699 | font-size: 16px;
700 | color: #2c2c30;
701 | margin: 20px;
702 | }
703 |
704 | .user-item__wrapper {
705 | display: flex;
706 | align-items: center;
707 | margin: 0px 20px;
708 | justify-content: space-between;
709 | }
710 |
711 | .user-item__wrapper:hover {
712 | background: #f7f6f8;
713 | cursor: pointer;
714 | }
715 |
716 | .user-item__name-wrapper {
717 | display: flex;
718 | align-items: center;
719 | flex: 2;
720 | text-align: left;
721 | }
722 |
723 | .user-item__wrapper p {
724 | font-family: Helvetica Neue, sans-serif;
725 | font-size: 14px;
726 | line-height: 17px;
727 | color: #2c2c30;
728 | word-break: break-all;
729 | }
730 |
731 | .user-item__name {
732 | font-weight: 500;
733 | }
734 |
735 | .user-item__last-active {
736 | font-weight: 400;
737 | width: 30%;
738 | flex: 0.5;
739 | text-align: right;
740 |
741 | margin: 0px 20px;
742 | }
743 |
744 | .user-item__invite-empty {
745 | height: 28px;
746 | width: 28px;
747 | background: #f7f6f8;
748 | border: 1px solid #dedddf;
749 | border-radius: 14px;
750 | box-sizing: border-box;
751 | margin-left: 2px;
752 | }
753 |
754 | .edit-channel__container {
755 | display: flex;
756 | flex-direction: column;
757 | height: 100%;
758 | }
759 |
760 | .edit-channel__header {
761 | display: flex;
762 | align-items: center;
763 | justify-content: space-between;
764 | height: 62px;
765 | box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.1);
766 | padding-right: 20px;
767 | }
768 |
769 | .edit-channel__header p {
770 | font-family: Helvetica Neue, sans-serif;
771 | font-weight: bold;
772 | font-size: 18px;
773 | line-height: 22px;
774 | color: #2c2c30;
775 | margin-left: 20px;
776 | }
777 |
778 | .edit-channel__header svg {
779 | cursor: pointer;
780 | }
781 |
782 | .channel-name-input__wrapper {
783 | display: flex;
784 | flex-direction: column;
785 | height: 169px;
786 | padding-left: 20px;
787 | box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.1);
788 | }
789 |
790 | .channel-name-input__wrapper p {
791 | font-family: Helvetica Neue, sans-serif;
792 | font-size: 16px;
793 | line-height: 120%;
794 | color: #2c2c30;
795 | margin-top: 30px;
796 | }
797 |
798 | .channel-name-input__wrapper input {
799 | font-family: Helvetica Neue, sans-serif;
800 | font-size: 18px;
801 | color: rgba(0, 0, 0);
802 | height: 50px;
803 | width: 90%;
804 | background: #f7f6f8;
805 | border: 1px solid rgba(0, 0, 0, 0.1);
806 | box-sizing: border-box;
807 | border-radius: 8px;
808 | padding-left: 16px;
809 | }
810 |
811 | .channel-name-input__wrapper input:focus {
812 | border: 1px solid var(--primary-color);
813 | outline: none;
814 | }
815 |
816 | .channel-name-input__wrapper input::placeholder {
817 | font-weight: 300;
818 | color: rgba(0, 0, 0, 0.5);
819 | }
820 |
821 | .edit-channel__button-wrapper {
822 | height: 82px;
823 | background: #f7f6f8;
824 | display: flex;
825 | align-items: center;
826 | justify-content: flex-end;
827 | border-bottom-right-radius: 16px;
828 | }
829 |
830 | .edit-channel__button-wrapper p {
831 | background: var(--primary-color);
832 | font-family: Helvetica Neue, sans-serif;
833 | font-weight: bold;
834 | font-size: 18px;
835 | padding: 10px 20px;
836 | color: #ffffff;
837 | margin-right: 30px;
838 | border-radius: 8px;
839 | cursor: pointer;
840 | }
841 |
842 | .team-channel-header__container {
843 | position: relative;
844 | height: 62px;
845 | display: flex;
846 | justify-content: space-between;
847 | align-items: center;
848 | padding: 0 20px;
849 | background: #ffffff;
850 | box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.1);
851 | border-top-right-radius: 16px;
852 | z-index: 1;
853 | }
854 |
855 | .team-channel-header__channel-wrapper {
856 | display: flex;
857 | align-items: center;
858 | }
859 |
860 | .team-channel-header__channel-wrapper svg {
861 | cursor: pointer;
862 | }
863 |
864 | .team-channel-header__name {
865 | font-family: Helvetica Neue, sans-serif;
866 | font-weight: bold;
867 | font-size: 18px;
868 | color: #2c2c30;
869 | margin-right: 8px;
870 | }
871 |
872 | .team-channel-header__name-wrapper {
873 | flex: 3;
874 | display: flex;
875 | align-items: center;
876 | overflow-x: auto;
877 | max-width: 500px;
878 | white-space: nowrap;
879 | -ms-overflow-style: none;
880 | scrollbar-width: none;
881 | }
882 |
883 | @media screen and (min-width: 1070px) {
884 | .team-channel-header__name-wrapper {
885 | max-width: 700px;
886 | }
887 | }
888 |
889 | .team-channel-header__name-wrapper::-webkit-scrollbar {
890 | display: none;
891 | }
892 |
893 | .team-channel-header__name-multi {
894 | display: flex;
895 | align-items: center;
896 | margin-right: 8px;
897 | }
898 |
899 | .team-channel-header__name-multi:nth-child(3) {
900 | margin-right: 0px;
901 | }
902 |
903 | .team-channel-header__name-wrapper .str-chat__avatar {
904 | margin-right: 8px;
905 | }
906 |
907 | .team-channel-header__name.user {
908 | font-weight: 500;
909 | font-size: 14px;
910 | }
911 |
912 | .team-channel-header__right {
913 | flex: 0.55;
914 | display: flex;
915 | align-items: center;
916 | justify-content: flex-end;
917 | text-align: right;
918 | }
919 |
920 | .team-channel-header__right-pin-wrapper {
921 | display: flex;
922 | align-items: center;
923 | cursor: pointer;
924 | }
925 |
926 | .team-channel-header__right svg {
927 | margin-left: 16px;
928 | margin-right: 4px;
929 | }
930 |
931 | .team-channel-header__right-text {
932 | font-family: Helvetica Neue, sans-serif;
933 | font-size: 14px;
934 | color: #858688;
935 | }
936 |
937 | .team-channel-list {
938 | width: 100%;
939 | display: flex;
940 | flex-direction: column;
941 | }
942 |
943 | .team-channel-list__message {
944 | color: #ffffff;
945 | padding: 0 16px;
946 | }
947 |
948 | .team-channel-list__message.loading {
949 | height: 115px;
950 | }
951 |
952 | .team-channel-list__header {
953 | padding: 0 16px;
954 | display: flex;
955 | justify-content: space-between;
956 | align-items: center;
957 | }
958 |
959 | .team-channel-list__header svg {
960 | cursor: pointer;
961 | }
962 |
963 | .team-channel-list__header__title {
964 | font-family: Helvetica Neue, sans-serif;
965 | font-size: 13px;
966 | line-height: 16px;
967 | height: 16px;
968 | color: rgba(255, 255, 255, 0.66);
969 | margin-bottom: 10px;
970 | }
971 |
972 | .channel-preview__wrapper {
973 | height: 37px;
974 | display: flex;
975 | align-items: center;
976 | }
977 |
978 | .channel-preview__wrapper__selected {
979 | height: auto;
980 | display: flex;
981 | align-items: center;
982 | background: rgba(0, 0, 0, 0.2);
983 | border-top-right-radius: 8px;
984 | border-bottom-right-radius: 8px;
985 | font-weight: bold;
986 | margin-right: 16px;
987 | cursor: pointer;
988 | z-index: 2;
989 | }
990 |
991 | .channel-preview__wrapper:hover {
992 | background: rgba(0, 0, 0, 0.2);
993 | border-top-right-radius: 8px;
994 | border-bottom-right-radius: 8px;
995 | font-weight: bold;
996 | margin-right: 16px;
997 | cursor: pointer;
998 | }
999 |
1000 | .channel-preview__item {
1001 | display: flex;
1002 | align-items: center;
1003 | font-family: Helvetica Neue, sans-serif;
1004 | font-size: 14px;
1005 | color: #ffffff;
1006 | padding: 0px 20px;
1007 | height: 100%;
1008 | width: 100%;
1009 | text-overflow: ellipsis;
1010 | word-break: break-all;
1011 | }
1012 |
1013 | .channel-preview__item.multi {
1014 | max-width: 220px;
1015 | }
1016 |
1017 | .channel-preview__item.single .str-chat__avatar {
1018 | margin-right: 12px;
1019 | }
1020 |
1021 | .channel-preview__item.multi .str-chat__avatar {
1022 | margin-right: 0;
1023 | }
1024 |
1025 | .channel-preview__item.multi span:first-child {
1026 | position: relative;
1027 | z-index: 2;
1028 | bottom: 6px;
1029 | }
1030 |
1031 | .channel-preview__item.multi div:nth-child(2) {
1032 | position: relative;
1033 | right: 10px;
1034 | z-index: 1;
1035 | margin-bottom: 0px;
1036 | }
1037 |
1038 | .channel-preview__item.multi p {
1039 | overflow: hidden;
1040 | white-space: nowrap;
1041 | text-overflow: ellipsis;
1042 | }
1043 |
1044 | .str-chat__message-team:hover {
1045 | background: #e9e9ea;
1046 | }
1047 |
1048 | .str-chat__message-team-group {
1049 | display: flex;
1050 | flex-direction: column;
1051 | justify-content: center;
1052 | }
1053 |
1054 | .str-chat__message-team-content p {
1055 | font-family: Helvetica Neue, sans-serif;
1056 | font-style: normal;
1057 | font-weight: normal;
1058 | line-height: 120%;
1059 | color: #000000;
1060 | margin: 0;
1061 | background: none;
1062 | }
1063 |
1064 | .str-chat__message-team:hover .str-chat__message-team-content {
1065 | background: none;
1066 | }
1067 |
1068 | .str-chat__message-team-meta {
1069 | justify-content: flex-start;
1070 | align-items: center;
1071 | }
1072 |
1073 | .str-chat__message-team--bottom time {
1074 | display: none;
1075 | }
1076 |
1077 | .str-chat__message-team--middle time {
1078 | display: none;
1079 | }
1080 |
1081 | .str-chat__message-team-meta time {
1082 | visibility: visible;
1083 | z-index: 2;
1084 | font-family: Helvetica Neue, sans-serif;
1085 | font-style: normal;
1086 | font-weight: normal;
1087 | font-size: 10px;
1088 | color: #858688;
1089 | margin-top: 4px;
1090 | }
1091 |
1092 | .str-chat__message-team-author strong {
1093 | font-family: Helvetica Neue, sans-serif;
1094 | font-style: normal;
1095 | font-weight: 500;
1096 | font-size: 11px;
1097 | line-height: 120%;
1098 | color: #858688;
1099 | margin: 0;
1100 | margin-right: 8px;
1101 | }
1102 |
1103 | .str-chat__message-team-content--text {
1104 | border-left: none;
1105 | }
1106 |
1107 | .str-chat__message-team--received {
1108 | padding-left: 20px;
1109 | }
1110 |
1111 | .str-chat__message-replies-count-button {
1112 | z-index: 2;
1113 | display: flex;
1114 | /* justify-content: flex-end; */
1115 | font-family: Helvetica Neue, sans-serif;
1116 | font-style: normal;
1117 | font-weight: bold;
1118 | font-size: 14px;
1119 | color: var(--primary-color);
1120 | }
1121 |
1122 | .str-chat__message-replies-count-button:focus {
1123 | outline: none;
1124 | }
1125 |
1126 | .str-chat__message-team-actions {
1127 | right: -3px;
1128 | }
1129 |
1130 | .str-chat__date-separator-date {
1131 | color: #858688;
1132 | font-family: Helvetica Neue, sans-serif;
1133 | font-style: normal;
1134 | font-weight: normal;
1135 | }
1136 |
1137 | .str-chat__avatar-image img.str-chat__avatar-image--loaded {
1138 | display: none;
1139 | }
1140 |
1141 | .str-chat__message-attachment {
1142 | margin-bottom: 0;
1143 | }
1144 |
1145 | .str-chat__message-attachment--image {
1146 | max-width: 375px;
1147 | }
1148 |
1149 | .str-chat__message-attachment-card--title {
1150 | color: var(--primary-color);
1151 | }
1152 |
1153 | .str-chat__message-team .str-chat__message-attachment-card {
1154 | border-radius: 16px;
1155 | }
1156 |
1157 | .str-chat__message-team .str-chat__message-attachment-card--content {
1158 | background: #fff;
1159 | }
1160 |
1161 | ul.str-chat__simple-reactions-list {
1162 | display: flex;
1163 | align-items: center;
1164 | width: fit-content;
1165 | background: #ffffff;
1166 | border: 1px solid #e9e9ea;
1167 | box-sizing: border-box;
1168 | border-radius: 50vw;
1169 | padding: 6px 6px 4px 6px;
1170 | z-index: 3;
1171 | }
1172 |
1173 | ul.str-chat__simple-reactions-list:hover {
1174 | border: 1px solid var(--primary-color);
1175 | }
1176 |
1177 | .str-chat__simple-reactions-list-item span {
1178 | display: flex;
1179 | align-items: center;
1180 | }
1181 |
1182 | .str-chat__message-team-content ul {
1183 | margin-top: 4px;
1184 | }
1185 |
1186 | .emoji-mart-emoji-custom span {
1187 | height: 15px !important;
1188 | width: 15px !important;
1189 | }
1190 |
1191 | .str-chat__simple-reactions-list-item--last-number {
1192 | font-family: Helvetica Neue, sans-serif;
1193 | font-style: normal;
1194 | font-weight: normal;
1195 | font-size: 11px;
1196 | color: #2c2c30;
1197 | }
1198 |
1199 | .str-chat__message-attachment-actions-form {
1200 | margin: 0px;
1201 | padding: 10px 0;
1202 | border-top: none;
1203 | border-radius: 16px;
1204 | }
1205 |
1206 | .str-chat__message-attachment-actions-button--primary {
1207 | background: var(--primary-color);
1208 | cursor: pointer;
1209 | }
1210 |
1211 | .str-chat__message-attachment-actions-button--default {
1212 | background: #fff;
1213 | cursor: pointer;
1214 | }
1215 |
1216 | .str-chat__message-attachment-actions-button:focus {
1217 | box-shadow: none;
1218 | border: 2px solid rgba(0, 0, 0, 0.08);
1219 | }
1220 |
1221 | .str-chat__message-attachment-actions-button:hover {
1222 | font-weight: 700;
1223 | border: 1px solid var(--primary-color);
1224 | }
1225 |
1226 | .str-chat__message-team-status {
1227 | display: none;
1228 | }
1229 |
1230 | .str-chat__message-actions-list button:hover {
1231 | color: var(--primary-color);
1232 | }
1233 |
1234 | .emoji-mart-anchor-selected {
1235 | color: var(--primary-color) !important;
1236 | }
1237 |
1238 | .emoji-mart-anchor-bar {
1239 | background: var(--primary-color) !important;
1240 | }
1241 |
1242 | .str-chat__message-team--editing {
1243 | background: #e9e9ea;
1244 | box-shadow: 0 0 11px 0 rgba(0, 0, 0, 0.06),
1245 | inset 0 1px 0 0 var(--primary-color), inset 0 -1px 0 0 var(--primary-color);
1246 | padding: 15px 20px;
1247 | }
1248 |
1249 | .str-chat__message-team--editing .str-chat__message-team-form-footer {
1250 | padding: 10px 0 0;
1251 | }
1252 |
1253 | .str-chat__edit-message-form
1254 | .str-chat__message-team-form-footer
1255 | button[type="submit"] {
1256 | color: var(--primary-color);
1257 | }
1258 |
1259 | .str-chat__edit-message-form .str-chat__message-team-form-footer button {
1260 | cursor: pointer;
1261 | color: rgba(0, 0, 0, 0.33);
1262 | font-family: Helvetica Neue, sans-serif;
1263 | font-size: 14px;
1264 | }
1265 |
1266 | .str-chat__edit-message-form .str-chat__message-team-form-footer button:focus {
1267 | outline: none;
1268 | }
1269 |
1270 | .str-chat__edit-message-form textarea {
1271 | box-shadow: 0 0 0 1px var(--primary-color);
1272 | }
1273 |
1274 | .str-chat__edit-message-form textarea:focus {
1275 | border: 1px solid var(--primary-color);
1276 | box-shadow: 0 0 0 1px var(--primary-color);
1277 | }
1278 |
1279 | .str-chat__edit-message-form svg {
1280 | display: none;
1281 | }
1282 |
1283 | .str-chat__message-team-content p a {
1284 | color: var(--primary-color);
1285 | }
1286 |
1287 | .pinned-message {
1288 | background: #e6efff;
1289 | }
1290 |
1291 | .unpinned-message {
1292 | background: #fff;
1293 | }
1294 |
1295 | .str-chat__message-team-pin-indicator {
1296 | display: flex;
1297 | align-items: center;
1298 | margin-left: 40px;
1299 | height: 18px;
1300 | }
1301 |
1302 | .str-chat__message-team-pin-indicator div svg {
1303 | fill: #858688;
1304 | font-size: 10px !important;
1305 | }
1306 |
1307 | .str-chat__message-team-pin-indicator div div {
1308 | font-family: Helvetica Neue, sans-serif;
1309 | font-size: 10px !important;
1310 | line-height: 120%;
1311 | color: #858688;
1312 | margin-left: 4px;
1313 | }
1314 |
1315 | .str-chat__reaction-selector {
1316 | background: #ffffff;
1317 | border: 1px solid #e9e9ea;
1318 | box-sizing: border-box;
1319 | box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.06);
1320 | border-radius: 99999px;
1321 | }
1322 |
1323 | .str-chat__reaction-selector li {
1324 | font-size: 24px;
1325 | }
1326 |
1327 | .str-chat__reaction-selector li span span {
1328 | height: 24px !important;
1329 | width: 24px !important;
1330 | }
1331 |
1332 | .str-chat__message-team-content--single:not(.str-chat__message-team-content--image)::before {
1333 | display: none;
1334 | }
1335 |
1336 | .team-message-input__wrapper {
1337 | position: relative;
1338 | display: flex;
1339 | flex-direction: column;
1340 | background: #f7f6f8;
1341 | padding: 15px 20px 28px;
1342 | width: 100%;
1343 | }
1344 |
1345 | .team-message-input__wrapper.thread-open {
1346 | border-bottom-right-radius: 0px;
1347 | }
1348 |
1349 | .team-message-input__input {
1350 | border: 1px solid rgba(0, 0, 0, 0.2);
1351 | border-radius: 8px;
1352 | }
1353 |
1354 | .team-message-input__input:focus-within {
1355 | border-color: var(--primary-color);
1356 | }
1357 |
1358 | .team-message-input__top {
1359 | min-height: 43px;
1360 | display: flex;
1361 | align-items: center;
1362 | width: 100%;
1363 | background: #fff;
1364 | border-top-left-radius: 8px;
1365 | border-top-right-radius: 8px;
1366 | }
1367 |
1368 | .team-message-input__wrapper .giphy-icon__wrapper {
1369 | display: flex;
1370 | align-items: center;
1371 | justify-content: space-evenly;
1372 | height: 24px;
1373 | width: 63px;
1374 | background: var(--primary-color);
1375 | border-radius: 12px;
1376 | margin-left: 8px;
1377 | }
1378 |
1379 | .team-message-input__wrapper .giphy-icon__text {
1380 | font-family: Helvetica Neue, sans-serif;
1381 | font-style: normal;
1382 | font-weight: bold;
1383 | font-size: 11px;
1384 | line-height: 8px;
1385 | color: #ffffff;
1386 | }
1387 |
1388 | .team-message-input__bottom {
1389 | display: flex;
1390 | align-items: center;
1391 | justify-content: flex-start;
1392 | width: 100%;
1393 | height: 40px;
1394 | background: rgba(0, 0, 0, 0.05);
1395 | }
1396 |
1397 | .team-message-input__button {
1398 | position: relative;
1399 | width: 0;
1400 | right: 32px;
1401 | cursor: pointer;
1402 | }
1403 |
1404 | .team-message-input__input:focus-within .team-message-input__button path {
1405 | fill: var(--primary-color);
1406 | fill-opacity: 1;
1407 | }
1408 |
1409 | .team-message-input__wrapper .str-chat__textarea textarea {
1410 | display: flex;
1411 | background: #fff;
1412 | border: none;
1413 | outline: none;
1414 | font-family: Helvetica Neue, sans-serif;
1415 | font-style: normal;
1416 | font-weight: normal;
1417 | font-size: 15px;
1418 | border-bottom-left-radius: 0px;
1419 | border-bottom-right-radius: 0px;
1420 | }
1421 |
1422 | .team-message-input__wrapper .str-chat__textarea textarea:focus {
1423 | border: none;
1424 | outline: none;
1425 | box-shadow: none;
1426 | background: #fff;
1427 | }
1428 |
1429 | .team-message-input__wrapper .str-chat__textarea textarea::placeholder {
1430 | color: rgba(0, 0, 0, 0.2);
1431 | }
1432 |
1433 | .team-message-input__icons {
1434 | display: flex;
1435 | justify-content: space-around;
1436 | align-items: center;
1437 | }
1438 |
1439 | .team-message-input__icons div:first-child {
1440 | margin: 0 5px;
1441 | }
1442 |
1443 | .team-message-input__icons div:nth-child(3) {
1444 | margin-left: 5px;
1445 | }
1446 |
1447 | .team-message-input__icons svg {
1448 | width: 36px;
1449 | }
1450 |
1451 | .team-message-input__icons svg:hover path {
1452 | fill: var(--primary-color);
1453 | fill-opacity: 1;
1454 | }
1455 |
1456 | .team-message-input__icons svg:hover {
1457 | cursor: pointer;
1458 | }
1459 |
1460 | .icon-divider {
1461 | width: 1px;
1462 | height: 40px;
1463 | background: rgba(204, 204, 204, 0.5);
1464 | }
1465 |
1466 | .team-message-input__wrapper .str-chat__input--emojipicker {
1467 | z-index: 3;
1468 | position: absolute;
1469 | bottom: 112px;
1470 | left: 20px;
1471 | width: 338px;
1472 | }
1473 |
1474 | .emoji-mart .emoji-mart-emoji:focus {
1475 | outline: none;
1476 | }
1477 |
1478 | div.rfu-dropzone:focus {
1479 | outline: none;
1480 | }
1481 |
1482 | .rfu-image-previewer {
1483 | flex: none;
1484 | margin-left: 12px;
1485 | }
1486 |
1487 | .rfu-image-previewer__image {
1488 | margin-bottom: 0;
1489 | }
1490 |
1491 | div.rta__autocomplete.str-chat__emojisearch {
1492 | z-index: 10;
1493 | position: relative;
1494 | width: 100%;
1495 | background: #fff;
1496 | margin: 0;
1497 | border-top-left-radius: 8px;
1498 | border-top-right-radius: 8px;
1499 | }
1500 |
1501 | .rta__entity--selected {
1502 | background: var(--primary-color);
1503 | }
1504 |
1505 | .str-chat__slash-command:hover {
1506 | background: var(--primary-color);
1507 | cursor: pointer;
1508 | }
1509 |
1510 | .rta__list-header {
1511 | font-family: Helvetica Neue, sans-serif;
1512 | font-size: 14px;
1513 | line-height: 16px;
1514 | color: #2c2c30;
1515 | mix-blend-mode: normal;
1516 | opacity: 0.9;
1517 | }
1518 |
1519 | .str-chat__thread {
1520 | background: #fff;
1521 | box-shadow: inset 1px 0px 0px rgba(0, 0, 0, 0.1);
1522 | border-top-right-radius: 16px;
1523 | border-bottom-right-radius: 16px;
1524 | }
1525 |
1526 | .str-chat__thread-header {
1527 | height: 62px !important;
1528 | box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
1529 | }
1530 |
1531 | .str-chat__thread-header-details {
1532 | display: flex;
1533 | height: 62px !important;
1534 | align-items: center;
1535 | }
1536 |
1537 | .str-chat__thread-header-details strong {
1538 | font-family: Helvetica, sans-serif;
1539 | font-style: normal;
1540 | font-weight: bold;
1541 | font-size: 18px;
1542 | line-height: 22px;
1543 | color: #2c2c30;
1544 | margin-right: 10px;
1545 | }
1546 |
1547 | .str-chat__thread-header-details small {
1548 | font-family: Helvetica Neue, sans-serif;
1549 | font-style: normal;
1550 | font-weight: normal;
1551 | font-size: 14px;
1552 | line-height: 17px;
1553 | color: #858688;
1554 | }
1555 |
1556 | .str-chat__thread .str-chat__square-button {
1557 | border-radius: 20px;
1558 | height: 35px;
1559 | width: 35px;
1560 | }
1561 |
1562 | .str-chat__square-button svg {
1563 | fill: var(--primary-color);
1564 | }
1565 |
1566 | .str-chat__square-button:hover {
1567 | border: 1px solid var(--primary-color);
1568 | cursor: pointer;
1569 | }
1570 |
1571 | .str-chat__square-button:focus {
1572 | outline: none;
1573 | }
1574 |
1575 | .str-chat__thread-start {
1576 | padding: 0;
1577 | margin: 20px 0 0 0;
1578 | font-size: 0;
1579 | width: 100%;
1580 | border-top: 1px solid rgba(0, 0, 0, 0.1);
1581 | }
1582 |
1583 | .str-chat .str-chat__list--thread {
1584 | padding: 0px;
1585 | }
1586 |
1587 | .str-chat .str-chat__list--thread .str-chat__reverse-infinite-scroll {
1588 | padding-top: 0px;
1589 | }
1590 |
1591 | .str-chat__thread-list {
1592 | top: 62px;
1593 | border-bottom: 1px solid rgba(0, 0, 0, 0.1);
1594 | height: auto;
1595 | }
1596 |
1597 | .str-chat__thread-list .str-chat__message-team {
1598 | padding: 10px;
1599 | }
1600 |
1601 | .thread-message-input__wrapper {
1602 | display: flex;
1603 | align-items: center;
1604 | padding: 15px 20px 28px;
1605 | width: 100%;
1606 | }
1607 |
1608 | .thread-message-input__wrapper .giphy-icon__wrapper {
1609 | display: flex;
1610 | align-items: center;
1611 | justify-content: space-evenly;
1612 | height: 24px;
1613 | width: 63px;
1614 | background: var(--primary-color);
1615 | border-radius: 12px;
1616 | margin-left: 8px;
1617 | }
1618 |
1619 | .thread-message-input__wrapper .giphy-icon__text {
1620 | font-family: Helvetica Neue, sans-serif;
1621 | font-style: normal;
1622 | font-weight: bold;
1623 | font-size: 11px;
1624 | line-height: 8px;
1625 | color: #ffffff;
1626 | }
1627 |
1628 | .thread-message-input__input {
1629 | border: 1px solid rgba(0, 0, 0, 0.2);
1630 | border-radius: 8px;
1631 | display: flex;
1632 | align-items: center;
1633 | width: 100%;
1634 | }
1635 |
1636 | .thread-message-input__input:focus-within {
1637 | border-color: var(--primary-color);
1638 | }
1639 |
1640 | .thread-message-input__button {
1641 | display: flex;
1642 | cursor: pointer;
1643 | align-items: center;
1644 | justify-content: center;
1645 | background: rgba(0, 0, 0, 0.05);
1646 | border-top-right-radius: 8px;
1647 | border-bottom-right-radius: 8px;
1648 | height: 44px;
1649 | width: 41px;
1650 | }
1651 |
1652 | .thread-message-input__input:focus-within .thread-message-input__button path {
1653 | fill: var(--primary-color);
1654 | fill-opacity: 1;
1655 | }
1656 |
1657 | .thread-message-input__wrapper .str-chat__textarea textarea {
1658 | display: flex;
1659 | align-items: center;
1660 | background: #fff;
1661 | border: none;
1662 | outline: none;
1663 | font-family: Helvetica Neue, sans-serif;
1664 | font-size: 15px;
1665 | line-height: 10px;
1666 | }
1667 |
1668 | .thread-message-input__wrapper .str-chat__textarea textarea:focus {
1669 | border: none;
1670 | outline: none;
1671 | box-shadow: none;
1672 | background: #fff;
1673 | }
1674 |
1675 | .thread-message-input__wrapper .str-chat__textarea textarea::placeholder {
1676 | color: rgba(0, 0, 0, 0.2);
1677 | }
1678 |
1679 | .thread-message-input__icons {
1680 | display: flex;
1681 | justify-content: space-around;
1682 | align-items: center;
1683 | width: 30px;
1684 | padding-right: 6px;
1685 | }
1686 |
1687 | .thread-message-input__icons svg:hover path {
1688 | fill: var(--primary-color);
1689 | fill-opacity: 1;
1690 | }
1691 |
1692 | .thread-message-input__icons svg:hover {
1693 | cursor: pointer;
1694 | }
1695 |
1696 | .thread-message-input__wrapper .str-chat__input--emojipicker {
1697 | z-index: 3;
1698 | top: 183px;
1699 | right: 299px;
1700 | width: 338px;
1701 | }
1702 |
1703 | .emoji-mart .emoji-mart-emoji:focus {
1704 | outline: none;
1705 | }
1706 |
1707 | .team-channerl-header_menu-icon {
1708 | display: none;
1709 | }
1710 |
1711 | .channerl-list__container-toggle {
1712 | display: none;
1713 | height: 50px;
1714 | width: 50px;
1715 | background: #005fff;
1716 | position: absolute;
1717 | right: -2%;
1718 | top: 50%;
1719 | border-radius: 50%;
1720 | z-index: 2;
1721 | }
1722 |
1723 | .channel-list__container-responsive {
1724 | display: none;
1725 | height: 100%;
1726 | box-shadow: inset 1px 0px 0px rgba(0, 0, 0, 0.1);
1727 | position: absolute;
1728 | width: 90%;
1729 | top: 0%;
1730 | z-index: 5;
1731 | transition: 0.8s ease;
1732 | }
1733 |
1734 | .str-chat__input-flat {
1735 | width: 100%;
1736 | padding: 10px;
1737 | }
1738 |
1739 | @media screen and (max-width: 960px) {
1740 | .channel-list__container {
1741 | display: none;
1742 | }
1743 |
1744 | .team-channerl-header_menu-icon {
1745 | display: flex;
1746 | }
1747 |
1748 | .team-channel-header__container {
1749 | height: 70px;
1750 | }
1751 |
1752 | .team-channel-header__name-wrapper {
1753 | height: 100%;
1754 | max-width: unset;
1755 | }
1756 |
1757 | .team-channel-header__name-multi {
1758 | margin-right: 8px;
1759 | align-items: center;
1760 | flex-direction: column;
1761 | }
1762 |
1763 | .team-channel-header__name.user {
1764 | font-size: 10px;
1765 | margin: 5px;
1766 | text-align: center;
1767 | }
1768 |
1769 | .team-channel-header__right {
1770 | display: flex;
1771 | padding-left: 10px;
1772 | }
1773 |
1774 | .channel-list__container-responsive {
1775 | display: flex;
1776 | }
1777 |
1778 | .channel-list__list__wrapper {
1779 | width: 100%;
1780 | }
1781 |
1782 | .channerl-list__container-toggle {
1783 | display: flex;
1784 | }
1785 |
1786 | .channel-search__input__wrapper {
1787 | width: 90%;
1788 | padding-left: 10px;
1789 | justify-content: flex-start;
1790 | }
1791 |
1792 | .channel-search__input__text {
1793 | width: inherit;
1794 | }
1795 |
1796 | .channel-preview__item.multi {
1797 | width: 80%;
1798 | }
1799 |
1800 | .channel-search__results {
1801 | top: 100%;
1802 | left: 5%;
1803 | }
1804 | }
1805 |
1806 | @media screen and (max-width: 650px) {
1807 | .channerl-list__container-toggle {
1808 | right: -3%;
1809 | }
1810 | }
1811 |
1812 | @media screen and (max-width: 400px) {
1813 | .channel-preview__item.multi {
1814 | width: 150px;
1815 | }
1816 |
1817 | .channerl-list__container-toggle {
1818 | right: -5%;
1819 | }
1820 | }
1821 |
1822 | @media screen and (max-width: 320px) {
1823 | .channel-list__sidebar {
1824 | display: none;
1825 | }
1826 | }
1827 |
--------------------------------------------------------------------------------
/client/src/App.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { StreamChat } from 'stream-chat';
3 | import { Chat } from 'stream-chat-react';
4 | import Cookies from 'universal-cookie';
5 |
6 | import { ChannelListContainer, ChannelContainer, Auth } from './components';
7 |
8 | import 'stream-chat-react/dist/css/index.css';
9 | import './App.css';
10 |
11 | const cookies = new Cookies();
12 |
13 | const apiKey = 'qgtk9ttyha7j';
14 | const authToken = cookies.get("token");
15 |
16 | const client = StreamChat.getInstance(apiKey);
17 |
18 | if(authToken) {
19 | client.connectUser({
20 | id: cookies.get('userId'),
21 | name: cookies.get('username'),
22 | fullName: cookies.get('fullName'),
23 | image: cookies.get('avatarURL'),
24 | hashedPassword: cookies.get('hashedPassword'),
25 | phoneNumber: cookies.get('phoneNumber'),
26 | }, authToken)
27 | }
28 |
29 |
30 | const App = () => {
31 | const [createType, setCreateType] = useState('');
32 | const [isCreating, setIsCreating] = useState(false);
33 | const [isEditing, setIsEditing] = useState(false);
34 |
35 | if(!authToken) return
36 |
37 | return (
38 |
39 |
40 |
46 |
53 |
54 |
55 | );
56 | }
57 |
58 | export default App;
59 |
--------------------------------------------------------------------------------
/client/src/assets/AddChannel.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const AddChannel = ({ setCreateType, setIsCreating, setIsEditing, setToggleContainer, type }) => (
4 | {
11 | setCreateType(type);
12 | setIsCreating((prevState) => !prevState);
13 | setIsEditing(false);
14 | if(setToggleContainer) setToggleContainer((prevState) => !prevState)
15 | }}
16 | >
17 |
22 |
23 | );
24 |
--------------------------------------------------------------------------------
/client/src/assets/ChannelInfo.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const ChannelInfo = () => (
4 |
5 |
10 |
11 | );
12 |
--------------------------------------------------------------------------------
/client/src/assets/CloseCreateChannel.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const CloseCreateChannel = ({ setIsCreating, setIsEditing }) => (
4 | {
11 | if (setIsCreating) setIsCreating(false);
12 | if (setIsEditing) setIsEditing(false);
13 | }}
14 | >
15 |
19 |
20 | );
21 |
--------------------------------------------------------------------------------
/client/src/assets/InviteIcon.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const InviteIcon = () => (
4 |
12 | );
13 |
--------------------------------------------------------------------------------
/client/src/assets/LightningBolt.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const LightningBolt = ({ giphyState, onCommandClick }) => (
4 |
13 | );
14 |
--------------------------------------------------------------------------------
/client/src/assets/SearchIcon.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const SearchIcon = () => (
4 |
5 |
12 |
13 | );
14 |
--------------------------------------------------------------------------------
/client/src/assets/hospital.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adrianhajdin/project_medical_pager_chat/b5a536baf8092c76f4b88eb99c71d95f7f4baae9/client/src/assets/hospital.png
--------------------------------------------------------------------------------
/client/src/assets/index.js:
--------------------------------------------------------------------------------
1 | export { AddChannel } from './AddChannel';
2 | export { ChannelInfo } from './ChannelInfo';
3 | export { CloseCreateChannel } from './CloseCreateChannel';
4 | export { InviteIcon } from './InviteIcon';
5 | export { LightningBolt } from './LightningBolt';
6 | export { SearchIcon } from './SearchIcon';
--------------------------------------------------------------------------------
/client/src/assets/logout.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adrianhajdin/project_medical_pager_chat/b5a536baf8092c76f4b88eb99c71d95f7f4baae9/client/src/assets/logout.png
--------------------------------------------------------------------------------
/client/src/assets/signup.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adrianhajdin/project_medical_pager_chat/b5a536baf8092c76f4b88eb99c71d95f7f4baae9/client/src/assets/signup.jpg
--------------------------------------------------------------------------------
/client/src/components/Auth.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import Cookies from 'universal-cookie';
3 | import axios from 'axios';
4 |
5 | import signinImage from '../assets/signup.jpg';
6 |
7 | const cookies = new Cookies();
8 |
9 | const initialState = {
10 | fullName: '',
11 | username: '',
12 | password: '',
13 | confirmPassword: '',
14 | phoneNumber: '',
15 | avatarURL: '',
16 | }
17 |
18 | const Auth = () => {
19 | const [form, setForm] = useState(initialState);
20 | const [isSignup, setIsSignup] = useState(true);
21 |
22 | const handleChange = (e) => {
23 | setForm({ ...form, [e.target.name]: e.target.value });
24 | }
25 |
26 | const handleSubmit = async (e) => {
27 | e.preventDefault();
28 |
29 | const { username, password, phoneNumber, avatarURL } = form;
30 |
31 | const URL = 'https://localhost:5000/auth';
32 | // const URL = 'https://medical-pager.herokuapp.com/auth';
33 |
34 | const { data: { token, userId, hashedPassword, fullName } } = await axios.post(`${URL}/${isSignup ? 'signup' : 'login'}`, {
35 | username, password, fullName: form.fullName, phoneNumber, avatarURL,
36 | });
37 |
38 | cookies.set('token', token);
39 | cookies.set('username', username);
40 | cookies.set('fullName', fullName);
41 | cookies.set('userId', userId);
42 |
43 | if(isSignup) {
44 | cookies.set('phoneNumber', phoneNumber);
45 | cookies.set('avatarURL', avatarURL);
46 | cookies.set('hashedPassword', hashedPassword);
47 | }
48 |
49 | window.location.reload();
50 | }
51 |
52 | const switchMode = () => {
53 | setIsSignup((prevIsSignup) => !prevIsSignup);
54 | }
55 |
56 | return (
57 |
58 |
59 |
60 |
{isSignup ? 'Sign Up' : 'Sign In'}
61 |
134 |
135 |
136 | {isSignup
137 | ? "Already have an account?"
138 | : "Don't have an account?"
139 | }
140 |
141 | {isSignup ? 'Sign In' : 'Sign Up'}
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 | )
152 | }
153 |
154 | export default Auth
155 |
--------------------------------------------------------------------------------
/client/src/components/ChannelContainer.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Channel, MessageTeam } from 'stream-chat-react';
3 |
4 | import { ChannelInner, CreateChannel, EditChannel } from './';
5 |
6 | const ChannelContainer = ({ isCreating, setIsCreating, isEditing, setIsEditing, createType }) => {
7 | if(isCreating) {
8 | return (
9 |
10 |
11 |
12 | )
13 | }
14 |
15 | if(isEditing) {
16 | return (
17 |
18 |
19 |
20 | )
21 | }
22 |
23 | const EmptyState = () => (
24 |
25 |
This is the beginning of your chat history.
26 |
Send messages, attachments, links, emojis, and more!
27 |
28 | )
29 |
30 | return (
31 |
32 | }
35 | >
36 |
37 |
38 |
39 | );
40 | }
41 |
42 | export default ChannelContainer;
43 |
--------------------------------------------------------------------------------
/client/src/components/ChannelInner.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { MessageList, MessageInput, Thread, Window, useChannelActionContext, Avatar, useChannelStateContext, useChatContext } from 'stream-chat-react';
3 |
4 | import { ChannelInfo } from '../assets';
5 |
6 | export const GiphyContext = React.createContext({});
7 |
8 | const ChannelInner = ({ setIsEditing }) => {
9 | const [giphyState, setGiphyState] = useState(false);
10 | const { sendMessage } = useChannelActionContext();
11 |
12 | const overrideSubmitHandler = (message) => {
13 | let updatedMessage = {
14 | attachments: message.attachments,
15 | mentioned_users: message.mentioned_users,
16 | parent_id: message.parent?.id,
17 | parent: message.parent,
18 | text: message.text,
19 | };
20 |
21 | if (giphyState) {
22 | updatedMessage = { ...updatedMessage, text: `/giphy ${message.text}` };
23 | }
24 |
25 | if (sendMessage) {
26 | sendMessage(updatedMessage);
27 | setGiphyState(false);
28 | }
29 | };
30 |
31 | return (
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 | );
43 | };
44 |
45 | const TeamChannelHeader = ({ setIsEditing }) => {
46 | const { channel, watcher_count } = useChannelStateContext();
47 | const { client } = useChatContext();
48 |
49 | const MessagingHeader = () => {
50 | const members = Object.values(channel.state.members).filter(({ user }) => user.id !== client.userID);
51 | const additionalMembers = members.length - 3;
52 |
53 | if(channel.type === 'messaging') {
54 | return (
55 |
56 | {members.map(({ user }, i) => (
57 |
58 |
59 |
{user.fullName || user.id}
60 |
61 | ))}
62 |
63 | {additionalMembers > 0 &&
and {additionalMembers} more
}
64 |
65 | );
66 | }
67 |
68 | return (
69 |
70 |
# {channel.data.name}
71 |
setIsEditing(true)}>
72 |
73 |
74 |
75 | );
76 | };
77 |
78 | const getWatcherText = (watchers) => {
79 | if (!watchers) return 'No users online';
80 | if (watchers === 1) return '1 user online';
81 | return `${watchers} users online`;
82 | };
83 |
84 | return (
85 |
86 |
87 |
88 |
{getWatcherText(watcher_count)}
89 |
90 |
91 | );
92 | };
93 |
94 | export default ChannelInner;
95 |
--------------------------------------------------------------------------------
/client/src/components/ChannelListContainer.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { ChannelList, useChatContext } from 'stream-chat-react';
3 | import Cookies from 'universal-cookie';
4 |
5 | import { ChannelSearch, TeamChannelList, TeamChannelPreview } from './';
6 | import HospitalIcon from '../assets/hospital.png'
7 | import LogoutIcon from '../assets/logout.png'
8 |
9 | const cookies = new Cookies();
10 |
11 | const SideBar = ({ logout }) => (
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | );
25 |
26 | const CompanyHeader = () => (
27 |
30 | )
31 |
32 | const customChannelTeamFilter = (channels) => {
33 | return channels.filter((channel) => channel.type === 'team');
34 | }
35 |
36 | const customChannelMessagingFilter = (channels) => {
37 | return channels.filter((channel) => channel.type === 'messaging');
38 | }
39 |
40 | const ChannelListContent = ({ isCreating, setIsCreating, setCreateType, setIsEditing, setToggleContainer }) => {
41 | const { client } = useChatContext();
42 |
43 | const logout = () => {
44 | cookies.remove("token");
45 | cookies.remove('userId');
46 | cookies.remove('username');
47 | cookies.remove('fullName');
48 | cookies.remove('avatarURL');
49 | cookies.remove('hashedPassword');
50 | cookies.remove('phoneNumber');
51 |
52 | window.location.reload();
53 | }
54 |
55 | const filters = { members: { $in: [client.userID] } };
56 |
57 | return (
58 | <>
59 |
60 |
61 |
62 |
63 | (
67 |
76 | )}
77 | Preview={(previewProps) => (
78 |
85 | )}
86 | />
87 | (
91 |
100 | )}
101 | Preview={(previewProps) => (
102 |
109 | )}
110 | />
111 |
112 | >
113 | );
114 | }
115 |
116 | const ChannelListContainer = ({ setCreateType, setIsCreating, setIsEditing }) => {
117 | const [toggleContainer, setToggleContainer] = useState(false);
118 |
119 | return (
120 | <>
121 |
122 |
127 |
128 |
129 |
132 |
setToggleContainer((prevToggleContainer) => !prevToggleContainer)}>
133 |
134 |
140 |
141 | >
142 | )
143 |
144 | }
145 |
146 | export default ChannelListContainer;
147 |
--------------------------------------------------------------------------------
/client/src/components/ChannelSearch.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from 'react';
2 | import { useChatContext } from 'stream-chat-react';
3 |
4 | import { ResultsDropdown } from './'
5 | import { SearchIcon } from '../assets';
6 |
7 | const ChannelSearch = ({ setToggleContainer }) => {
8 | const { client, setActiveChannel } = useChatContext();
9 | const [query, setQuery] = useState('');
10 | const [loading, setLoading] = useState(false);
11 | const [teamChannels, setTeamChannels] = useState([])
12 | const [directChannels, setDirectChannels] = useState([])
13 |
14 | useEffect(() => {
15 | if(!query) {
16 | setTeamChannels([]);
17 | setDirectChannels([]);
18 | }
19 | }, [query])
20 |
21 | const getChannels = async (text) => {
22 | try {
23 | const channelResponse = client.queryChannels({
24 | type: 'team',
25 | name: { $autocomplete: text },
26 | members: { $in: [client.userID]}
27 | });
28 | const userResponse = client.queryUsers({
29 | id: { $ne: client.userID },
30 | name: { $autocomplete: text }
31 | })
32 |
33 | const [channels, { users }] = await Promise.all([channelResponse, userResponse]);
34 |
35 | if(channels.length) setTeamChannels(channels);
36 | if(users.length) setDirectChannels(users);
37 | } catch (error) {
38 | setQuery('')
39 | }
40 | }
41 |
42 | const onSearch = (event) => {
43 | event.preventDefault();
44 |
45 | setLoading(true);
46 | setQuery(event.target.value);
47 | getChannels(event.target.value)
48 | }
49 |
50 | const setChannel = (channel) => {
51 | setQuery('');
52 | setActiveChannel(channel);
53 | }
54 |
55 | return (
56 |
57 |
69 | { query && (
70 |
78 | )}
79 |
80 | )
81 | }
82 |
83 | export default ChannelSearch
84 |
--------------------------------------------------------------------------------
/client/src/components/CreateChannel.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { useChatContext } from 'stream-chat-react';
3 |
4 | import { UserList } from './';
5 | import { CloseCreateChannel } from '../assets';
6 |
7 | const ChannelNameInput = ({ channelName = '', setChannelName }) => {
8 | const handleChange = (event) => {
9 | event.preventDefault();
10 |
11 | setChannelName(event.target.value);
12 | }
13 |
14 | return (
15 |
16 |
Name
17 |
18 |
Add Members
19 |
20 | )
21 | }
22 |
23 | const CreateChannel = ({ createType, setIsCreating }) => {
24 | const { client, setActiveChannel } = useChatContext();
25 | const [selectedUsers, setSelectedUsers] = useState([client.userID || ''])
26 | const [channelName, setChannelName] = useState('');
27 |
28 | const createChannel = async (e) => {
29 | e.preventDefault();
30 |
31 | try {
32 | const newChannel = await client.channel(createType, channelName, {
33 | name: channelName, members: selectedUsers
34 | });
35 |
36 | await newChannel.watch();
37 |
38 | setChannelName('');
39 | setIsCreating(false);
40 | setSelectedUsers([client.userID]);
41 | setActiveChannel(newChannel);
42 | } catch (error) {
43 | console.log(error);
44 | }
45 | }
46 |
47 | return (
48 |
49 |
50 |
{createType === 'team' ? 'Create a New Channel' : 'Send a Direct Message'}
51 |
52 |
53 | {createType === 'team' &&
}
54 |
55 |
56 |
{createType === 'team' ? 'Create Channel' : 'Create Message Group'}
57 |
58 |
59 | )
60 | }
61 |
62 | export default CreateChannel
63 |
--------------------------------------------------------------------------------
/client/src/components/EditChannel.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { useChatContext } from 'stream-chat-react';
3 |
4 | import { UserList } from './';
5 | import { CloseCreateChannel } from '../assets';
6 |
7 | const ChannelNameInput = ({ channelName = '', setChannelName }) => {
8 | const handleChange = (event) => {
9 | event.preventDefault();
10 |
11 | setChannelName(event.target.value);
12 | }
13 |
14 | return (
15 |
16 |
Name
17 |
18 |
Add Members
19 |
20 | )
21 | }
22 |
23 | const EditChannel = ({ setIsEditing }) => {
24 | const { channel } = useChatContext();
25 | const [channelName, setChannelName] = useState(channel?.data?.name);
26 | const [selectedUsers, setSelectedUsers] = useState([])
27 |
28 | const updateChannel = async (event) => {
29 | event.preventDefault();
30 |
31 | const nameChanged = channelName !== (channel.data.name || channel.data.id);
32 |
33 | if(nameChanged) {
34 | await channel.update({ name: channelName }, { text: `Channel name changed to ${channelName}`});
35 | }
36 |
37 | if(selectedUsers.length) {
38 | await channel.addMembers(selectedUsers);
39 | }
40 |
41 | setChannelName(null);
42 | setIsEditing(false);
43 | setSelectedUsers([]);
44 | }
45 |
46 | return (
47 |
48 |
49 |
Edit Channel
50 |
51 |
52 |
53 |
54 |
57 |
58 | )
59 | }
60 |
61 | export default EditChannel
62 |
--------------------------------------------------------------------------------
/client/src/components/ResultsDropdown.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Avatar, useChatContext } from 'stream-chat-react';
3 |
4 | const channelByUser = async ({ client, setActiveChannel, channel, setChannel }) => {
5 | const filters = {
6 | type: 'messaging',
7 | member_count: 2,
8 | members: { $eq: [client.user.id, client.userID] },
9 | };
10 |
11 | const [existingChannel] = await client.queryChannels(filters);
12 |
13 | if (existingChannel) return setActiveChannel(existingChannel);
14 |
15 | const newChannel = client.channel('messaging', { members: [channel.id, client.userID] });
16 |
17 | setChannel(newChannel)
18 |
19 | return setActiveChannel(newChannel);
20 | };
21 |
22 | const SearchResult = ({ channel, focusedId, type, setChannel, setToggleContainer }) => {
23 | const { client, setActiveChannel } = useChatContext();
24 |
25 | if (type === 'channel') {
26 | return (
27 | {
29 | setChannel(channel)
30 | if(setToggleContainer) {
31 | setToggleContainer((prevState) => !prevState)
32 | }
33 | }}
34 | className={focusedId === channel.id ? 'channel-search__result-container__focused' : 'channel-search__result-container' }
35 | >
36 |
#
37 |
{channel.data.name}
38 |
39 | );
40 | }
41 |
42 | return (
43 | {
45 | channelByUser({ client, setActiveChannel, channel, setChannel })
46 | if(setToggleContainer) {
47 | setToggleContainer((prevState) => !prevState)
48 | }
49 | }}
50 | className={focusedId === channel.id ? 'channel-search__result-container__focused' : 'channel-search__result-container' }
51 | >
52 |
53 |
54 |
{channel.name}
55 |
56 |
57 | );
58 | };
59 |
60 | const ResultsDropdown = ({ teamChannels, directChannels, focusedId, loading, setChannel, setToggleContainer }) => {
61 |
62 | return (
63 |
64 |
Channels
65 | {loading && !teamChannels.length && (
66 |
67 | Loading...
68 |
69 | )}
70 | {!loading && !teamChannels.length ? (
71 |
72 | No channels found
73 |
74 | ) : (
75 | teamChannels?.map((channel, i) => (
76 |
84 | ))
85 | )}
86 |
Users
87 | {loading && !directChannels.length && (
88 |
89 | Loading...
90 |
91 | )}
92 | {!loading && !directChannels.length ? (
93 |
94 | No direct messages found
95 |
96 | ) : (
97 | directChannels?.map((channel, i) => (
98 |
106 | ))
107 | )}
108 |
109 | );
110 | };
111 |
112 | export default ResultsDropdown;
--------------------------------------------------------------------------------
/client/src/components/TeamChannelList.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | import { AddChannel } from '../assets';
4 |
5 | const TeamChannelList = ({ setToggleContainer, children, error = false, loading, type, isCreating, setIsCreating, setCreateType, setIsEditing }) => {
6 | if(error) {
7 | return type === 'team' ? (
8 |
9 |
10 | Connection error, please wait a moment and try again.
11 |
12 |
13 | ) : null
14 | }
15 |
16 | if(loading) {
17 | return (
18 |
19 |
20 | {type === 'team' ? 'Channels' : 'Messages'} loading...
21 |
22 |
23 | )
24 | }
25 |
26 | return (
27 |
28 |
29 |
30 | {type === 'team' ? 'Channels' : 'Direct Messages'}
31 |
32 |
40 |
41 | {children}
42 |
43 | )
44 | }
45 |
46 | export default TeamChannelList
47 |
--------------------------------------------------------------------------------
/client/src/components/TeamChannelPreview.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Avatar, useChatContext } from 'stream-chat-react';
3 |
4 | const TeamChannelPreview = ({ setActiveChannel, setIsCreating, setIsEditing, setToggleContainer, channel, type }) => {
5 | const { channel: activeChannel, client } = useChatContext();
6 |
7 | const ChannelPreview = () => (
8 |
9 | # {channel?.data?.name || channel?.data?.id}
10 |
11 | );
12 |
13 |
14 | const DirectPreview = () => {
15 | const members = Object.values(channel.state.members).filter(({ user }) => user.id !== client.userID);
16 |
17 | console.log(members[0]);
18 |
19 | return (
20 |
21 |
26 |
{members[0]?.user?.fullName || members[0]?.user?.id}
27 |
28 | )
29 | }
30 |
31 | return (
32 | {
38 | setIsCreating(false);
39 | setIsEditing(false);
40 | setActiveChannel(channel);
41 | if(setToggleContainer) {
42 | setToggleContainer((prevState) => !prevState)
43 | }
44 | }}
45 | >
46 | {type === 'team' ? : }
47 |
48 | );
49 | }
50 |
51 | export default TeamChannelPreview
52 |
--------------------------------------------------------------------------------
/client/src/components/TeamMessage.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { MessageTeam, useMessageContext } from 'stream-chat-react';
3 |
4 | const TeamMessage = () => {
5 | const { handleOpenThread, message } = useMessageContext();
6 |
7 | return (
8 |
12 | )
13 | }
14 |
15 | export default TeamMessage
16 |
--------------------------------------------------------------------------------
/client/src/components/UserList.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react';
2 | import { Avatar, useChatContext } from 'stream-chat-react';
3 |
4 | import { InviteIcon } from '../assets';
5 |
6 | const ListContainer = ({ children }) => {
7 | return (
8 |
9 |
10 |
User
11 |
Invite
12 |
13 | {children}
14 |
15 | )
16 | }
17 |
18 | const UserItem = ({ user, setSelectedUsers }) => {
19 | const [selected, setSelected] = useState(false)
20 |
21 | const handleSelect = () => {
22 | if(selected) {
23 | setSelectedUsers((prevUsers) => prevUsers.filter((prevUser) => prevUser !== user.id))
24 | } else {
25 | setSelectedUsers((prevUsers) => [...prevUsers, user.id])
26 | }
27 |
28 | setSelected((prevSelected) => !prevSelected)
29 | }
30 |
31 | return (
32 |
33 |
34 |
35 |
{user.fullName || user.id}
36 |
37 | {selected ?
:
}
38 |
39 | )
40 | }
41 |
42 |
43 | const UserList = ({ setSelectedUsers }) => {
44 | const { client } = useChatContext();
45 | const [users, setUsers] = useState([]);
46 | const [loading, setLoading] = useState(false);
47 | const [listEmpty, setListEmpty] = useState(false);
48 | const [error, setError] = useState(false);
49 |
50 | useEffect(() => {
51 | const getUsers = async () => {
52 | if(loading) return;
53 |
54 | setLoading(true);
55 |
56 | try {
57 | const response = await client.queryUsers(
58 | { id: { $ne: client.userID } },
59 | { id: 1 },
60 | { limit: 8 }
61 | );
62 |
63 | if(response.users.length) {
64 | setUsers(response.users);
65 | } else {
66 | setListEmpty(true);
67 | }
68 | } catch (error) {
69 | setError(true);
70 | }
71 | setLoading(false);
72 | }
73 |
74 | if(client) getUsers()
75 | }, []);
76 |
77 | if(error) {
78 | return (
79 |
80 |
81 | Error loading, please refresh and try again.
82 |
83 |
84 | )
85 | }
86 |
87 | if(listEmpty) {
88 | return (
89 |
90 |
91 | No users found.
92 |
93 |
94 | )
95 | }
96 |
97 | return (
98 |
99 | {loading ?
100 | Loading users...
101 |
: (
102 | users?.map((user, i) => (
103 |
104 | ))
105 | )}
106 |
107 | )
108 | }
109 |
110 | export default UserList;
--------------------------------------------------------------------------------
/client/src/components/index.js:
--------------------------------------------------------------------------------
1 | export { default as ChannelContainer } from './ChannelContainer';
2 | export { default as ChannelListContainer } from './ChannelListContainer';
3 | export { default as ChannelSearch } from './ChannelSearch';
4 | export { default as TeamChannelList } from './TeamChannelList';
5 | export { default as TeamChannelPreview } from './TeamChannelPreview';
6 | export { default as ChannelInner } from './ChannelInner';
7 | export { default as CreateChannel } from './CreateChannel';
8 | export { default as EditChannel } from './EditChannel';
9 | export { default as TeamMessage } from './TeamMessage';
10 | export { default as Auth } from './Auth';
11 | export { default as UserList } from './UserList';
12 | export { default as ResultsDropdown } from './ResultsDropdown';
--------------------------------------------------------------------------------
/client/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 |
4 | import App from './App';
5 |
6 | ReactDOM.render( , document.getElementById('root'));
--------------------------------------------------------------------------------
/server/.env:
--------------------------------------------------------------------------------
1 | STREAM_APP_ID = 1139538
2 | STREAM_API_KEY = qgtk9ttyha7j
3 | STREAM_API_SECRET = 7wue2y5whwn98sak824qmaqf5d82cvg83vag2qt7rupjwkcp8jgqv6panmx8qefb
4 |
5 | TWILIO_ACCOUNT_SID = ACee5bbcf69e428b462dba86519b22cf2e
6 | TWILIO_AUTH_TOKEN = 950b65cdb38a198696b75fc6ed5ae7d9
7 | TWILIO_MESSAGING_SERVICE_SID = MGbf86065e25b0747ef5a9fc0d6261f2c2
--------------------------------------------------------------------------------
/server/controllers/auth.js:
--------------------------------------------------------------------------------
1 | const { connect } = require('getstream');
2 | const bcrypt = require('bcrypt');
3 | const StreamChat = require('stream-chat').StreamChat;
4 | const crypto = require('crypto');
5 |
6 | require('dotenv').config();
7 |
8 | const api_key = process.env.STREAM_API_KEY;
9 | const api_secret = process.env.STREAM_API_SECRET;
10 | const app_id = process.env.STREAM_APP_ID;
11 |
12 | const signup = async (req, res) => {
13 | try {
14 | const { fullName, username, password, phoneNumber } = req.body;
15 |
16 | const userId = crypto.randomBytes(16).toString('hex');
17 |
18 | const serverClient = connect(api_key, api_secret, app_id);
19 |
20 | const hashedPassword = await bcrypt.hash(password, 10);
21 |
22 | const token = serverClient.createUserToken(userId);
23 |
24 | res.status(200).json({ token, fullName, username, userId, hashedPassword, phoneNumber });
25 | } catch (error) {
26 | console.log(error);
27 |
28 | res.status(500).json({ message: error });
29 | }
30 | };
31 |
32 | const login = async (req, res) => {
33 | try {
34 | const { username, password } = req.body;
35 |
36 | const serverClient = connect(api_key, api_secret, app_id);
37 | const client = StreamChat.getInstance(api_key, api_secret);
38 |
39 | const { users } = await client.queryUsers({ name: username });
40 |
41 | if(!users.length) return res.status(400).json({ message: 'User not found' });
42 |
43 | const success = await bcrypt.compare(password, users[0].hashedPassword);
44 |
45 | const token = serverClient.createUserToken(users[0].id);
46 |
47 | if(success) {
48 | res.status(200).json({ token, fullName: users[0].fullName, username, userId: users[0].id});
49 | } else {
50 | res.status(500).json({ message: 'Incorrect password' });
51 | }
52 | } catch (error) {ads
53 | console.log(error);
54 |
55 | res.status(500).json({ message: error });
56 | }
57 | };
58 |
59 | module.exports = { signup, login }
--------------------------------------------------------------------------------
/server/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const cors = require('cors');
3 |
4 | const authRoutes = require("./routes/auth.js");
5 |
6 | const app = express();
7 | const PORT = process.env.PORT || 5000;
8 |
9 | require('dotenv').config();
10 |
11 | const accountSid = process.env.TWILIO_ACCOUNT_SID;
12 | const authToken = process.env.TWILIO_AUTH_TOKEN;
13 | const messagingServiceSid = process.env.TWILIO_MESSAGING_SERVICE_SID;
14 | const twilioClient = require('twilio')(accountSid, authToken);
15 |
16 | app.use(cors());
17 | app.use(express.json());
18 | app.use(express.urlencoded());
19 |
20 | app.get('/', (req, res) => {
21 | res.send('Hello, World!');
22 | });
23 |
24 | app.post('/', (req, res) => {
25 | const { message, user: sender, type, members } = req.body;
26 |
27 | if(type === 'message.new') {
28 | members
29 | .filter((member) => member.user_id !== sender.id)
30 | .forEach(({ user }) => {
31 | if(!user.online) {
32 | twilioClient.messages.create({
33 | body: `You have a new message from ${message.user.fullName} - ${message.text}`,
34 | messagingServiceSid: messagingServiceSid,
35 | to: user.phoneNumber
36 | })
37 | .then(() => console.log('Message sent!'))
38 | .catch((err) => console.log(err));
39 | }
40 | })
41 |
42 | return res.status(200).send('Message sent!');
43 | }
44 |
45 | return res.status(200).send('Not a new message request');
46 | });
47 |
48 | app.use('/auth', authRoutes);
49 |
50 | app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
--------------------------------------------------------------------------------
/server/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/runtime": {
8 | "version": "7.15.3",
9 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
10 | "integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
11 | "requires": {
12 | "regenerator-runtime": "^0.13.4"
13 | }
14 | },
15 | "@mapbox/node-pre-gyp": {
16 | "version": "1.0.5",
17 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz",
18 | "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==",
19 | "requires": {
20 | "detect-libc": "^1.0.3",
21 | "https-proxy-agent": "^5.0.0",
22 | "make-dir": "^3.1.0",
23 | "node-fetch": "^2.6.1",
24 | "nopt": "^5.0.0",
25 | "npmlog": "^4.1.2",
26 | "rimraf": "^3.0.2",
27 | "semver": "^7.3.4",
28 | "tar": "^6.1.0"
29 | }
30 | },
31 | "@sindresorhus/is": {
32 | "version": "0.14.0",
33 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
34 | "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
35 | },
36 | "@szmarczak/http-timer": {
37 | "version": "1.1.2",
38 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
39 | "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
40 | "requires": {
41 | "defer-to-connect": "^1.0.1"
42 | }
43 | },
44 | "@types/jsonwebtoken": {
45 | "version": "8.5.5",
46 | "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.5.tgz",
47 | "integrity": "sha512-OGqtHQ7N5/Ap/TUwO6IgHDuLiAoTmHhGpNvgkCm/F4N6pKzx/RBSfr2OXZSwC6vkfnsEdb6+7DNZVtiXiwdwFw==",
48 | "requires": {
49 | "@types/node": "*"
50 | }
51 | },
52 | "@types/jwt-decode": {
53 | "version": "2.2.1",
54 | "resolved": "https://registry.npmjs.org/@types/jwt-decode/-/jwt-decode-2.2.1.tgz",
55 | "integrity": "sha512-aWw2YTtAdT7CskFyxEX2K21/zSDStuf/ikI3yBqmwpwJF0pS+/IX5DWv+1UFffZIbruP6cnT9/LAJV1gFwAT1A=="
56 | },
57 | "@types/node": {
58 | "version": "16.7.2",
59 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.2.tgz",
60 | "integrity": "sha512-TbG4TOx9hng8FKxaVrCisdaxKxqEwJ3zwHoCWXZ0Jw6mnvTInpaB99/2Cy4+XxpXtjNv9/TgfGSvZFyfV/t8Fw=="
61 | },
62 | "@types/qs": {
63 | "version": "6.9.7",
64 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
65 | "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
66 | },
67 | "@types/ws": {
68 | "version": "7.4.7",
69 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz",
70 | "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==",
71 | "requires": {
72 | "@types/node": "*"
73 | }
74 | },
75 | "abbrev": {
76 | "version": "1.1.1",
77 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
78 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
79 | },
80 | "accepts": {
81 | "version": "1.3.7",
82 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
83 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
84 | "requires": {
85 | "mime-types": "~2.1.24",
86 | "negotiator": "0.6.2"
87 | }
88 | },
89 | "agent-base": {
90 | "version": "6.0.2",
91 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
92 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
93 | "requires": {
94 | "debug": "4"
95 | }
96 | },
97 | "ansi-align": {
98 | "version": "3.0.0",
99 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
100 | "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
101 | "requires": {
102 | "string-width": "^3.0.0"
103 | },
104 | "dependencies": {
105 | "ansi-regex": {
106 | "version": "4.1.0",
107 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
108 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
109 | },
110 | "is-fullwidth-code-point": {
111 | "version": "2.0.0",
112 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
113 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
114 | },
115 | "string-width": {
116 | "version": "3.1.0",
117 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
118 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
119 | "requires": {
120 | "emoji-regex": "^7.0.1",
121 | "is-fullwidth-code-point": "^2.0.0",
122 | "strip-ansi": "^5.1.0"
123 | }
124 | },
125 | "strip-ansi": {
126 | "version": "5.2.0",
127 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
128 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
129 | "requires": {
130 | "ansi-regex": "^4.1.0"
131 | }
132 | }
133 | }
134 | },
135 | "ansi-regex": {
136 | "version": "2.1.1",
137 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
138 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
139 | },
140 | "ansi-styles": {
141 | "version": "4.3.0",
142 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
143 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
144 | "requires": {
145 | "color-convert": "^2.0.1"
146 | }
147 | },
148 | "anymatch": {
149 | "version": "3.1.2",
150 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
151 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
152 | "requires": {
153 | "normalize-path": "^3.0.0",
154 | "picomatch": "^2.0.4"
155 | }
156 | },
157 | "aproba": {
158 | "version": "1.2.0",
159 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
160 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
161 | },
162 | "are-we-there-yet": {
163 | "version": "1.1.5",
164 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
165 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
166 | "requires": {
167 | "delegates": "^1.0.0",
168 | "readable-stream": "^2.0.6"
169 | }
170 | },
171 | "array-flatten": {
172 | "version": "1.1.1",
173 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
174 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
175 | },
176 | "asap": {
177 | "version": "2.0.6",
178 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
179 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
180 | },
181 | "asynckit": {
182 | "version": "0.4.0",
183 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
184 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
185 | },
186 | "axios": {
187 | "version": "0.21.1",
188 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
189 | "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
190 | "requires": {
191 | "follow-redirects": "^1.10.0"
192 | }
193 | },
194 | "balanced-match": {
195 | "version": "1.0.2",
196 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
197 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
198 | },
199 | "base64-js": {
200 | "version": "1.5.1",
201 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
202 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
203 | },
204 | "bcrypt": {
205 | "version": "5.0.1",
206 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.1.tgz",
207 | "integrity": "sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==",
208 | "requires": {
209 | "@mapbox/node-pre-gyp": "^1.0.0",
210 | "node-addon-api": "^3.1.0"
211 | }
212 | },
213 | "binary-extensions": {
214 | "version": "2.2.0",
215 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
216 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
217 | },
218 | "body-parser": {
219 | "version": "1.19.0",
220 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
221 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
222 | "requires": {
223 | "bytes": "3.1.0",
224 | "content-type": "~1.0.4",
225 | "debug": "2.6.9",
226 | "depd": "~1.1.2",
227 | "http-errors": "1.7.2",
228 | "iconv-lite": "0.4.24",
229 | "on-finished": "~2.3.0",
230 | "qs": "6.7.0",
231 | "raw-body": "2.4.0",
232 | "type-is": "~1.6.17"
233 | },
234 | "dependencies": {
235 | "debug": {
236 | "version": "2.6.9",
237 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
238 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
239 | "requires": {
240 | "ms": "2.0.0"
241 | }
242 | },
243 | "ms": {
244 | "version": "2.0.0",
245 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
246 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
247 | }
248 | }
249 | },
250 | "boxen": {
251 | "version": "4.2.0",
252 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
253 | "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
254 | "requires": {
255 | "ansi-align": "^3.0.0",
256 | "camelcase": "^5.3.1",
257 | "chalk": "^3.0.0",
258 | "cli-boxes": "^2.2.0",
259 | "string-width": "^4.1.0",
260 | "term-size": "^2.1.0",
261 | "type-fest": "^0.8.1",
262 | "widest-line": "^3.1.0"
263 | },
264 | "dependencies": {
265 | "ansi-regex": {
266 | "version": "5.0.0",
267 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
268 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
269 | },
270 | "emoji-regex": {
271 | "version": "8.0.0",
272 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
273 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
274 | },
275 | "is-fullwidth-code-point": {
276 | "version": "3.0.0",
277 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
278 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
279 | },
280 | "string-width": {
281 | "version": "4.2.2",
282 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
283 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
284 | "requires": {
285 | "emoji-regex": "^8.0.0",
286 | "is-fullwidth-code-point": "^3.0.0",
287 | "strip-ansi": "^6.0.0"
288 | }
289 | },
290 | "strip-ansi": {
291 | "version": "6.0.0",
292 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
293 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
294 | "requires": {
295 | "ansi-regex": "^5.0.0"
296 | }
297 | }
298 | }
299 | },
300 | "brace-expansion": {
301 | "version": "1.1.11",
302 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
303 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
304 | "requires": {
305 | "balanced-match": "^1.0.0",
306 | "concat-map": "0.0.1"
307 | }
308 | },
309 | "braces": {
310 | "version": "3.0.2",
311 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
312 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
313 | "requires": {
314 | "fill-range": "^7.0.1"
315 | }
316 | },
317 | "buffer-equal-constant-time": {
318 | "version": "1.0.1",
319 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
320 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
321 | },
322 | "bytes": {
323 | "version": "3.1.0",
324 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
325 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
326 | },
327 | "cacheable-request": {
328 | "version": "6.1.0",
329 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
330 | "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
331 | "requires": {
332 | "clone-response": "^1.0.2",
333 | "get-stream": "^5.1.0",
334 | "http-cache-semantics": "^4.0.0",
335 | "keyv": "^3.0.0",
336 | "lowercase-keys": "^2.0.0",
337 | "normalize-url": "^4.1.0",
338 | "responselike": "^1.0.2"
339 | },
340 | "dependencies": {
341 | "get-stream": {
342 | "version": "5.2.0",
343 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
344 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
345 | "requires": {
346 | "pump": "^3.0.0"
347 | }
348 | },
349 | "lowercase-keys": {
350 | "version": "2.0.0",
351 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
352 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
353 | }
354 | }
355 | },
356 | "call-bind": {
357 | "version": "1.0.2",
358 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
359 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
360 | "requires": {
361 | "function-bind": "^1.1.1",
362 | "get-intrinsic": "^1.0.2"
363 | }
364 | },
365 | "camelcase": {
366 | "version": "5.3.1",
367 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
368 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
369 | },
370 | "chalk": {
371 | "version": "3.0.0",
372 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
373 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
374 | "requires": {
375 | "ansi-styles": "^4.1.0",
376 | "supports-color": "^7.1.0"
377 | },
378 | "dependencies": {
379 | "has-flag": {
380 | "version": "4.0.0",
381 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
382 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
383 | },
384 | "supports-color": {
385 | "version": "7.2.0",
386 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
387 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
388 | "requires": {
389 | "has-flag": "^4.0.0"
390 | }
391 | }
392 | }
393 | },
394 | "chokidar": {
395 | "version": "3.5.2",
396 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
397 | "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
398 | "requires": {
399 | "anymatch": "~3.1.2",
400 | "braces": "~3.0.2",
401 | "fsevents": "~2.3.2",
402 | "glob-parent": "~5.1.2",
403 | "is-binary-path": "~2.1.0",
404 | "is-glob": "~4.0.1",
405 | "normalize-path": "~3.0.0",
406 | "readdirp": "~3.6.0"
407 | }
408 | },
409 | "chownr": {
410 | "version": "2.0.0",
411 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
412 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
413 | },
414 | "ci-info": {
415 | "version": "2.0.0",
416 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
417 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
418 | },
419 | "cli-boxes": {
420 | "version": "2.2.1",
421 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
422 | "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="
423 | },
424 | "clone-response": {
425 | "version": "1.0.2",
426 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
427 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
428 | "requires": {
429 | "mimic-response": "^1.0.0"
430 | }
431 | },
432 | "code-point-at": {
433 | "version": "1.1.0",
434 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
435 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
436 | },
437 | "color-convert": {
438 | "version": "2.0.1",
439 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
440 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
441 | "requires": {
442 | "color-name": "~1.1.4"
443 | }
444 | },
445 | "color-name": {
446 | "version": "1.1.4",
447 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
448 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
449 | },
450 | "combined-stream": {
451 | "version": "1.0.8",
452 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
453 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
454 | "requires": {
455 | "delayed-stream": "~1.0.0"
456 | }
457 | },
458 | "concat-map": {
459 | "version": "0.0.1",
460 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
461 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
462 | },
463 | "configstore": {
464 | "version": "5.0.1",
465 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
466 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
467 | "requires": {
468 | "dot-prop": "^5.2.0",
469 | "graceful-fs": "^4.1.2",
470 | "make-dir": "^3.0.0",
471 | "unique-string": "^2.0.0",
472 | "write-file-atomic": "^3.0.0",
473 | "xdg-basedir": "^4.0.0"
474 | }
475 | },
476 | "console-control-strings": {
477 | "version": "1.1.0",
478 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
479 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
480 | },
481 | "content-disposition": {
482 | "version": "0.5.3",
483 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
484 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
485 | "requires": {
486 | "safe-buffer": "5.1.2"
487 | }
488 | },
489 | "content-type": {
490 | "version": "1.0.4",
491 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
492 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
493 | },
494 | "cookie": {
495 | "version": "0.4.0",
496 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
497 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
498 | },
499 | "cookie-signature": {
500 | "version": "1.0.6",
501 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
502 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
503 | },
504 | "core-util-is": {
505 | "version": "1.0.2",
506 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
507 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
508 | },
509 | "cors": {
510 | "version": "2.8.5",
511 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
512 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
513 | "requires": {
514 | "object-assign": "^4",
515 | "vary": "^1"
516 | }
517 | },
518 | "crypto": {
519 | "version": "1.0.1",
520 | "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz",
521 | "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig=="
522 | },
523 | "crypto-random-string": {
524 | "version": "2.0.0",
525 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
526 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
527 | },
528 | "csprng": {
529 | "version": "0.1.2",
530 | "resolved": "https://registry.npmjs.org/csprng/-/csprng-0.1.2.tgz",
531 | "integrity": "sha1-S8aPEvo2jSUqWYQcusqXSxirReI=",
532 | "requires": {
533 | "sequin": "*"
534 | }
535 | },
536 | "dayjs": {
537 | "version": "1.10.6",
538 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz",
539 | "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw=="
540 | },
541 | "debug": {
542 | "version": "4.3.2",
543 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
544 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
545 | "requires": {
546 | "ms": "2.1.2"
547 | }
548 | },
549 | "decompress-response": {
550 | "version": "3.3.0",
551 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
552 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
553 | "requires": {
554 | "mimic-response": "^1.0.0"
555 | }
556 | },
557 | "deep-extend": {
558 | "version": "0.6.0",
559 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
560 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
561 | },
562 | "defer-to-connect": {
563 | "version": "1.1.3",
564 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
565 | "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
566 | },
567 | "delayed-stream": {
568 | "version": "1.0.0",
569 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
570 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
571 | },
572 | "delegates": {
573 | "version": "1.0.0",
574 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
575 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
576 | },
577 | "depd": {
578 | "version": "1.1.2",
579 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
580 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
581 | },
582 | "destroy": {
583 | "version": "1.0.4",
584 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
585 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
586 | },
587 | "detect-libc": {
588 | "version": "1.0.3",
589 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
590 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
591 | },
592 | "dot-prop": {
593 | "version": "5.3.0",
594 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
595 | "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
596 | "requires": {
597 | "is-obj": "^2.0.0"
598 | }
599 | },
600 | "dotenv": {
601 | "version": "10.0.0",
602 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
603 | "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="
604 | },
605 | "duplexer3": {
606 | "version": "0.1.4",
607 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
608 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
609 | },
610 | "ecdsa-sig-formatter": {
611 | "version": "1.0.11",
612 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
613 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
614 | "requires": {
615 | "safe-buffer": "^5.0.1"
616 | }
617 | },
618 | "ee-first": {
619 | "version": "1.1.1",
620 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
621 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
622 | },
623 | "emoji-regex": {
624 | "version": "7.0.3",
625 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
626 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
627 | },
628 | "encodeurl": {
629 | "version": "1.0.2",
630 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
631 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
632 | },
633 | "end-of-stream": {
634 | "version": "1.4.4",
635 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
636 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
637 | "requires": {
638 | "once": "^1.4.0"
639 | }
640 | },
641 | "escape-goat": {
642 | "version": "2.1.1",
643 | "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
644 | "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="
645 | },
646 | "escape-html": {
647 | "version": "1.0.3",
648 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
649 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
650 | },
651 | "etag": {
652 | "version": "1.8.1",
653 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
654 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
655 | },
656 | "express": {
657 | "version": "4.17.1",
658 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
659 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
660 | "requires": {
661 | "accepts": "~1.3.7",
662 | "array-flatten": "1.1.1",
663 | "body-parser": "1.19.0",
664 | "content-disposition": "0.5.3",
665 | "content-type": "~1.0.4",
666 | "cookie": "0.4.0",
667 | "cookie-signature": "1.0.6",
668 | "debug": "2.6.9",
669 | "depd": "~1.1.2",
670 | "encodeurl": "~1.0.2",
671 | "escape-html": "~1.0.3",
672 | "etag": "~1.8.1",
673 | "finalhandler": "~1.1.2",
674 | "fresh": "0.5.2",
675 | "merge-descriptors": "1.0.1",
676 | "methods": "~1.1.2",
677 | "on-finished": "~2.3.0",
678 | "parseurl": "~1.3.3",
679 | "path-to-regexp": "0.1.7",
680 | "proxy-addr": "~2.0.5",
681 | "qs": "6.7.0",
682 | "range-parser": "~1.2.1",
683 | "safe-buffer": "5.1.2",
684 | "send": "0.17.1",
685 | "serve-static": "1.14.1",
686 | "setprototypeof": "1.1.1",
687 | "statuses": "~1.5.0",
688 | "type-is": "~1.6.18",
689 | "utils-merge": "1.0.1",
690 | "vary": "~1.1.2"
691 | },
692 | "dependencies": {
693 | "debug": {
694 | "version": "2.6.9",
695 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
696 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
697 | "requires": {
698 | "ms": "2.0.0"
699 | }
700 | },
701 | "ms": {
702 | "version": "2.0.0",
703 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
704 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
705 | }
706 | }
707 | },
708 | "faye": {
709 | "version": "1.4.0",
710 | "resolved": "https://registry.npmjs.org/faye/-/faye-1.4.0.tgz",
711 | "integrity": "sha512-kRrIg4be8VNYhycS2PY//hpBJSzZPr/DBbcy9VWelhZMW3KhyLkQR0HL0k0MNpmVoNFF4EdfMFkNAWjTP65g6w==",
712 | "requires": {
713 | "asap": "*",
714 | "csprng": "*",
715 | "faye-websocket": ">=0.9.1",
716 | "safe-buffer": "*",
717 | "tough-cookie": "*",
718 | "tunnel-agent": "*"
719 | }
720 | },
721 | "faye-websocket": {
722 | "version": "0.11.4",
723 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
724 | "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
725 | "requires": {
726 | "websocket-driver": ">=0.5.1"
727 | }
728 | },
729 | "fill-range": {
730 | "version": "7.0.1",
731 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
732 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
733 | "requires": {
734 | "to-regex-range": "^5.0.1"
735 | }
736 | },
737 | "finalhandler": {
738 | "version": "1.1.2",
739 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
740 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
741 | "requires": {
742 | "debug": "2.6.9",
743 | "encodeurl": "~1.0.2",
744 | "escape-html": "~1.0.3",
745 | "on-finished": "~2.3.0",
746 | "parseurl": "~1.3.3",
747 | "statuses": "~1.5.0",
748 | "unpipe": "~1.0.0"
749 | },
750 | "dependencies": {
751 | "debug": {
752 | "version": "2.6.9",
753 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
754 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
755 | "requires": {
756 | "ms": "2.0.0"
757 | }
758 | },
759 | "ms": {
760 | "version": "2.0.0",
761 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
762 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
763 | }
764 | }
765 | },
766 | "follow-redirects": {
767 | "version": "1.14.2",
768 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.2.tgz",
769 | "integrity": "sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA=="
770 | },
771 | "form-data": {
772 | "version": "4.0.0",
773 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
774 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
775 | "requires": {
776 | "asynckit": "^0.4.0",
777 | "combined-stream": "^1.0.8",
778 | "mime-types": "^2.1.12"
779 | }
780 | },
781 | "forwarded": {
782 | "version": "0.2.0",
783 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
784 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
785 | },
786 | "fresh": {
787 | "version": "0.5.2",
788 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
789 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
790 | },
791 | "fs-minipass": {
792 | "version": "2.1.0",
793 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
794 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
795 | "requires": {
796 | "minipass": "^3.0.0"
797 | }
798 | },
799 | "fs.realpath": {
800 | "version": "1.0.0",
801 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
802 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
803 | },
804 | "fsevents": {
805 | "version": "2.3.2",
806 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
807 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
808 | "optional": true
809 | },
810 | "function-bind": {
811 | "version": "1.1.1",
812 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
813 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
814 | },
815 | "gauge": {
816 | "version": "2.7.4",
817 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
818 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
819 | "requires": {
820 | "aproba": "^1.0.3",
821 | "console-control-strings": "^1.0.0",
822 | "has-unicode": "^2.0.0",
823 | "object-assign": "^4.1.0",
824 | "signal-exit": "^3.0.0",
825 | "string-width": "^1.0.1",
826 | "strip-ansi": "^3.0.1",
827 | "wide-align": "^1.1.0"
828 | }
829 | },
830 | "get-intrinsic": {
831 | "version": "1.1.1",
832 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
833 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
834 | "requires": {
835 | "function-bind": "^1.1.1",
836 | "has": "^1.0.3",
837 | "has-symbols": "^1.0.1"
838 | }
839 | },
840 | "get-stream": {
841 | "version": "4.1.0",
842 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
843 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
844 | "requires": {
845 | "pump": "^3.0.0"
846 | }
847 | },
848 | "getstream": {
849 | "version": "7.2.10",
850 | "resolved": "https://registry.npmjs.org/getstream/-/getstream-7.2.10.tgz",
851 | "integrity": "sha512-cSUBxZ8JiTyfTXwiYl6vwqrg1XTOR0YGA+sYSODtuxGBgAsBZIUWWA9mvWgbmWnzRNboL52+bhwyisvaZhxDAA==",
852 | "requires": {
853 | "@babel/runtime": "^7.13.10",
854 | "@types/jsonwebtoken": "^8.5.0",
855 | "@types/jwt-decode": "^2.2.1",
856 | "@types/qs": "^6.9.6",
857 | "axios": "^0.21.1",
858 | "faye": "^1.4.0",
859 | "form-data": "^4.0.0",
860 | "jsonwebtoken": "^8.5.1",
861 | "jwt-decode": "^3.1.2",
862 | "qs": "^6.9.6"
863 | },
864 | "dependencies": {
865 | "qs": {
866 | "version": "6.10.1",
867 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz",
868 | "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==",
869 | "requires": {
870 | "side-channel": "^1.0.4"
871 | }
872 | }
873 | }
874 | },
875 | "glob": {
876 | "version": "7.1.7",
877 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
878 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
879 | "requires": {
880 | "fs.realpath": "^1.0.0",
881 | "inflight": "^1.0.4",
882 | "inherits": "2",
883 | "minimatch": "^3.0.4",
884 | "once": "^1.3.0",
885 | "path-is-absolute": "^1.0.0"
886 | }
887 | },
888 | "glob-parent": {
889 | "version": "5.1.2",
890 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
891 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
892 | "requires": {
893 | "is-glob": "^4.0.1"
894 | }
895 | },
896 | "global-dirs": {
897 | "version": "2.1.0",
898 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz",
899 | "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==",
900 | "requires": {
901 | "ini": "1.3.7"
902 | }
903 | },
904 | "got": {
905 | "version": "9.6.0",
906 | "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
907 | "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
908 | "requires": {
909 | "@sindresorhus/is": "^0.14.0",
910 | "@szmarczak/http-timer": "^1.1.2",
911 | "cacheable-request": "^6.0.0",
912 | "decompress-response": "^3.3.0",
913 | "duplexer3": "^0.1.4",
914 | "get-stream": "^4.1.0",
915 | "lowercase-keys": "^1.0.1",
916 | "mimic-response": "^1.0.1",
917 | "p-cancelable": "^1.0.0",
918 | "to-readable-stream": "^1.0.0",
919 | "url-parse-lax": "^3.0.0"
920 | }
921 | },
922 | "graceful-fs": {
923 | "version": "4.2.8",
924 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
925 | "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
926 | },
927 | "has": {
928 | "version": "1.0.3",
929 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
930 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
931 | "requires": {
932 | "function-bind": "^1.1.1"
933 | }
934 | },
935 | "has-flag": {
936 | "version": "3.0.0",
937 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
938 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
939 | },
940 | "has-symbols": {
941 | "version": "1.0.2",
942 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
943 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
944 | },
945 | "has-unicode": {
946 | "version": "2.0.1",
947 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
948 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
949 | },
950 | "has-yarn": {
951 | "version": "2.1.0",
952 | "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
953 | "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
954 | },
955 | "http-cache-semantics": {
956 | "version": "4.1.0",
957 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
958 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
959 | },
960 | "http-errors": {
961 | "version": "1.7.2",
962 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
963 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
964 | "requires": {
965 | "depd": "~1.1.2",
966 | "inherits": "2.0.3",
967 | "setprototypeof": "1.1.1",
968 | "statuses": ">= 1.5.0 < 2",
969 | "toidentifier": "1.0.0"
970 | },
971 | "dependencies": {
972 | "inherits": {
973 | "version": "2.0.3",
974 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
975 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
976 | }
977 | }
978 | },
979 | "http-parser-js": {
980 | "version": "0.5.3",
981 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz",
982 | "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg=="
983 | },
984 | "https-proxy-agent": {
985 | "version": "5.0.0",
986 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
987 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
988 | "requires": {
989 | "agent-base": "6",
990 | "debug": "4"
991 | }
992 | },
993 | "iconv-lite": {
994 | "version": "0.4.24",
995 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
996 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
997 | "requires": {
998 | "safer-buffer": ">= 2.1.2 < 3"
999 | }
1000 | },
1001 | "ignore-by-default": {
1002 | "version": "1.0.1",
1003 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
1004 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk="
1005 | },
1006 | "import-lazy": {
1007 | "version": "2.1.0",
1008 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
1009 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
1010 | },
1011 | "imurmurhash": {
1012 | "version": "0.1.4",
1013 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1014 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
1015 | },
1016 | "inflight": {
1017 | "version": "1.0.6",
1018 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1019 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1020 | "requires": {
1021 | "once": "^1.3.0",
1022 | "wrappy": "1"
1023 | }
1024 | },
1025 | "inherits": {
1026 | "version": "2.0.4",
1027 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1028 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1029 | },
1030 | "ini": {
1031 | "version": "1.3.7",
1032 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
1033 | "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ=="
1034 | },
1035 | "ipaddr.js": {
1036 | "version": "1.9.1",
1037 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1038 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1039 | },
1040 | "is-binary-path": {
1041 | "version": "2.1.0",
1042 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1043 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1044 | "requires": {
1045 | "binary-extensions": "^2.0.0"
1046 | }
1047 | },
1048 | "is-ci": {
1049 | "version": "2.0.0",
1050 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
1051 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
1052 | "requires": {
1053 | "ci-info": "^2.0.0"
1054 | }
1055 | },
1056 | "is-extglob": {
1057 | "version": "2.1.1",
1058 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1059 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
1060 | },
1061 | "is-fullwidth-code-point": {
1062 | "version": "1.0.0",
1063 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
1064 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
1065 | "requires": {
1066 | "number-is-nan": "^1.0.0"
1067 | }
1068 | },
1069 | "is-glob": {
1070 | "version": "4.0.1",
1071 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
1072 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
1073 | "requires": {
1074 | "is-extglob": "^2.1.1"
1075 | }
1076 | },
1077 | "is-installed-globally": {
1078 | "version": "0.3.2",
1079 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
1080 | "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
1081 | "requires": {
1082 | "global-dirs": "^2.0.1",
1083 | "is-path-inside": "^3.0.1"
1084 | }
1085 | },
1086 | "is-npm": {
1087 | "version": "4.0.0",
1088 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
1089 | "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig=="
1090 | },
1091 | "is-number": {
1092 | "version": "7.0.0",
1093 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1094 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
1095 | },
1096 | "is-obj": {
1097 | "version": "2.0.0",
1098 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
1099 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
1100 | },
1101 | "is-path-inside": {
1102 | "version": "3.0.3",
1103 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
1104 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="
1105 | },
1106 | "is-typedarray": {
1107 | "version": "1.0.0",
1108 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1109 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
1110 | },
1111 | "is-yarn-global": {
1112 | "version": "0.3.0",
1113 | "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
1114 | "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="
1115 | },
1116 | "isarray": {
1117 | "version": "1.0.0",
1118 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1119 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
1120 | },
1121 | "isomorphic-ws": {
1122 | "version": "4.0.1",
1123 | "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
1124 | "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="
1125 | },
1126 | "json-buffer": {
1127 | "version": "3.0.0",
1128 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
1129 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
1130 | },
1131 | "jsonwebtoken": {
1132 | "version": "8.5.1",
1133 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
1134 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
1135 | "requires": {
1136 | "jws": "^3.2.2",
1137 | "lodash.includes": "^4.3.0",
1138 | "lodash.isboolean": "^3.0.3",
1139 | "lodash.isinteger": "^4.0.4",
1140 | "lodash.isnumber": "^3.0.3",
1141 | "lodash.isplainobject": "^4.0.6",
1142 | "lodash.isstring": "^4.0.1",
1143 | "lodash.once": "^4.0.0",
1144 | "ms": "^2.1.1",
1145 | "semver": "^5.6.0"
1146 | },
1147 | "dependencies": {
1148 | "semver": {
1149 | "version": "5.7.1",
1150 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1151 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
1152 | }
1153 | }
1154 | },
1155 | "jwa": {
1156 | "version": "1.4.1",
1157 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
1158 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
1159 | "requires": {
1160 | "buffer-equal-constant-time": "1.0.1",
1161 | "ecdsa-sig-formatter": "1.0.11",
1162 | "safe-buffer": "^5.0.1"
1163 | }
1164 | },
1165 | "jws": {
1166 | "version": "3.2.2",
1167 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
1168 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
1169 | "requires": {
1170 | "jwa": "^1.4.1",
1171 | "safe-buffer": "^5.0.1"
1172 | }
1173 | },
1174 | "jwt-decode": {
1175 | "version": "3.1.2",
1176 | "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
1177 | "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
1178 | },
1179 | "keyv": {
1180 | "version": "3.1.0",
1181 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
1182 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
1183 | "requires": {
1184 | "json-buffer": "3.0.0"
1185 | }
1186 | },
1187 | "latest-version": {
1188 | "version": "5.1.0",
1189 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
1190 | "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
1191 | "requires": {
1192 | "package-json": "^6.3.0"
1193 | }
1194 | },
1195 | "lodash": {
1196 | "version": "4.17.21",
1197 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
1198 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
1199 | },
1200 | "lodash.includes": {
1201 | "version": "4.3.0",
1202 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
1203 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
1204 | },
1205 | "lodash.isboolean": {
1206 | "version": "3.0.3",
1207 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
1208 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
1209 | },
1210 | "lodash.isinteger": {
1211 | "version": "4.0.4",
1212 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
1213 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
1214 | },
1215 | "lodash.isnumber": {
1216 | "version": "3.0.3",
1217 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
1218 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
1219 | },
1220 | "lodash.isplainobject": {
1221 | "version": "4.0.6",
1222 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
1223 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
1224 | },
1225 | "lodash.isstring": {
1226 | "version": "4.0.1",
1227 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
1228 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
1229 | },
1230 | "lodash.once": {
1231 | "version": "4.1.1",
1232 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
1233 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
1234 | },
1235 | "lowercase-keys": {
1236 | "version": "1.0.1",
1237 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
1238 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
1239 | },
1240 | "lru-cache": {
1241 | "version": "6.0.0",
1242 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
1243 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
1244 | "requires": {
1245 | "yallist": "^4.0.0"
1246 | }
1247 | },
1248 | "make-dir": {
1249 | "version": "3.1.0",
1250 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
1251 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
1252 | "requires": {
1253 | "semver": "^6.0.0"
1254 | },
1255 | "dependencies": {
1256 | "semver": {
1257 | "version": "6.3.0",
1258 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1259 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
1260 | }
1261 | }
1262 | },
1263 | "media-typer": {
1264 | "version": "0.3.0",
1265 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1266 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
1267 | },
1268 | "merge-descriptors": {
1269 | "version": "1.0.1",
1270 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1271 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
1272 | },
1273 | "methods": {
1274 | "version": "1.1.2",
1275 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1276 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
1277 | },
1278 | "mime": {
1279 | "version": "1.6.0",
1280 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1281 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1282 | },
1283 | "mime-db": {
1284 | "version": "1.49.0",
1285 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz",
1286 | "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA=="
1287 | },
1288 | "mime-types": {
1289 | "version": "2.1.32",
1290 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz",
1291 | "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==",
1292 | "requires": {
1293 | "mime-db": "1.49.0"
1294 | }
1295 | },
1296 | "mimic-response": {
1297 | "version": "1.0.1",
1298 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
1299 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
1300 | },
1301 | "minimatch": {
1302 | "version": "3.0.4",
1303 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1304 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1305 | "requires": {
1306 | "brace-expansion": "^1.1.7"
1307 | }
1308 | },
1309 | "minimist": {
1310 | "version": "1.2.5",
1311 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1312 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
1313 | },
1314 | "minipass": {
1315 | "version": "3.1.3",
1316 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
1317 | "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
1318 | "requires": {
1319 | "yallist": "^4.0.0"
1320 | }
1321 | },
1322 | "minizlib": {
1323 | "version": "2.1.2",
1324 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
1325 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
1326 | "requires": {
1327 | "minipass": "^3.0.0",
1328 | "yallist": "^4.0.0"
1329 | }
1330 | },
1331 | "mkdirp": {
1332 | "version": "1.0.4",
1333 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
1334 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
1335 | },
1336 | "ms": {
1337 | "version": "2.1.2",
1338 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1339 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1340 | },
1341 | "negotiator": {
1342 | "version": "0.6.2",
1343 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
1344 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
1345 | },
1346 | "node-addon-api": {
1347 | "version": "3.2.1",
1348 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
1349 | "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="
1350 | },
1351 | "node-fetch": {
1352 | "version": "2.6.1",
1353 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
1354 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
1355 | },
1356 | "nodemon": {
1357 | "version": "2.0.12",
1358 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz",
1359 | "integrity": "sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==",
1360 | "requires": {
1361 | "chokidar": "^3.2.2",
1362 | "debug": "^3.2.6",
1363 | "ignore-by-default": "^1.0.1",
1364 | "minimatch": "^3.0.4",
1365 | "pstree.remy": "^1.1.7",
1366 | "semver": "^5.7.1",
1367 | "supports-color": "^5.5.0",
1368 | "touch": "^3.1.0",
1369 | "undefsafe": "^2.0.3",
1370 | "update-notifier": "^4.1.0"
1371 | },
1372 | "dependencies": {
1373 | "debug": {
1374 | "version": "3.2.7",
1375 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
1376 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
1377 | "requires": {
1378 | "ms": "^2.1.1"
1379 | }
1380 | },
1381 | "semver": {
1382 | "version": "5.7.1",
1383 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1384 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
1385 | }
1386 | }
1387 | },
1388 | "nopt": {
1389 | "version": "5.0.0",
1390 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
1391 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
1392 | "requires": {
1393 | "abbrev": "1"
1394 | }
1395 | },
1396 | "normalize-path": {
1397 | "version": "3.0.0",
1398 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1399 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
1400 | },
1401 | "normalize-url": {
1402 | "version": "4.5.1",
1403 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
1404 | "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA=="
1405 | },
1406 | "npmlog": {
1407 | "version": "4.1.2",
1408 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
1409 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
1410 | "requires": {
1411 | "are-we-there-yet": "~1.1.2",
1412 | "console-control-strings": "~1.1.0",
1413 | "gauge": "~2.7.3",
1414 | "set-blocking": "~2.0.0"
1415 | }
1416 | },
1417 | "number-is-nan": {
1418 | "version": "1.0.1",
1419 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1420 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
1421 | },
1422 | "object-assign": {
1423 | "version": "4.1.1",
1424 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1425 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1426 | },
1427 | "object-inspect": {
1428 | "version": "1.11.0",
1429 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
1430 | "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
1431 | },
1432 | "on-finished": {
1433 | "version": "2.3.0",
1434 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1435 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1436 | "requires": {
1437 | "ee-first": "1.1.1"
1438 | }
1439 | },
1440 | "once": {
1441 | "version": "1.4.0",
1442 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1443 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1444 | "requires": {
1445 | "wrappy": "1"
1446 | }
1447 | },
1448 | "p-cancelable": {
1449 | "version": "1.1.0",
1450 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
1451 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
1452 | },
1453 | "package-json": {
1454 | "version": "6.5.0",
1455 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
1456 | "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
1457 | "requires": {
1458 | "got": "^9.6.0",
1459 | "registry-auth-token": "^4.0.0",
1460 | "registry-url": "^5.0.0",
1461 | "semver": "^6.2.0"
1462 | },
1463 | "dependencies": {
1464 | "semver": {
1465 | "version": "6.3.0",
1466 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1467 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
1468 | }
1469 | }
1470 | },
1471 | "parseurl": {
1472 | "version": "1.3.3",
1473 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1474 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1475 | },
1476 | "path-is-absolute": {
1477 | "version": "1.0.1",
1478 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1479 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
1480 | },
1481 | "path-to-regexp": {
1482 | "version": "0.1.7",
1483 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1484 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1485 | },
1486 | "picomatch": {
1487 | "version": "2.3.0",
1488 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
1489 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw=="
1490 | },
1491 | "pop-iterate": {
1492 | "version": "1.0.1",
1493 | "resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz",
1494 | "integrity": "sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M="
1495 | },
1496 | "prepend-http": {
1497 | "version": "2.0.0",
1498 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
1499 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
1500 | },
1501 | "process-nextick-args": {
1502 | "version": "2.0.1",
1503 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1504 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
1505 | },
1506 | "proxy-addr": {
1507 | "version": "2.0.7",
1508 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1509 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1510 | "requires": {
1511 | "forwarded": "0.2.0",
1512 | "ipaddr.js": "1.9.1"
1513 | }
1514 | },
1515 | "psl": {
1516 | "version": "1.8.0",
1517 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
1518 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
1519 | },
1520 | "pstree.remy": {
1521 | "version": "1.1.8",
1522 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1523 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
1524 | },
1525 | "pump": {
1526 | "version": "3.0.0",
1527 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1528 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1529 | "requires": {
1530 | "end-of-stream": "^1.1.0",
1531 | "once": "^1.3.1"
1532 | }
1533 | },
1534 | "punycode": {
1535 | "version": "2.1.1",
1536 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1537 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
1538 | },
1539 | "pupa": {
1540 | "version": "2.1.1",
1541 | "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
1542 | "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
1543 | "requires": {
1544 | "escape-goat": "^2.0.0"
1545 | }
1546 | },
1547 | "q": {
1548 | "version": "2.0.3",
1549 | "resolved": "https://registry.npmjs.org/q/-/q-2.0.3.tgz",
1550 | "integrity": "sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ=",
1551 | "requires": {
1552 | "asap": "^2.0.0",
1553 | "pop-iterate": "^1.0.1",
1554 | "weak-map": "^1.0.5"
1555 | }
1556 | },
1557 | "qs": {
1558 | "version": "6.7.0",
1559 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
1560 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
1561 | },
1562 | "querystringify": {
1563 | "version": "2.2.0",
1564 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
1565 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
1566 | },
1567 | "range-parser": {
1568 | "version": "1.2.1",
1569 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1570 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1571 | },
1572 | "raw-body": {
1573 | "version": "2.4.0",
1574 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
1575 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
1576 | "requires": {
1577 | "bytes": "3.1.0",
1578 | "http-errors": "1.7.2",
1579 | "iconv-lite": "0.4.24",
1580 | "unpipe": "1.0.0"
1581 | }
1582 | },
1583 | "rc": {
1584 | "version": "1.2.8",
1585 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
1586 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
1587 | "requires": {
1588 | "deep-extend": "^0.6.0",
1589 | "ini": "~1.3.0",
1590 | "minimist": "^1.2.0",
1591 | "strip-json-comments": "~2.0.1"
1592 | }
1593 | },
1594 | "readable-stream": {
1595 | "version": "2.3.7",
1596 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1597 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1598 | "requires": {
1599 | "core-util-is": "~1.0.0",
1600 | "inherits": "~2.0.3",
1601 | "isarray": "~1.0.0",
1602 | "process-nextick-args": "~2.0.0",
1603 | "safe-buffer": "~5.1.1",
1604 | "string_decoder": "~1.1.1",
1605 | "util-deprecate": "~1.0.1"
1606 | }
1607 | },
1608 | "readdirp": {
1609 | "version": "3.6.0",
1610 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1611 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1612 | "requires": {
1613 | "picomatch": "^2.2.1"
1614 | }
1615 | },
1616 | "regenerator-runtime": {
1617 | "version": "0.13.9",
1618 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
1619 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
1620 | },
1621 | "registry-auth-token": {
1622 | "version": "4.2.1",
1623 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
1624 | "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
1625 | "requires": {
1626 | "rc": "^1.2.8"
1627 | }
1628 | },
1629 | "registry-url": {
1630 | "version": "5.1.0",
1631 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
1632 | "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
1633 | "requires": {
1634 | "rc": "^1.2.8"
1635 | }
1636 | },
1637 | "requires-port": {
1638 | "version": "1.0.0",
1639 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
1640 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
1641 | },
1642 | "responselike": {
1643 | "version": "1.0.2",
1644 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
1645 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
1646 | "requires": {
1647 | "lowercase-keys": "^1.0.0"
1648 | }
1649 | },
1650 | "rimraf": {
1651 | "version": "3.0.2",
1652 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
1653 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
1654 | "requires": {
1655 | "glob": "^7.1.3"
1656 | }
1657 | },
1658 | "rootpath": {
1659 | "version": "0.1.2",
1660 | "resolved": "https://registry.npmjs.org/rootpath/-/rootpath-0.1.2.tgz",
1661 | "integrity": "sha1-Wzeah9ypBum5HWkKWZQ5vvJn6ms="
1662 | },
1663 | "safe-buffer": {
1664 | "version": "5.1.2",
1665 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1666 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1667 | },
1668 | "safer-buffer": {
1669 | "version": "2.1.2",
1670 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1671 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1672 | },
1673 | "scmp": {
1674 | "version": "2.1.0",
1675 | "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz",
1676 | "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q=="
1677 | },
1678 | "semver": {
1679 | "version": "7.3.5",
1680 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
1681 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
1682 | "requires": {
1683 | "lru-cache": "^6.0.0"
1684 | }
1685 | },
1686 | "semver-diff": {
1687 | "version": "3.1.1",
1688 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
1689 | "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
1690 | "requires": {
1691 | "semver": "^6.3.0"
1692 | },
1693 | "dependencies": {
1694 | "semver": {
1695 | "version": "6.3.0",
1696 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1697 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
1698 | }
1699 | }
1700 | },
1701 | "send": {
1702 | "version": "0.17.1",
1703 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
1704 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
1705 | "requires": {
1706 | "debug": "2.6.9",
1707 | "depd": "~1.1.2",
1708 | "destroy": "~1.0.4",
1709 | "encodeurl": "~1.0.2",
1710 | "escape-html": "~1.0.3",
1711 | "etag": "~1.8.1",
1712 | "fresh": "0.5.2",
1713 | "http-errors": "~1.7.2",
1714 | "mime": "1.6.0",
1715 | "ms": "2.1.1",
1716 | "on-finished": "~2.3.0",
1717 | "range-parser": "~1.2.1",
1718 | "statuses": "~1.5.0"
1719 | },
1720 | "dependencies": {
1721 | "debug": {
1722 | "version": "2.6.9",
1723 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1724 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1725 | "requires": {
1726 | "ms": "2.0.0"
1727 | },
1728 | "dependencies": {
1729 | "ms": {
1730 | "version": "2.0.0",
1731 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1732 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1733 | }
1734 | }
1735 | },
1736 | "ms": {
1737 | "version": "2.1.1",
1738 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1739 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1740 | }
1741 | }
1742 | },
1743 | "sequin": {
1744 | "version": "0.1.1",
1745 | "resolved": "https://registry.npmjs.org/sequin/-/sequin-0.1.1.tgz",
1746 | "integrity": "sha1-XC04nWajg3NOqvvEXt6ywcsb5wE="
1747 | },
1748 | "serve-static": {
1749 | "version": "1.14.1",
1750 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
1751 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
1752 | "requires": {
1753 | "encodeurl": "~1.0.2",
1754 | "escape-html": "~1.0.3",
1755 | "parseurl": "~1.3.3",
1756 | "send": "0.17.1"
1757 | }
1758 | },
1759 | "set-blocking": {
1760 | "version": "2.0.0",
1761 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1762 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
1763 | },
1764 | "setprototypeof": {
1765 | "version": "1.1.1",
1766 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1767 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
1768 | },
1769 | "side-channel": {
1770 | "version": "1.0.4",
1771 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1772 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1773 | "requires": {
1774 | "call-bind": "^1.0.0",
1775 | "get-intrinsic": "^1.0.2",
1776 | "object-inspect": "^1.9.0"
1777 | }
1778 | },
1779 | "signal-exit": {
1780 | "version": "3.0.3",
1781 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
1782 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
1783 | },
1784 | "statuses": {
1785 | "version": "1.5.0",
1786 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1787 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
1788 | },
1789 | "stream-chat": {
1790 | "version": "4.1.0",
1791 | "resolved": "https://registry.npmjs.org/stream-chat/-/stream-chat-4.1.0.tgz",
1792 | "integrity": "sha512-zvl/4e8kJTOEi3BJjTTnxwEVh4Rv8tQtZqf0J4L1pZPsWjkzQ/QP39gEAqVfulhXrDWzGe4xVfaiJBmMGRGHlw==",
1793 | "requires": {
1794 | "@babel/runtime": "^7.13.10",
1795 | "@types/jsonwebtoken": "^8.5.0",
1796 | "@types/ws": "^7.4.0",
1797 | "axios": "^0.21.1",
1798 | "base64-js": "^1.5.1",
1799 | "form-data": "^4.0.0",
1800 | "isomorphic-ws": "^4.0.1",
1801 | "jsonwebtoken": "^8.5.1",
1802 | "ws": "^7.4.4"
1803 | }
1804 | },
1805 | "string-width": {
1806 | "version": "1.0.2",
1807 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
1808 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
1809 | "requires": {
1810 | "code-point-at": "^1.0.0",
1811 | "is-fullwidth-code-point": "^1.0.0",
1812 | "strip-ansi": "^3.0.0"
1813 | }
1814 | },
1815 | "string_decoder": {
1816 | "version": "1.1.1",
1817 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1818 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1819 | "requires": {
1820 | "safe-buffer": "~5.1.0"
1821 | }
1822 | },
1823 | "strip-ansi": {
1824 | "version": "3.0.1",
1825 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1826 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1827 | "requires": {
1828 | "ansi-regex": "^2.0.0"
1829 | }
1830 | },
1831 | "strip-json-comments": {
1832 | "version": "2.0.1",
1833 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1834 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
1835 | },
1836 | "supports-color": {
1837 | "version": "5.5.0",
1838 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1839 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1840 | "requires": {
1841 | "has-flag": "^3.0.0"
1842 | }
1843 | },
1844 | "tar": {
1845 | "version": "6.1.10",
1846 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.10.tgz",
1847 | "integrity": "sha512-kvvfiVvjGMxeUNB6MyYv5z7vhfFRwbwCXJAeL0/lnbrttBVqcMOnpHUf0X42LrPMR8mMpgapkJMchFH4FSHzNA==",
1848 | "requires": {
1849 | "chownr": "^2.0.0",
1850 | "fs-minipass": "^2.0.0",
1851 | "minipass": "^3.0.0",
1852 | "minizlib": "^2.1.1",
1853 | "mkdirp": "^1.0.3",
1854 | "yallist": "^4.0.0"
1855 | }
1856 | },
1857 | "term-size": {
1858 | "version": "2.2.1",
1859 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
1860 | "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="
1861 | },
1862 | "to-readable-stream": {
1863 | "version": "1.0.0",
1864 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
1865 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
1866 | },
1867 | "to-regex-range": {
1868 | "version": "5.0.1",
1869 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1870 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1871 | "requires": {
1872 | "is-number": "^7.0.0"
1873 | }
1874 | },
1875 | "toidentifier": {
1876 | "version": "1.0.0",
1877 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
1878 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
1879 | },
1880 | "touch": {
1881 | "version": "3.1.0",
1882 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1883 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1884 | "requires": {
1885 | "nopt": "~1.0.10"
1886 | },
1887 | "dependencies": {
1888 | "nopt": {
1889 | "version": "1.0.10",
1890 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1891 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
1892 | "requires": {
1893 | "abbrev": "1"
1894 | }
1895 | }
1896 | }
1897 | },
1898 | "tough-cookie": {
1899 | "version": "4.0.0",
1900 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
1901 | "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
1902 | "requires": {
1903 | "psl": "^1.1.33",
1904 | "punycode": "^2.1.1",
1905 | "universalify": "^0.1.2"
1906 | }
1907 | },
1908 | "tunnel-agent": {
1909 | "version": "0.6.0",
1910 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1911 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1912 | "requires": {
1913 | "safe-buffer": "^5.0.1"
1914 | }
1915 | },
1916 | "twilio": {
1917 | "version": "3.67.1",
1918 | "resolved": "https://registry.npmjs.org/twilio/-/twilio-3.67.1.tgz",
1919 | "integrity": "sha512-JpdPLqPyYpMyrW39ByUbHimqeHpcWuMv7DD1R215C5wf8dS9EzYfAHqFvrZCEOZkdpB3QeR0UZfvh96jb8FB7Q==",
1920 | "requires": {
1921 | "axios": "^0.21.1",
1922 | "dayjs": "^1.8.29",
1923 | "https-proxy-agent": "^5.0.0",
1924 | "jsonwebtoken": "^8.5.1",
1925 | "lodash": "^4.17.21",
1926 | "q": "2.0.x",
1927 | "qs": "^6.9.4",
1928 | "rootpath": "^0.1.2",
1929 | "scmp": "^2.1.0",
1930 | "url-parse": "^1.5.3",
1931 | "xmlbuilder": "^13.0.2"
1932 | },
1933 | "dependencies": {
1934 | "qs": {
1935 | "version": "6.10.1",
1936 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz",
1937 | "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==",
1938 | "requires": {
1939 | "side-channel": "^1.0.4"
1940 | }
1941 | }
1942 | }
1943 | },
1944 | "type-fest": {
1945 | "version": "0.8.1",
1946 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
1947 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
1948 | },
1949 | "type-is": {
1950 | "version": "1.6.18",
1951 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1952 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1953 | "requires": {
1954 | "media-typer": "0.3.0",
1955 | "mime-types": "~2.1.24"
1956 | }
1957 | },
1958 | "typedarray-to-buffer": {
1959 | "version": "3.1.5",
1960 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
1961 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
1962 | "requires": {
1963 | "is-typedarray": "^1.0.0"
1964 | }
1965 | },
1966 | "undefsafe": {
1967 | "version": "2.0.3",
1968 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
1969 | "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
1970 | "requires": {
1971 | "debug": "^2.2.0"
1972 | },
1973 | "dependencies": {
1974 | "debug": {
1975 | "version": "2.6.9",
1976 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1977 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1978 | "requires": {
1979 | "ms": "2.0.0"
1980 | }
1981 | },
1982 | "ms": {
1983 | "version": "2.0.0",
1984 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1985 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1986 | }
1987 | }
1988 | },
1989 | "unique-string": {
1990 | "version": "2.0.0",
1991 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
1992 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
1993 | "requires": {
1994 | "crypto-random-string": "^2.0.0"
1995 | }
1996 | },
1997 | "universalify": {
1998 | "version": "0.1.2",
1999 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
2000 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
2001 | },
2002 | "unpipe": {
2003 | "version": "1.0.0",
2004 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
2005 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
2006 | },
2007 | "update-notifier": {
2008 | "version": "4.1.3",
2009 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
2010 | "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
2011 | "requires": {
2012 | "boxen": "^4.2.0",
2013 | "chalk": "^3.0.0",
2014 | "configstore": "^5.0.1",
2015 | "has-yarn": "^2.1.0",
2016 | "import-lazy": "^2.1.0",
2017 | "is-ci": "^2.0.0",
2018 | "is-installed-globally": "^0.3.1",
2019 | "is-npm": "^4.0.0",
2020 | "is-yarn-global": "^0.3.0",
2021 | "latest-version": "^5.0.0",
2022 | "pupa": "^2.0.1",
2023 | "semver-diff": "^3.1.1",
2024 | "xdg-basedir": "^4.0.0"
2025 | }
2026 | },
2027 | "url-parse": {
2028 | "version": "1.5.3",
2029 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz",
2030 | "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==",
2031 | "requires": {
2032 | "querystringify": "^2.1.1",
2033 | "requires-port": "^1.0.0"
2034 | }
2035 | },
2036 | "url-parse-lax": {
2037 | "version": "3.0.0",
2038 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
2039 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
2040 | "requires": {
2041 | "prepend-http": "^2.0.0"
2042 | }
2043 | },
2044 | "util-deprecate": {
2045 | "version": "1.0.2",
2046 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2047 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
2048 | },
2049 | "utils-merge": {
2050 | "version": "1.0.1",
2051 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
2052 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
2053 | },
2054 | "vary": {
2055 | "version": "1.1.2",
2056 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
2057 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
2058 | },
2059 | "weak-map": {
2060 | "version": "1.0.5",
2061 | "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz",
2062 | "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes="
2063 | },
2064 | "websocket-driver": {
2065 | "version": "0.7.4",
2066 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
2067 | "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
2068 | "requires": {
2069 | "http-parser-js": ">=0.5.1",
2070 | "safe-buffer": ">=5.1.0",
2071 | "websocket-extensions": ">=0.1.1"
2072 | }
2073 | },
2074 | "websocket-extensions": {
2075 | "version": "0.1.4",
2076 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
2077 | "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="
2078 | },
2079 | "wide-align": {
2080 | "version": "1.1.3",
2081 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
2082 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
2083 | "requires": {
2084 | "string-width": "^1.0.2 || 2"
2085 | }
2086 | },
2087 | "widest-line": {
2088 | "version": "3.1.0",
2089 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
2090 | "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
2091 | "requires": {
2092 | "string-width": "^4.0.0"
2093 | },
2094 | "dependencies": {
2095 | "ansi-regex": {
2096 | "version": "5.0.0",
2097 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
2098 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
2099 | },
2100 | "emoji-regex": {
2101 | "version": "8.0.0",
2102 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2103 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
2104 | },
2105 | "is-fullwidth-code-point": {
2106 | "version": "3.0.0",
2107 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
2108 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
2109 | },
2110 | "string-width": {
2111 | "version": "4.2.2",
2112 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
2113 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
2114 | "requires": {
2115 | "emoji-regex": "^8.0.0",
2116 | "is-fullwidth-code-point": "^3.0.0",
2117 | "strip-ansi": "^6.0.0"
2118 | }
2119 | },
2120 | "strip-ansi": {
2121 | "version": "6.0.0",
2122 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
2123 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
2124 | "requires": {
2125 | "ansi-regex": "^5.0.0"
2126 | }
2127 | }
2128 | }
2129 | },
2130 | "wrappy": {
2131 | "version": "1.0.2",
2132 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2133 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
2134 | },
2135 | "write-file-atomic": {
2136 | "version": "3.0.3",
2137 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
2138 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
2139 | "requires": {
2140 | "imurmurhash": "^0.1.4",
2141 | "is-typedarray": "^1.0.0",
2142 | "signal-exit": "^3.0.2",
2143 | "typedarray-to-buffer": "^3.1.5"
2144 | }
2145 | },
2146 | "ws": {
2147 | "version": "7.5.3",
2148 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz",
2149 | "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg=="
2150 | },
2151 | "xdg-basedir": {
2152 | "version": "4.0.0",
2153 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
2154 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="
2155 | },
2156 | "xmlbuilder": {
2157 | "version": "13.0.2",
2158 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz",
2159 | "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ=="
2160 | },
2161 | "yallist": {
2162 | "version": "4.0.0",
2163 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
2164 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
2165 | }
2166 | }
2167 | }
2168 |
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "node index.js",
8 | "dev": "nodemon index.js"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "dependencies": {
14 | "bcrypt": "^5.0.1",
15 | "cors": "^2.8.5",
16 | "crypto": "^1.0.1",
17 | "dotenv": "^10.0.0",
18 | "express": "^4.17.1",
19 | "getstream": "^7.2.10",
20 | "nodemon": "^2.0.12",
21 | "stream-chat": "^4.1.0",
22 | "twilio": "^3.67.1"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/server/routes/auth.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 |
3 | const { signup, login } = require('../controllers/auth.js');
4 |
5 | const router = express.Router();
6 |
7 | router.post('/signup', signup);
8 | router.post('/login', login);
9 |
10 | module.exports = router;
--------------------------------------------------------------------------------