From e6f95642482a1b7743638b1740970b353b908218 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 5 Jul 2022 14:00:56 -0700 Subject: [PATCH 01/65] Unifying courses header into one single layout --- frontend/src/App.tsx | 3 +- .../components/Difficulty/DifficultyIndex.tsx | 56 +++++++++---------- frontend/src/components/Hub/HubIndex.tsx | 38 +++++-------- .../src/components/Layouts/CourseLayout.tsx | 17 ++++++ 4 files changed, 60 insertions(+), 54 deletions(-) create mode 100644 frontend/src/components/Layouts/CourseLayout.tsx diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index a0a9774..373ebae 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -3,6 +3,7 @@ import { BrowserRouter, Route, Routes } from "react-router-dom"; import DifficultyIndex from "./components/Difficulty/DifficultyIndex"; import Home from "./components/Home"; import HubIndex from "./components/Hub/HubIndex"; +import CourseLayout from "./components/Layouts/CourseLayout"; import Navbar from "./components/Navbar"; function App() { @@ -12,7 +13,7 @@ function App() { Not found} /> } /> - + }> } /> } /> diff --git a/frontend/src/components/Difficulty/DifficultyIndex.tsx b/frontend/src/components/Difficulty/DifficultyIndex.tsx index 4f5d35f..b0fd7d7 100644 --- a/frontend/src/components/Difficulty/DifficultyIndex.tsx +++ b/frontend/src/components/Difficulty/DifficultyIndex.tsx @@ -1,39 +1,35 @@ -import { Container, Box, Heading } from "@chakra-ui/react"; +import { Box, Heading } from "@chakra-ui/react"; import React from "react"; -import Banner from "../Hub/Banner"; import DifficultyCard from "./DifficultyCard"; const DifficultyIndex = () => { return ( <> - - - - React - - - - - - - + + React + + + + + + ); }; diff --git a/frontend/src/components/Hub/HubIndex.tsx b/frontend/src/components/Hub/HubIndex.tsx index 1e8d947..538875d 100644 --- a/frontend/src/components/Hub/HubIndex.tsx +++ b/frontend/src/components/Hub/HubIndex.tsx @@ -1,5 +1,4 @@ import { - Container, Box, Heading, Badge, @@ -7,34 +6,27 @@ import { CircularProgressLabel, } from "@chakra-ui/react"; import React from "react"; -import Banner from "./Banner"; import ResourceGroup from "./ResourceGroup"; const HubIndex = () => { return ( <> - - - - - - React - - Beginner - - - 30% - + + + + React + + Beginner - - - - - - + + 30% + + + + + + + ); }; diff --git a/frontend/src/components/Layouts/CourseLayout.tsx b/frontend/src/components/Layouts/CourseLayout.tsx new file mode 100644 index 0000000..3225ad3 --- /dev/null +++ b/frontend/src/components/Layouts/CourseLayout.tsx @@ -0,0 +1,17 @@ +import { Container, Heading } from "@chakra-ui/react"; +import React from "react"; +import { Outlet } from "react-router-dom"; +import Banner from "../Hub/Banner"; + +const CourseLayout = () => { + return ( + <> + + + + + + ); +}; + +export default CourseLayout; From 90462e0c3583b5c36609d3733dcd795c36956768 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 5 Jul 2022 14:08:32 -0700 Subject: [PATCH 02/65] Adding register route --- frontend/src/App.tsx | 2 ++ frontend/src/components/Registration/RegisterIndex.tsx | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 frontend/src/components/Registration/RegisterIndex.tsx diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index b9e9aef..c2e7300 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -3,6 +3,7 @@ import React from "react"; import { BrowserRouter, Route, Routes } from "react-router-dom"; import Home from "./components/Home"; import Navbar from "./components/Navbar"; +import RegisterIndex from "./components/Registration/RegisterIndex"; function App() { return ( @@ -10,6 +11,7 @@ function App() { } /> + } /> ); diff --git a/frontend/src/components/Registration/RegisterIndex.tsx b/frontend/src/components/Registration/RegisterIndex.tsx new file mode 100644 index 0000000..8daaf48 --- /dev/null +++ b/frontend/src/components/Registration/RegisterIndex.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +const RegisterIndex = () => { + return
RegisterIndex
; +}; + +export default RegisterIndex; From 6ce44f69c0c1c00c6d657d9b8492c225328e1455 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 5 Jul 2022 14:17:17 -0700 Subject: [PATCH 03/65] Adding registration form --- .../components/Registration/RegisterIndex.tsx | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/Registration/RegisterIndex.tsx b/frontend/src/components/Registration/RegisterIndex.tsx index 8daaf48..4a6a6b9 100644 --- a/frontend/src/components/Registration/RegisterIndex.tsx +++ b/frontend/src/components/Registration/RegisterIndex.tsx @@ -1,7 +1,48 @@ +import { + Box, + Button, + Center, + Flex, + FormControl, + FormLabel, + Heading, + Input, +} from "@chakra-ui/react"; import React from "react"; +import useThemeColor from "../../hooks/useThemeColor"; const RegisterIndex = () => { - return
RegisterIndex
; + const { backgroundColor, borderColor } = useThemeColor(); + return ( +
+ + + Join Learning U! + + Username or email + + + + Password + + + + + + + + +
+ ); }; export default RegisterIndex; From 6f67536626c385212eb6b622f837b6d5137b793e Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 5 Jul 2022 14:27:28 -0700 Subject: [PATCH 04/65] Adding email field and responsiveness to Register Component --- frontend/src/components/Registration/RegisterIndex.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/Registration/RegisterIndex.tsx b/frontend/src/components/Registration/RegisterIndex.tsx index 4a6a6b9..9d1c22c 100644 --- a/frontend/src/components/Registration/RegisterIndex.tsx +++ b/frontend/src/components/Registration/RegisterIndex.tsx @@ -19,8 +19,8 @@ const RegisterIndex = () => { backgroundColor={backgroundColor} borderColor={borderColor} borderWidth={1} - h="60%" - w="30%" + h={{ base: "70%", md: "60%" }} + w={{ base: "90%", md: "30%" }} p={10} flexDir="column" justifyContent="space-between" @@ -28,7 +28,11 @@ const RegisterIndex = () => { Join Learning U! - Username or email + Username + + + + Email From 242a039d357f9bf7eaa9e870455caba7ab7ca98e Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 5 Jul 2022 14:34:00 -0700 Subject: [PATCH 05/65] Adding login route --- frontend/src/App.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index c2e7300..7f108af 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -3,6 +3,7 @@ import React from "react"; import { BrowserRouter, Route, Routes } from "react-router-dom"; import Home from "./components/Home"; import Navbar from "./components/Navbar"; +import LoginIndex from "./components/Registration/LoginIndex"; import RegisterIndex from "./components/Registration/RegisterIndex"; function App() { @@ -12,6 +13,7 @@ function App() { } /> } /> + } /> ); From 50afeaac8973b228210ec23b5126279f88975a26 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 5 Jul 2022 14:34:07 -0700 Subject: [PATCH 06/65] Adding login component --- .../components/Registration/LoginIndex.tsx | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 frontend/src/components/Registration/LoginIndex.tsx diff --git a/frontend/src/components/Registration/LoginIndex.tsx b/frontend/src/components/Registration/LoginIndex.tsx new file mode 100644 index 0000000..c551a74 --- /dev/null +++ b/frontend/src/components/Registration/LoginIndex.tsx @@ -0,0 +1,50 @@ +import { + Button, + Center, + Flex, + FormControl, + FormLabel, + Heading, + Input, +} from "@chakra-ui/react"; +import React from "react"; +import useThemeColor from "../../hooks/useThemeColor"; + +const LoginIndex = () => { + const { backgroundColor, borderColor } = useThemeColor(); + return ( +
+ + + Welcome back! + + Username or email + + + + Password + + + + + + + + + +
+ ); +}; + +export default LoginIndex; From 2548f136e266d113e5a1afbfd4bf081414e99f1b Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 5 Jul 2022 14:37:45 -0700 Subject: [PATCH 07/65] Adding link between pages --- frontend/src/components/Registration/LoginIndex.tsx | 5 ++++- frontend/src/components/Registration/RegisterIndex.tsx | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/Registration/LoginIndex.tsx b/frontend/src/components/Registration/LoginIndex.tsx index c551a74..e00d81d 100644 --- a/frontend/src/components/Registration/LoginIndex.tsx +++ b/frontend/src/components/Registration/LoginIndex.tsx @@ -8,6 +8,7 @@ import { Input, } from "@chakra-ui/react"; import React from "react"; +import { Link } from "react-router-dom"; import useThemeColor from "../../hooks/useThemeColor"; const LoginIndex = () => { @@ -38,7 +39,9 @@ const LoginIndex = () => { diff --git a/frontend/src/components/Registration/RegisterIndex.tsx b/frontend/src/components/Registration/RegisterIndex.tsx index 9d1c22c..c3b8176 100644 --- a/frontend/src/components/Registration/RegisterIndex.tsx +++ b/frontend/src/components/Registration/RegisterIndex.tsx @@ -9,6 +9,7 @@ import { Input, } from "@chakra-ui/react"; import React from "react"; +import { Link } from "react-router-dom"; import useThemeColor from "../../hooks/useThemeColor"; const RegisterIndex = () => { @@ -41,7 +42,9 @@ const RegisterIndex = () => {
- + From 06124264fdb10c62183e67337bde3d28585e5a16 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 11:19:05 -0700 Subject: [PATCH 08/65] Chaning ensureWeightsAreCorrect so the recive a parameter --- backend/rating/ranking.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/rating/ranking.ts b/backend/rating/ranking.ts index fa9d3c2..4ab78cc 100644 --- a/backend/rating/ranking.ts +++ b/backend/rating/ranking.ts @@ -23,7 +23,7 @@ const WEIGHTS = { }; export const getExternalRanking = (videos: youtube_v3.Schema$Video[]) => { - if (!ensureWeightsAreCorrect()) { + if (!ensureWeightsAreCorrect(WEIGHTS)) { new ExpressError("Ranking Weights are incorrect", 500); } @@ -168,14 +168,14 @@ const getDaysSincePublished = (publishedAt: string) => { return daysSincePublished; }; -const ensureWeightsAreCorrect = () => { - if (WEIGHTS.w1 + WEIGHTS.w2 !== 100) { +const ensureWeightsAreCorrect = (weights: typeof WEIGHTS) => { + if (weights.w1 + weights.w2 !== 100) { return false; } - if (WEIGHTS.w3 + WEIGHTS.w4 !== 100) { + if (weights.w3 + weights.w4 !== 100) { return false; } - if (WEIGHTS.w4 + WEIGHTS.w6 !== 100) { + if (weights.w4 + weights.w6 !== 100) { new ExpressError("Weights are incorrect", 500); return false; } From a44b6e7035410dc5afb732d78f68b2390a3f7db3 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 11:32:25 -0700 Subject: [PATCH 09/65] exporting functions so they can be used in text --- backend/rating/ranking.ts | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/backend/rating/ranking.ts b/backend/rating/ranking.ts index 4ab78cc..6c4ec43 100644 --- a/backend/rating/ranking.ts +++ b/backend/rating/ranking.ts @@ -36,7 +36,7 @@ export const getExternalRanking = (videos: youtube_v3.Schema$Video[]) => { return getWeightedExternalRanking(normalizedExternalScoreVideos); }; -const getRawExternalRanking = ( +export const getRawExternalRanking = ( videos: youtube_v3.Schema$Video[] ): IRawYoutubeVideo[] => { return videos.map((video) => { @@ -66,7 +66,7 @@ const getRawExternalRanking = ( }); }; -const getNormalizedExternalRanking = ( +export const getNormalizedExternalRanking = ( videos: IRawYoutubeVideo[], maxScores: IMaxScores ): INormalizedYoutubeVideo[] => { @@ -91,7 +91,7 @@ const getNormalizedExternalRanking = ( }); }; -const getWeightedExternalRanking = ( +export const getWeightedExternalRanking = ( videos: INormalizedYoutubeVideo[] ): IWeightedYoutubeVideo[] => { return videos.map((video) => { @@ -115,7 +115,7 @@ const getWeightedExternalRanking = ( }); }; -const getMaxScores = ( +export const getMaxScores = ( rawExternalRankingVideos: IRawYoutubeVideo[] ): IMaxScores => { const maxScore = { @@ -137,20 +137,23 @@ const getMaxScores = ( return maxScore; }; -const getDateScore = (yearsSincePublished: number) => { +export const getDateScore = (yearsSincePublished: number) => { // Following the function in https://docs.google.com/document/d/1zxYRyytmbbvfAZkQc8dampD9Vhun0XQtWepKYxWUTKo return Math.max(-Math.pow(1.6, yearsSincePublished) + 11, 0); }; -const getDateXViewsScore = (views: number, daysSincePublished: number) => { +export const getDateXViewsScore = ( + views: number, + daysSincePublished: number +) => { return views / daysSincePublished; }; -const getDateXLikes = (likes: number, daysSincePublished: number) => { +export const getDateXLikes = (likes: number, daysSincePublished: number) => { return likes / daysSincePublished; }; -const getUseOfChapters = (description: string) => { +export const getUseOfChapters = (description: string) => { const usesChapters = description.match("[0-9]:[0-9]"); return usesChapters !== null ? 1 : 0; }; @@ -159,7 +162,7 @@ const getChannelPopularity = () => { return 1; }; -const getDaysSincePublished = (publishedAt: string) => { +export const getDaysSincePublished = (publishedAt: string) => { const publishedAtDate = parseISO(publishedAt); const daysSincePublished = differenceInCalendarDays( new Date(), @@ -168,7 +171,7 @@ const getDaysSincePublished = (publishedAt: string) => { return daysSincePublished; }; -const ensureWeightsAreCorrect = (weights: typeof WEIGHTS) => { +export const ensureWeightsAreCorrect = (weights: typeof WEIGHTS) => { if (weights.w1 + weights.w2 !== 100) { return false; } From 9b63bde9a397bf61d3cef1e28e6968e4176833e7 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 11:32:35 -0700 Subject: [PATCH 10/65] adding weight test --- backend/rating/ranking.test.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 backend/rating/ranking.test.ts diff --git a/backend/rating/ranking.test.ts b/backend/rating/ranking.test.ts new file mode 100644 index 0000000..ef57c19 --- /dev/null +++ b/backend/rating/ranking.test.ts @@ -0,0 +1,25 @@ +import { ensureWeightsAreCorrect } from "./ranking"; + +test("weights should throw an error if weights are incorrect", () => { + const testWeights1 = { + w1: 60, + w2: 40, + w3: 100, + w4: 0, + w5: 100, + w6: 0, + }; + + expect(ensureWeightsAreCorrect(testWeights1)).toBe(true); + + const testWeights2 = { + w1: 60, + w2: 40, + w3: 100, + w4: 0, + w5: 100, + w6: 10, + }; + + expect(ensureWeightsAreCorrect(testWeights2)).toBe(false); +}); From 9b94adb76a629bf2bace7d861f8513389c375c09 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 11:45:20 -0700 Subject: [PATCH 11/65] refactoring code folders --- backend/{ => src}/rating/ranking.test.ts | 0 backend/{ => src}/rating/ranking.ts | 2 +- backend/{ => src}/rating/youtube-data.json | 0 backend/{ => src}/rating/youtube.ts | 0 backend/{ => src}/routes/auth.ts | 0 backend/{ => src}/routes/debug.ts | 0 backend/{ => src}/types/global.d.ts | 0 backend/{ => src}/types/user.d.ts | 0 backend/{ => src}/types/youtube.d.ts | 0 backend/{ => src}/utils/errors.ts | 0 backend/{ => src}/utils/gapi.ts | 0 backend/{ => src}/utils/math.ts | 0 backend/{ => src}/utils/nodemailer.ts | 0 13 files changed, 1 insertion(+), 1 deletion(-) rename backend/{ => src}/rating/ranking.test.ts (100%) rename backend/{ => src}/rating/ranking.ts (99%) rename backend/{ => src}/rating/youtube-data.json (100%) rename backend/{ => src}/rating/youtube.ts (100%) rename backend/{ => src}/routes/auth.ts (100%) rename backend/{ => src}/routes/debug.ts (100%) rename backend/{ => src}/types/global.d.ts (100%) rename backend/{ => src}/types/user.d.ts (100%) rename backend/{ => src}/types/youtube.d.ts (100%) rename backend/{ => src}/utils/errors.ts (100%) rename backend/{ => src}/utils/gapi.ts (100%) rename backend/{ => src}/utils/math.ts (100%) rename backend/{ => src}/utils/nodemailer.ts (100%) diff --git a/backend/rating/ranking.test.ts b/backend/src/rating/ranking.test.ts similarity index 100% rename from backend/rating/ranking.test.ts rename to backend/src/rating/ranking.test.ts diff --git a/backend/rating/ranking.ts b/backend/src/rating/ranking.ts similarity index 99% rename from backend/rating/ranking.ts rename to backend/src/rating/ranking.ts index 6c4ec43..d0406a0 100644 --- a/backend/rating/ranking.ts +++ b/backend/src/rating/ranking.ts @@ -178,7 +178,7 @@ export const ensureWeightsAreCorrect = (weights: typeof WEIGHTS) => { if (weights.w3 + weights.w4 !== 100) { return false; } - if (weights.w4 + weights.w6 !== 100) { + if (weights.w5 + weights.w6 !== 100) { new ExpressError("Weights are incorrect", 500); return false; } diff --git a/backend/rating/youtube-data.json b/backend/src/rating/youtube-data.json similarity index 100% rename from backend/rating/youtube-data.json rename to backend/src/rating/youtube-data.json diff --git a/backend/rating/youtube.ts b/backend/src/rating/youtube.ts similarity index 100% rename from backend/rating/youtube.ts rename to backend/src/rating/youtube.ts diff --git a/backend/routes/auth.ts b/backend/src/routes/auth.ts similarity index 100% rename from backend/routes/auth.ts rename to backend/src/routes/auth.ts diff --git a/backend/routes/debug.ts b/backend/src/routes/debug.ts similarity index 100% rename from backend/routes/debug.ts rename to backend/src/routes/debug.ts diff --git a/backend/types/global.d.ts b/backend/src/types/global.d.ts similarity index 100% rename from backend/types/global.d.ts rename to backend/src/types/global.d.ts diff --git a/backend/types/user.d.ts b/backend/src/types/user.d.ts similarity index 100% rename from backend/types/user.d.ts rename to backend/src/types/user.d.ts diff --git a/backend/types/youtube.d.ts b/backend/src/types/youtube.d.ts similarity index 100% rename from backend/types/youtube.d.ts rename to backend/src/types/youtube.d.ts diff --git a/backend/utils/errors.ts b/backend/src/utils/errors.ts similarity index 100% rename from backend/utils/errors.ts rename to backend/src/utils/errors.ts diff --git a/backend/utils/gapi.ts b/backend/src/utils/gapi.ts similarity index 100% rename from backend/utils/gapi.ts rename to backend/src/utils/gapi.ts diff --git a/backend/utils/math.ts b/backend/src/utils/math.ts similarity index 100% rename from backend/utils/math.ts rename to backend/src/utils/math.ts diff --git a/backend/utils/nodemailer.ts b/backend/src/utils/nodemailer.ts similarity index 100% rename from backend/utils/nodemailer.ts rename to backend/src/utils/nodemailer.ts From 1a31aaf438792d15715b927af78dab061cb70a02 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 11:45:35 -0700 Subject: [PATCH 12/65] Configuring jest for typescript --- backend/app.ts | 6 +- backend/babel.config.js | 6 + backend/package.json | 5 + backend/pnpm-lock.yaml | 2616 +++++++++++++++++++++++++++++++++++++-- backend/tsconfig.json | 2 +- 5 files changed, 2537 insertions(+), 98 deletions(-) create mode 100644 backend/babel.config.js diff --git a/backend/app.ts b/backend/app.ts index 2a4365a..4925100 100644 --- a/backend/app.ts +++ b/backend/app.ts @@ -2,9 +2,9 @@ import express from "express"; import dotenv from "dotenv"; import Parse from "parse/node"; -import auth from "./routes/auth"; -import { NotFoundError } from "./utils/errors"; -import debug from "./routes/debug"; +import auth from "./src/routes/auth"; +import { NotFoundError } from "./src/utils/errors"; +import debug from "./src/routes/debug"; dotenv.config(); diff --git a/backend/babel.config.js b/backend/babel.config.js new file mode 100644 index 0000000..dd242dc --- /dev/null +++ b/backend/babel.config.js @@ -0,0 +1,6 @@ +module.exports = { + presets: [ + ["@babel/preset-env", { targets: { node: "current" } }], + "@babel/preset-typescript", + ], +}; diff --git a/backend/package.json b/backend/package.json index 9a29d09..7c91b1f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -2,6 +2,7 @@ "name": "backend", "version": "1.0.0", "description": "", + "type": "commonjs", "main": "index.js", "scripts": { "start": "node --loader ts-node/esm ./index.ts", @@ -21,11 +22,15 @@ "ts-node": "^10.8.1" }, "devDependencies": { + "@babel/core": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", "@types/express": "^4.17.13", "@types/jest": "^28.1.3", "@types/node": "^18.0.0", "@types/nodemailer": "^6.4.4", "@types/parse": "^2.18.16", + "babel-cli": "^6.26.0", "jest": "^28.1.2", "nodemon": "^2.0.18", "ts-jest": "^28.0.5", diff --git a/backend/pnpm-lock.yaml b/backend/pnpm-lock.yaml index 239897b..f7d861a 100644 --- a/backend/pnpm-lock.yaml +++ b/backend/pnpm-lock.yaml @@ -1,11 +1,15 @@ lockfileVersion: 5.4 specifiers: + '@babel/core': ^7.18.6 + '@babel/preset-env': ^7.18.6 + '@babel/preset-typescript': ^7.18.6 '@types/express': ^4.17.13 '@types/jest': ^28.1.3 '@types/node': ^18.0.0 '@types/nodemailer': ^6.4.4 '@types/parse': ^2.18.16 + babel-cli: ^6.26.0 date-fns: ^2.28.0 dotenv: ^16.0.1 express: ^4.18.1 @@ -28,14 +32,18 @@ dependencies: ts-node: 10.8.1_qiyc72axg2v44xl4yovan2v55u devDependencies: + '@babel/core': 7.18.6 + '@babel/preset-env': 7.18.6_@babel+core@7.18.6 + '@babel/preset-typescript': 7.18.6_@babel+core@7.18.6 '@types/express': 4.17.13 '@types/jest': 28.1.3 '@types/node': 18.0.0 '@types/nodemailer': 6.4.4 '@types/parse': 2.18.16 + babel-cli: 6.26.0 jest: 28.1.2_jbmz3vlfopghb5mdasddsdxfzq nodemon: 2.0.18 - ts-jest: 28.0.5_lt5llx2ti6zt4eclhanfli5ynu + ts-jest: 28.0.5_d7p7jfykgzko2wul3x4xic5voa typescript: 4.7.4 packages: @@ -92,6 +100,21 @@ packages: jsesc: 2.5.2 dev: true + /@babel/helper-annotate-as-pure/7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.7 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor/7.18.6: + resolution: {integrity: sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-explode-assignable-expression': 7.18.6 + '@babel/types': 7.18.7 + dev: true + /@babel/helper-compilation-targets/7.18.6_@babel+core@7.18.6: resolution: {integrity: sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==} engines: {node: '>=6.9.0'} @@ -105,11 +128,65 @@ packages: semver: 6.3.0 dev: true + /@babel/helper-create-class-features-plugin/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.6 + '@babel/helper-function-name': 7.18.6 + '@babel/helper-member-expression-to-functions': 7.18.6 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-regexp-features-plugin/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.1.0 + dev: true + + /@babel/helper-define-polyfill-provider/0.3.1_@babel+core@7.18.6: + resolution: {integrity: sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-compilation-targets': 7.18.6_@babel+core@7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/traverse': 7.18.6 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-environment-visitor/7.18.6: resolution: {integrity: sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==} engines: {node: '>=6.9.0'} dev: true + /@babel/helper-explode-assignable-expression/7.18.6: + resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.7 + dev: true + /@babel/helper-function-name/7.18.6: resolution: {integrity: sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==} engines: {node: '>=6.9.0'} @@ -125,6 +202,13 @@ packages: '@babel/types': 7.18.7 dev: true + /@babel/helper-member-expression-to-functions/7.18.6: + resolution: {integrity: sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.7 + dev: true + /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} @@ -132,90 +216,789 @@ packages: '@babel/types': 7.18.7 dev: true - /@babel/helper-module-transforms/7.18.6: - resolution: {integrity: sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==} + /@babel/helper-module-transforms/7.18.6: + resolution: {integrity: sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.18.6 + '@babel/template': 7.18.6 + '@babel/traverse': 7.18.6 + '@babel/types': 7.18.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-optimise-call-expression/7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.7 + dev: true + + /@babel/helper-plugin-utils/7.18.6: + resolution: {integrity: sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-remap-async-to-generator/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.6 + '@babel/helper-wrap-function': 7.18.6 + '@babel/types': 7.18.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers/7.18.6: + resolution: {integrity: sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.6 + '@babel/helper-member-expression-to-functions': 7.18.6 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/traverse': 7.18.6 + '@babel/types': 7.18.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-simple-access/7.18.6: + resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.7 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers/7.18.6: + resolution: {integrity: sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.7 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.7 + dev: true + + /@babel/helper-validator-identifier/7.18.6: + resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-wrap-function/7.18.6: + resolution: {integrity: sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.18.6 + '@babel/template': 7.18.6 + '@babel/traverse': 7.18.6 + '@babel/types': 7.18.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers/7.18.6: + resolution: {integrity: sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.6 + '@babel/traverse': 7.18.6 + '@babel/types': 7.18.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.18.6 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser/7.18.6: + resolution: {integrity: sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.18.7 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.6 + '@babel/plugin-proposal-optional-chaining': 7.18.6_@babel+core@7.18.6 + dev: true + + /@babel/plugin-proposal-async-generator-functions/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-environment-visitor': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/helper-remap-async-to-generator': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.18.6_@babel+core@7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.18.6_@babel+core@7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.6 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.6 + dev: true + + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.6 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.6 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.18.6 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.6 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.18.6 + '@babel/core': 7.18.6 + '@babel/helper-compilation-targets': 7.18.6_@babel+core@7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.6 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.18.6 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.18.6 + dev: true + + /@babel/plugin-proposal-optional-chaining/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.6 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.18.6 + dev: true + + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.18.6_@babel+core@7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.18.6_@babel+core@7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.18.6: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.18.6: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.18.6: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.18.6: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.18.6: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.18.6: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-import-assertions/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.18.6: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.18.6: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.18.6: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.18.6: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.18.6: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.18.6: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.18.6: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.18.6: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.18.6: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.18.6: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/helper-remap-async-to-generator': 7.18.6_@babel+core@7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-block-scoping/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-classes/7.18.8_@babel+core@7.18.6: + resolution: {integrity: sha512-RySDoXdF6hgHSHuAW4aLGyVQdmvEX/iJtjVre52k0pxRq4hzqze+rAVP++NmNv596brBpYmaiKgTZby7ziBnVg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.6 + '@babel/helper-function-name': 7.18.6 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/helper-replace-supers': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-computed-properties/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-destructuring/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.18.6: + resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-function-name/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-compilation-targets': 7.18.6_@babel+core@7.18.6 + '@babel/helper-function-name': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-literals/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + dev: true + + /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-module-transforms': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-environment-visitor': 7.18.6 - '@babel/helper-module-imports': 7.18.6 + '@babel/core': 7.18.6 + '@babel/helper-module-transforms': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 '@babel/helper-simple-access': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.18.6 - '@babel/template': 7.18.6 - '@babel/traverse': 7.18.6 - '@babel/types': 7.18.7 + babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-plugin-utils/7.18.6: - resolution: {integrity: sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access/7.18.6: - resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} + /@babel/plugin-transform-modules-systemjs/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@babel/types': 7.18.7 + '@babel/core': 7.18.6 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/helper-validator-identifier': 7.18.6 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-split-export-declaration/7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@babel/types': 7.18.7 + '@babel/core': 7.18.6 + '@babel/helper-module-transforms': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-validator-identifier/7.18.6: - resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} + /@babel/plugin-transform-named-capturing-groups-regex/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.6 + '@babel/helper-plugin-utils': 7.18.6 dev: true - /@babel/helper-validator-option/7.18.6: - resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 dev: true - /@babel/helpers/7.18.6: - resolution: {integrity: sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==} + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@babel/template': 7.18.6 - '@babel/traverse': 7.18.6 - '@babel/types': 7.18.7 + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 + '@babel/helper-replace-supers': 7.18.6 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight/7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.18.6: + resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-validator-identifier': 7.18.6 - chalk: 2.4.2 - js-tokens: 4.0.0 + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 dev: true - /@babel/parser/7.18.6: - resolution: {integrity: sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==} - engines: {node: '>=6.0.0'} - hasBin: true + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@babel/types': 7.18.7 + '@babel/core': 7.18.6 + '@babel/helper-plugin-utils': 7.18.6 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.18.6: - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.6 '@babel/helper-plugin-utils': 7.18.6 + regenerator-transform: 0.15.0 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.18.6: - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -223,8 +1006,9 @@ packages: '@babel/helper-plugin-utils': 7.18.6 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.18.6: - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -232,17 +1016,20 @@ packages: '@babel/helper-plugin-utils': 7.18.6 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.18.6: - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + /@babel/plugin-transform-spread/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.6 '@babel/helper-plugin-utils': 7.18.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.6 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.18.6: - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -250,8 +1037,9 @@ packages: '@babel/helper-plugin-utils': 7.18.6 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.18.6: - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + /@babel/plugin-transform-template-literals/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -259,8 +1047,9 @@ packages: '@babel/helper-plugin-utils': 7.18.6 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.18.6: - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + /@babel/plugin-transform-typeof-symbol/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -268,17 +1057,23 @@ packages: '@babel/helper-plugin-utils': 7.18.6 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.18.6: - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + /@babel/plugin-transform-typescript/7.18.8_@babel+core@7.18.6: + resolution: {integrity: sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.18.6_@babel+core@7.18.6 '@babel/helper-plugin-utils': 7.18.6 + '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.18.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.18.6: - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + /@babel/plugin-transform-unicode-escapes/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -286,42 +1081,128 @@ packages: '@babel/helper-plugin-utils': 7.18.6 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.18.6: - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.6 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.6 '@babel/helper-plugin-utils': 7.18.6 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.18.6: - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + /@babel/preset-env/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/compat-data': 7.18.6 '@babel/core': 7.18.6 + '@babel/helper-compilation-targets': 7.18.6_@babel+core@7.18.6 '@babel/helper-plugin-utils': 7.18.6 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-async-generator-functions': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-export-namespace-from': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-logical-assignment-operators': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-object-rest-spread': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-optional-chaining': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.6 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.18.6 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.18.6 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.6 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.6 + '@babel/plugin-syntax-import-assertions': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.6 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.6 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.18.6 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.6 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.6 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.18.6 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.18.6 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.18.6 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.18.6 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-block-scoping': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-classes': 7.18.8_@babel+core@7.18.6 + '@babel/plugin-transform-computed-properties': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-destructuring': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-duplicate-keys': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.18.6 + '@babel/plugin-transform-function-name': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-literals': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-modules-systemjs': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-named-capturing-groups-regex': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.18.6 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-spread': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-template-literals': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-typeof-symbol': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-unicode-escapes': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.18.6 + '@babel/preset-modules': 0.1.5_@babel+core@7.18.6 + '@babel/types': 7.18.7 + babel-plugin-polyfill-corejs2: 0.3.1_@babel+core@7.18.6 + babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.18.6 + babel-plugin-polyfill-regenerator: 0.3.1_@babel+core@7.18.6 + core-js-compat: 3.23.4 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.18.6: - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} + /@babel/preset-modules/0.1.5_@babel+core@7.18.6: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.6 '@babel/helper-plugin-utils': 7.18.6 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.18.6 + '@babel/types': 7.18.7 + esutils: 2.0.3 dev: true - /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.18.6: - resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} + /@babel/preset-typescript/7.18.6_@babel+core@7.18.6: + resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.6 '@babel/helper-plugin-utils': 7.18.6 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-transform-typescript': 7.18.8_@babel+core@7.18.6 + transitivePeerDependencies: + - supports-color dev: true /@babel/runtime-corejs3/7.17.8: @@ -337,7 +1218,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.9 - dev: false /@babel/template/7.18.6: resolution: {integrity: sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==} @@ -898,11 +1778,21 @@ packages: type-fest: 0.21.3 dev: true + /ansi-regex/2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: true + /ansi-styles/2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + /ansi-styles/3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -922,6 +1812,14 @@ packages: engines: {node: '>=10'} dev: true + /anymatch/1.3.2: + resolution: {integrity: sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==} + dependencies: + micromatch: 2.3.11 + normalize-path: 2.1.1 + dev: true + optional: true + /anymatch/3.1.2: resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} @@ -939,15 +1837,151 @@ packages: sprintf-js: 1.0.3 dev: true + /arr-diff/2.0.0: + resolution: {integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + dev: true + optional: true + + /arr-diff/4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /arr-flatten/1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /arr-union/3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /array-flatten/1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false + /array-unique/0.2.1: + resolution: {integrity: sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /array-unique/0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /arrify/2.0.1: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} dev: false + /assign-symbols/1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /async-each/1.0.3: + resolution: {integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==} + dev: true + optional: true + + /atob/2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + optional: true + + /babel-cli/6.26.0: + resolution: {integrity: sha512-wau+BDtQfuSBGQ9PzzFL3REvR9Sxnd4LKwtcHAiPjhugA7K/80vpHXafj+O5bAqJOuSefjOx5ZJnNSR2J1Qw6Q==} + hasBin: true + dependencies: + babel-core: 6.26.3 + babel-polyfill: 6.26.0 + babel-register: 6.26.0 + babel-runtime: 6.26.0 + commander: 2.20.3 + convert-source-map: 1.8.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + lodash: 4.17.21 + output-file-sync: 1.1.2 + path-is-absolute: 1.0.1 + slash: 1.0.0 + source-map: 0.5.7 + v8flags: 2.1.1 + optionalDependencies: + chokidar: 1.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-code-frame/6.26.0: + resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} + dependencies: + chalk: 1.1.3 + esutils: 2.0.3 + js-tokens: 3.0.2 + dev: true + + /babel-core/6.26.3: + resolution: {integrity: sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==} + dependencies: + babel-code-frame: 6.26.0 + babel-generator: 6.26.1 + babel-helpers: 6.24.1 + babel-messages: 6.23.0 + babel-register: 6.26.0 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + babylon: 6.18.0 + convert-source-map: 1.8.0 + debug: 2.6.9 + json5: 0.5.1 + lodash: 4.17.21 + minimatch: 3.1.2 + path-is-absolute: 1.0.1 + private: 0.1.8 + slash: 1.0.0 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-generator/6.26.1: + resolution: {integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==} + dependencies: + babel-messages: 6.23.0 + babel-runtime: 6.26.0 + babel-types: 6.26.0 + detect-indent: 4.0.0 + jsesc: 1.3.0 + lodash: 4.17.21 + source-map: 0.5.7 + trim-right: 1.0.1 + dev: true + + /babel-helpers/6.24.1: + resolution: {integrity: sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==} + dependencies: + babel-runtime: 6.26.0 + babel-template: 6.26.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-jest/28.1.2_@babel+core@7.18.6: resolution: {integrity: sha512-pfmoo6sh4L/+5/G2OOfQrGJgvH7fTa1oChnuYH2G/6gA+JwDvO8PELwvwnofKBMNrQsam0Wy/Rw+QSrBNewq2Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -966,6 +2000,18 @@ packages: - supports-color dev: true + /babel-messages/6.23.0: + resolution: {integrity: sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==} + dependencies: + babel-runtime: 6.26.0 + dev: true + + /babel-plugin-dynamic-import-node/2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + dependencies: + object.assign: 4.1.2 + dev: true + /babel-plugin-istanbul/6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} @@ -989,6 +2035,50 @@ packages: '@types/babel__traverse': 7.17.1 dev: true + /babel-plugin-polyfill-corejs2/0.3.1_@babel+core@7.18.6: + resolution: {integrity: sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.18.6 + '@babel/core': 7.18.6 + '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.6 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3/0.5.2_@babel+core@7.18.6: + resolution: {integrity: sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.6 + core-js-compat: 3.23.4 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator/0.3.1_@babel+core@7.18.6: + resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-polyfill/6.26.0: + resolution: {integrity: sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==} + dependencies: + babel-runtime: 6.26.0 + core-js: 2.6.12 + regenerator-runtime: 0.10.5 + dev: true + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.18.6: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: @@ -1020,10 +2110,87 @@ packages: babel-preset-current-node-syntax: 1.0.1_@babel+core@7.18.6 dev: true + /babel-register/6.26.0: + resolution: {integrity: sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==} + dependencies: + babel-core: 6.26.3 + babel-runtime: 6.26.0 + core-js: 2.6.12 + home-or-tmp: 2.0.0 + lodash: 4.17.21 + mkdirp: 0.5.6 + source-map-support: 0.4.18 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-runtime/6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.11.1 + dev: true + + /babel-template/6.26.0: + resolution: {integrity: sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==} + dependencies: + babel-runtime: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + babylon: 6.18.0 + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-traverse/6.26.0: + resolution: {integrity: sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==} + dependencies: + babel-code-frame: 6.26.0 + babel-messages: 6.23.0 + babel-runtime: 6.26.0 + babel-types: 6.26.0 + babylon: 6.18.0 + debug: 2.6.9 + globals: 9.18.0 + invariant: 2.2.4 + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-types/6.26.0: + resolution: {integrity: sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==} + dependencies: + babel-runtime: 6.26.0 + esutils: 2.0.3 + lodash: 4.17.21 + to-fast-properties: 1.0.3 + dev: true + + /babylon/6.18.0: + resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} + hasBin: true + dev: true + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true + /base/0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.0 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + optional: true + /base64-js/1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: false @@ -1032,11 +2199,24 @@ packages: resolution: {integrity: sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==} dev: false + /binary-extensions/1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true + /bindings/1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: true + optional: true + /body-parser/1.20.0: resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -1078,6 +2258,35 @@ packages: concat-map: 0.0.1 dev: true + /braces/1.8.5: + resolution: {integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==} + engines: {node: '>=0.10.0'} + dependencies: + expand-range: 1.8.2 + preserve: 0.2.0 + repeat-element: 1.1.4 + dev: true + optional: true + + /braces/2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -1122,6 +2331,22 @@ packages: engines: {node: '>= 0.8'} dev: false + /cache-base/1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.0 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + optional: true + /cacheable-request/6.1.0: resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} engines: {node: '>=8'} @@ -1140,7 +2365,6 @@ packages: dependencies: function-bind: 1.1.1 get-intrinsic: 1.1.2 - dev: false /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -1161,6 +2385,17 @@ packages: resolution: {integrity: sha512-ybhCrjNtkFji1/Wto6SSJKkWk6kZgVQsDq5QI83SafsF6FXv2JB4df9eEdH6g8sdGgqTXrFLjAxqBGgYoU3azQ==} dev: true + /chalk/1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1183,6 +2418,26 @@ packages: engines: {node: '>=10'} dev: true + /chokidar/1.7.0: + resolution: {integrity: sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==} + deprecated: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies. + requiresBuild: true + dependencies: + anymatch: 1.3.2 + async-each: 1.0.3 + glob-parent: 2.0.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 2.0.1 + path-is-absolute: 1.0.1 + readdirp: 2.2.1 + optionalDependencies: + fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + /chokidar/3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -1210,6 +2465,17 @@ packages: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true + /class-utils/0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + optional: true + /cli-boxes/2.2.1: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} @@ -1238,6 +2504,15 @@ packages: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true + /collection-visit/1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + optional: true + /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1259,6 +2534,15 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true + /commander/2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /component-emitter/1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + dev: true + optional: true + /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true @@ -1302,11 +2586,35 @@ packages: engines: {node: '>= 0.6'} dev: false + /copy-descriptor/0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /core-js-compat/3.23.4: + resolution: {integrity: sha512-RkSRPe+JYEoflcsuxJWaiMPhnZoFS51FcIxm53k4KzhISCBTmaGlto9dTIrYuk0hnJc3G6pKufAKepHnBq6B6Q==} + dependencies: + browserslist: 4.21.1 + semver: 7.0.0 + dev: true + /core-js-pure/3.23.3: resolution: {integrity: sha512-XpoouuqIj4P+GWtdyV8ZO3/u4KftkeDVMfvp+308eGMhCrA3lVDSmAxO0c6GGOcmgVlaKDrgWVMo49h2ab/TDA==} requiresBuild: true dev: false + /core-js/2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + requiresBuild: true + dev: true + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + optional: true + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -1344,7 +2652,6 @@ packages: optional: true dependencies: ms: 2.0.0 - dev: false /debug/3.2.7_supports-color@5.5.0: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -1369,6 +2676,12 @@ packages: dependencies: ms: 2.1.2 + /decode-uri-component/0.2.0: + resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} + engines: {node: '>=0.10'} + dev: true + optional: true + /decompress-response/3.3.0: resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} engines: {node: '>=4'} @@ -1394,6 +2707,39 @@ packages: resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} dev: true + /define-properties/1.1.4: + resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /define-property/0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.6 + dev: true + optional: true + + /define-property/1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + dev: true + optional: true + + /define-property/2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + isobject: 3.0.1 + dev: true + optional: true + /depd/2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1404,6 +2750,13 @@ packages: engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: false + /detect-indent/4.0.0: + resolution: {integrity: sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==} + engines: {node: '>=0.10.0'} + dependencies: + repeating: 2.0.1 + dev: true + /detect-newline/3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -1504,6 +2857,11 @@ packages: hasBin: true dev: true + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + /etag/1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -1534,6 +2892,38 @@ packages: engines: {node: '>= 0.8.0'} dev: true + /expand-brackets/0.1.5: + resolution: {integrity: sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==} + engines: {node: '>=0.10.0'} + dependencies: + is-posix-bracket: 0.1.1 + dev: true + optional: true + + /expand-brackets/2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + + /expand-range/1.8.2: + resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} + engines: {node: '>=0.10.0'} + dependencies: + fill-range: 2.2.4 + dev: true + optional: true + /expect/28.1.1: resolution: {integrity: sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -1584,10 +2974,52 @@ packages: - supports-color dev: false + /extend-shallow/2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + optional: true + + /extend-shallow/3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + optional: true + /extend/3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false + /extglob/0.3.2: + resolution: {integrity: sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 1.0.0 + dev: true + optional: true + + /extglob/2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true @@ -1602,6 +3034,40 @@ packages: bser: 2.1.1 dev: true + /file-uri-to-path/1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: true + optional: true + + /filename-regex/2.0.1: + resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /fill-range/2.2.4: + resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 2.1.0 + isobject: 2.1.0 + randomatic: 3.1.1 + repeat-element: 1.1.4 + repeat-string: 1.6.1 + dev: true + optional: true + + /fill-range/4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + optional: true + /fill-range/7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -1632,20 +3098,58 @@ packages: path-exists: 4.0.0 dev: true + /for-in/1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /for-own/0.1.5: + resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + dev: true + optional: true + /forwarded/0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} dev: false + /fragment-cache/0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + optional: true + /fresh/0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} dev: false + /fs-readdir-recursive/1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + dev: true + /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true + /fsevents/1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2. + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.16.0 + dev: true + optional: true + /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1711,7 +3215,6 @@ packages: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 - dev: false /get-package-type/0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} @@ -1737,6 +3240,28 @@ packages: engines: {node: '>=10'} dev: true + /get-value/2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /glob-base/0.3.0: + resolution: {integrity: sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==} + engines: {node: '>=0.10.0'} + dependencies: + glob-parent: 2.0.0 + is-glob: 2.0.1 + dev: true + optional: true + + /glob-parent/2.0.0: + resolution: {integrity: sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==} + dependencies: + is-glob: 2.0.1 + dev: true + optional: true + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1767,6 +3292,11 @@ packages: engines: {node: '>=4'} dev: true + /globals/9.18.0: + resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} + engines: {node: '>=0.10.0'} + dev: true + /google-auth-library/8.1.0: resolution: {integrity: sha512-J/fNXEnqLgbr3kmeUshZCtHQia6ZiNbbrebVzpt/+LTeY6Ka9CtbQvloTjVGVO7nyYbs0KYeuIwgUC/t2Gp1Jw==} engines: {node: '>=12'} @@ -1854,6 +3384,13 @@ packages: - supports-color dev: false + /has-ansi/2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + /has-flag/3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -1863,11 +3400,51 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: true - - /has-symbols/1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: false + + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.1.2 + dev: true + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-value/0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + optional: true + + /has-value/1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + optional: true + + /has-values/0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /has-values/1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + optional: true /has-yarn/2.1.0: resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} @@ -1880,6 +3457,14 @@ packages: dependencies: function-bind: 1.1.1 + /home-or-tmp/2.0.0: + resolution: {integrity: sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==} + engines: {node: '>=0.10.0'} + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + dev: true + /html-escaper/2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true @@ -1969,15 +3554,45 @@ packages: engines: {node: '>=10'} dev: true + /invariant/2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: true + /ipaddr.js/1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} dev: false + /is-accessor-descriptor/0.1.6: + resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + optional: true + + /is-accessor-descriptor/1.0.0: + resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + optional: true + /is-arrayish/0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true + /is-binary-path/1.0.1: + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + engines: {node: '>=0.10.0'} + dependencies: + binary-extensions: 1.13.1 + dev: true + optional: true + /is-binary-path/2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1985,6 +3600,11 @@ packages: binary-extensions: 2.2.0 dev: true + /is-buffer/1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + optional: true + /is-ci/2.0.0: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} hasBin: true @@ -1998,11 +3618,86 @@ packages: has: 1.0.3 dev: true + /is-data-descriptor/0.1.4: + resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + optional: true + + /is-data-descriptor/1.0.0: + resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + optional: true + + /is-descriptor/0.1.6: + resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 0.1.6 + is-data-descriptor: 0.1.4 + kind-of: 5.1.0 + dev: true + optional: true + + /is-descriptor/1.0.2: + resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 1.0.0 + is-data-descriptor: 1.0.0 + kind-of: 6.0.3 + dev: true + optional: true + + /is-dotfile/1.0.3: + resolution: {integrity: sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /is-equal-shallow/0.1.3: + resolution: {integrity: sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==} + engines: {node: '>=0.10.0'} + dependencies: + is-primitive: 2.0.0 + dev: true + optional: true + + /is-extendable/0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /is-extendable/1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + optional: true + + /is-extglob/1.0.0: + resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /is-extglob/2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true + /is-finite/1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + dev: true + /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -2013,6 +3708,14 @@ packages: engines: {node: '>=6'} dev: true + /is-glob/2.0.1: + resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 1.0.0 + dev: true + optional: true + /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -2033,6 +3736,28 @@ packages: engines: {node: '>=10'} dev: true + /is-number/2.1.0: + resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + optional: true + + /is-number/3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + optional: true + + /is-number/4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2048,6 +3773,26 @@ packages: engines: {node: '>=8'} dev: true + /is-plain-object/2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + optional: true + + /is-posix-bracket/0.1.1: + resolution: {integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /is-primitive/2.0.0: + resolution: {integrity: sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /is-stream/2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -2056,14 +3801,39 @@ packages: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: true + /is-windows/1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /is-yarn-global/0.3.0: resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} dev: true + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + optional: true + /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /isobject/2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + optional: true + + /isobject/3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /istanbul-lib-coverage/3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} @@ -2517,6 +4287,10 @@ packages: - ts-node dev: true + /js-tokens/3.0.2: + resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} + dev: true + /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true @@ -2529,6 +4303,16 @@ packages: esprima: 4.0.1 dev: true + /jsesc/0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc/1.3.0: + resolution: {integrity: sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==} + hasBin: true + dev: true + /jsesc/2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -2549,6 +4333,11 @@ packages: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true + /json5/0.5.1: + resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==} + hasBin: true + dev: true + /json5/2.2.1: resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} @@ -2576,6 +4365,34 @@ packages: json-buffer: 3.0.0 dev: true + /kind-of/3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + optional: true + + /kind-of/4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + optional: true + + /kind-of/5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /kleur/3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -2604,10 +4421,25 @@ packages: p-locate: 4.1.0 dev: true + /lodash.debounce/4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + /lodash.memoize/4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + /lowercase-keys/1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} @@ -2640,6 +4472,25 @@ packages: tmpl: 1.0.5 dev: true + /map-cache/0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /map-visit/1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + optional: true + + /math-random/1.0.4: + resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} + dev: true + optional: true + /media-typer/0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -2658,6 +4509,48 @@ packages: engines: {node: '>= 0.6'} dev: false + /micromatch/2.3.11: + resolution: {integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 2.0.0 + array-unique: 0.2.1 + braces: 1.8.5 + expand-brackets: 0.1.5 + extglob: 0.3.2 + filename-regex: 2.0.1 + is-extglob: 1.0.0 + is-glob: 2.0.1 + kind-of: 3.2.2 + normalize-path: 2.1.1 + object.omit: 2.0.1 + parse-glob: 3.0.4 + regex-cache: 0.4.4 + dev: true + optional: true + + /micromatch/3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + /micromatch/4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -2704,9 +4597,24 @@ packages: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} dev: true + /mixin-deep/1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + optional: true + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.6 + dev: true + /ms/2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: false /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -2714,6 +4622,31 @@ packages: /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /nan/2.16.0: + resolution: {integrity: sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==} + dev: true + optional: true + + /nanomatch/1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -2778,26 +4711,89 @@ packages: abbrev: 1.1.1 dev: true - /normalize-path/3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + /normalize-path/2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: 1.1.0 + dev: true + optional: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url/4.5.1: + resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} + engines: {node: '>=8'} + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-copy/0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + optional: true + + /object-inspect/1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + dev: false + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object-visit/1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + optional: true + + /object.assign/4.1.2: + resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.omit/2.0.1: + resolution: {integrity: sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==} engines: {node: '>=0.10.0'} + dependencies: + for-own: 0.1.5 + is-extendable: 0.1.1 dev: true + optional: true - /normalize-url/4.5.1: - resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} - engines: {node: '>=8'} - dev: true - - /npm-run-path/4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + /object.pick/1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} dependencies: - path-key: 3.1.1 + isobject: 3.0.1 dev: true - - /object-inspect/1.12.2: - resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} - dev: false + optional: true /on-finished/2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -2819,6 +4815,24 @@ packages: mimic-fn: 2.1.0 dev: true + /os-homedir/1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + dev: true + + /os-tmpdir/1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /output-file-sync/1.1.2: + resolution: {integrity: sha512-uQLlclru4xpCi+tfs80l3QF24KL81X57ELNMy7W/dox+JTtxUf1bLyQ8968fFCmSqqbokjW0kn+WBIlO+rSkNg==} + dependencies: + graceful-fs: 4.2.10 + mkdirp: 0.5.6 + object-assign: 4.1.1 + dev: true + /p-cancelable/1.1.0: resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} engines: {node: '>=6'} @@ -2853,6 +4867,17 @@ packages: semver: 6.3.0 dev: true + /parse-glob/3.0.4: + resolution: {integrity: sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==} + engines: {node: '>=0.10.0'} + dependencies: + glob-base: 0.3.0 + is-dotfile: 1.0.3 + is-extglob: 1.0.0 + is-glob: 2.0.1 + dev: true + optional: true + /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -2885,6 +4910,12 @@ packages: engines: {node: '>= 0.8'} dev: false + /pascalcase/0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2929,11 +4960,23 @@ packages: find-up: 4.1.0 dev: true + /posix-character-classes/0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /prepend-http/2.0.0: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} engines: {node: '>=4'} dev: true + /preserve/0.2.0: + resolution: {integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /pretty-format/28.1.1: resolution: {integrity: sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -2944,6 +4987,16 @@ packages: react-is: 18.2.0 dev: true + /private/0.1.8: + resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} + engines: {node: '>= 0.6'} + dev: true + + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + optional: true + /prompts/2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -2985,6 +5038,16 @@ packages: side-channel: 1.0.4 dev: false + /randomatic/3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} + dependencies: + is-number: 4.0.0 + kind-of: 6.0.3 + math-random: 1.0.4 + dev: true + optional: true + /range-parser/1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -3018,6 +5081,31 @@ packages: resolution: {integrity: sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA==} dev: false + /readable-stream/2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + optional: true + + /readdirp/2.2.1: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} + dependencies: + graceful-fs: 4.2.10 + micromatch: 3.1.10 + readable-stream: 2.3.7 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + /readdirp/3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -3025,9 +5113,62 @@ packages: picomatch: 2.3.1 dev: true + /regenerate-unicode-properties/10.0.1: + resolution: {integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate/1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime/0.10.5: + resolution: {integrity: sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==} + dev: true + + /regenerator-runtime/0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + dev: true + /regenerator-runtime/0.13.9: resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} - dev: false + + /regenerator-transform/0.15.0: + resolution: {integrity: sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==} + dependencies: + '@babel/runtime': 7.17.9 + dev: true + + /regex-cache/0.4.4: + resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-equal-shallow: 0.1.3 + dev: true + optional: true + + /regex-not/1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + optional: true + + /regexpu-core/5.1.0: + resolution: {integrity: sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.0.1 + regjsgen: 0.6.0 + regjsparser: 0.8.4 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.0.0 + dev: true /registry-auth-token/4.2.2: resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} @@ -3043,6 +5184,41 @@ packages: rc: 1.2.8 dev: true + /regjsgen/0.6.0: + resolution: {integrity: sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==} + dev: true + + /regjsparser/0.8.4: + resolution: {integrity: sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /remove-trailing-separator/1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: true + optional: true + + /repeat-element/1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /repeat-string/1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true + optional: true + + /repeating/2.0.1: + resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} + engines: {node: '>=0.10.0'} + dependencies: + is-finite: 1.1.0 + dev: true + /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -3060,6 +5236,12 @@ packages: engines: {node: '>=8'} dev: true + /resolve-url/0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + optional: true + /resolve.exports/1.1.0: resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} engines: {node: '>=10'} @@ -3080,6 +5262,12 @@ packages: lowercase-keys: 1.0.1 dev: true + /ret/0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + optional: true + /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -3099,6 +5287,13 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false + /safe-regex/1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: true + optional: true + /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false @@ -3120,6 +5315,11 @@ packages: hasBin: true dev: true + /semver/7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + /semver/7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} @@ -3161,6 +5361,17 @@ packages: - supports-color dev: false + /set-value/2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + optional: true + /setprototypeof/1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false @@ -3193,11 +5404,69 @@ packages: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true + /slash/1.0.0: + resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} + engines: {node: '>=0.10.0'} + dev: true + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true + /snapdragon-node/2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + optional: true + + /snapdragon-util/3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + optional: true + + /snapdragon/0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + + /source-map-resolve/0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.0 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + optional: true + + /source-map-support/0.4.18: + resolution: {integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==} + dependencies: + source-map: 0.5.7 + dev: true + /source-map-support/0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: @@ -3205,11 +5474,30 @@ packages: source-map: 0.6.1 dev: true + /source-map-url/0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + optional: true + + /source-map/0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: true + /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: true + /split-string/3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + optional: true + /sprintf-js/1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true @@ -3221,6 +5509,15 @@ packages: escape-string-regexp: 2.0.0 dev: true + /static-extend/0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + optional: true + /statuses/2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -3243,6 +5540,20 @@ packages: strip-ansi: 6.0.1 dev: true + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + optional: true + + /strip-ansi/3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3270,6 +5581,11 @@ packages: engines: {node: '>=8'} dev: true + /supports-color/2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -3329,16 +5645,38 @@ packages: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true + /to-fast-properties/1.0.3: + resolution: {integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==} + engines: {node: '>=0.10.0'} + dev: true + /to-fast-properties/2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true + /to-object-path/0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + optional: true + /to-readable-stream/1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} engines: {node: '>=6'} dev: true + /to-regex-range/2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + optional: true + /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3346,6 +5684,17 @@ packages: is-number: 7.0.0 dev: true + /to-regex/3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + optional: true + /toidentifier/1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -3362,7 +5711,12 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false - /ts-jest/28.0.5_lt5llx2ti6zt4eclhanfli5ynu: + /trim-right/1.0.1: + resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} + engines: {node: '>=0.10.0'} + dev: true + + /ts-jest/28.0.5_d7p7jfykgzko2wul3x4xic5voa: resolution: {integrity: sha512-Sx9FyP9pCY7pUzQpy4FgRZf2bhHY3za576HMKJFs+OnQ9jS96Du5vNsDKkyedQkik+sEabbKAnCliv9BEsHZgQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} hasBin: true @@ -3380,6 +5734,7 @@ packages: esbuild: optional: true dependencies: + '@babel/core': 7.18.6 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 28.1.2_jbmz3vlfopghb5mdasddsdxfzq @@ -3460,6 +5815,40 @@ packages: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true + /unicode-canonical-property-names-ecmascript/2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript/2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.0.0 + dev: true + + /unicode-match-property-value-ecmascript/2.0.0: + resolution: {integrity: sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript/2.0.0: + resolution: {integrity: sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==} + engines: {node: '>=4'} + dev: true + + /union-value/1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + optional: true + /unique-string/2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} @@ -3472,6 +5861,15 @@ packages: engines: {node: '>= 0.8'} dev: false + /unset-value/1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + optional: true + /update-browserslist-db/1.0.4_browserslist@4.21.1: resolution: {integrity: sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==} hasBin: true @@ -3503,6 +5901,12 @@ packages: xdg-basedir: 4.0.0 dev: true + /urix/0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + optional: true + /url-parse-lax/3.0.0: resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} engines: {node: '>=4'} @@ -3514,6 +5918,23 @@ packages: resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} dev: false + /use/3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + + /user-home/1.1.1: + resolution: {integrity: sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + optional: true + /utils-merge/1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -3542,6 +5963,13 @@ packages: convert-source-map: 1.8.0 dev: true + /v8flags/2.1.1: + resolution: {integrity: sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA==} + engines: {node: '>= 0.10.0'} + dependencies: + user-home: 1.1.1 + dev: true + /vary/1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} diff --git a/backend/tsconfig.json b/backend/tsconfig.json index 52f7802..84cd3e8 100644 --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -3,4 +3,4 @@ "esModuleInterop": true, "types": ["jest", "node"] } -} \ No newline at end of file +} From 99298744d85e88e90b33aa6136207971ed820113 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 14:24:49 -0700 Subject: [PATCH 13/65] adding return statement --- backend/src/rating/ranking.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/rating/ranking.ts b/backend/src/rating/ranking.ts index d0406a0..fd5f348 100644 --- a/backend/src/rating/ranking.ts +++ b/backend/src/rating/ranking.ts @@ -25,6 +25,7 @@ const WEIGHTS = { export const getExternalRanking = (videos: youtube_v3.Schema$Video[]) => { if (!ensureWeightsAreCorrect(WEIGHTS)) { new ExpressError("Ranking Weights are incorrect", 500); + return; } const rawExternalScoreVideos = getRawExternalRanking(videos); From 0cfa32ee8efb7a3faaaa4892e543b9af464cebee Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 14:30:28 -0700 Subject: [PATCH 14/65] adding daysSincePublished test --- backend/src/rating/ranking.test.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/backend/src/rating/ranking.test.ts b/backend/src/rating/ranking.test.ts index ef57c19..9709099 100644 --- a/backend/src/rating/ranking.test.ts +++ b/backend/src/rating/ranking.test.ts @@ -1,4 +1,4 @@ -import { ensureWeightsAreCorrect } from "./ranking"; +import { ensureWeightsAreCorrect, getDaysSincePublished } from "./ranking"; test("weights should throw an error if weights are incorrect", () => { const testWeights1 = { @@ -23,3 +23,9 @@ test("weights should throw an error if weights are incorrect", () => { expect(ensureWeightsAreCorrect(testWeights2)).toBe(false); }); + +test("should return the days that have passed since then, given an ISO Date", () => { + const publishedAt = "2018-07-16T16:51:44Z"; + expect(getDaysSincePublished(publishedAt)).toBe(1456); + expect(getDaysSincePublished(new Date().toISOString())).toBe(0); +}); From df958a07dd2adf50d88f8ec8d96488f84141de2b Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 14:33:11 -0700 Subject: [PATCH 15/65] adding descriptionWithChapters test --- backend/src/rating/ranking.test.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/backend/src/rating/ranking.test.ts b/backend/src/rating/ranking.test.ts index 9709099..4067b82 100644 --- a/backend/src/rating/ranking.test.ts +++ b/backend/src/rating/ranking.test.ts @@ -1,4 +1,8 @@ -import { ensureWeightsAreCorrect, getDaysSincePublished } from "./ranking"; +import { + ensureWeightsAreCorrect, + getDaysSincePublished, + getUseOfChapters, +} from "./ranking"; test("weights should throw an error if weights are incorrect", () => { const testWeights1 = { @@ -29,3 +33,14 @@ test("should return the days that have passed since then, given an ISO Date", () expect(getDaysSincePublished(publishedAt)).toBe(1456); expect(getDaysSincePublished(new Date().toISOString())).toBe(0); }); + +test("should return if a video has chapters or not", () => { + const descriptionWithChapters = + "eact JS Tutorial - Get up & running with React JS: the most popular JavaScript library in the world! \n- Want to master React? Get my React mastery course: http://bit.ly/2KVl2A3\n- Subscribe for more videos like this: https://goo.gl/6PYaGF\n\nWant to learn more from me? Check out my blog and courses: \n\nCourses: https://codewithmosh.com\nBlog: https://programmingwithmosh.com \nFacebook: https://www.facebook.com/programmingwithmosh/\nTwitter: https://twitter.com/moshhamedani\n\nTABLE OF CONTENT\n\n00:00 Introduction\n01:14 What is React\n05:48 Setting Up the Development Environment \n09:27 Your First React App\n16:03 Hello World\n22:26 Components\n24:06 Setting Up the Project\n26:15 Your First React Component\n31:38 Specifying Children\n35:56 Embedding Expressions\n40:49 Setting Attributes\n46:36 Rendering Classes Dynamically\n50:57 Rendering Lists\n54:58 Conditional Rendering\n1:01:04 Handling Events\n1:03:56 Binding Event Handlers\n1:08:34 Updating the State\n1:10:51 What Happens When State Changes \n1:12:58 Passing Event Arguments\n1:17:31 Composing Components\n1:21:18 Passing Data to Components\n1:24:31 Passing Children\n1:27:44 Debugging React Apps\n1:31:55 Props vs State\n1:34:22 Raising and Handling Events\n1:39:16 Updating the State\n1:43:57 Single Source of Truth\n1:47:55 Removing the Local State\n1:54:44 Multiple Components in Sync \n2:00:39 Lifting the State Up\n2:06:18 Stateless Functional Components\n2:08:49 Destructuring Arguments\n2:10:52 Lifecycle Hooks\n2:12:32 Mounting Phase \n2:18:09 Updating Phase \n2:22:31 Unmounting Phase\n\n#react #webdevelopment #programming"; + + const descriptionWithoutChapters = + "🚨 IMPORTANT:\n\nFull React Course: https://courses.webdevsimplified.com/learn-react-today\n\nIn this video I will be covering all of the basics of React in only 30 minutes. We will cover create-react-app, components, state, props, rendering, event handling, and so much more. By the end of this video you will have a full understanding of the basics of React, but if you want to take your React knowledge to the next level checkout my full React course linked above for the best React learning experience on the web.\n\n\nšŸ“š Materials/References:\n\nHow To Install Node.js: https://youtu.be/VShtPwEkDD0\nDestructoring Video: https://youtu.be/NIq3qLaHCIs\nGitHub Code: https://github.com/WebDevSimplified/Learn-React-In-30-Minutes\n\n\n🧠 Concepts Covered:\n\n- React function components\n- React hooks\n- State management in React\n- Prop drilling\n- How to use create-react-app\n\n\nšŸŒŽ Find Me Here:\n\nMy Courses: https://courses.webdevsimplified.com\nPatreon: https://www.patreon.com/WebDevSimplified\nTwitter: https://twitter.com/DevSimplified\nDiscord: https://discord.gg/7StTjnR\nGitHub: https://github.com/WebDevSimplified\nCodePen: https://codepen.io/WebDevSimplified\n\n\n#Reactjs #WDS #JavaScript"; + + expect(getUseOfChapters(descriptionWithChapters)).toBe(1); + expect(getUseOfChapters(descriptionWithoutChapters)).toBe(0); +}); From b407f3ce0432ae2c688e5fa0852eb3c2b912d34e Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 14:36:11 -0700 Subject: [PATCH 16/65] adding daysXLikes test --- backend/src/rating/ranking.test.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/backend/src/rating/ranking.test.ts b/backend/src/rating/ranking.test.ts index 4067b82..0bb7517 100644 --- a/backend/src/rating/ranking.test.ts +++ b/backend/src/rating/ranking.test.ts @@ -1,5 +1,6 @@ import { ensureWeightsAreCorrect, + getDateXLikes, getDaysSincePublished, getUseOfChapters, } from "./ranking"; @@ -44,3 +45,14 @@ test("should return if a video has chapters or not", () => { expect(getUseOfChapters(descriptionWithChapters)).toBe(1); expect(getUseOfChapters(descriptionWithoutChapters)).toBe(0); }); + +test("should get the relation between date and likes", () => { + const likes1 = 50; + const daysSincePublished1 = 10; + + expect(getDateXLikes(likes1, daysSincePublished1)).toBe(5); + + const likes2 = 433442; + const daysSincePublished2 = 433.442; + expect(getDateXLikes(likes2, daysSincePublished2)).toBe(1000); +}); From 330d1e91f30bcb6a2629d81702fb8061996a51d2 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 14:49:23 -0700 Subject: [PATCH 17/65] adding getXLikes test --- backend/src/rating/ranking.test.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/backend/src/rating/ranking.test.ts b/backend/src/rating/ranking.test.ts index 0bb7517..cd59cbe 100644 --- a/backend/src/rating/ranking.test.ts +++ b/backend/src/rating/ranking.test.ts @@ -56,3 +56,14 @@ test("should get the relation between date and likes", () => { const daysSincePublished2 = 433.442; expect(getDateXLikes(likes2, daysSincePublished2)).toBe(1000); }); + +test("should get the relation between date and views", () => { + const views1 = 5040; + const daysSincePublished1 = 10; + + expect(getDateXLikes(views1, daysSincePublished1)).toBe(504); + + const views2 = 433442; + const daysSincePublished2 = 433.442; + expect(getDateXLikes(views2, daysSincePublished2)).toBe(1000); +}); From 6b655a9a6e1a26c5db056ea3f80ac1064102c24c Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 14:59:57 -0700 Subject: [PATCH 18/65] adding date test --- backend/src/rating/ranking.test.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backend/src/rating/ranking.test.ts b/backend/src/rating/ranking.test.ts index cd59cbe..f0a6392 100644 --- a/backend/src/rating/ranking.test.ts +++ b/backend/src/rating/ranking.test.ts @@ -1,5 +1,6 @@ import { ensureWeightsAreCorrect, + getDateScore, getDateXLikes, getDaysSincePublished, getUseOfChapters, @@ -67,3 +68,9 @@ test("should get the relation between date and views", () => { const daysSincePublished2 = 433.442; expect(getDateXLikes(views2, daysSincePublished2)).toBe(1000); }); + +test("should get a score based on how old a video is", () => { + expect(getDateScore(0)).toBe(10); + expect(getDateScore(1)).toBe(9.4); + expect(getDateScore(4.5)).toBe(2.7102788505282014); +}); From a920787b183dabef2bbe19d6d658e6bba3ad1aec Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 15:10:11 -0700 Subject: [PATCH 19/65] adding ranking test --- backend/src/rating/ranking.test.ts | 224 +++++++++++++++++++++++++++++ 1 file changed, 224 insertions(+) diff --git a/backend/src/rating/ranking.test.ts b/backend/src/rating/ranking.test.ts index f0a6392..fa66b5f 100644 --- a/backend/src/rating/ranking.test.ts +++ b/backend/src/rating/ranking.test.ts @@ -3,6 +3,8 @@ import { getDateScore, getDateXLikes, getDaysSincePublished, + getExternalRanking, + getRawExternalRanking, getUseOfChapters, } from "./ranking"; @@ -74,3 +76,225 @@ test("should get a score based on how old a video is", () => { expect(getDateScore(1)).toBe(9.4); expect(getDateScore(4.5)).toBe(2.7102788505282014); }); + +test("it should get the final score of a series of videos", () => { + const videosToRank = [ + { + kind: "youtube#video", + etag: "4PNSIKu_HYYjG5LknxySq9j2wQE", + id: "Ke90Tje7VS0", + snippet: { + publishedAt: "2018-07-16T16:51:44Z", + channelId: "UCWv7vMbMWH4-V0ZXdmDpPBA", + title: "React JS - React Tutorial for Beginners", + description: + "React JS Tutorial - Get up & running with React JS: the most popular JavaScript library in the world! \n- Want to master React? Get my React mastery course: http://bit.ly/2KVl2A3\n- Subscribe for more videos like this: https://goo.gl/6PYaGF\n\nWant to learn more from me? Check out my blog and courses: \n\nCourses: https://codewithmosh.com\nBlog: https://programmingwithmosh.com \nFacebook: https://www.facebook.com/programmingwithmosh/\nTwitter: https://twitter.com/moshhamedani\n\nTABLE OF CONTENT\n\n00:00 Introduction\n01:14 What is React\n05:48 Setting Up the Development Environment \n09:27 Your First React App\n16:03 Hello World\n22:26 Components\n24:06 Setting Up the Project\n26:15 Your First React Component\n31:38 Specifying Children\n35:56 Embedding Expressions\n40:49 Setting Attributes\n46:36 Rendering Classes Dynamically\n50:57 Rendering Lists\n54:58 Conditional Rendering\n1:01:04 Handling Events\n1:03:56 Binding Event Handlers\n1:08:34 Updating the State\n1:10:51 What Happens When State Changes \n1:12:58 Passing Event Arguments\n1:17:31 Composing Components\n1:21:18 Passing Data to Components\n1:24:31 Passing Children\n1:27:44 Debugging React Apps\n1:31:55 Props vs State\n1:34:22 Raising and Handling Events\n1:39:16 Updating the State\n1:43:57 Single Source of Truth\n1:47:55 Removing the Local State\n1:54:44 Multiple Components in Sync \n2:00:39 Lifting the State Up\n2:06:18 Stateless Functional Components\n2:08:49 Destructuring Arguments\n2:10:52 Lifecycle Hooks\n2:12:32 Mounting Phase \n2:18:09 Updating Phase \n2:22:31 Unmounting Phase\n\n#react #webdevelopment #programming", + thumbnails: { + default: { + url: "https://i.ytimg.com/vi/Ke90Tje7VS0/default.jpg", + width: 120, + height: 90, + }, + medium: { + url: "https://i.ytimg.com/vi/Ke90Tje7VS0/mqdefault.jpg", + width: 320, + height: 180, + }, + high: { + url: "https://i.ytimg.com/vi/Ke90Tje7VS0/hqdefault.jpg", + width: 480, + height: 360, + }, + }, + channelTitle: "Programming with Mosh", + tags: [ + "react js", + "react tutorial", + "learn react", + "react course", + "reactjs tutorial", + "react crash course", + "react js tutorial", + "reactjs course", + "react tutorial for beginners", + "react.js", + "reactjs tutorial for beginners", + "reactJS", + "react", + "learn reactjs", + "tutorial", + "javascript", + "crash course", + "programming with mosh", + "code with mosh", + "web development", + "mosh hamedani", + "learn react js", + ], + categoryId: "22", + liveBroadcastContent: "none", + localized: { + title: "React JS - React Tutorial for Beginners", + description: + "React JS Tutorial - Get up & running with React JS: the most popular JavaScript library in the world! \n- Want to master React? Get my React mastery course: http://bit.ly/2KVl2A3\n- Subscribe for more videos like this: https://goo.gl/6PYaGF\n\nWant to learn more from me? Check out my blog and courses: \n\nCourses: https://codewithmosh.com\nBlog: https://programmingwithmosh.com \nFacebook: https://www.facebook.com/programmingwithmosh/\nTwitter: https://twitter.com/moshhamedani\n\nTABLE OF CONTENT\n\n00:00 Introduction\n01:14 What is React\n05:48 Setting Up the Development Environment \n09:27 Your First React App\n16:03 Hello World\n22:26 Components\n24:06 Setting Up the Project\n26:15 Your First React Component\n31:38 Specifying Children\n35:56 Embedding Expressions\n40:49 Setting Attributes\n46:36 Rendering Classes Dynamically\n50:57 Rendering Lists\n54:58 Conditional Rendering\n1:01:04 Handling Events\n1:03:56 Binding Event Handlers\n1:08:34 Updating the State\n1:10:51 What Happens When State Changes \n1:12:58 Passing Event Arguments\n1:17:31 Composing Components\n1:21:18 Passing Data to Components\n1:24:31 Passing Children\n1:27:44 Debugging React Apps\n1:31:55 Props vs State\n1:34:22 Raising and Handling Events\n1:39:16 Updating the State\n1:43:57 Single Source of Truth\n1:47:55 Removing the Local State\n1:54:44 Multiple Components in Sync \n2:00:39 Lifting the State Up\n2:06:18 Stateless Functional Components\n2:08:49 Destructuring Arguments\n2:10:52 Lifecycle Hooks\n2:12:32 Mounting Phase \n2:18:09 Updating Phase \n2:22:31 Unmounting Phase\n\n#react #webdevelopment #programming", + }, + defaultAudioLanguage: "en", + }, + contentDetails: { + duration: "PT2H25M27S", + dimension: "2d", + definition: "hd", + caption: "false", + licensedContent: true, + contentRating: {}, + projection: "rectangular", + }, + statistics: { + viewCount: "5002487", + likeCount: "79120", + favoriteCount: "0", + commentCount: "4793", + }, + }, + { + kind: "youtube#video", + etag: "YQnZv7l0ezWokaM0Vk0v6lRMl1I", + id: "hQAHSlTtcmY", + snippet: { + publishedAt: "2019-10-22T16:00:07Z", + channelId: "UCFbNIlppjAuEX4znoulh0Cw", + title: "Learn React In 30 Minutes", + description: + "🚨 IMPORTANT:\n\nFull React Course: https://courses.webdevsimplified.com/learn-react-today\n\nIn this video I will be covering all of the basics of React in only 30 minutes. We will cover create-react-app, components, state, props, rendering, event handling, and so much more. By the end of this video you will have a full understanding of the basics of React, but if you want to take your React knowledge to the next level checkout my full React course linked above for the best React learning experience on the web.\n\n\nšŸ“š Materials/References:\n\nHow To Install Node.js: https://youtu.be/VShtPwEkDD0\nDestructoring Video: https://youtu.be/NIq3qLaHCIs\nGitHub Code: https://github.com/WebDevSimplified/Learn-React-In-30-Minutes\n\n\n🧠 Concepts Covered:\n\n- React function components\n- React hooks\n- State management in React\n- Prop drilling\n- How to use create-react-app\n\n\nšŸŒŽ Find Me Here:\n\nMy Courses: https://courses.webdevsimplified.com\nPatreon: https://www.patreon.com/WebDevSimplified\nTwitter: https://twitter.com/DevSimplified\nDiscord: https://discord.gg/7StTjnR\nGitHub: https://github.com/WebDevSimplified\nCodePen: https://codepen.io/WebDevSimplified\n\n\n#Reactjs #WDS #JavaScript", + thumbnails: { + default: { + url: "https://i.ytimg.com/vi/hQAHSlTtcmY/default.jpg", + width: 120, + height: 90, + }, + medium: { + url: "https://i.ytimg.com/vi/hQAHSlTtcmY/mqdefault.jpg", + width: 320, + height: 180, + }, + high: { + url: "https://i.ytimg.com/vi/hQAHSlTtcmY/hqdefault.jpg", + width: 480, + height: 360, + }, + standard: { + url: "https://i.ytimg.com/vi/hQAHSlTtcmY/sddefault.jpg", + width: 640, + height: 480, + }, + maxres: { + url: "https://i.ytimg.com/vi/hQAHSlTtcmY/maxresdefault.jpg", + width: 1280, + height: 720, + }, + }, + channelTitle: "Web Dev Simplified", + tags: [ + "webdevsimplified", + "learn react in 30 minutes", + "learn react", + "react tutorial", + "react crash course", + "react js tutorial", + "react js", + "reactjs", + "reactjs tutorial", + "reactjs crash course", + "learn reactjs", + "learn react js", + "react js project", + "react js todo app", + "react js tutorial for beginners", + "react crash course 2019", + "react crash course tutorial", + "react hooks tutorial", + "react hooks for beginners", + "react component tutorial", + "react components", + "reactjs hooks", + "reactjs hook tutorial", + "reactjs hooks project", + ], + categoryId: "27", + liveBroadcastContent: "none", + localized: { + title: "Learn React In 30 Minutes", + description: + "🚨 IMPORTANT:\n\nFull React Course: https://courses.webdevsimplified.com/learn-react-today\n\nIn this video I will be covering all of the basics of React in only 30 minutes. We will cover create-react-app, components, state, props, rendering, event handling, and so much more. By the end of this video you will have a full understanding of the basics of React, but if you want to take your React knowledge to the next level checkout my full React course linked above for the best React learning experience on the web.\n\n\nšŸ“š Materials/References:\n\nHow To Install Node.js: https://youtu.be/VShtPwEkDD0\nDestructoring Video: https://youtu.be/NIq3qLaHCIs\nGitHub Code: https://github.com/WebDevSimplified/Learn-React-In-30-Minutes\n\n\n🧠 Concepts Covered:\n\n- React function components\n- React hooks\n- State management in React\n- Prop drilling\n- How to use create-react-app\n\n\nšŸŒŽ Find Me Here:\n\nMy Courses: https://courses.webdevsimplified.com\nPatreon: https://www.patreon.com/WebDevSimplified\nTwitter: https://twitter.com/DevSimplified\nDiscord: https://discord.gg/7StTjnR\nGitHub: https://github.com/WebDevSimplified\nCodePen: https://codepen.io/WebDevSimplified\n\n\n#Reactjs #WDS #JavaScript", + }, + defaultAudioLanguage: "en-US", + }, + contentDetails: { + duration: "PT27M16S", + dimension: "2d", + definition: "hd", + caption: "false", + licensedContent: true, + contentRating: {}, + projection: "rectangular", + }, + statistics: { + viewCount: "804244", + likeCount: "18124", + favoriteCount: "0", + commentCount: "1220", + }, + }, + ]; + + const finalScore = getExternalRanking(videosToRank); + + const video1ExpectedResult = { + ...videosToRank[0], + raw_score: { + date: 4.480069005095963, + dateXViews: 1254057.5240384615, + dateXLikes: 54.34065934065934, + useOfChapters: 1, + }, + normalized_score: { + date: 0.4480069005095963, + dateXLikes: 1, + dateXViews: 1, + useOfChapters: 1, + }, + weighted_score: { + date: 26.88041403057578, + dateXLikes: 40, + dateXViews: 100, + useOfChapters: 100, + }, + final_score: 83.44020701528788, + }; + + const video2ExpectedResult = { + ...videosToRank[1], + raw_score: { + date: 7.408149936492211, + dateXViews: 295618.3887210473, + dateXLikes: 18.25176233635448, + useOfChapters: 0, + }, + normalized_score: { + date: 0.7408149936492211, + dateXLikes: 0.33587671842431904, + dateXViews: 0.23572952839440944, + useOfChapters: 0, + }, + weighted_score: { + date: 44.44889961895326, + dateXLikes: 13.435068736972761, + dateXViews: 23.572952839440944, + useOfChapters: 0, + }, + final_score: 36.01387002979529, + }; + + expect(finalScore[0]).toMatchObject(video1ExpectedResult); + expect(finalScore[1]).toMatchObject(video2ExpectedResult); +}); From 76e0fed7c450e17d40f4c71875a80e2cb197641f Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 15:11:52 -0700 Subject: [PATCH 20/65] adding jest unit test to gh action --- .github/workflows/run_tests.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 12009e7..444fb6f 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -1,7 +1,7 @@ name: testing on: [pull_request] jobs: - e2e-testing: + testing: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -13,3 +13,8 @@ jobs: run: | npm install npm run e2e:headless + - name: "Run Jest Unit Tests" + working-directory: ./backend + run: | + npm install + npm run test From 861442704aad0431e7b4b72f52d1f1eac2f33eda Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 15:41:18 -0700 Subject: [PATCH 21/65] Installing formik --- frontend/package.json | 1 + frontend/pnpm-lock.yaml | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index 41a91c2..b7f5542 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -16,6 +16,7 @@ "@chakra-ui/system": "^2.1.3", "@emotion/react": "^11", "@emotion/styled": "^11", + "formik": "^2.2.9", "framer-motion": "^6", "react": "^18.0.0", "react-dom": "^18.0.0", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 298f993..079f887 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -17,6 +17,7 @@ specifiers: cypress: ^10.3.0 eslint: ^8.18.0 eslint-plugin-react: ^7.30.1 + formik: ^2.2.9 framer-motion: ^6 react: ^18.0.0 react-dom: ^18.0.0 @@ -35,6 +36,7 @@ dependencies: '@chakra-ui/system': 2.1.3_fdnqutfacy7v3gmlcm66flps3q '@emotion/react': 11.9.3_4jaruczdv2uxjj3lb2xbkiuci4 '@emotion/styled': 11.9.3_toiz7tndcw4z2b7gxmmeo5fkcu + formik: 2.2.9_react@18.2.0 framer-motion: 6.3.16_biqbaboplfbrettd7655fr4n2y react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -2112,6 +2114,11 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true + /deepmerge/2.2.1: + resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==} + engines: {node: '>=0.10.0'} + dev: false + /define-properties/1.1.4: resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} engines: {node: '>= 0.4'} @@ -2737,6 +2744,21 @@ packages: mime-types: 2.1.35 dev: true + /formik/2.2.9_react@18.2.0: + resolution: {integrity: sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==} + peerDependencies: + react: '>=16.8.0' + dependencies: + deepmerge: 2.2.1 + hoist-non-react-statics: 3.3.2 + lodash: 4.17.21 + lodash-es: 4.17.21 + react: 18.2.0 + react-fast-compare: 2.0.4 + tiny-warning: 1.0.3 + tslib: 1.14.1 + dev: false + /framer-motion/6.3.16_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-1kuXvOVss/Rzi+XHuYq6RPjwnZGkfnfvtBpCpZm+kYhLGA6ICHwfAJtG1ohz1ruSAFVMz3RSpanTf6TOPG979A==} peerDependencies: @@ -3288,6 +3310,10 @@ packages: wrap-ansi: 7.0.0 dev: true + /lodash-es/4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -3302,7 +3328,6 @@ packages: /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true /log-symbols/4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -3650,6 +3675,10 @@ packages: scheduler: 0.23.0 dev: false + /react-fast-compare/2.0.4: + resolution: {integrity: sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==} + dev: false + /react-fast-compare/3.2.0: resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==} dev: false @@ -4095,6 +4124,10 @@ packages: resolution: {integrity: sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==} dev: false + /tiny-warning/1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + dev: false + /tmp/0.2.1: resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} engines: {node: '>=8.17.0'} From 532d8f88f458742c61e0a291095fd61c17ee320b Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 15:41:55 -0700 Subject: [PATCH 22/65] installing yup --- frontend/package.json | 3 ++- frontend/pnpm-lock.yaml | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index b7f5542..e3c2931 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,7 +23,8 @@ "react-icons": "^4.4.0", "react-query": "^3.39.1", "react-router-dom": "^6.3.0", - "react-router-hash-link": "^2.4.3" + "react-router-hash-link": "^2.4.3", + "yup": "^0.32.11" }, "devDependencies": { "@types/node": "^18.0.1", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 079f887..4e84782 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -28,6 +28,7 @@ specifiers: typescript: ^4.6.3 vite: ^2.9.9 vite-plugin-eslint: ^1.6.1 + yup: ^0.32.11 dependencies: '@babel/core': 7.18.6 @@ -44,6 +45,7 @@ dependencies: react-query: 3.39.1_biqbaboplfbrettd7655fr4n2y react-router-dom: 6.3.0_biqbaboplfbrettd7655fr4n2y react-router-hash-link: 2.4.3_gghooq75xnjwyznt6ahhkj73mi + yup: 0.32.11 devDependencies: '@types/node': 18.0.1 @@ -3423,6 +3425,10 @@ packages: big-integer: 1.6.51 dev: false + /nanoclone/0.2.1: + resolution: {integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==} + dev: false + /nanoid/3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3627,6 +3633,10 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 + /property-expr/2.0.5: + resolution: {integrity: sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==} + dev: false + /proxy-from-env/1.0.0: resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} dev: true @@ -4150,6 +4160,10 @@ packages: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} dev: false + /toposort/2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + dev: false + /tough-cookie/2.5.0: resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} engines: {node: '>=0.8'} @@ -4394,3 +4408,16 @@ packages: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 dev: true + + /yup/0.32.11: + resolution: {integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==} + engines: {node: '>=10'} + dependencies: + '@babel/runtime': 7.18.6 + '@types/lodash': 4.14.182 + lodash: 4.17.21 + lodash-es: 4.17.21 + nanoclone: 0.2.1 + property-expr: 2.0.5 + toposort: 2.0.2 + dev: false From 8926dd52d5fe72e0db60e6cd14fd567e01774f5f Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 15:44:15 -0700 Subject: [PATCH 23/65] Adding formik and yup validationi --- .../components/Registration/RegisterIndex.tsx | 100 ++++++++++++------ 1 file changed, 65 insertions(+), 35 deletions(-) diff --git a/frontend/src/components/Registration/RegisterIndex.tsx b/frontend/src/components/Registration/RegisterIndex.tsx index c3b8176..227515a 100644 --- a/frontend/src/components/Registration/RegisterIndex.tsx +++ b/frontend/src/components/Registration/RegisterIndex.tsx @@ -1,5 +1,4 @@ import { - Box, Button, Center, Flex, @@ -8,47 +7,78 @@ import { Heading, Input, } from "@chakra-ui/react"; +import { Field, Form, Formik } from "formik"; import React from "react"; import { Link } from "react-router-dom"; import useThemeColor from "../../hooks/useThemeColor"; +import * as Yup from "yup"; + +interface IRegisterForm { + username: string; + email: string; + password: string; +} + +const schema = Yup.object({ + username: Yup.string().required("Username is required"), + email: Yup.string().required("Email is required"), + password: Yup.string() + .min(8, "Password must be 8 characters or longer") + .required("Password is required"), +}); const RegisterIndex = () => { const { backgroundColor, borderColor } = useThemeColor(); + + const handleOnSubmit = (values: IRegisterForm) => { + console.log(values); + }; + return ( -
- - - Join Learning U! - - Username - - - - Email - - - - Password - - - - - - - - -
+ + {() => ( +
+
+ + + Join Learning U! + + Username + + + + Email + + + + Password + + + + + + + + +
+
+ )} +
); }; From 64732f16aba69c1ef9e00ad3d963ed325301c6e5 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 15:47:44 -0700 Subject: [PATCH 24/65] Adding form error messages --- .../components/Registration/RegisterIndex.tsx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/Registration/RegisterIndex.tsx b/frontend/src/components/Registration/RegisterIndex.tsx index 227515a..7418a68 100644 --- a/frontend/src/components/Registration/RegisterIndex.tsx +++ b/frontend/src/components/Registration/RegisterIndex.tsx @@ -3,11 +3,12 @@ import { Center, Flex, FormControl, + FormErrorMessage, FormLabel, Heading, Input, } from "@chakra-ui/react"; -import { Field, Form, Formik } from "formik"; +import { ErrorMessage, Field, Form, Formik } from "formik"; import React from "react"; import { Link } from "react-router-dom"; import useThemeColor from "../../hooks/useThemeColor"; @@ -40,32 +41,35 @@ const RegisterIndex = () => { onSubmit={handleOnSubmit} validationSchema={schema} > - {() => ( + {({ errors }) => (
- + Join Learning U! - + Username + {errors.username} - + Email + {errors.email} - + Password + {errors.password} From 0737e8fbf178f27ec5f084c8944f0326aeb800ec Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 15:58:32 -0700 Subject: [PATCH 25/65] adding axio --- frontend/package.json | 1 + frontend/pnpm-lock.yaml | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index e3c2931..756c190 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -16,6 +16,7 @@ "@chakra-ui/system": "^2.1.3", "@emotion/react": "^11", "@emotion/styled": "^11", + "axios": "^0.27.2", "formik": "^2.2.9", "framer-motion": "^6", "react": "^18.0.0", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 4e84782..3ef488d 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -14,6 +14,7 @@ specifiers: '@typescript-eslint/eslint-plugin': ^5.30.0 '@typescript-eslint/parser': ^5.30.0 '@vitejs/plugin-react': ^1.3.0 + axios: ^0.27.2 cypress: ^10.3.0 eslint: ^8.18.0 eslint-plugin-react: ^7.30.1 @@ -37,6 +38,7 @@ dependencies: '@chakra-ui/system': 2.1.3_fdnqutfacy7v3gmlcm66flps3q '@emotion/react': 11.9.3_4jaruczdv2uxjj3lb2xbkiuci4 '@emotion/styled': 11.9.3_toiz7tndcw4z2b7gxmmeo5fkcu + axios: 0.27.2 formik: 2.2.9_react@18.2.0 framer-motion: 6.3.16_biqbaboplfbrettd7655fr4n2y react: 18.2.0 @@ -1751,7 +1753,6 @@ packages: /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true /at-least-node/1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} @@ -1766,6 +1767,15 @@ packages: resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} dev: true + /axios/0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.1 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: false + /babel-plugin-macros/2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: @@ -1952,7 +1962,6 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - dev: true /commander/5.1.0: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} @@ -2132,7 +2141,6 @@ packages: /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: true /detect-node-es/1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} @@ -2733,6 +2741,16 @@ packages: tslib: 2.4.0 dev: false + /follow-redirects/1.15.1: + resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /forever-agent/0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true @@ -2746,6 +2764,15 @@ packages: mime-types: 2.1.35 dev: true + /form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /formik/2.2.9_react@18.2.0: resolution: {integrity: sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==} peerDependencies: @@ -3393,14 +3420,12 @@ packages: /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - dev: true /mime-types/2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - dev: true /mimic-fn/2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} From 4378856373662fa85839432a67294cce9f3b7273 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 15:58:42 -0700 Subject: [PATCH 26/65] adding base url constant --- frontend/src/utils/constants.ts | 1 + 1 file changed, 1 insertion(+) create mode 100644 frontend/src/utils/constants.ts diff --git a/frontend/src/utils/constants.ts b/frontend/src/utils/constants.ts new file mode 100644 index 0000000..75d0e16 --- /dev/null +++ b/frontend/src/utils/constants.ts @@ -0,0 +1 @@ +export const baseURL = "http://localhost:3001"; From ddc1c099410f2e717bee5235874b19757ff8bdc5 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 15:58:49 -0700 Subject: [PATCH 27/65] adding query provider --- frontend/src/main.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 2a89d4d..e88c75b 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -1,6 +1,7 @@ import { ChakraProvider, ColorModeScript, extendTheme } from "@chakra-ui/react"; import React from "react"; import ReactDOM from "react-dom/client"; +import { QueryClient, QueryClientProvider } from "react-query"; import App from "./App"; import "./main.css"; @@ -13,12 +14,15 @@ const theme = extendTheme({ }, }); +const queryClient = new QueryClient(); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion ReactDOM.createRoot(document.getElementById("root")!).render( - - + + + + ); From b15fe28f6198f2aa3b192fe3be18c38e83a45050 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 15:59:01 -0700 Subject: [PATCH 28/65] adding handleRegistration mutation --- .../components/Registration/RegisterIndex.tsx | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/Registration/RegisterIndex.tsx b/frontend/src/components/Registration/RegisterIndex.tsx index 7418a68..808fe4a 100644 --- a/frontend/src/components/Registration/RegisterIndex.tsx +++ b/frontend/src/components/Registration/RegisterIndex.tsx @@ -8,11 +8,14 @@ import { Heading, Input, } from "@chakra-ui/react"; -import { ErrorMessage, Field, Form, Formik } from "formik"; +import { Field, Form, Formik } from "formik"; import React from "react"; import { Link } from "react-router-dom"; import useThemeColor from "../../hooks/useThemeColor"; +import { useMutation, useQuery } from "react-query"; +import axios from "axios"; import * as Yup from "yup"; +import { baseURL } from "../../utils/constants"; interface IRegisterForm { username: string; @@ -32,9 +35,24 @@ const RegisterIndex = () => { const { backgroundColor, borderColor } = useThemeColor(); const handleOnSubmit = (values: IRegisterForm) => { - console.log(values); + handleRegistration.mutate(values); }; + const handleRegistration = useMutation( + async (values: IRegisterForm) => { + const response = await axios.post(`${baseURL}/auth/register`, values); + return response.data; + }, + { + onSuccess: () => { + alert("Registered succesfully"); + }, + onError: () => { + alert("There was an error with your login"); + }, + } + ); + return ( { backgroundColor={backgroundColor} borderColor={borderColor} borderWidth={1} - // h={{ base: "70%", md: "60%" }} w={{ base: "90%", md: "30%" }} p={10} flexDir="column" @@ -68,7 +85,7 @@ const RegisterIndex = () => { Password - + {errors.password} @@ -76,7 +93,9 @@ const RegisterIndex = () => { - +
From 7d25e6e8d23c8d9d70fee82a99df8075e3d24d76 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 16:03:19 -0700 Subject: [PATCH 29/65] Adding cors --- backend/app.ts | 2 ++ backend/package.json | 1 + backend/pnpm-lock.yaml | 15 +++++++++++++++ 3 files changed, 18 insertions(+) diff --git a/backend/app.ts b/backend/app.ts index d88a409..c3716a8 100644 --- a/backend/app.ts +++ b/backend/app.ts @@ -3,6 +3,7 @@ import dotenv from "dotenv"; import Parse from "parse/node"; import auth from "./routes/auth"; +import cors from "cors"; import { NotFoundError } from "./utils/errors"; dotenv.config(); @@ -13,6 +14,7 @@ Parse.serverURL = process.env.PARSE_SERVER_URL; const app = express(); app.use(express.json()); +app.use(cors()); app.use("/auth", auth); diff --git a/backend/package.json b/backend/package.json index 35088b2..0f4bca7 100644 --- a/backend/package.json +++ b/backend/package.json @@ -12,6 +12,7 @@ "author": "", "license": "ISC", "dependencies": { + "cors": "^2.8.5", "dotenv": "^16.0.1", "express": "^4.18.1", "nodemailer": "^6.7.5", diff --git a/backend/pnpm-lock.yaml b/backend/pnpm-lock.yaml index 58e0c48..6f63016 100644 --- a/backend/pnpm-lock.yaml +++ b/backend/pnpm-lock.yaml @@ -6,6 +6,7 @@ specifiers: '@types/node': ^18.0.0 '@types/nodemailer': ^6.4.4 '@types/parse': ^2.18.16 + cors: ^2.8.5 dotenv: ^16.0.1 express: ^4.18.1 jest: ^28.1.2 @@ -17,6 +18,7 @@ specifiers: typescript: ^4.7.4 dependencies: + cors: 2.8.5 dotenv: 16.0.1 express: 4.18.1 nodemailer: 6.7.5 @@ -1270,6 +1272,14 @@ packages: requiresBuild: true dev: false + /cors/2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: false + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -2588,6 +2598,11 @@ packages: path-key: 3.1.1 dev: true + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + /object-inspect/1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} dev: false From a62e6e25f2a1e64ee487b32b456ce8885aa5d748 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 16:16:01 -0700 Subject: [PATCH 30/65] Adding toast on succes and failure --- .../components/Registration/RegisterIndex.tsx | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/Registration/RegisterIndex.tsx b/frontend/src/components/Registration/RegisterIndex.tsx index 808fe4a..5f807c1 100644 --- a/frontend/src/components/Registration/RegisterIndex.tsx +++ b/frontend/src/components/Registration/RegisterIndex.tsx @@ -7,6 +7,7 @@ import { FormLabel, Heading, Input, + useToast, } from "@chakra-ui/react"; import { Field, Form, Formik } from "formik"; import React from "react"; @@ -33,6 +34,7 @@ const schema = Yup.object({ const RegisterIndex = () => { const { backgroundColor, borderColor } = useThemeColor(); + const toast = useToast(); const handleOnSubmit = (values: IRegisterForm) => { handleRegistration.mutate(values); @@ -45,10 +47,22 @@ const RegisterIndex = () => { }, { onSuccess: () => { - alert("Registered succesfully"); + toast({ + title: "Account created.", + description: "We've created your account for you.", + status: "success", + duration: 5000, + isClosable: true, + }); }, - onError: () => { - alert("There was an error with your login"); + onError: (error) => { + toast({ + title: "An error ocurred", + description: error.response.data.message, + status: "error", + duration: 5000, + isClosable: true, + }); }, } ); From aa9c24568ce64b0e408987bdbbc85200b260a6b1 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Mon, 11 Jul 2022 16:20:32 -0700 Subject: [PATCH 31/65] Adding typescript to error handler --- .../src/components/Registration/RegisterIndex.tsx | 12 ++++++++---- frontend/src/types/requests.d.ts | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 frontend/src/types/requests.d.ts diff --git a/frontend/src/components/Registration/RegisterIndex.tsx b/frontend/src/components/Registration/RegisterIndex.tsx index 5f807c1..051211e 100644 --- a/frontend/src/components/Registration/RegisterIndex.tsx +++ b/frontend/src/components/Registration/RegisterIndex.tsx @@ -11,12 +11,13 @@ import { } from "@chakra-ui/react"; import { Field, Form, Formik } from "formik"; import React from "react"; -import { Link } from "react-router-dom"; +import { Link, useNavigate } from "react-router-dom"; import useThemeColor from "../../hooks/useThemeColor"; import { useMutation, useQuery } from "react-query"; -import axios from "axios"; +import axios, { AxiosError } from "axios"; import * as Yup from "yup"; import { baseURL } from "../../utils/constants"; +import { ErrorType } from "../../types/requests"; interface IRegisterForm { username: string; @@ -34,7 +35,9 @@ const schema = Yup.object({ const RegisterIndex = () => { const { backgroundColor, borderColor } = useThemeColor(); + const toast = useToast(); + const navigate = useNavigate(); const handleOnSubmit = (values: IRegisterForm) => { handleRegistration.mutate(values); @@ -54,11 +57,12 @@ const RegisterIndex = () => { duration: 5000, isClosable: true, }); + navigate("/login"); }, - onError: (error) => { + onError: (error: AxiosError) => { toast({ title: "An error ocurred", - description: error.response.data.message, + description: error.response?.data.message, status: "error", duration: 5000, isClosable: true, diff --git a/frontend/src/types/requests.d.ts b/frontend/src/types/requests.d.ts new file mode 100644 index 0000000..55982fb --- /dev/null +++ b/frontend/src/types/requests.d.ts @@ -0,0 +1 @@ +export type ErrorType = { status: number; message: string }; From 4f7c5bb18c66fa84d8d79543c41d5e5a0b47ed6e Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 09:44:55 -0700 Subject: [PATCH 32/65] Adding formik to login form --- .../components/Registration/LoginIndex.tsx | 91 ++++++++++++------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/frontend/src/components/Registration/LoginIndex.tsx b/frontend/src/components/Registration/LoginIndex.tsx index e00d81d..3290b01 100644 --- a/frontend/src/components/Registration/LoginIndex.tsx +++ b/frontend/src/components/Registration/LoginIndex.tsx @@ -3,50 +3,75 @@ import { Center, Flex, FormControl, + FormErrorMessage, FormLabel, Heading, Input, } from "@chakra-ui/react"; +import { Field, Form, Formik } from "formik"; import React from "react"; import { Link } from "react-router-dom"; import useThemeColor from "../../hooks/useThemeColor"; +interface ILoginForm { + username: string; + password: string; +} + const LoginIndex = () => { const { backgroundColor, borderColor } = useThemeColor(); + + const handleOnSubmit = (values: ILoginForm) => { + console.log(values); + }; + return ( -
- - - Welcome back! - - Username or email - - - - Password - - - - - - - - - -
+ + {({ errors, touched }) => ( + +
+ + + Welcome back! + + Username or email + + {errors.username} + + + Password + + {errors.password} + + + + + + + + +
+ + )} +
); }; From cf421b353d85138d90f31f3cc032ca10421c67d1 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 09:55:56 -0700 Subject: [PATCH 33/65] Adding handle login mutation --- backend/routes/auth.ts | 2 +- .../components/Registration/LoginIndex.tsx | 24 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/backend/routes/auth.ts b/backend/routes/auth.ts index d19803b..361ff69 100644 --- a/backend/routes/auth.ts +++ b/backend/routes/auth.ts @@ -5,7 +5,7 @@ import type { IUser } from "../types/user"; const auth = express.Router(); -auth.get("/login", async (req, res, next) => { +auth.post("/login", async (req, res, next) => { const { username, password } = req.body; if (!username || !password) { diff --git a/frontend/src/components/Registration/LoginIndex.tsx b/frontend/src/components/Registration/LoginIndex.tsx index 3290b01..429c928 100644 --- a/frontend/src/components/Registration/LoginIndex.tsx +++ b/frontend/src/components/Registration/LoginIndex.tsx @@ -8,10 +8,13 @@ import { Heading, Input, } from "@chakra-ui/react"; +import axios from "axios"; import { Field, Form, Formik } from "formik"; import React from "react"; +import { useMutation } from "react-query"; import { Link } from "react-router-dom"; import useThemeColor from "../../hooks/useThemeColor"; +import { baseURL } from "../../utils/constants"; interface ILoginForm { username: string; @@ -22,9 +25,24 @@ const LoginIndex = () => { const { backgroundColor, borderColor } = useThemeColor(); const handleOnSubmit = (values: ILoginForm) => { - console.log(values); + handleLogin.mutate(values); }; + const handleLogin = useMutation( + async (values: ILoginForm) => { + const res = await axios.post(`${baseURL}/auth/login`, values); + return res.data; + }, + { + onSuccess: (res) => { + console.log("Success ", res); + }, + onError: () => { + console.log("Error"); + }, + } + ); + return ( { Don{"'"}t have an account yet? Register here! - + From 3eb3bd1fed79749b3eb8d443738bea8cb6f73891 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:05:14 -0700 Subject: [PATCH 34/65] Adding frontend auth helper functions --- frontend/src/types/global.d.ts | 5 +++++ frontend/src/types/user.d.ts | 8 ++++++++ 2 files changed, 13 insertions(+) create mode 100644 frontend/src/types/global.d.ts create mode 100644 frontend/src/types/user.d.ts diff --git a/frontend/src/types/global.d.ts b/frontend/src/types/global.d.ts new file mode 100644 index 0000000..de11dc2 --- /dev/null +++ b/frontend/src/types/global.d.ts @@ -0,0 +1,5 @@ +export interface DbObject { + createdAt: string; + updatedAt: string; + objectId: string; +} diff --git a/frontend/src/types/user.d.ts b/frontend/src/types/user.d.ts new file mode 100644 index 0000000..d6d62c0 --- /dev/null +++ b/frontend/src/types/user.d.ts @@ -0,0 +1,8 @@ +import { DbObject } from "./global"; + +interface IUser extends DbObject { + username: string; + email: string; + sessionToken: string; + ACL: object; +} From 782d7e23602fea0a60eee08d3ba4cf4e9c01c3d6 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:05:21 -0700 Subject: [PATCH 35/65] Adding auth helper function --- frontend/src/utils/auth.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 frontend/src/utils/auth.ts diff --git a/frontend/src/utils/auth.ts b/frontend/src/utils/auth.ts new file mode 100644 index 0000000..4197192 --- /dev/null +++ b/frontend/src/utils/auth.ts @@ -0,0 +1,32 @@ +import { useEffect, useState } from "react"; +import { IUser } from "../types/user"; + +export const persistUser = (user: IUser) => { + localStorage.setItem("user", JSON.stringify(user)); +}; + +export const getCachedUser = (): IUser | null => { + const userString = localStorage.get("user"); + if (!userString) return null; + return JSON.parse(userString) as IUser; +}; + +export const deleteCachedUser = () => { + localStorage.removeItem("user"); +}; + +export const useSession = () => { + const [user, setUser] = useState(null); + + useEffect(() => { + fetchUser(); + }, []); + + const fetchUser = () => { + const cachedUser = getCachedUser(); + if (!cachedUser) return; + setUser(cachedUser); + }; + + return { user, fetchUser }; +}; From a4c0c053496fcb32892989bc9fe21c7c4632df81 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:11:22 -0700 Subject: [PATCH 36/65] Adding error handler to login --- .../components/Registration/LoginIndex.tsx | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/Registration/LoginIndex.tsx b/frontend/src/components/Registration/LoginIndex.tsx index 429c928..c535e0f 100644 --- a/frontend/src/components/Registration/LoginIndex.tsx +++ b/frontend/src/components/Registration/LoginIndex.tsx @@ -7,13 +7,17 @@ import { FormLabel, Heading, Input, + useToast, } from "@chakra-ui/react"; -import axios from "axios"; +import axios, { AxiosError } from "axios"; import { Field, Form, Formik } from "formik"; import React from "react"; import { useMutation } from "react-query"; import { Link } from "react-router-dom"; import useThemeColor from "../../hooks/useThemeColor"; +import { ErrorType } from "../../types/requests"; +import { IUser } from "../../types/user"; +import { persistUser } from "../../utils/auth"; import { baseURL } from "../../utils/constants"; interface ILoginForm { @@ -24,21 +28,29 @@ interface ILoginForm { const LoginIndex = () => { const { backgroundColor, borderColor } = useThemeColor(); + const toast = useToast(); const handleOnSubmit = (values: ILoginForm) => { handleLogin.mutate(values); }; const handleLogin = useMutation( async (values: ILoginForm) => { - const res = await axios.post(`${baseURL}/auth/login`, values); + const res = await axios.post(`${baseURL}/auth/login`, values); return res.data; }, { - onSuccess: (res) => { - console.log("Success ", res); + onSuccess: (user) => { + persistUser(user); + window.location.reload(); }, - onError: () => { - console.log("Error"); + onError: (error: AxiosError) => { + toast({ + title: "An error ocurred", + description: error.response?.data.message, + status: "error", + duration: 5000, + isClosable: true, + }); }, } ); From 7415f197e7b5532e838aa2f191ff358bcbae7a4b Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:11:30 -0700 Subject: [PATCH 37/65] Adding is fetching to login hook --- frontend/src/utils/auth.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/utils/auth.ts b/frontend/src/utils/auth.ts index 4197192..5b8b2f2 100644 --- a/frontend/src/utils/auth.ts +++ b/frontend/src/utils/auth.ts @@ -17,16 +17,19 @@ export const deleteCachedUser = () => { export const useSession = () => { const [user, setUser] = useState(null); + const [isFetching, setIsFetching] = useState(true); useEffect(() => { fetchUser(); }, []); const fetchUser = () => { + setIsFetching(true); const cachedUser = getCachedUser(); if (!cachedUser) return; setUser(cachedUser); + setIsFetching(false); }; - return { user, fetchUser }; + return { user, fetchUser, isFetching }; }; From 979ffdd7513dec7ea767f214f070fba8b56d3f8d Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:12:54 -0700 Subject: [PATCH 38/65] Adding validation schema to login form --- frontend/src/components/Registration/LoginIndex.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/frontend/src/components/Registration/LoginIndex.tsx b/frontend/src/components/Registration/LoginIndex.tsx index c535e0f..b393d3b 100644 --- a/frontend/src/components/Registration/LoginIndex.tsx +++ b/frontend/src/components/Registration/LoginIndex.tsx @@ -19,12 +19,18 @@ import { ErrorType } from "../../types/requests"; import { IUser } from "../../types/user"; import { persistUser } from "../../utils/auth"; import { baseURL } from "../../utils/constants"; +import * as Yup from "yup"; interface ILoginForm { username: string; password: string; } +const schema = Yup.object({ + username: Yup.string().required("Username is required"), + password: Yup.string().required("Password is required"), +}); + const LoginIndex = () => { const { backgroundColor, borderColor } = useThemeColor(); @@ -59,6 +65,7 @@ const LoginIndex = () => { {({ errors, touched }) => (
From 4d7ee719318d87646e6149562907380cdcc18082 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:22:30 -0700 Subject: [PATCH 39/65] Adding requireAuth component --- frontend/src/App.tsx | 1 + frontend/src/components/Navbar.tsx | 11 +++++++++++ .../components/Registration/RequireAuth.tsx | 19 +++++++++++++++++++ frontend/src/utils/auth.ts | 2 +- 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 frontend/src/components/Registration/RequireAuth.tsx diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 64ef37f..4fadd9c 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -6,6 +6,7 @@ import HubIndex from "./components/Hub/HubIndex"; import Navbar from "./components/Navbar"; import LoginIndex from "./components/Registration/LoginIndex"; import RegisterIndex from "./components/Registration/RegisterIndex"; +import RequireAuth from "./components/Registration/RequireAuth"; function App() { return ( diff --git a/frontend/src/components/Navbar.tsx b/frontend/src/components/Navbar.tsx index 25f3a95..dd7827e 100644 --- a/frontend/src/components/Navbar.tsx +++ b/frontend/src/components/Navbar.tsx @@ -9,13 +9,19 @@ import { } from "@chakra-ui/react"; import { MoonIcon, SunIcon } from "@chakra-ui/icons"; import useThemeColor from "../hooks/useThemeColor"; +import { deleteCachedUser, useSession } from "../utils/auth"; const Navbar = () => { const { toggleColorMode, colorMode } = useColorMode(); const colorToggleIcon = colorMode === "dark" ? : ; const { backgroundColor, borderColor } = useThemeColor(); + const { user } = useSession(); + const handleLogout = () => { + deleteCachedUser(); + window.location.reload(); + }; return ( { aria-label="Toggle Color Icon" onClick={() => toggleColorMode()} /> + {user && ( + + )} diff --git a/frontend/src/components/Registration/RequireAuth.tsx b/frontend/src/components/Registration/RequireAuth.tsx new file mode 100644 index 0000000..8903363 --- /dev/null +++ b/frontend/src/components/Registration/RequireAuth.tsx @@ -0,0 +1,19 @@ +import React from "react"; +import { Navigate, useLocation, useNavigate } from "react-router-dom"; +import { useSession } from "../../utils/auth"; + +interface Props { + children: JSX.Element; +} +const RequireAuth = ({ children }: Props) => { + const { isFetching, user } = useSession(); + const location = useLocation(); + + if (!isFetching && !user) { + return ; + } + + return children; +}; + +export default RequireAuth; diff --git a/frontend/src/utils/auth.ts b/frontend/src/utils/auth.ts index 5b8b2f2..07f3f7e 100644 --- a/frontend/src/utils/auth.ts +++ b/frontend/src/utils/auth.ts @@ -6,7 +6,7 @@ export const persistUser = (user: IUser) => { }; export const getCachedUser = (): IUser | null => { - const userString = localStorage.get("user"); + const userString = localStorage.getItem("user"); if (!userString) return null; return JSON.parse(userString) as IUser; }; From 12ea174aa9a7e79b8d583321f1dfce3c025f106f Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:24:35 -0700 Subject: [PATCH 40/65] Removing isFetching as it is unnecesary --- frontend/src/App.tsx | 9 ++++++++- frontend/src/components/Registration/RequireAuth.tsx | 4 ++-- frontend/src/utils/auth.ts | 5 +---- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 92f43a2..9eedd3e 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -18,7 +18,14 @@ function App() { } /> } /> } /> - }> + + + + } + > } /> } /> diff --git a/frontend/src/components/Registration/RequireAuth.tsx b/frontend/src/components/Registration/RequireAuth.tsx index 8903363..e70b50e 100644 --- a/frontend/src/components/Registration/RequireAuth.tsx +++ b/frontend/src/components/Registration/RequireAuth.tsx @@ -6,10 +6,10 @@ interface Props { children: JSX.Element; } const RequireAuth = ({ children }: Props) => { - const { isFetching, user } = useSession(); + const { user } = useSession(); const location = useLocation(); - if (!isFetching && !user) { + if (!user) { return ; } diff --git a/frontend/src/utils/auth.ts b/frontend/src/utils/auth.ts index 07f3f7e..2521680 100644 --- a/frontend/src/utils/auth.ts +++ b/frontend/src/utils/auth.ts @@ -17,19 +17,16 @@ export const deleteCachedUser = () => { export const useSession = () => { const [user, setUser] = useState(null); - const [isFetching, setIsFetching] = useState(true); useEffect(() => { fetchUser(); }, []); const fetchUser = () => { - setIsFetching(true); const cachedUser = getCachedUser(); if (!cachedUser) return; setUser(cachedUser); - setIsFetching(false); }; - return { user, fetchUser, isFetching }; + return { user, fetchUser }; }; From b58bf61c6c0b1ad76dcf114aa96f26a7b3b78d7a Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:32:26 -0700 Subject: [PATCH 41/65] Readding isFetching because it has a purpose --- frontend/src/utils/auth.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/frontend/src/utils/auth.ts b/frontend/src/utils/auth.ts index 2521680..5c47aef 100644 --- a/frontend/src/utils/auth.ts +++ b/frontend/src/utils/auth.ts @@ -17,16 +17,22 @@ export const deleteCachedUser = () => { export const useSession = () => { const [user, setUser] = useState(null); + const [isFetching, setIsFetching] = useState(true); useEffect(() => { fetchUser(); }, []); const fetchUser = () => { + setIsFetching(true); const cachedUser = getCachedUser(); - if (!cachedUser) return; + if (!cachedUser) { + setIsFetching(false); + return; + } setUser(cachedUser); + setIsFetching(false); }; - return { user, fetchUser }; + return { user, fetchUser, isFetching }; }; From f2e4187c57d1587548cde17152e0eddd4add8c09 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:32:39 -0700 Subject: [PATCH 42/65] Adding loading spinner --- .../components/Registration/RequireAuth.tsx | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/Registration/RequireAuth.tsx b/frontend/src/components/Registration/RequireAuth.tsx index e70b50e..e19570e 100644 --- a/frontend/src/components/Registration/RequireAuth.tsx +++ b/frontend/src/components/Registration/RequireAuth.tsx @@ -1,3 +1,4 @@ +import { Box, Center, Spinner } from "@chakra-ui/react"; import React from "react"; import { Navigate, useLocation, useNavigate } from "react-router-dom"; import { useSession } from "../../utils/auth"; @@ -5,15 +6,27 @@ import { useSession } from "../../utils/auth"; interface Props { children: JSX.Element; } + const RequireAuth = ({ children }: Props) => { - const { user } = useSession(); + const { user, isFetching } = useSession(); const location = useLocation(); - if (!user) { - return ; - } + console.log(user, isFetching); + const handleRender = () => { + if (!isFetching) + return ( +
+
+ +
+
+ ); + if (!user) + return ; + return children; + }; - return children; + return <>{handleRender()}; }; export default RequireAuth; From 98eea8c733fa5c1180f069811b24c2605c17de83 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:33:51 -0700 Subject: [PATCH 43/65] Fixing infinite loading --- frontend/src/components/Registration/RequireAuth.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/Registration/RequireAuth.tsx b/frontend/src/components/Registration/RequireAuth.tsx index e19570e..4613084 100644 --- a/frontend/src/components/Registration/RequireAuth.tsx +++ b/frontend/src/components/Registration/RequireAuth.tsx @@ -13,7 +13,7 @@ const RequireAuth = ({ children }: Props) => { console.log(user, isFetching); const handleRender = () => { - if (!isFetching) + if (isFetching) return (
From 6370c58caccca4ea16490c75743ada9eaeb36747 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:38:45 -0700 Subject: [PATCH 44/65] removing console log --- frontend/src/components/Registration/RequireAuth.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/components/Registration/RequireAuth.tsx b/frontend/src/components/Registration/RequireAuth.tsx index 4613084..1ec659e 100644 --- a/frontend/src/components/Registration/RequireAuth.tsx +++ b/frontend/src/components/Registration/RequireAuth.tsx @@ -11,7 +11,6 @@ const RequireAuth = ({ children }: Props) => { const { user, isFetching } = useSession(); const location = useLocation(); - console.log(user, isFetching); const handleRender = () => { if (isFetching) return ( From 2d8a5f6cf3c7a607d5de9cf44ec9a0f2438b6171 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:48:04 -0700 Subject: [PATCH 45/65] Adding dashboard route --- backend/pnpm-lock.yaml | 15 +++------------ frontend/src/App.tsx | 13 ++++++++++++- .../src/components/Dashboard/DashboardIndex.tsx | 7 +++++++ 3 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 frontend/src/components/Dashboard/DashboardIndex.tsx diff --git a/backend/pnpm-lock.yaml b/backend/pnpm-lock.yaml index 3bf47f9..692d006 100644 --- a/backend/pnpm-lock.yaml +++ b/backend/pnpm-lock.yaml @@ -10,8 +10,8 @@ specifiers: '@types/nodemailer': ^6.4.4 '@types/parse': ^2.18.16 babel-cli: ^6.26.0 - date-fns: ^2.28.0 cors: ^2.8.5 + date-fns: ^2.28.0 dotenv: ^16.0.1 express: ^4.18.1 googleapis: ^105.0.0 @@ -24,8 +24,8 @@ specifiers: typescript: ^4.7.4 dependencies: - date-fns: 2.28.0 cors: 2.8.5 + date-fns: 2.28.0 dotenv: 16.0.1 express: 4.18.1 googleapis: 105.0.0 @@ -2616,6 +2616,7 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true optional: true + /cors/2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} @@ -4748,7 +4749,6 @@ packages: /object-assign/4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - dev: true /object-copy/0.1.0: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} @@ -4804,15 +4804,6 @@ packages: dev: true optional: true - /object-assign/4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false - - /object-inspect/1.12.2: - resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} - dev: false - /on-finished/2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 9eedd3e..4847d8f 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,5 +1,6 @@ import React from "react"; -import { BrowserRouter, Route, Routes } from "react-router-dom"; +import { BrowserRouter, Outlet, Route, Routes } from "react-router-dom"; +import DashboardIndex from "./components/Dashboard/DashboardIndex"; import DifficultyIndex from "./components/Difficulty/DifficultyIndex"; import Home from "./components/Home"; import HubIndex from "./components/Hub/HubIndex"; @@ -18,6 +19,16 @@ function App() { } /> } /> } /> + + + + } + > + } /> + { + return
DashboardIndex
; +}; + +export default DashboardIndex; From 81f4e157970b3ae9ae340d62bfa387eb6fe43ecc Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:50:56 -0700 Subject: [PATCH 46/65] Adding initial dashboard header --- frontend/src/components/Dashboard/DashboardIndex.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/Dashboard/DashboardIndex.tsx b/frontend/src/components/Dashboard/DashboardIndex.tsx index 236ccfa..e28289e 100644 --- a/frontend/src/components/Dashboard/DashboardIndex.tsx +++ b/frontend/src/components/Dashboard/DashboardIndex.tsx @@ -1,7 +1,17 @@ +import { Button, Container, Flex, Heading, VStack } from "@chakra-ui/react"; import React from "react"; const DashboardIndex = () => { - return
DashboardIndex
; + return ( + + + + Learning Dashboard + + + + + ); }; export default DashboardIndex; From 2dfaaf4adfde89815ba8e03c79d9a261e2f0daaa Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:58:04 -0700 Subject: [PATCH 47/65] Adding grid --- .../components/Dashboard/DashboardIndex.tsx | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/Dashboard/DashboardIndex.tsx b/frontend/src/components/Dashboard/DashboardIndex.tsx index e28289e..ac2cdba 100644 --- a/frontend/src/components/Dashboard/DashboardIndex.tsx +++ b/frontend/src/components/Dashboard/DashboardIndex.tsx @@ -1,5 +1,13 @@ -import { Button, Container, Flex, Heading, VStack } from "@chakra-ui/react"; +import { + Button, + Container, + Flex, + Grid, + Heading, + VStack, +} from "@chakra-ui/react"; import React from "react"; +import CourseCard from "./CourseCard"; const DashboardIndex = () => { return ( @@ -9,6 +17,16 @@ const DashboardIndex = () => { Learning Dashboard + + + + + + ); From 927588c0f88981b5f77581351484159bf0671c96 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:58:17 -0700 Subject: [PATCH 48/65] Adding course dashboard card --- .../src/components/Dashboard/CourseCard.tsx | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 frontend/src/components/Dashboard/CourseCard.tsx diff --git a/frontend/src/components/Dashboard/CourseCard.tsx b/frontend/src/components/Dashboard/CourseCard.tsx new file mode 100644 index 0000000..7cd0d71 --- /dev/null +++ b/frontend/src/components/Dashboard/CourseCard.tsx @@ -0,0 +1,58 @@ +import { ChevronDownIcon, HamburgerIcon } from "@chakra-ui/icons"; +import { + Box, + Button, + Flex, + Heading, + IconButton, + Image, + Menu, + MenuButton, + MenuItem, + MenuList, + Text, +} from "@chakra-ui/react"; +import React from "react"; +import useThemeColor from "../../hooks/useThemeColor"; + +const CourseCard = () => { + const { backgroundColor, borderColor } = useThemeColor(); + return ( + + + + + + React Course + + + } + > + + Download + Create a Copy + Mark as Draft + Delete + Attend a Workshop + + + + + + ); +}; + +export default CourseCard; From 464e37a443ca8e691d241ec5ae0d9321c92ae7e9 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 10:59:15 -0700 Subject: [PATCH 49/65] Adding correct menu items --- frontend/src/components/Dashboard/CourseCard.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/Dashboard/CourseCard.tsx b/frontend/src/components/Dashboard/CourseCard.tsx index 7cd0d71..95c2fc4 100644 --- a/frontend/src/components/Dashboard/CourseCard.tsx +++ b/frontend/src/components/Dashboard/CourseCard.tsx @@ -24,6 +24,7 @@ const CourseCard = () => { borderWidth={1} borderRadius={4} w="100%" + cursor={"pointer"} > @@ -42,11 +43,8 @@ const CourseCard = () => { icon={} > - Download - Create a Copy - Mark as Draft - Delete - Attend a Workshop + Share course + Delete course From a4e88cf8f2978a083d7cdcd8cfbc0b2d43e79ec5 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 11:08:19 -0700 Subject: [PATCH 50/65] Adding progress detail to popover --- .../components/Dashboard/DashboardIndex.tsx | 2 + frontend/src/components/Popover/Popover.tsx | 50 +++++++++++++++++++ .../src/components/Popover/PopoverPortal.tsx | 7 +++ 3 files changed, 59 insertions(+) create mode 100644 frontend/src/components/Popover/Popover.tsx create mode 100644 frontend/src/components/Popover/PopoverPortal.tsx diff --git a/frontend/src/components/Dashboard/DashboardIndex.tsx b/frontend/src/components/Dashboard/DashboardIndex.tsx index ac2cdba..63d051a 100644 --- a/frontend/src/components/Dashboard/DashboardIndex.tsx +++ b/frontend/src/components/Dashboard/DashboardIndex.tsx @@ -7,6 +7,7 @@ import { VStack, } from "@chakra-ui/react"; import React from "react"; +import Popover from "../Popover/Popover"; import CourseCard from "./CourseCard"; const DashboardIndex = () => { @@ -18,6 +19,7 @@ const DashboardIndex = () => { + { + const { backgroundColor, borderColor } = useThemeColor(); + return ( + + + React Course + + + Beginner + + 50% + + + + Intermediate + + 70% + + + + Advanced + + 20% + + + + ); +}; + +export default Popover; diff --git a/frontend/src/components/Popover/PopoverPortal.tsx b/frontend/src/components/Popover/PopoverPortal.tsx new file mode 100644 index 0000000..4d23e1f --- /dev/null +++ b/frontend/src/components/Popover/PopoverPortal.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +const PopoverPortal = () => { + return
PopoverPortal
; +}; + +export default PopoverPortal; From 51e83263628f5f5ca4f225e6401b7a3a642cf6c9 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 11:11:03 -0700 Subject: [PATCH 51/65] Adding props to popover --- .../components/Dashboard/DashboardIndex.tsx | 7 ++++- frontend/src/components/Popover/Popover.tsx | 28 +++++++++++++------ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/frontend/src/components/Dashboard/DashboardIndex.tsx b/frontend/src/components/Dashboard/DashboardIndex.tsx index 63d051a..1b025b5 100644 --- a/frontend/src/components/Dashboard/DashboardIndex.tsx +++ b/frontend/src/components/Dashboard/DashboardIndex.tsx @@ -19,7 +19,12 @@ const DashboardIndex = () => { - + { +interface Props { + courseName: string; + beginnerProgress: number; + intermediateProgress: number; + advancedProgress: number; +} + +const Popover = ({ + courseName, + beginnerProgress, + intermediateProgress, + advancedProgress, +}: Props) => { const { backgroundColor, borderColor } = useThemeColor(); return ( { gap={4} > - React Course + {courseName} Beginner - - 50% + + {beginnerProgress}% Intermediate - - 70% + + {intermediateProgress}% Advanced - - 20% + + {advancedProgress}% From 9af71385806544472a26750f6f089184aa5cddf6 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 11:17:31 -0700 Subject: [PATCH 52/65] Adding portal component --- frontend/src/components/Popover/PopoverPortal.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/Popover/PopoverPortal.tsx b/frontend/src/components/Popover/PopoverPortal.tsx index 4d23e1f..c03d99f 100644 --- a/frontend/src/components/Popover/PopoverPortal.tsx +++ b/frontend/src/components/Popover/PopoverPortal.tsx @@ -1,7 +1,11 @@ import React from "react"; +import ReactDom from "react-dom"; -const PopoverPortal = () => { - return
PopoverPortal
; +interface Props { + children: JSX.Element; +} +const PopoverPortal = ({ children }: Props) => { + return ReactDom.createPortal(children, document.body); }; export default PopoverPortal; From 0df2e402e661425391bfcf4d998e0450c37cf656 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 11:31:24 -0700 Subject: [PATCH 53/65] Adding tooltip logic --- frontend/src/components/Popover/Tooltip.tsx | 36 +++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 frontend/src/components/Popover/Tooltip.tsx diff --git a/frontend/src/components/Popover/Tooltip.tsx b/frontend/src/components/Popover/Tooltip.tsx new file mode 100644 index 0000000..29f7800 --- /dev/null +++ b/frontend/src/components/Popover/Tooltip.tsx @@ -0,0 +1,36 @@ +import { Box } from "@chakra-ui/react"; +import React, { useState } from "react"; +import PopoverPortal from "./PopoverPortal"; + +interface Props { + children: React.ReactElement; + render: React.ReactElement; +} + +const Tooltip = ({ children, render }: Props) => { + const [show, setShow] = useState(false); + + const handleMouseOver = () => { + setShow(true); + }; + + const handleMouseOut = () => { + setShow(false); + }; + + return ( + <> + {React.cloneElement(children, { + onMouseOver: handleMouseOver, + onMouseOut: handleMouseOut, + })} + + + {render} + + + + ); +}; + +export default Tooltip; From 85750c625021f78b87f78a6963b8f9f10048e3be Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 11:31:33 -0700 Subject: [PATCH 54/65] Reanming interface --- frontend/src/components/Popover/PopoverPortal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/Popover/PopoverPortal.tsx b/frontend/src/components/Popover/PopoverPortal.tsx index c03d99f..caccf1a 100644 --- a/frontend/src/components/Popover/PopoverPortal.tsx +++ b/frontend/src/components/Popover/PopoverPortal.tsx @@ -2,7 +2,7 @@ import React from "react"; import ReactDom from "react-dom"; interface Props { - children: JSX.Element; + children: React.ReactNode; } const PopoverPortal = ({ children }: Props) => { return ReactDom.createPortal(children, document.body); From 5c0698335fa308ff89eee4daf672e85e9bcb5161 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 11:31:41 -0700 Subject: [PATCH 55/65] Adding test tooltip --- .../components/Dashboard/DashboardIndex.tsx | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/Dashboard/DashboardIndex.tsx b/frontend/src/components/Dashboard/DashboardIndex.tsx index 1b025b5..2dc0836 100644 --- a/frontend/src/components/Dashboard/DashboardIndex.tsx +++ b/frontend/src/components/Dashboard/DashboardIndex.tsx @@ -8,6 +8,7 @@ import { } from "@chakra-ui/react"; import React from "react"; import Popover from "../Popover/Popover"; +import Tooltip from "../Popover/Tooltip"; import CourseCard from "./CourseCard"; const DashboardIndex = () => { @@ -19,12 +20,18 @@ const DashboardIndex = () => { - + + } + > +
hi
+
Date: Tue, 12 Jul 2022 11:55:13 -0700 Subject: [PATCH 56/65] Adding position logic to tooltip --- frontend/src/components/Popover/Tooltip.tsx | 26 ++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/Popover/Tooltip.tsx b/frontend/src/components/Popover/Tooltip.tsx index 29f7800..1f6c76c 100644 --- a/frontend/src/components/Popover/Tooltip.tsx +++ b/frontend/src/components/Popover/Tooltip.tsx @@ -1,5 +1,5 @@ import { Box } from "@chakra-ui/react"; -import React, { useState } from "react"; +import React, { useRef, useState } from "react"; import PopoverPortal from "./PopoverPortal"; interface Props { @@ -7,11 +7,24 @@ interface Props { render: React.ReactElement; } +const getPoint = (element: HTMLElement, ref: HTMLElement) => { + const pt = { x: 0, y: 0 }; + const rectangle = element.getBoundingClientRect(); + const refRectangle = ref.getBoundingClientRect(); + pt.x = rectangle.left + (rectangle.width - refRectangle.width) / 2; + pt.y = rectangle.top - refRectangle.height / 2; + return pt; +}; + const Tooltip = ({ children, render }: Props) => { const [show, setShow] = useState(false); - const handleMouseOver = () => { + const posRef = useRef({ x: 0, y: 0 }); + const tooltipRef = useRef(); + + const handleMouseOver = (e: React.MouseEvent) => { setShow(true); + posRef.current = getPoint(e.currentTarget, tooltipRef.current); }; const handleMouseOut = () => { @@ -25,7 +38,14 @@ const Tooltip = ({ children, render }: Props) => { onMouseOut: handleMouseOut, })} - + {render} From 3440288724515b11c0aea537bd3ab11640767ec1 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 11:55:25 -0700 Subject: [PATCH 57/65] Restyling popover --- frontend/src/components/Popover/Popover.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/src/components/Popover/Popover.tsx b/frontend/src/components/Popover/Popover.tsx index c7f03bf..c56f864 100644 --- a/frontend/src/components/Popover/Popover.tsx +++ b/frontend/src/components/Popover/Popover.tsx @@ -29,31 +29,31 @@ const Popover = ({ backgroundColor={backgroundColor} borderColor={borderColor} borderWidth={1} + borderRadius={4} w={"20vw"} p={4} flexDir="column" gap={4} + boxShadow={"0px 10px 15px -3px rgba(0,0,0,0.3)"} > {courseName} Beginner - - {beginnerProgress}% - + Intermediate - - {intermediateProgress}% - + Advanced - - {advancedProgress}% - + ); From dc91b5e1471eca128a0c8683564b1d2fa3dc7da0 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 11:55:37 -0700 Subject: [PATCH 58/65] Adding test popover to one of the courses --- .../components/Dashboard/DashboardIndex.tsx | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/Dashboard/DashboardIndex.tsx b/frontend/src/components/Dashboard/DashboardIndex.tsx index 2dc0836..ff2fc7f 100644 --- a/frontend/src/components/Dashboard/DashboardIndex.tsx +++ b/frontend/src/components/Dashboard/DashboardIndex.tsx @@ -19,25 +19,25 @@ const DashboardIndex = () => { Learning Dashboard - - - } - > -
hi
-
- + + } + > +
+ +
+
From c3fa42fc04a729f5810c18657db24b155fff25d6 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 14:41:06 -0700 Subject: [PATCH 59/65] Fixing typescript errors --- frontend/src/components/Popover/Tooltip.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/Popover/Tooltip.tsx b/frontend/src/components/Popover/Tooltip.tsx index 1f6c76c..eece653 100644 --- a/frontend/src/components/Popover/Tooltip.tsx +++ b/frontend/src/components/Popover/Tooltip.tsx @@ -12,7 +12,7 @@ const getPoint = (element: HTMLElement, ref: HTMLElement) => { const rectangle = element.getBoundingClientRect(); const refRectangle = ref.getBoundingClientRect(); pt.x = rectangle.left + (rectangle.width - refRectangle.width) / 2; - pt.y = rectangle.top - refRectangle.height / 2; + pt.y = rectangle.top - refRectangle.height / 1.2; return pt; }; @@ -20,10 +20,11 @@ const Tooltip = ({ children, render }: Props) => { const [show, setShow] = useState(false); const posRef = useRef({ x: 0, y: 0 }); - const tooltipRef = useRef(); + const tooltipRef = useRef(null); const handleMouseOver = (e: React.MouseEvent) => { setShow(true); + if (!tooltipRef.current) return; posRef.current = getPoint(e.currentTarget, tooltipRef.current); }; From 6f718f1b666ab5fa29d775b55ff566aadc41cebc Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 14:41:15 -0700 Subject: [PATCH 60/65] Adding tooltip to the image --- .../components/Dashboard/DashboardIndex.tsx | 26 ++----------------- 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/frontend/src/components/Dashboard/DashboardIndex.tsx b/frontend/src/components/Dashboard/DashboardIndex.tsx index ff2fc7f..fced630 100644 --- a/frontend/src/components/Dashboard/DashboardIndex.tsx +++ b/frontend/src/components/Dashboard/DashboardIndex.tsx @@ -1,14 +1,5 @@ -import { - Button, - Container, - Flex, - Grid, - Heading, - VStack, -} from "@chakra-ui/react"; +import { Button, Container, Flex, Grid, Heading } from "@chakra-ui/react"; import React from "react"; -import Popover from "../Popover/Popover"; -import Tooltip from "../Popover/Tooltip"; import CourseCard from "./CourseCard"; const DashboardIndex = () => { @@ -24,20 +15,7 @@ const DashboardIndex = () => { gap="1em" mt={10} > - - } - > -
- -
-
+
From 74eab9e21cf78d5b64498a6798dc387691276777 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 14:41:27 -0700 Subject: [PATCH 61/65] Adding tooltip to the image --- frontend/src/components/Dashboard/CourseCard.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/Dashboard/CourseCard.tsx b/frontend/src/components/Dashboard/CourseCard.tsx index 95c2fc4..6552b84 100644 --- a/frontend/src/components/Dashboard/CourseCard.tsx +++ b/frontend/src/components/Dashboard/CourseCard.tsx @@ -14,6 +14,8 @@ import { } from "@chakra-ui/react"; import React from "react"; import useThemeColor from "../../hooks/useThemeColor"; +import Popover from "../Popover/Popover"; +import Tooltip from "../Popover/Tooltip"; const CourseCard = () => { const { backgroundColor, borderColor } = useThemeColor(); @@ -27,7 +29,18 @@ const CourseCard = () => { cursor={"pointer"} > - + + } + > + + Date: Tue, 12 Jul 2022 14:46:09 -0700 Subject: [PATCH 62/65] Adding props to course card --- .../src/components/Dashboard/CourseCard.tsx | 30 +++++++++++++------ .../components/Dashboard/DashboardIndex.tsx | 24 +++++++++++++-- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/frontend/src/components/Dashboard/CourseCard.tsx b/frontend/src/components/Dashboard/CourseCard.tsx index 6552b84..dfffced 100644 --- a/frontend/src/components/Dashboard/CourseCard.tsx +++ b/frontend/src/components/Dashboard/CourseCard.tsx @@ -1,7 +1,6 @@ import { ChevronDownIcon, HamburgerIcon } from "@chakra-ui/icons"; import { Box, - Button, Flex, Heading, IconButton, @@ -10,14 +9,27 @@ import { MenuButton, MenuItem, MenuList, - Text, } from "@chakra-ui/react"; import React from "react"; import useThemeColor from "../../hooks/useThemeColor"; import Popover from "../Popover/Popover"; import Tooltip from "../Popover/Tooltip"; -const CourseCard = () => { +interface Props { + title: string; + src: string; + beginnerProgress: number; + intermediateProgress: number; + advancedProgress: number; +} + +const CourseCard = ({ + title, + src, + beginnerProgress, + intermediateProgress, + advancedProgress, +}: Props) => { const { backgroundColor, borderColor } = useThemeColor(); return ( { } > - + { alignItems={"center"} > - React Course + {title} { gap="1em" mt={10} > - - - + + + From bf2b0e5834c420613b6673978a4dfd3f64749c16 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 14:53:05 -0700 Subject: [PATCH 63/65] Adding link between pages --- .../src/components/Dashboard/CourseCard.tsx | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/Dashboard/CourseCard.tsx b/frontend/src/components/Dashboard/CourseCard.tsx index dfffced..05637bc 100644 --- a/frontend/src/components/Dashboard/CourseCard.tsx +++ b/frontend/src/components/Dashboard/CourseCard.tsx @@ -1,6 +1,7 @@ import { ChevronDownIcon, HamburgerIcon } from "@chakra-ui/icons"; import { Box, + Button, Flex, Heading, IconButton, @@ -11,6 +12,7 @@ import { MenuList, } from "@chakra-ui/react"; import React from "react"; +import { Link } from "react-router-dom"; import useThemeColor from "../../hooks/useThemeColor"; import Popover from "../Popover/Popover"; import Tooltip from "../Popover/Tooltip"; @@ -38,7 +40,6 @@ const CourseCard = ({ borderWidth={1} borderRadius={4} w="100%" - cursor={"pointer"} > } > - + {title} - - } - > - - Share course - Delete course - - + + + + + + } + > + + Share course + Delete course + + + From 463ed0619f6f34d1f3cdf505383551dbb0b5c229 Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Tue, 12 Jul 2022 14:56:35 -0700 Subject: [PATCH 64/65] Fixing style issue --- frontend/src/components/Popover/Tooltip.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/Popover/Tooltip.tsx b/frontend/src/components/Popover/Tooltip.tsx index eece653..6d81e94 100644 --- a/frontend/src/components/Popover/Tooltip.tsx +++ b/frontend/src/components/Popover/Tooltip.tsx @@ -12,7 +12,7 @@ const getPoint = (element: HTMLElement, ref: HTMLElement) => { const rectangle = element.getBoundingClientRect(); const refRectangle = ref.getBoundingClientRect(); pt.x = rectangle.left + (rectangle.width - refRectangle.width) / 2; - pt.y = rectangle.top - refRectangle.height / 1.2; + pt.y = rectangle.top - refRectangle.height + 10; return pt; }; @@ -43,7 +43,7 @@ const Tooltip = ({ children, render }: Props) => { position="fixed" top={posRef.current.y} left={posRef.current.x} - opacity={show ? 1 : 0} + visibility={show ? "visible" : "hidden"} zIndex={999} ref={tooltipRef} > From 635a811c75aeff5f93be09e60d0af6b1eeb2245b Mon Sep 17 00:00:00 2001 From: Mauricio Munoz Date: Wed, 13 Jul 2022 13:35:16 -0700 Subject: [PATCH 65/65] removing flacky test --- backend/src/rating/ranking.test.ts | 252 ++--------------------------- backend/src/rating/ranking.ts | 4 +- 2 files changed, 19 insertions(+), 237 deletions(-) diff --git a/backend/src/rating/ranking.test.ts b/backend/src/rating/ranking.test.ts index fa66b5f..219f3f8 100644 --- a/backend/src/rating/ranking.test.ts +++ b/backend/src/rating/ranking.test.ts @@ -1,3 +1,4 @@ +import { differenceInCalendarDays, getDate } from "date-fns"; import { ensureWeightsAreCorrect, getDateScore, @@ -10,23 +11,23 @@ import { test("weights should throw an error if weights are incorrect", () => { const testWeights1 = { - w1: 60, - w2: 40, - w3: 100, - w4: 0, - w5: 100, - w6: 0, + weight1: 60, + weight2: 40, + weight3: 100, + weight4: 0, + weight5: 100, + weight6: 0, }; expect(ensureWeightsAreCorrect(testWeights1)).toBe(true); const testWeights2 = { - w1: 60, - w2: 40, - w3: 100, - w4: 0, - w5: 100, - w6: 10, + weight1: 60, + weight2: 40, + weight3: 100, + weight4: 0, + weight5: 100, + weight6: 10, }; expect(ensureWeightsAreCorrect(testWeights2)).toBe(false); @@ -34,7 +35,10 @@ test("weights should throw an error if weights are incorrect", () => { test("should return the days that have passed since then, given an ISO Date", () => { const publishedAt = "2018-07-16T16:51:44Z"; - expect(getDaysSincePublished(publishedAt)).toBe(1456); + const today = new Date(); + expect(getDaysSincePublished(publishedAt)).toBe( + differenceInCalendarDays(today, new Date(publishedAt)) + ); expect(getDaysSincePublished(new Date().toISOString())).toBe(0); }); @@ -76,225 +80,3 @@ test("should get a score based on how old a video is", () => { expect(getDateScore(1)).toBe(9.4); expect(getDateScore(4.5)).toBe(2.7102788505282014); }); - -test("it should get the final score of a series of videos", () => { - const videosToRank = [ - { - kind: "youtube#video", - etag: "4PNSIKu_HYYjG5LknxySq9j2wQE", - id: "Ke90Tje7VS0", - snippet: { - publishedAt: "2018-07-16T16:51:44Z", - channelId: "UCWv7vMbMWH4-V0ZXdmDpPBA", - title: "React JS - React Tutorial for Beginners", - description: - "React JS Tutorial - Get up & running with React JS: the most popular JavaScript library in the world! \n- Want to master React? Get my React mastery course: http://bit.ly/2KVl2A3\n- Subscribe for more videos like this: https://goo.gl/6PYaGF\n\nWant to learn more from me? Check out my blog and courses: \n\nCourses: https://codewithmosh.com\nBlog: https://programmingwithmosh.com \nFacebook: https://www.facebook.com/programmingwithmosh/\nTwitter: https://twitter.com/moshhamedani\n\nTABLE OF CONTENT\n\n00:00 Introduction\n01:14 What is React\n05:48 Setting Up the Development Environment \n09:27 Your First React App\n16:03 Hello World\n22:26 Components\n24:06 Setting Up the Project\n26:15 Your First React Component\n31:38 Specifying Children\n35:56 Embedding Expressions\n40:49 Setting Attributes\n46:36 Rendering Classes Dynamically\n50:57 Rendering Lists\n54:58 Conditional Rendering\n1:01:04 Handling Events\n1:03:56 Binding Event Handlers\n1:08:34 Updating the State\n1:10:51 What Happens When State Changes \n1:12:58 Passing Event Arguments\n1:17:31 Composing Components\n1:21:18 Passing Data to Components\n1:24:31 Passing Children\n1:27:44 Debugging React Apps\n1:31:55 Props vs State\n1:34:22 Raising and Handling Events\n1:39:16 Updating the State\n1:43:57 Single Source of Truth\n1:47:55 Removing the Local State\n1:54:44 Multiple Components in Sync \n2:00:39 Lifting the State Up\n2:06:18 Stateless Functional Components\n2:08:49 Destructuring Arguments\n2:10:52 Lifecycle Hooks\n2:12:32 Mounting Phase \n2:18:09 Updating Phase \n2:22:31 Unmounting Phase\n\n#react #webdevelopment #programming", - thumbnails: { - default: { - url: "https://i.ytimg.com/vi/Ke90Tje7VS0/default.jpg", - width: 120, - height: 90, - }, - medium: { - url: "https://i.ytimg.com/vi/Ke90Tje7VS0/mqdefault.jpg", - width: 320, - height: 180, - }, - high: { - url: "https://i.ytimg.com/vi/Ke90Tje7VS0/hqdefault.jpg", - width: 480, - height: 360, - }, - }, - channelTitle: "Programming with Mosh", - tags: [ - "react js", - "react tutorial", - "learn react", - "react course", - "reactjs tutorial", - "react crash course", - "react js tutorial", - "reactjs course", - "react tutorial for beginners", - "react.js", - "reactjs tutorial for beginners", - "reactJS", - "react", - "learn reactjs", - "tutorial", - "javascript", - "crash course", - "programming with mosh", - "code with mosh", - "web development", - "mosh hamedani", - "learn react js", - ], - categoryId: "22", - liveBroadcastContent: "none", - localized: { - title: "React JS - React Tutorial for Beginners", - description: - "React JS Tutorial - Get up & running with React JS: the most popular JavaScript library in the world! \n- Want to master React? Get my React mastery course: http://bit.ly/2KVl2A3\n- Subscribe for more videos like this: https://goo.gl/6PYaGF\n\nWant to learn more from me? Check out my blog and courses: \n\nCourses: https://codewithmosh.com\nBlog: https://programmingwithmosh.com \nFacebook: https://www.facebook.com/programmingwithmosh/\nTwitter: https://twitter.com/moshhamedani\n\nTABLE OF CONTENT\n\n00:00 Introduction\n01:14 What is React\n05:48 Setting Up the Development Environment \n09:27 Your First React App\n16:03 Hello World\n22:26 Components\n24:06 Setting Up the Project\n26:15 Your First React Component\n31:38 Specifying Children\n35:56 Embedding Expressions\n40:49 Setting Attributes\n46:36 Rendering Classes Dynamically\n50:57 Rendering Lists\n54:58 Conditional Rendering\n1:01:04 Handling Events\n1:03:56 Binding Event Handlers\n1:08:34 Updating the State\n1:10:51 What Happens When State Changes \n1:12:58 Passing Event Arguments\n1:17:31 Composing Components\n1:21:18 Passing Data to Components\n1:24:31 Passing Children\n1:27:44 Debugging React Apps\n1:31:55 Props vs State\n1:34:22 Raising and Handling Events\n1:39:16 Updating the State\n1:43:57 Single Source of Truth\n1:47:55 Removing the Local State\n1:54:44 Multiple Components in Sync \n2:00:39 Lifting the State Up\n2:06:18 Stateless Functional Components\n2:08:49 Destructuring Arguments\n2:10:52 Lifecycle Hooks\n2:12:32 Mounting Phase \n2:18:09 Updating Phase \n2:22:31 Unmounting Phase\n\n#react #webdevelopment #programming", - }, - defaultAudioLanguage: "en", - }, - contentDetails: { - duration: "PT2H25M27S", - dimension: "2d", - definition: "hd", - caption: "false", - licensedContent: true, - contentRating: {}, - projection: "rectangular", - }, - statistics: { - viewCount: "5002487", - likeCount: "79120", - favoriteCount: "0", - commentCount: "4793", - }, - }, - { - kind: "youtube#video", - etag: "YQnZv7l0ezWokaM0Vk0v6lRMl1I", - id: "hQAHSlTtcmY", - snippet: { - publishedAt: "2019-10-22T16:00:07Z", - channelId: "UCFbNIlppjAuEX4znoulh0Cw", - title: "Learn React In 30 Minutes", - description: - "🚨 IMPORTANT:\n\nFull React Course: https://courses.webdevsimplified.com/learn-react-today\n\nIn this video I will be covering all of the basics of React in only 30 minutes. We will cover create-react-app, components, state, props, rendering, event handling, and so much more. By the end of this video you will have a full understanding of the basics of React, but if you want to take your React knowledge to the next level checkout my full React course linked above for the best React learning experience on the web.\n\n\nšŸ“š Materials/References:\n\nHow To Install Node.js: https://youtu.be/VShtPwEkDD0\nDestructoring Video: https://youtu.be/NIq3qLaHCIs\nGitHub Code: https://github.com/WebDevSimplified/Learn-React-In-30-Minutes\n\n\n🧠 Concepts Covered:\n\n- React function components\n- React hooks\n- State management in React\n- Prop drilling\n- How to use create-react-app\n\n\nšŸŒŽ Find Me Here:\n\nMy Courses: https://courses.webdevsimplified.com\nPatreon: https://www.patreon.com/WebDevSimplified\nTwitter: https://twitter.com/DevSimplified\nDiscord: https://discord.gg/7StTjnR\nGitHub: https://github.com/WebDevSimplified\nCodePen: https://codepen.io/WebDevSimplified\n\n\n#Reactjs #WDS #JavaScript", - thumbnails: { - default: { - url: "https://i.ytimg.com/vi/hQAHSlTtcmY/default.jpg", - width: 120, - height: 90, - }, - medium: { - url: "https://i.ytimg.com/vi/hQAHSlTtcmY/mqdefault.jpg", - width: 320, - height: 180, - }, - high: { - url: "https://i.ytimg.com/vi/hQAHSlTtcmY/hqdefault.jpg", - width: 480, - height: 360, - }, - standard: { - url: "https://i.ytimg.com/vi/hQAHSlTtcmY/sddefault.jpg", - width: 640, - height: 480, - }, - maxres: { - url: "https://i.ytimg.com/vi/hQAHSlTtcmY/maxresdefault.jpg", - width: 1280, - height: 720, - }, - }, - channelTitle: "Web Dev Simplified", - tags: [ - "webdevsimplified", - "learn react in 30 minutes", - "learn react", - "react tutorial", - "react crash course", - "react js tutorial", - "react js", - "reactjs", - "reactjs tutorial", - "reactjs crash course", - "learn reactjs", - "learn react js", - "react js project", - "react js todo app", - "react js tutorial for beginners", - "react crash course 2019", - "react crash course tutorial", - "react hooks tutorial", - "react hooks for beginners", - "react component tutorial", - "react components", - "reactjs hooks", - "reactjs hook tutorial", - "reactjs hooks project", - ], - categoryId: "27", - liveBroadcastContent: "none", - localized: { - title: "Learn React In 30 Minutes", - description: - "🚨 IMPORTANT:\n\nFull React Course: https://courses.webdevsimplified.com/learn-react-today\n\nIn this video I will be covering all of the basics of React in only 30 minutes. We will cover create-react-app, components, state, props, rendering, event handling, and so much more. By the end of this video you will have a full understanding of the basics of React, but if you want to take your React knowledge to the next level checkout my full React course linked above for the best React learning experience on the web.\n\n\nšŸ“š Materials/References:\n\nHow To Install Node.js: https://youtu.be/VShtPwEkDD0\nDestructoring Video: https://youtu.be/NIq3qLaHCIs\nGitHub Code: https://github.com/WebDevSimplified/Learn-React-In-30-Minutes\n\n\n🧠 Concepts Covered:\n\n- React function components\n- React hooks\n- State management in React\n- Prop drilling\n- How to use create-react-app\n\n\nšŸŒŽ Find Me Here:\n\nMy Courses: https://courses.webdevsimplified.com\nPatreon: https://www.patreon.com/WebDevSimplified\nTwitter: https://twitter.com/DevSimplified\nDiscord: https://discord.gg/7StTjnR\nGitHub: https://github.com/WebDevSimplified\nCodePen: https://codepen.io/WebDevSimplified\n\n\n#Reactjs #WDS #JavaScript", - }, - defaultAudioLanguage: "en-US", - }, - contentDetails: { - duration: "PT27M16S", - dimension: "2d", - definition: "hd", - caption: "false", - licensedContent: true, - contentRating: {}, - projection: "rectangular", - }, - statistics: { - viewCount: "804244", - likeCount: "18124", - favoriteCount: "0", - commentCount: "1220", - }, - }, - ]; - - const finalScore = getExternalRanking(videosToRank); - - const video1ExpectedResult = { - ...videosToRank[0], - raw_score: { - date: 4.480069005095963, - dateXViews: 1254057.5240384615, - dateXLikes: 54.34065934065934, - useOfChapters: 1, - }, - normalized_score: { - date: 0.4480069005095963, - dateXLikes: 1, - dateXViews: 1, - useOfChapters: 1, - }, - weighted_score: { - date: 26.88041403057578, - dateXLikes: 40, - dateXViews: 100, - useOfChapters: 100, - }, - final_score: 83.44020701528788, - }; - - const video2ExpectedResult = { - ...videosToRank[1], - raw_score: { - date: 7.408149936492211, - dateXViews: 295618.3887210473, - dateXLikes: 18.25176233635448, - useOfChapters: 0, - }, - normalized_score: { - date: 0.7408149936492211, - dateXLikes: 0.33587671842431904, - dateXViews: 0.23572952839440944, - useOfChapters: 0, - }, - weighted_score: { - date: 44.44889961895326, - dateXLikes: 13.435068736972761, - dateXViews: 23.572952839440944, - useOfChapters: 0, - }, - final_score: 36.01387002979529, - }; - - expect(finalScore[0]).toMatchObject(video1ExpectedResult); - expect(finalScore[1]).toMatchObject(video2ExpectedResult); -}); diff --git a/backend/src/rating/ranking.ts b/backend/src/rating/ranking.ts index 6c66ef0..51a5680 100644 --- a/backend/src/rating/ranking.ts +++ b/backend/src/rating/ranking.ts @@ -172,7 +172,7 @@ export const getDaysSincePublished = (publishedAt: string) => { return daysSincePublished; }; -const ensureWeightsAreCorrect = (weights: typeof WEIGHTS) => { +export const ensureWeightsAreCorrect = (weights: typeof WEIGHTS) => { if (weights.weight1 + weights.weight2 !== 100) { new ExpressError("Weights are incorrect", 500); return false; @@ -181,7 +181,7 @@ const ensureWeightsAreCorrect = (weights: typeof WEIGHTS) => { new ExpressError("Weights are incorrect", 500); return false; } - if (weights.weight4 + weights.weight6 !== 100) { + if (weights.weight5 + weights.weight6 !== 100) { new ExpressError("Weights are incorrect", 500); return false; }