diff --git a/.github/workflows/client.yml b/.github/workflows/client.yml index e255897d..3da5358a 100644 --- a/.github/workflows/client.yml +++ b/.github/workflows/client.yml @@ -1 +1,58 @@ # client 워크플로우 작성 공간 +on: + pull_request: + branches: + - main + paths: + - "client/**" + +jobs: + build: + runs-on: ubuntu-latest + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_CLIENT_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_CLIENT_SECRET_ACCESS_KEY }} + AWS_REGION: "ap-northeast-2" + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Cache node modules + uses: actions/cache@v2 + with: + path: node_modules + key: ${{ runner.OS }}-build-${{ hashFiles('**/yarn-lock') }} + restore-keys: | + ${{ runner.OS }}-build- + ${{ runner.OS }}- + + - name: Install Dependencies + run: yarn install + + - name: Build client + run: yarn client build + env: + PUBLIC_URL: ${{ secrets.ENV_CLIENT_PUBLIC_URL }} + API_URL: ${{ secrets.ENV_CLIENT_API_URL }} + CI: "" + + - name: Deploy + uses: jakejarvis/s3-sync-action@master + with: + args: --acl public-read --follow-symlinks --delete + env: + AWS_S3_BUCKET: ${{ secrets.AWS_CLIENT_S3_BUCKET }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_CLIENT_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_CLIENT_SECRET_ACCESS_KEY }} + AWS_REGION: 'ap-southeast-2' + SOURCE_DIR: './client/build' + + - name: Invalidation + uses: awact/cloudfront-action@master + env: + SOURCE_PATH: '/*' + AWS_REGION: 'ap-southeast-2' + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_CLIENT_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_CLIENT_SECRET_ACCESS_KEY }} + DISTRIBUTION_ID: ${{ secrets.AWS_CLIENT_DISTRIBUTION_ID }} diff --git a/.github/workflows/server.yml b/.github/workflows/server.yml index d421fc23..4c3d3ec5 100644 --- a/.github/workflows/server.yml +++ b/.github/workflows/server.yml @@ -1 +1 @@ -# server workflow 작성 공간 +# socket workflow 작성 공간 diff --git a/.github/workflows/server_dev_api.yml b/.github/workflows/server_dev_api.yml new file mode 100644 index 00000000..2236213a --- /dev/null +++ b/.github/workflows/server_dev_api.yml @@ -0,0 +1,52 @@ +name: Backend Api Dev Server + +on: + pull_request: + branches: + - dev-be + types: + - closed + +jobs: + noti_slack: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + + - name: action-slack + uses: 8398a7/action-slack@v3 + with: + status: ${{ job.status }} + author_name: Backend dev PR merge! + fields: repo,commit,message,author + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_ASUMI_URL }} # required + if: always() # Pick up events even if the job fails or is canceled. + pull_nCloud_api_server: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: execute remot ssh + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.NCLOUD_REMOTE_IP }} + username: ${{ secrets.NCLOUD_REMOTE_SSH_ID }} + password: ${{ secrets.NCLOUD_REMOTE_SSH_PASSWORD }} + port: ${{ secrets.NCLOUD_REMOTE_SSH_PORT }} + script: | + whoami + cd web24-Asnity + git stash + git pull origin dev-be + ls -al + export NVM_DIR=~/.nvm + source ~/.nvm/nvm.sh + yarn install + pm2 restart asnity-api diff --git a/.gitignore b/.gitignore index dea2faf3..ae1a5dd6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,8 @@ .idea/ node_modules/ server/dist -server/node_modules/ \ No newline at end of file +server/node_modules/ +server/config/ +.DS_Store +client/node_modules/ +yarn-error.log \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index 1f1015d7..db4e8407 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,5 @@ { - "endOfLine": "lf", + "endOfLine": "auto", "tabWidth": 2, "semi": true, "singleQuote": true, diff --git a/client/.eslintrc b/client/.eslintrc index 3e9f488e..e8578692 100644 --- a/client/.eslintrc +++ b/client/.eslintrc @@ -5,10 +5,10 @@ "jest": true, "commonjs": true }, - "extends": [ - "plugin:react/recommended", - "plugin:react-hooks/recommended" - ], + "globals": { + "JSX": true + }, + "extends": ["plugin:react/recommended", "plugin:react-hooks/recommended"], "rules": { "react/prop-types": "off", "no-param-reassign": "off", @@ -28,4 +28,4 @@ "react/no-unknown-property": "off", "no-duplicate-imports": "off" } -} \ No newline at end of file +} diff --git a/client/config/webpack.analysis.ts b/client/config/webpack.analysis.ts new file mode 100644 index 00000000..e23525fa --- /dev/null +++ b/client/config/webpack.analysis.ts @@ -0,0 +1,47 @@ +import type { Configuration } from 'webpack'; + +import CssMinimizerPlugin from 'css-minimizer-webpack-plugin'; +import MiniCssExtractPlugin from 'mini-css-extract-plugin'; +import TerserPlugin from 'terser-webpack-plugin'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import { merge } from 'webpack-merge'; + +import common from './webpack.common'; + +const config: Configuration = { + devtool: 'inline-source-map', + mode: 'production', + module: { + rules: [ + { + test: /\.css$/, + use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader'], + exclude: /node_modules/, + }, + ], + }, + plugins: [ + new MiniCssExtractPlugin(), + new BundleAnalyzerPlugin({ + analyzerMode: 'static', + reportFilename: 'report.html', + openAnalyzer: false, + }), + ], + optimization: { + minimize: true, + minimizer: [ + new CssMinimizerPlugin(), + new TerserPlugin({ + terserOptions: { + format: { + comments: false, + }, + }, + extractComments: false, + }), + ], + }, +}; + +export default merge(common, config); diff --git a/client/config/webpack.common.ts b/client/config/webpack.common.ts index 8cc916ff..5f8890dc 100644 --- a/client/config/webpack.common.ts +++ b/client/config/webpack.common.ts @@ -3,12 +3,19 @@ import type { Configuration } from 'webpack'; import path from 'path'; import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin'; +import dotenv from 'dotenv'; import HtmlWebpackPlugin from 'html-webpack-plugin'; import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; import webpack from 'webpack'; const isDevelopment = process.env.NODE_ENV === 'development'; +const envPath = isDevelopment + ? path.resolve(__dirname, '..', 'env/.env.dev') + : path.resolve(__dirname, '..', 'env/.env.prod'); + +dotenv.config({ path: envPath }); + function isTruthy( value: T, ): value is Exclude { @@ -47,13 +54,11 @@ const config: Configuration = { plugins: [ new HtmlWebpackPlugin({ template: '../public/index.html', + templateParameters: { + PUBLIC_URL: process.env.PUBLIC_URL, + }, }), - new webpack.DefinePlugin({ - SIGN_IN_URL: JSON.stringify( - 'https://github.com/login/oauth/authorize?client_id=940294fcbf88a773fdc1', - ), - BASE_URL: JSON.stringify('http://localhost:8081'), - }), + new webpack.EnvironmentPlugin(['API_URL', 'PUBLIC_URL']), isDevelopment && new ReactRefreshWebpackPlugin(), ].filter(isTruthy), }; diff --git a/client/config/webpack.dev.ts b/client/config/webpack.dev.ts index d854a0c1..2644e31a 100644 --- a/client/config/webpack.dev.ts +++ b/client/config/webpack.dev.ts @@ -13,7 +13,7 @@ const config: Configuration = { rules: [ { test: /\.css$/, - use: ['style-loader', 'css-loader'], + use: ['style-loader', 'css-loader', 'postcss-loader'], exclude: /node_modules/, }, ], diff --git a/client/config/webpack.prod.ts b/client/config/webpack.prod.ts index 69c27a99..1be3571e 100644 --- a/client/config/webpack.prod.ts +++ b/client/config/webpack.prod.ts @@ -2,34 +2,37 @@ import type { Configuration } from 'webpack'; import CssMinimizerPlugin from 'css-minimizer-webpack-plugin'; import MiniCssExtractPlugin from 'mini-css-extract-plugin'; -import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import TerserPlugin from 'terser-webpack-plugin'; import { merge } from 'webpack-merge'; import common from './webpack.common'; const config: Configuration = { - devtool: 'source-map', + devtool: 'inline-source-map', mode: 'production', module: { rules: [ { test: /\.css$/, - use: [MiniCssExtractPlugin.loader, 'css-loader'], + use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader'], exclude: /node_modules/, }, ], }, - plugins: [ - new MiniCssExtractPlugin(), - new BundleAnalyzerPlugin({ - analyzerMode: 'static', - reportFilename: 'report.html', - openAnalyzer: false, - }), - ], + plugins: [new MiniCssExtractPlugin()], optimization: { minimize: true, - minimizer: [new CssMinimizerPlugin()], + minimizer: [ + new CssMinimizerPlugin(), + new TerserPlugin({ + terserOptions: { + format: { + comments: false, + }, + }, + extractComments: false, + }), + ], }, }; diff --git a/client/package.json b/client/package.json index b155e7a5..7c64c5ea 100644 --- a/client/package.json +++ b/client/package.json @@ -6,17 +6,20 @@ "scripts": { "dev": "cross-env NODE_ENV=development webpack serve --config ./config/webpack.dev.ts --progress", "build": "cross-env NODE_ENV=production webpack --config ./config/webpack.prod.ts --progress", - "deploy": "aws s3 sync ./build s3://asnity --profile=mjsdo2", + "analysis": "cross-env NODE_ENV=production webpack --config ./config/webpack.analysis.ts --progress", "test": "jest" }, "dependencies": { + "@heroicons/react": "^2.0.13", "@tanstack/react-query": "^4.16.1", "axios": "^1.1.3", "classnames": "^2.3.2", - "common": "1.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-hook-form": "^7.39.4", "react-router-dom": "^6.4.3", + "react-toastify": "^9.1.1", + "shared": "1.0.0", "tailwindcss": "^3.2.4", "zustand": "^4.1.4" }, @@ -27,6 +30,7 @@ "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.9", + "@tanstack/react-query-devtools": "^4.16.1", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@types/jest": "^29.2.2", @@ -35,12 +39,14 @@ "@types/webpack-bundle-analyzer": "^4.6.0", "@typescript-eslint/eslint-plugin": "^5.42.1", "@typescript-eslint/parser": "^5.42.1", + "autoprefixer": "^10.4.13", "babel-jest": "^29.3.1", "babel-loader": "^9.1.0", "core-js": "^3.26.0", "cross-env": "^7.0.3", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.2.2", + "dotenv": "^16.0.3", "eslint": "8.22", "eslint-config-naver": "^2.1.0", "eslint-config-prettier": "^8.5.0", @@ -53,6 +59,8 @@ "jest-environment-jsdom": "^29.3.1", "mini-css-extract-plugin": "^2.6.1", "msw": "^0.48.2", + "postcss": "^8.4.19", + "postcss-loader": "^7.0.1", "prettier": "^2.7.1", "react-refresh": "^0.14.0", "style-loader": "^3.3.1", diff --git a/client/postcss.config.js b/client/postcss.config.js new file mode 100644 index 00000000..12a703d9 --- /dev/null +++ b/client/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/client/public/favicon.ico b/client/public/favicon.ico new file mode 100644 index 00000000..3702cb44 Binary files /dev/null and b/client/public/favicon.ico differ diff --git a/client/public/index.html b/client/public/index.html index 74a69e9b..84305a91 100644 --- a/client/public/index.html +++ b/client/public/index.html @@ -6,6 +6,7 @@ name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" /> + Asnity diff --git a/client/src/App.tsx b/client/src/App.tsx index 742016a3..072a03b9 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -1,7 +1,49 @@ +import AuthorizedLayer from '@components/AuthorizedLayer'; +import UnAuthorizedLayer from '@components/UnAuthorizedLayer'; +import AccessDenied from '@pages/AccessDenied'; +import Community from '@pages/Community'; +import DM from '@pages/DM'; +import DMRoom from '@pages/DMRoom'; +import Friends from '@pages/Friends'; +import Home from '@pages/Home'; +import NotFound from '@pages/NotFound'; +import Root from '@pages/Root'; +import SignIn from '@pages/SignIn'; +import SignUp from '@pages/SignUp'; import React from 'react'; +import { + RouterProvider, + Route, + createBrowserRouter, + createRoutesFromElements, +} from 'react-router-dom'; -const App = () => { - return
App
; -}; +const router = createBrowserRouter( + createRoutesFromElements( + + } /> + }> + }> + }> + } /> + } /> + + } + /> + + + }> + } /> + } /> + + } /> + } /> + , + ), +); + +const App = () => ; export default App; diff --git a/client/src/assets/icons/logo.svg b/client/src/assets/icons/logo.svg new file mode 100644 index 00000000..0d64c257 --- /dev/null +++ b/client/src/assets/icons/logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/src/components/AuthInput/index.tsx b/client/src/components/AuthInput/index.tsx new file mode 100644 index 00000000..9161148e --- /dev/null +++ b/client/src/components/AuthInput/index.tsx @@ -0,0 +1,63 @@ +import type { + ChangeEventHandler, + ComponentPropsWithRef, + HTMLInputTypeAttribute, +} from 'react'; + +import cn from 'classnames'; +import React from 'react'; + +interface Props extends ComponentPropsWithRef<'input'> { + type?: HTMLInputTypeAttribute; + value: string; + onChange: ChangeEventHandler; + className?: string; + placeholder?: string; +} + +const AuthInput: React.FC = ({ + type = 'text', + value = '', + onChange, + className = '', + placeholder = 'Default', + ...restProps +}) => { + const inputValueFilled = value.length >= 1; + + const movePlaceholderTop = cn([ + { + 'top-1/2': !inputValueFilled, + 'text-s16': !inputValueFilled, + 'top-[16px]': inputValueFilled, + 'text-s12': inputValueFilled, + }, + ]); + + const moveInputValueBottom = cn([ + { + 'pt-6': inputValueFilled, + }, + ]); + + return ( +
+ +
+ {placeholder} +
+
+ ); +}; + +export default AuthInput; diff --git a/client/src/components/AuthorizedLayer/index.tsx b/client/src/components/AuthorizedLayer/index.tsx new file mode 100644 index 00000000..f1d0d205 --- /dev/null +++ b/client/src/components/AuthorizedLayer/index.tsx @@ -0,0 +1,8 @@ +import React from 'react'; +import { Outlet } from 'react-router-dom'; + +const AuthorizedLayer = () => { + return ; +}; + +export default AuthorizedLayer; diff --git a/client/src/components/Avatar/index.tsx b/client/src/components/Avatar/index.tsx new file mode 100644 index 00000000..88f4c14e --- /dev/null +++ b/client/src/components/Avatar/index.tsx @@ -0,0 +1,38 @@ +import React from 'react'; + +export interface AvatarProps { + size: 'small' | 'medium'; + variant: 'circle' | 'rectangle'; + name: string; + url?: string; +} + +const ROUNDED = { + rectangle: 'rounded-2xl', + circle: 'rounded-full', +}; + +const WH = { + small: 'w-[57px] h-[57px]', + medium: 'w-[65px] h-[65px]', +}; + +const Avatar: React.FC = ({ name, url, size, variant }) => { + return ( +
+ {url ? ( + {`${name}의 + ) : ( + name.at(0) + )} +
+ ); +}; + +export default Avatar; diff --git a/client/src/components/Badge/index.tsx b/client/src/components/Badge/index.tsx new file mode 100644 index 00000000..5efd918b --- /dev/null +++ b/client/src/components/Badge/index.tsx @@ -0,0 +1,35 @@ +import React from 'react'; + +interface BadgeProps { + children?: React.ReactNode; + size?: 'small' | 'medium'; + color?: 'success' | 'error' | 'default'; +} + +const scale = { + small: 'w-5 h-5', + medium: 'w-6 h-6', +}; + +const background = { + success: 'bg-success', + error: 'bg-error', + default: 'bg-label', +}; + +const Badge: React.FC = ({ + children, + size = 'small', + color = 'default', +}) => { + return ( +
+
+ {children} +
+ ); +}; + +export default Badge; diff --git a/client/src/components/Button/index.tsx b/client/src/components/Button/index.tsx new file mode 100644 index 00000000..115a0a4a --- /dev/null +++ b/client/src/components/Button/index.tsx @@ -0,0 +1,93 @@ +import type { ReactNode, ComponentPropsWithoutRef } from 'react'; + +import React, { useMemo } from 'react'; + +const buttonHeight = { + md: 'h-[56px]', + sm: 'h-[40px]', +}; + +const buttonRounded = { + md: 'rounded-[20px]', + sm: 'rounded-[11px]', +}; + +const buttonBg = (outlined: boolean) => ({ + primary: outlined + ? 'border-primary hover:border-primary-dark active:border-primary' + : 'bg-primary hover:bg-primary-dark active:bg-primary', + secondary: outlined + ? 'border-secondary hover:border-secondary-dark active:border-secondary' + : 'bg-secondary hover:bg-secondary-dark active:bg-secondary', + dark: outlined + ? 'border-indigo hover:border-titleActive active:border-indigo' + : 'bg-indigo hover:bg-titleActive active:bg-indigo', +}); + +const buttonText = (outlined: boolean) => ({ + primary: outlined + ? 'text-primary hover:text-primary-dark active:text-primary' + : 'text-offWhite', + secondary: outlined + ? 'text-secondary hover:text-secondary-dark active:text-secondary' + : 'text-offWhite', + dark: outlined + ? 'text-indigo hover:text-titleActive active:text-indigo' + : 'text-offWhite', +}); + +const focusOutline = { + primary: 'outline-primary-light', + secondary: 'outline-secondary-light', + dark: 'outline-placeholder', +}; + +export type ButtonSize = 'md' | 'sm'; +export type ButtonColor = 'primary' | 'secondary' | 'dark'; +export interface Props extends ComponentPropsWithoutRef<'button'> { + children: ReactNode; + outlined?: boolean; + width?: number | string; + minWidth?: number | string; + maxWidth?: number | string; + size?: ButtonSize; + color: ButtonColor; +} + +const Button: React.FC = ({ + children, + outlined = false, + size = 'sm', + color = 'dark', + width, + minWidth, + maxWidth, + ...restProps +}) => { + const As = 'button'; + + const style = useMemo( + () => ({ width, minWidth, maxWidth }), + [width, minWidth, maxWidth], + ); + + return ( + + {children} + + ); +}; + +export default Button; diff --git a/client/src/components/CommunityAvatar/index.tsx b/client/src/components/CommunityAvatar/index.tsx new file mode 100644 index 00000000..bc0306f7 --- /dev/null +++ b/client/src/components/CommunityAvatar/index.tsx @@ -0,0 +1,13 @@ +import Avatar, { AvatarProps } from '@components/Avatar'; +import React from 'react'; + +const CommunityAvatar: React.FC = ({ + variant = 'rectangle', + size = 'medium', + name, + url, +}) => { + return ; +}; + +export default CommunityAvatar; diff --git a/client/src/components/ErrorMessage/index.tsx b/client/src/components/ErrorMessage/index.tsx new file mode 100644 index 00000000..e3797115 --- /dev/null +++ b/client/src/components/ErrorMessage/index.tsx @@ -0,0 +1,22 @@ +import type { ReactNode } from 'react'; + +import React, { memo, useMemo } from 'react'; + +const messageSize = { + lg: 'text-s16', + md: 'text-s14', + sm: 'text-s12', +} as const; + +export interface Props { + children: ReactNode; + size?: keyof typeof messageSize; +} + +const ErrorMessage: React.FC = ({ children, size = 'sm' }) => { + const memoizedSize = useMemo(() => messageSize[size], [size]); + + return
{children}
; +}; + +export default memo(ErrorMessage); diff --git a/client/src/components/Logo/index.tsx b/client/src/components/Logo/index.tsx new file mode 100644 index 00000000..16eb5be6 --- /dev/null +++ b/client/src/components/Logo/index.tsx @@ -0,0 +1,24 @@ +import logoUrl from '@icons/logo.svg'; +import React, { memo } from 'react'; + +const logoSize = { + xl: 'w-[140px]', + lg: 'w-[120px]', + md: 'w-[100px]', + sm: 'w-[80px]', + xs: 'w-[60px]', +} as const; + +export interface Props { + size?: keyof typeof logoSize; +} + +const Logo: React.FC = ({ size = 'md' }) => { + return ( +
+ +
+ ); +}; + +export default memo(Logo); diff --git a/client/src/components/SuccessMessage/index.tsx b/client/src/components/SuccessMessage/index.tsx new file mode 100644 index 00000000..c73467ab --- /dev/null +++ b/client/src/components/SuccessMessage/index.tsx @@ -0,0 +1,22 @@ +import type { ReactNode } from 'react'; + +import React, { memo, useMemo } from 'react'; + +const messageSize = { + lg: 'text-s16', + md: 'text-s14', + sm: 'text-s12', +} as const; + +export interface Props { + children: ReactNode; + size?: keyof typeof messageSize; +} + +const SuccessMessage: React.FC = ({ children, size = 'sm' }) => { + const memoizedSize = useMemo(() => messageSize[size], [size]); + + return
{children}
; +}; + +export default memo(SuccessMessage); diff --git a/client/src/components/TextButton/index.tsx b/client/src/components/TextButton/index.tsx new file mode 100644 index 00000000..bb088d60 --- /dev/null +++ b/client/src/components/TextButton/index.tsx @@ -0,0 +1,49 @@ +import type { ReactNode, ComponentPropsWithoutRef, CSSProperties } from 'react'; + +import cn from 'classnames'; +import React from 'react'; + +const textButtonSize = { + xl: 'text-s20', + lg: 'text-s18', + md: 'text-s16', + sm: 'text-s14', + xs: 'text-s12', +}; + +const textButtonColor = { + default: '', + primary: 'text-primary hover:text-primary-dark active:text-primary', + secondary: 'text-secondary hover:text-secondary-dark active:text-secondary', + dark: 'text-body hover:text-titleActive active:text-body', +}; + +export type TextButtonColor = keyof typeof textButtonColor; +export type TextButtonSize = keyof typeof textButtonSize; + +export interface Props extends ComponentPropsWithoutRef<'button'> { + children: ReactNode; + size: TextButtonSize; + color?: TextButtonColor; + style?: CSSProperties; + className?: string; +} + +const TextButton: React.FC = ({ + children, + size, + color = 'default', + className, + style, + ...restProps +}) => { + const classes = cn([textButtonSize[size], textButtonColor[color], className]); + + return ( + + ); +}; + +export default TextButton; diff --git a/client/src/components/UnAuthorizedLayer/index.tsx b/client/src/components/UnAuthorizedLayer/index.tsx new file mode 100644 index 00000000..3d9c16f2 --- /dev/null +++ b/client/src/components/UnAuthorizedLayer/index.tsx @@ -0,0 +1,8 @@ +import React from 'react'; +import { Outlet } from 'react-router-dom'; + +const UnAuthorizedLayer = () => { + return ; +}; + +export default UnAuthorizedLayer; diff --git a/client/src/components/UserAvatar/index.tsx b/client/src/components/UserAvatar/index.tsx new file mode 100644 index 00000000..2f7dbaa4 --- /dev/null +++ b/client/src/components/UserAvatar/index.tsx @@ -0,0 +1,13 @@ +import Avatar, { AvatarProps } from '@components/Avatar'; +import React from 'react'; + +const UserAvatar: React.FC = ({ + variant = 'circle', + size = 'small', + name, + url, +}) => { + return ; +}; + +export default UserAvatar; diff --git a/client/src/components/UserProfile/index.tsx b/client/src/components/UserProfile/index.tsx new file mode 100644 index 00000000..f86de791 --- /dev/null +++ b/client/src/components/UserProfile/index.tsx @@ -0,0 +1,44 @@ +import Avatar from '@components/Avatar'; +import Badge from '@components/Badge'; +import React from 'react'; +import { User } from 'shared/lib/user'; + +interface UserItemProps { + user: User; +} + +const USER_STATUS = { + OFFLINE: 'offline', + ONLINE: 'online', + AFK: 'afk', +}; + +type UserStatus = typeof USER_STATUS[keyof typeof USER_STATUS]; + +const statusColor: { + [key: UserStatus]: 'default' | 'success' | 'error'; +} = { + [USER_STATUS.OFFLINE]: 'default', + [USER_STATUS.ONLINE]: 'success', + [USER_STATUS.AFK]: 'error', +}; + +const UserProfile: React.FC = ({ + user: { nickname, profileUrl, status }, +}) => { + return ( +
+ + + +
{nickname}
+
+ ); +}; + +export default UserProfile; diff --git a/client/src/constants/url.ts b/client/src/constants/url.ts new file mode 100644 index 00000000..dad72071 --- /dev/null +++ b/client/src/constants/url.ts @@ -0,0 +1,3 @@ +const _API_URL = process.env.API_URL as string; + +export const API_URL = _API_URL; diff --git a/client/src/custom.d.ts b/client/src/custom.d.ts new file mode 100644 index 00000000..71b5a8ff --- /dev/null +++ b/client/src/custom.d.ts @@ -0,0 +1,5 @@ +declare module '*.svg' { + // eslint-disable-next-line + const content: any; + export default content; +} diff --git a/client/src/hooks/useInput.ts b/client/src/hooks/useInput.ts new file mode 100644 index 00000000..58210b96 --- /dev/null +++ b/client/src/hooks/useInput.ts @@ -0,0 +1,18 @@ +import type { ChangeEvent } from 'react'; + +import { useCallback, useState } from 'react'; + +const useInput = (initialValue: T) => { + const [value, setValue] = useState(initialValue); + + const onChange = useCallback( + (e: ChangeEvent) => { + setValue(e.target.value as T); + }, + [], + ); + + return [value, onChange, setValue]; +}; + +export default useInput; diff --git a/client/src/index.css b/client/src/index.css index 1236d8ed..ff8c90ab 100644 --- a/client/src/index.css +++ b/client/src/index.css @@ -1,3 +1,13 @@ +@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans+KR:wght@700&family=Montserrat&family=Noto+Sans+KR:wght@400;700&display=swap'); + +@tailwind base; +@tailwind components; +@tailwind utilities; + * { box-sizing: border-box; } + +#root { + width: 100vw; +} \ No newline at end of file diff --git a/client/src/index.tsx b/client/src/index.tsx index 5a0016da..c7d541f2 100644 --- a/client/src/index.tsx +++ b/client/src/index.tsx @@ -1,9 +1,11 @@ +import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import React from 'react'; import ReactDOM from 'react-dom/client'; -import { BrowserRouter } from 'react-router-dom'; +import { ToastContainer } from 'react-toastify'; +import { injectStyle } from 'react-toastify/dist/inject-style'; import App from './App'; - import './index.css'; if (process.env.NODE_ENV === 'development') { @@ -12,12 +14,21 @@ if (process.env.NODE_ENV === 'development') { worker.start(); } +const queryClient = new QueryClient(); const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement, ); +/** + * react-toastify import css 안되는 이슈 + * // TODO: 링크 업데이트하기 + */ +injectStyle(); + root.render( - + + - , + + , ); diff --git a/client/src/layouts/CommunityNav/index.tsx b/client/src/layouts/CommunityNav/index.tsx new file mode 100644 index 00000000..7145d6d3 --- /dev/null +++ b/client/src/layouts/CommunityNav/index.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { useParams } from 'react-router-dom'; + +const CommunityNav = () => { + const { communityId } = useParams(); + + return ( + <> +
+ {communityId} +
+ + ); +}; + +export default CommunityNav; diff --git a/client/src/layouts/DmNav/index.tsx b/client/src/layouts/DmNav/index.tsx new file mode 100644 index 00000000..e56fd6cb --- /dev/null +++ b/client/src/layouts/DmNav/index.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +const DmNav = () => { + return ( + <> +
+ Direct Message +
+ + ); +}; + +export default DmNav; diff --git a/client/src/layouts/FollowingTab/apis/getFollowings.ts b/client/src/layouts/FollowingTab/apis/getFollowings.ts new file mode 100644 index 00000000..2955f518 --- /dev/null +++ b/client/src/layouts/FollowingTab/apis/getFollowings.ts @@ -0,0 +1,11 @@ +import { API_URL } from '@constants/url'; +import axios from 'axios'; + +const BASE_URL = `${API_URL}/api`; + +const getFollowings = (query: string) => + axios + .get(`${BASE_URL}/user/followings?query=${query}`) + .then((res) => res.data); + +export default getFollowings; diff --git a/client/src/layouts/FollowingTab/apis/updateFollowing.ts b/client/src/layouts/FollowingTab/apis/updateFollowing.ts new file mode 100644 index 00000000..8b581487 --- /dev/null +++ b/client/src/layouts/FollowingTab/apis/updateFollowing.ts @@ -0,0 +1,9 @@ +import { API_URL } from '@constants/url'; +import axios from 'axios'; + +const BASE_URL = `${API_URL}/api`; + +const updateFollowing = (userId: string) => + axios.post(`${BASE_URL}/user/following/${userId}`).then((res) => res.data); + +export default updateFollowing; diff --git a/client/src/layouts/FollowingTab/components/item.tsx b/client/src/layouts/FollowingTab/components/item.tsx new file mode 100644 index 00000000..dfdc5cd2 --- /dev/null +++ b/client/src/layouts/FollowingTab/components/item.tsx @@ -0,0 +1,45 @@ +import UserProfile from '@components/UserProfile'; +import { + EllipsisHorizontalIcon, + ChatBubbleLeftIcon, +} from '@heroicons/react/20/solid'; +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import { User } from 'shared/lib/user'; + +import useFollowingsMutation from '../hooks/useFollowingsMutation'; + +interface FollowingProps { + user: User; +} + +const FollowingItem: React.FC = ({ user }) => { + const navigate = useNavigate(); + const updateFollowing = useFollowingsMutation(user._id); + + const handleChatButtonClick = () => { + navigate(`/dms/${user._id}`); + }; + + return ( +
  • + +
    + + +
    +
  • + ); +}; + +export default FollowingItem; diff --git a/client/src/layouts/FollowingTab/components/list.tsx b/client/src/layouts/FollowingTab/components/list.tsx new file mode 100644 index 00000000..9d024caf --- /dev/null +++ b/client/src/layouts/FollowingTab/components/list.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { User } from 'shared/lib/user'; + +import FollowingItem from './item'; + +interface FollowingListProps { + users: User[]; +} + +const FollowingList: React.FC = ({ users }) => { + return ( +
      + {users.map((user: User) => ( + + ))} +
    + ); +}; + +export default FollowingList; diff --git a/client/src/layouts/FollowingTab/components/searchInput.tsx b/client/src/layouts/FollowingTab/components/searchInput.tsx new file mode 100644 index 00000000..8865bdb6 --- /dev/null +++ b/client/src/layouts/FollowingTab/components/searchInput.tsx @@ -0,0 +1,30 @@ +import { MagnifyingGlassIcon } from '@heroicons/react/20/solid'; +import React from 'react'; + +type SearchInputProps = React.InputHTMLAttributes; + +const SearchInput: React.FC = ({ + value, + onChange, + placeholder, +}) => { + return ( +
    +
    + +
    + +
    + ); +}; + +SearchInput.displayName = 'SearchInput'; + +export default SearchInput; diff --git a/client/src/layouts/FollowingTab/hooks/useDebouncedValue.ts b/client/src/layouts/FollowingTab/hooks/useDebouncedValue.ts new file mode 100644 index 00000000..2ca99cee --- /dev/null +++ b/client/src/layouts/FollowingTab/hooks/useDebouncedValue.ts @@ -0,0 +1,18 @@ +import { useState, useEffect } from 'react'; + +const useDebouncedValue = (value: T, delay = 500) => { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const timerId = setTimeout(() => { + setDebouncedValue(value); + }, delay); + + return () => { + clearTimeout(timerId); + }; + }, [value, delay]); + return debouncedValue; +}; + +export default useDebouncedValue; diff --git a/client/src/layouts/FollowingTab/hooks/useFollowingsMutation.ts b/client/src/layouts/FollowingTab/hooks/useFollowingsMutation.ts new file mode 100644 index 00000000..88fec020 --- /dev/null +++ b/client/src/layouts/FollowingTab/hooks/useFollowingsMutation.ts @@ -0,0 +1,43 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { GetUsersReponse, User } from 'shared/lib/user'; + +import updateFollowing from '../apis/updateFollowing'; + +const useFollowingsMutation = (userId: string) => { + const queryClient = useQueryClient(); + const mutation = useMutation(() => updateFollowing(userId), { + onMutate: async (deleted: User) => { + await queryClient.cancelQueries(['followings']); + const previousFollowings = queryClient.getQueryData([ + 'followings', + ]); + + if (previousFollowings) { + const { users } = previousFollowings.result; + + queryClient.setQueryData(['followings'], { + ...previousFollowings, + result: { + ...previousFollowings.result, + users: users.filter((user) => user._id !== deleted._id), + }, + }); + } + return { previousFollowings }; + }, + onError: (err, variables, context) => { + if (context?.previousFollowings) + queryClient.setQueryData( + ['followings'], + context.previousFollowings, + ); + }, + onSettled: () => { + queryClient.invalidateQueries(['followings']); + }, + }); + + return mutation; +}; + +export default useFollowingsMutation; diff --git a/client/src/layouts/FollowingTab/hooks/useFollowingsQuery.ts b/client/src/layouts/FollowingTab/hooks/useFollowingsQuery.ts new file mode 100644 index 00000000..9cb25d2d --- /dev/null +++ b/client/src/layouts/FollowingTab/hooks/useFollowingsQuery.ts @@ -0,0 +1,15 @@ +import { useQuery } from '@tanstack/react-query'; + +import getFollowings from '../apis/getFollowings'; + +const useFollowingsQuery = (search: string, options?: Record) => { + const query = useQuery( + ['followings', search], + () => getFollowings(search), + options, + ); + + return query; +}; + +export default useFollowingsQuery; diff --git a/client/src/layouts/FollowingTab/index.tsx b/client/src/layouts/FollowingTab/index.tsx new file mode 100644 index 00000000..8660f4d3 --- /dev/null +++ b/client/src/layouts/FollowingTab/index.tsx @@ -0,0 +1,34 @@ +import React, { useState, Suspense } from 'react'; + +import FollowingList from './components/list'; +import SearchInput from './components/searchInput'; +import useDebouncedValue from './hooks/useDebouncedValue'; +import useFollowingsQuery from './hooks/useFollowingsQuery'; + +const FollowingTab = () => { + const DEBOUNCE_DELAY = 500; + const [filter, setFilter] = useState(''); + const debouncedFilter = useDebouncedValue(filter, DEBOUNCE_DELAY); + const { data } = useFollowingsQuery(debouncedFilter, { suspense: true }); + + return ( +
    +
    + setFilter(e.target.value)} + placeholder="검색하기" + /> +
    + loading...
    }> + {data.result.followings.length ? ( + + ) : ( + '일치하는 사용자가 없습니다.' + )} + +
    + ); +}; + +export default FollowingTab; diff --git a/client/src/layouts/Gnb/index.tsx b/client/src/layouts/Gnb/index.tsx new file mode 100644 index 00000000..49f5e6b8 --- /dev/null +++ b/client/src/layouts/Gnb/index.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +const Gnb = () => { + return ( +
    + Gnb +
    + ); +}; + +export default Gnb; diff --git a/client/src/layouts/Sidebar/index.tsx b/client/src/layouts/Sidebar/index.tsx new file mode 100644 index 00000000..1d436ad9 --- /dev/null +++ b/client/src/layouts/Sidebar/index.tsx @@ -0,0 +1,31 @@ +import UserProfile from '@components/UserProfile'; +import CommunityNav from '@features/CommunityNav'; +import DmNav from '@features/DmNav'; +import { Cog6ToothIcon } from '@heroicons/react/20/solid'; +import { useQuery } from '@tanstack/react-query'; +import axios from 'axios'; +import React from 'react'; +import { useLocation } from 'react-router-dom'; + +const getMyInfo = () => axios.get('/api/user/auth/me').then((res) => res.data); + +const Sidebar = () => { + const { pathname } = useLocation(); + const { isLoading, data } = useQuery(['me'], getMyInfo); + + return ( +
    + +
    + {isLoading ? 'loading' : } + +
    +
    + ); +}; + +export default Sidebar; diff --git a/client/src/mocks/data/users.js b/client/src/mocks/data/users.js new file mode 100644 index 00000000..a2d890e9 --- /dev/null +++ b/client/src/mocks/data/users.js @@ -0,0 +1,36 @@ +import { getRandomInt } from '../utils/rand'; + +export const users = [ + { + _id: 'a', + id: '1', + nickname: '나영', + status: 'online', + profileUrl: `https://picsum.photos/id/${getRandomInt(500)}/70`, + description: 'default description', + }, + { + _id: 'b', + id: '2', + nickname: '수만', + status: 'offline', + profileUrl: `https://picsum.photos/id/${getRandomInt(500)}/70`, + description: 'default descrption', + }, + { + _id: 'c', + id: '3', + nickname: '민종', + status: 'afk', + profileUrl: `https://picsum.photos/id/${getRandomInt(500)}/70`, + description: 'default descrption', + }, + { + _id: 'd', + id: '4', + nickname: '준영', + status: 'afk', + profileUrl: `https://picsum.photos/id/${getRandomInt(500)}/70`, + description: 'default descrption', + }, +]; diff --git a/client/src/mocks/handlers/Auth.js b/client/src/mocks/handlers/Auth.js index 0bf3004c..074d78d5 100644 --- a/client/src/mocks/handlers/Auth.js +++ b/client/src/mocks/handlers/Auth.js @@ -1,14 +1,81 @@ +import { API_URL } from '@constants/url'; import { rest } from 'msw'; -export const GetUser = rest.get('/users', (req, res, ctx) => { +import { users } from '../data/users'; + +const BASE_URL = `${API_URL}/api`; + +// 회원가입 +const SignUp = rest.post(`${BASE_URL}/user/auth/signup`, (req, res, ctx) => { + // 응답 메세지 성공-실패를 토글하려면 이 값을 바꿔주세요. + const ERROR = true; + + const errorResponse = res( + ctx.status(400), + ctx.delay(500), + ctx.json({ + statusCode: 403, + message: '에러가 발생했습니다.', + error: 'Forbidden', + }), + ); + + const successResponse = res( + ctx.status(201), + ctx.delay(500), + ctx.json({ + statusCode: 201, + result: { + message: '회원가입 성공', + }, + }), + ); + + return ERROR ? errorResponse : successResponse; +}); + +// 로그인 +// 응답 json 데이터로 Access token, 쿠키로 Refresh token을 받는다. +const SignIn = rest.post(`${BASE_URL}/user/auth/signin`, (req, res, ctx) => { + // 응답 메세지 성공-실패를 토글하려면 이 값을 바꿔주세요. + const ERROR = false; + + const successResponse = res( + ctx.status(200), + ctx.delay(500), + ctx.json({ + statusCode: 200, + result: { + _id: '_id', + accessToken: 'accessToken', + }, + }), + ); + + const errorResponse = res( + ctx.status(400), + ctx.delay(500), + ctx.json({ + statusCode: 400, + message: 'Unknown Error', + error: '', + }), + ); + + return ERROR ? errorResponse : successResponse; +}); + +export const GetMyInfo = rest.get('/api/user/auth/me', (req, res, ctx) => { return res( + ctx.delay(), ctx.status(200), - ctx.delay(1000), ctx.json({ statusCode: 200, result: { - nickname: '닉네임', + user: users[0], }, }), ); }); + +export default [SignUp, SignIn, GetMyInfo]; diff --git a/client/src/mocks/handlers/Friend.js b/client/src/mocks/handlers/Friend.js new file mode 100644 index 00000000..8ea10e21 --- /dev/null +++ b/client/src/mocks/handlers/Friend.js @@ -0,0 +1,51 @@ +import { API_URL } from '@constants/url'; +import { rest } from 'msw'; + +import { users } from '../data/users'; + +const BASE_URL = `${API_URL}/api`; + +const GetFollowings = rest.get( + `${BASE_URL}/user/followings`, + (req, res, ctx) => { + const query = req.url.searchParams.get('query') ?? ''; + + return res( + ctx.delay(), + ctx.status(200), + ctx.json({ + statusCode: 200, + result: { + followings: query + ? users.filter(({ nickname }) => + nickname.toUpperCase().includes(query.toUpperCase()), + ) + : users, + }, + }), + ); + }, +); + +const UpdateFollowing = rest.post( + `${BASE_URL}/user/following/:userId`, + (req, res, ctx) => { + const { userId } = req.params; + const idx = users.findIndex((user) => user._id === userId); + + users.splice(idx, 1); + console.log(users); + return res( + ctx.delay(), + ctx.status(200), + ctx.json({ + statusCode: 200, + result: {}, + }), + ); + }, +); + +const FriendHandlers = [GetFollowings, UpdateFollowing]; + +export default FriendHandlers; diff --git a/client/src/mocks/handlers/index.js b/client/src/mocks/handlers/index.js index a84d7023..53cf66eb 100644 --- a/client/src/mocks/handlers/index.js +++ b/client/src/mocks/handlers/index.js @@ -1,3 +1,4 @@ -import { GetUser } from './Auth'; +import AuthHandlers from './Auth'; +import FriendHandlers from './Friend'; -export const handlers = [GetUser]; +export const handlers = [...AuthHandlers, ...FriendHandlers]; diff --git a/client/src/mocks/utils/rand.js b/client/src/mocks/utils/rand.js new file mode 100644 index 00000000..d4fa77ef --- /dev/null +++ b/client/src/mocks/utils/rand.js @@ -0,0 +1,3 @@ +export const getRandomInt = (max) => { + return Math.floor(Math.random() * max); +}; diff --git a/client/src/pages/AccessDenied/index.tsx b/client/src/pages/AccessDenied/index.tsx new file mode 100644 index 00000000..e1d89adf --- /dev/null +++ b/client/src/pages/AccessDenied/index.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const AccessDenied = () => { + return
    ; +}; + +export default AccessDenied; diff --git a/client/src/pages/Community/index.tsx b/client/src/pages/Community/index.tsx new file mode 100644 index 00000000..d2d95b2a --- /dev/null +++ b/client/src/pages/Community/index.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Community = () => { + return
    Community
    ; +}; + +export default Community; diff --git a/client/src/pages/DM/index.tsx b/client/src/pages/DM/index.tsx new file mode 100644 index 00000000..f3890d92 --- /dev/null +++ b/client/src/pages/DM/index.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { Outlet } from 'react-router-dom'; + +const DM = () => { + return ( +
    + +
    + ); +}; + +export default DM; diff --git a/client/src/pages/DMRoom/index.tsx b/client/src/pages/DMRoom/index.tsx new file mode 100644 index 00000000..9bd23978 --- /dev/null +++ b/client/src/pages/DMRoom/index.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { useParams } from 'react-router-dom'; + +const DMRoom = () => { + const { roomId } = useParams(); + + return ( + <> +
    + @{roomId} +
    + + ); +}; + +export default DMRoom; diff --git a/client/src/pages/Followers/index.tsx b/client/src/pages/Followers/index.tsx new file mode 100644 index 00000000..99df5f18 --- /dev/null +++ b/client/src/pages/Followers/index.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Followers = () => { + return
    Followers
    ; +}; + +export default Followers; diff --git a/client/src/pages/Friends/index.tsx b/client/src/pages/Friends/index.tsx new file mode 100644 index 00000000..61faf47e --- /dev/null +++ b/client/src/pages/Friends/index.tsx @@ -0,0 +1,68 @@ +import FollowingTab from '@features/FollowingTab'; +import Followers from '@pages/Followers'; +import UserSearch from '@pages/UserSearch'; +import React, { useState } from 'react'; + +const TAB = { + FOLLOWINGS: 'followings', + FOLLOWERS: 'followers', + USER_SEARCH: 'user-search', +}; + +const tabs = [ + { + name: '팔로잉', + tab: 'followings', + }, + { + name: '팔로워', + tab: 'followers', + }, + { + name: '사용자 검색', + tab: 'user-search', + }, +]; + +const TabPanel: Record = { + [TAB.FOLLOWINGS]: , + [TAB.FOLLOWERS]: , + [TAB.USER_SEARCH]: , +}; + +const DEFAULT_TAB = TAB.FOLLOWINGS; + +const Friends = () => { + const [tab, setTab] = useState(DEFAULT_TAB); + + return ( +
    +
    +
      + {tabs.map(({ name, tab: t }) => ( +
    • + +
    • + ))} +
    +
    +
    +
    + {TabPanel[tab]} +
    +
    + 온라인, 오프라인 +
    +
    +
    + ); +}; + +export default Friends; diff --git a/client/src/pages/Home/index.tsx b/client/src/pages/Home/index.tsx new file mode 100644 index 00000000..bac9f50a --- /dev/null +++ b/client/src/pages/Home/index.tsx @@ -0,0 +1,16 @@ +import Gnb from '@features/Gnb'; +import Sidebar from '@features/Sidebar'; +import React from 'react'; +import { Outlet } from 'react-router-dom'; + +const Home = () => { + return ( +
    + + + +
    + ); +}; + +export default Home; diff --git a/client/src/pages/NotFound/index.tsx b/client/src/pages/NotFound/index.tsx new file mode 100644 index 00000000..544c763e --- /dev/null +++ b/client/src/pages/NotFound/index.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const NotFound = () => { + return
    NotFound
    ; +}; + +export default NotFound; diff --git a/client/src/pages/Root/index.tsx b/client/src/pages/Root/index.tsx new file mode 100644 index 00000000..7c44f79c --- /dev/null +++ b/client/src/pages/Root/index.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Root = () => { + return
    ; +}; + +export default Root; diff --git a/client/src/pages/SignIn/index.tsx b/client/src/pages/SignIn/index.tsx new file mode 100644 index 00000000..9848110e --- /dev/null +++ b/client/src/pages/SignIn/index.tsx @@ -0,0 +1,173 @@ +import AuthInput from '@components/AuthInput'; +import Button from '@components/Button'; +import ErrorMessage from '@components/ErrorMessage'; +import Logo from '@components/Logo'; +import TextButton from '@components/TextButton'; +import { API_URL } from '@constants/url'; +import { useTokenStore } from '@stores/tokenStore'; +import { useMutation } from '@tanstack/react-query'; +import axios, { AxiosError } from 'axios'; +import React from 'react'; +import { Controller, useForm } from 'react-hook-form'; +import { Navigate, useNavigate } from 'react-router-dom'; +import { toast } from 'react-toastify'; + +interface SignInFields { + id: string; + password: string; +} + +interface SuccessResponse { + statusCode: number; + result: T; +} + +type SignInApi = ( + fields: SignInFields, +) => Promise>; + +const endPoint = `${API_URL}/api/user/auth/signin`; + +const signInApi: SignInApi = ({ id, password }) => { + return axios + .post(endPoint, { id, password }) + .then((response) => response.data); +}; +// 액세스 토큰으로 다시 유저 정보 요청해야함 +// _id, id(이메일), nickname, status, profileUrl, description + +const SignIn = () => { + const accessToken = useTokenStore((state) => state.accessToken); + const setAccessToken = useTokenStore((state) => state.setAccessToken); + const { control, handleSubmit, reset } = useForm({ + mode: 'all', + defaultValues: { + id: '', + password: '', + }, + }); + + const navigate = useNavigate(); + + const signInMutate = useMutation(['signIn'], signInApi, { + onSuccess: (data) => { + setAccessToken(data.result.accessToken); + }, + onError: (error) => { + reset(); + if (error instanceof AxiosError) { + const errorMessage = + error?.response?.data?.message || '에러가 발생했습니다!'; + + if (Array.isArray(errorMessage)) { + errorMessage.forEach((message) => { + toast.error(message); + }); + return; + } + + toast.error(errorMessage); + return; + } + + toast.error('Unknown Error'); + }, + }); + + const handleSubmitSignInForm = ({ id, password }: SignInFields) => { + signInMutate.mutate({ id, password }); + }; + + const handleNavigateSignUpPage = () => { + navigate('/sign-up'); + }; + + if (accessToken) { + return ; + } + + return ( +
    +
    + +

    asnity

    +
    + +
    + { + return ( +
    + +
    + {errors?.id && ( + {errors.id.message} + )} +
    +
    + ); + }} + /> + + + value.length >= 8 || '비밀번호는 8자리 이상이어야 합니다!', + }} + render={({ field, formState: { errors } }) => { + return ( +
    + + { +
    + {errors?.password && ( + {errors?.password.message} + )} +
    + } +
    + ); + }} + /> + +
    + +
    + +
    + + 회원가입 + +
    + +
    + ); +}; + +export default SignIn; diff --git a/client/src/pages/SignUp/index.tsx b/client/src/pages/SignUp/index.tsx new file mode 100644 index 00000000..00c1b267 --- /dev/null +++ b/client/src/pages/SignUp/index.tsx @@ -0,0 +1,244 @@ +import AuthInput from '@components/AuthInput'; +import Button from '@components/Button'; +import ErrorMessage from '@components/ErrorMessage'; +import Logo from '@components/Logo'; +import SuccessMessage from '@components/SuccessMessage'; +import TextButton from '@components/TextButton'; +import { API_URL } from '@constants/url'; +import { useMutation } from '@tanstack/react-query'; +import axios, { AxiosError } from 'axios'; +import React from 'react'; +import { useForm, Controller } from 'react-hook-form'; +import { useNavigate } from 'react-router-dom'; +import { toast } from 'react-toastify'; + +interface SignUpFields { + id: string; + nickname: string; + password: string; + passwordCheck: string; +} + +interface SuccessResponse { + statusCode: number; + result: T; +} + +type SignUpApi = ( + fields: Omit, +) => Promise>; + +const endPoint = `${API_URL}/api/user/auth/signup`; + +const signUpApi: SignUpApi = ({ id, nickname, password }) => { + return axios + .post(endPoint, { id, nickname, password }) + .then((response) => response.data); +}; + +const SignUp = () => { + // TODO: 리팩토링 하자 + const { control, handleSubmit, watch, reset } = useForm({ + mode: 'all', + defaultValues: { + id: '', + nickname: '', + password: '', + passwordCheck: '', + }, + }); + + const navigate = useNavigate(); + + const signUpMutate = useMutation(['signUp'], signUpApi, { + onSuccess: () => { + toast.success('회원가입에 성공했습니다.'); + reset(); + }, + onError: (error) => { + if (error instanceof AxiosError) { + const errorMessage = + error?.response?.data?.message || '에러가 발생했습니다!'; + + if (Array.isArray(errorMessage)) { + errorMessage.forEach((message) => { + toast.error(message); + }); + return; + } + + toast.error(errorMessage); + return; + } + + toast.error('Unknown Error'); + }, + }); + + const password = watch('password'); + + const handleSubmitSignUpForm = (fields: SignUpFields) => { + signUpMutate.mutate(fields); + }; + + const handleNavigateSignInPage = () => { + navigate('/sign-in'); + }; + + return ( +
    +
    + +

    asnity

    +
    + +
    + { + return ( +
    + +
    + {errors?.id ? ( + {errors.id.message} + ) : ( + field.value && ( + 올바른 이메일 형식입니다! + ) + )} +
    +
    + ); + }} + /> + + + !value.includes(' ') || '공백은 포함될 수 없습니다!', + nicknameLength: (value) => + (value.length >= 2 && value.length <= 8) || + '닉네임은 2자 이상, 8자 이하만 가능합니다!', + }, + }} + render={({ field, formState: { errors } }) => { + return ( +
    + +
    + {errors?.nickname ? ( + {errors.nickname.message} + ) : ( + field.value && ( + 사용 가능한 닉네임입니다! + ) + )} +
    +
    + ); + }} + /> + + + value.length >= 8 || '비밀번호는 8자리 이상이어야 합니다!', + }} + render={({ field, formState: { errors } }) => { + return ( +
    + + { +
    + {errors?.password ? ( + {errors?.password.message} + ) : ( + field.value && ( + + 사용 가능한 비밀번호입니다! + + ) + )} +
    + } +
    + ); + }} + /> + + + value === password || '비밀번호와 일치하지 않습니다!', + }, + }} + render={({ field, formState: { errors } }) => { + return ( +
    + +
    + {errors.passwordCheck ? ( + {errors?.passwordCheck.message} + ) : ( + field.value && ( + 비밀번호가 일치합니다! + ) + )} +
    +
    + ); + }} + /> + +
    + +
    + +
    + + 로그인 페이지로 + +
    + +
    + ); +}; + +export default SignUp; diff --git a/client/src/pages/UserSearch/index.tsx b/client/src/pages/UserSearch/index.tsx new file mode 100644 index 00000000..356d07d3 --- /dev/null +++ b/client/src/pages/UserSearch/index.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const UserSearch = () => { + return
    UserSearch
    ; +}; + +export default UserSearch; diff --git a/client/src/stores/tokenStore.ts b/client/src/stores/tokenStore.ts new file mode 100644 index 00000000..b13ad94a --- /dev/null +++ b/client/src/stores/tokenStore.ts @@ -0,0 +1,19 @@ +import { useStore } from 'zustand'; +import { devtools } from 'zustand/middleware'; +import createVanillaStore from 'zustand/vanilla'; + +type TokenStore = { + accessToken: null | string; + setAccessToken: (accessToken: null | string) => void; +}; + +export const tokenStore = createVanillaStore()( + devtools((set) => ({ + accessToken: null, + setAccessToken: (newAccessToken) => + set(() => ({ accessToken: newAccessToken })), + })), +); + +export const useTokenStore = (selector: (state: TokenStore) => T) => + useStore(tokenStore, selector); diff --git a/client/tailwind.config.js b/client/tailwind.config.js new file mode 100644 index 00000000..b418c059 --- /dev/null +++ b/client/tailwind.config.js @@ -0,0 +1,58 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./src/**/*.{js,jsx,ts,tsx}'], + theme: { + extend: { + height: { + header: '90px', + }, + }, + fontSize: { + s12: ['12px', '18px'], + s14: ['14px', '24px'], + s16: ['16px', '26px'], + s18: ['18px', '30px'], + s20: ['20px', '36px'], + s22: ['22px'], + title: ['28px'], + logo: ['80px', '144px'], + }, + colors: { + titleActive: '#14142B', + body: '#4E4B66', + label: '#6E7191', + placeholder: '#A0A3BD', + line: '#D9DBE9', + inputBackground: '#EFF0F6', + background: '#F7F7FC;', + offWhite: '#FEFEFE', + indigo: '#1D1D50', + primary: { + DEFAULT: '#FFA52D', + dark: '#FF832D', + light: '#FFD89E', + }, + secondary: { + DEFAULT: '#4CAB22', + dark: '#166C12', + light: '#8BE264', + }, + success: { + DEFAULT: '#34C759', + dark: '#00A028', + light: '#DDFFE6', + }, + error: { + DEFAULT: '#FF4343', + dark: '#C60B00', + light: '#FFD1CF', + }, + }, + fontFamily: { + mont: ['Montserrat', 'sans-serif'], + sans: ['Noto Sans KR', 'sans-serif'], + ipSans: ['IBM Plex Sans KR', 'sans-serif'], + }, + }, + plugins: [], +}; diff --git a/client/tsconfig.json b/client/tsconfig.json index 17d92e8c..929f22a5 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -6,9 +6,19 @@ "baseUrl": ".", "outDir": "./build", "paths": { - + "@pages/*": ["src/pages/*"], + "@layouts/*": ["src/layouts/*"], + "@components/*": ["src/components/*"], + "@mocks/*": ["src/mocks/*"], + "@stores/*": ["src/stores/*"], + "@icons/*": ["src/assets/icons/*"], + "@constants/*": ["src/constants/*"], + "@apis/*": ["src/apis/*"], } }, "include": ["src", "config"], - "exclude": ["node_modules", "build", "dist"] + "exclude": ["node_modules", "build", "dist"], + "references": [ + { "path": "../shared" } + ] } \ No newline at end of file diff --git a/common/utils/index.js b/common/utils/index.js deleted file mode 100644 index 6ab0a284..00000000 --- a/common/utils/index.js +++ /dev/null @@ -1,6 +0,0 @@ -const commonFn = () => { - console.log('TEST'); - return 'TEST'; -} - -export default commonFn; diff --git a/package.json b/package.json index b6d0b1ca..444b28e7 100644 --- a/package.json +++ b/package.json @@ -6,14 +6,17 @@ "author": "Cola ", "license": "MIT", "private": true, - "workspaces": [ - "client", - "server", - "common" - ], + "workspaces": { + "packages": ["client","shared", "server"], + "nohoist": ["server", "server/**"] + }, "scripts": { "client": "yarn workspace client", - "api-dev" : "yarn workspace server api-dev", - "socket-dev" : "yarn workspace server socket-dev" + "server": "yarn workspace server", + "api-dev": "yarn workspace server api-dev", + "socket-dev": "yarn workspace server socket-dev", + "api-prod": "yarn workspace server api-prod", + "socket-prod": "yarn workspace server socket-prod", + "server-test": "yarn workspace server test:report" } } diff --git a/server/.gitignore b/server/.gitignore index 22f55adc..10ed122e 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -32,4 +32,6 @@ lerna-debug.log* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json -!.vscode/extensions.json \ No newline at end of file +!.vscode/extensions.json + +junit.xml \ No newline at end of file diff --git a/server/.prettierrc b/server/.prettierrc index dcb72794..a75ce2da 100644 --- a/server/.prettierrc +++ b/server/.prettierrc @@ -1,4 +1,8 @@ { + "endOfLine": "lf", + "tabWidth": 2, + "semi": true, "singleQuote": true, - "trailingComma": "all" + "trailingComma": "all", + "printWidth": 100 } \ No newline at end of file diff --git a/server/__mock__/user.mock.ts b/server/__mock__/user.mock.ts new file mode 100644 index 00000000..2cd6df08 --- /dev/null +++ b/server/__mock__/user.mock.ts @@ -0,0 +1,53 @@ +import { ObjectId } from 'bson'; +import { FollowerDto } from '@user/dto/follower.dto'; + +export const user1 = { + name: '', + _id: new ObjectId('63734af9e62b37012c73e399'), + id: 'test_ny@naver.com', + password: + '$argon2id$v=19$m=65536,t=3,p=4$BvMvPrYTKubH8gvHVDe8zw$DTCW9ha7Wsp/jTqrWUmR56w1Z83pWaVN4afaYScvOQY', + nickname: 'nayoung', + profileUrl: 'nayoung img', + description: 'hello im nayoung', + status: 'OFFLINE', + lastLogin: '2022-11-15T08:15:54.703Z', + createdAt: '2022-11-15T08:15:54.703Z', + updatedAt: '2022-11-15T08:15:54.703Z', + followings: [], + followers: ['63739b643969101c3fec8849'], + communities: [], +} as any; + +export const user2 = { + name: '', + _id: new ObjectId('63734e98384f478a32c3a1cc'), + id: 'test_asmi@naver.com', + password: + '$argon2id$v=19$m=65536,t=3,p=4$gSUGguog1qo9SEZ4Q18iLA$psu/sCkJqMJ0LYQYv7OoatTZwa7/LdYS1vb4GucjCbk', + nickname: 'asmi', + profileUrl: 'url', + description: 'default description asmi', + status: 'ONLINE', + lastLogin: '2022-11-15T08:32:15.317Z', + createdAt: '2022-11-15T08:32:15.317Z', + updatedAt: '2022-11-15T08:32:15.317Z', + followings: ['63734f4eca63eaf1876a2c3b', '63743ae79198ef99b097cf57'], + followers: [], + communities: [], + refreshToken: + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MzczNGU5ODM4NGY0NzhhMzJjM2ExY2MiLCJpYXQiOjE2Njg2NzE3ODcsImV4cCI6MTY2ODY3NTM4N30.02nrFeZs_MWbTgXweZ89nONkfALtQqIF66LzXaeK-kQ', +} as any; + +export const followerDtoMock: FollowerDto = { + myId: '63734af9e62b37012c73e399', + followId: '63734e98384f478a32c3a1cc', +}; + +export const user1Modify = { + name: '', + id: 'test_ny@naver.com', + profileUrl: 'nayoung img modify', + description: 'hello im nayoung modify', + status: 'OFFLINE', +} as any; diff --git a/server/apps/api/src/api.controller.ts b/server/apps/api/src/api.controller.ts index a2231cbb..5957b397 100644 --- a/server/apps/api/src/api.controller.ts +++ b/server/apps/api/src/api.controller.ts @@ -1,7 +1,7 @@ import { Controller, Get } from '@nestjs/common'; import { ApiService } from './api.service'; -@Controller() +@Controller('api') export class ApiController { constructor(private readonly apiService: ApiService) {} diff --git a/server/apps/api/src/api.module.ts b/server/apps/api/src/api.module.ts index 58e4643a..ecc0fc45 100644 --- a/server/apps/api/src/api.module.ts +++ b/server/apps/api/src/api.module.ts @@ -1,9 +1,43 @@ -import { Module } from '@nestjs/common'; +import { HttpException, Module } from '@nestjs/common'; import { ApiController } from './api.controller'; import { ApiService } from './api.service'; +import { MongooseModule } from '@nestjs/mongoose'; +import { ConfigModule } from '@nestjs/config'; +import { ChannelModule } from './channel/channel.module'; +import { CommunityModule } from './community/community.module'; +import { UserModule } from './user/user.module'; +import * as winston from 'winston'; +import { utilities as nestWinstonModuleUtilities, WinstonModule } from 'nest-winston'; +import { AuthModule } from './auth/auth.module'; +import { APP_INTERCEPTOR } from '@nestjs/core'; +import { SentryInterceptor } from '../../webhook.interceptor'; +import { RavenInterceptor, RavenModule } from 'nest-raven'; @Module({ - imports: [], + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + envFilePath: `config/${process.env.NODE_ENV}.env`, + }), + MongooseModule.forRoot(process.env.MONGODB_URL), + WinstonModule.forRoot({ + transports: [ + new winston.transports.Console({ + level: process.env.NODE_ENV === 'prod' ? 'info' : 'silly', + format: winston.format.combine( + winston.format.colorize({ all: true }), + winston.format.simple(), + winston.format.timestamp(), + nestWinstonModuleUtilities.format.nestLike('Asnity', { prettyPrint: true }), + ), + }), + ], + }), + UserModule, + ChannelModule, + CommunityModule, + AuthModule, + ], controllers: [ApiController], providers: [ApiService], }) diff --git a/server/apps/api/src/auth/auth.controller.ts b/server/apps/api/src/auth/auth.controller.ts new file mode 100644 index 00000000..109597b3 --- /dev/null +++ b/server/apps/api/src/auth/auth.controller.ts @@ -0,0 +1,57 @@ +import { Body, Controller, Get, Post, Req, Res, UseGuards } from '@nestjs/common'; +import { AuthService } from './auth.service'; +import { SignInDto, SignUpDto } from './dto'; +import { responseForm } from '@utils/responseForm'; +import { Response } from 'express'; +import { getUserBasicInfo } from '@user/dto/user-basic-info.dto'; +import { JwtAccessGuard, JwtRefreshGuard } from '@api/src/auth/guard'; + +@Controller('api/user/auth') +export class AuthController { + constructor(private authService: AuthService) {} + + @Post('signup') // 회원가입 + async signUp(@Body() signUpDto: SignUpDto) { + await this.authService.signUp(signUpDto); + return responseForm(200, { message: '회원가입 성공!' }); + } + + @Post('signin') // 로그인 + async signIn(@Body() signInDto: SignInDto, @Res({ passthrough: true }) res: Response) { + const { refreshToken, accessToken } = await this.authService.signIn(signInDto); + + // refreshToken 쿠키에 구워줌 + res.cookie('refreshToken', refreshToken, { + path: '/api/user/auth/refresh', + httpOnly: true, + secure: false, + maxAge: 360000000, // 100시간 만료 + }); + + return responseForm(200, { message: '로그인 성공!', accessToken }); + } + + @Post('refresh') // AccessToken 재발행 + @UseGuards(JwtRefreshGuard) + async refresh(@Req() req: any) { + const accessToken = req.user; + if (accessToken === null) { + return responseForm(401, { message: '로그인 필요' }); + } + return responseForm(200, { message: 'accessToken 재발행 성공!', accessToken }); + } + + @Get('me') // 자신의 유저 정보 제공 + @UseGuards(JwtAccessGuard) + async getMyInfo(@Req() req: any) { + return getUserBasicInfo(req.user); + } + + @Post('signout') + @UseGuards(JwtAccessGuard) + async singOut(@Req() req: any, @Res({ passthrough: true }) res: Response) { + await this.authService.signOut(req.user._id); // DB에서 refreshToken 제거 + res.cookie('refreshToken', 'expired', { maxAge: -1 }); // client에서 refreshToken 제거 + return responseForm(200, { message: '로그아웃 성공!' }); + } +} diff --git a/server/apps/api/src/auth/auth.module.ts b/server/apps/api/src/auth/auth.module.ts new file mode 100644 index 00000000..934da785 --- /dev/null +++ b/server/apps/api/src/auth/auth.module.ts @@ -0,0 +1,21 @@ +import { Module } from '@nestjs/common'; +import { AuthController } from './auth.controller'; +import { AuthService } from './auth.service'; +import { UserRepository } from '@repository/user.repository'; +import { MongooseModule } from '@nestjs/mongoose'; +import { User, UserSchema } from '@schemas/user.schema'; +import { PassportModule } from '@nestjs/passport'; +import { JwtModule } from '@nestjs/jwt'; +import { JwtAccessStrategy, JwtRefreshStrategy } from '@api/src/auth/strategy'; +import { SignToken } from '@api/src/auth/helper/signToken'; + +@Module({ + imports: [ + MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]), + PassportModule, + JwtModule.register({}), + ], + controllers: [AuthController], + providers: [AuthService, UserRepository, JwtAccessStrategy, JwtRefreshStrategy, SignToken], +}) +export class AuthModule {} diff --git a/server/apps/api/src/auth/auth.service.ts b/server/apps/api/src/auth/auth.service.ts new file mode 100644 index 00000000..1add0a71 --- /dev/null +++ b/server/apps/api/src/auth/auth.service.ts @@ -0,0 +1,52 @@ +import { ForbiddenException, Injectable } from '@nestjs/common'; +import { SignInDto, SignUpDto } from './dto'; +import * as argon from 'argon2'; +import { UserRepository } from '@repository/user.repository'; +import { SignToken } from '@api/src/auth/helper/signToken'; + +@Injectable() +export class AuthService { + constructor(private userRepository: UserRepository, private signToken: SignToken) {} + async signUp(signUpDto: SignUpDto) { + // 비밀번호 암호화 + const hash = await argon.hash(signUpDto.password); + try { + // DB에 계정 생성 + await this.userRepository.create({ ...signUpDto, password: hash, provider: 'ASNITY' }); + } catch (error) { + // 아이디 중복시 에러 처리 + if (error.name === 'MongoServerError' && error.code === 11000) + throw new ForbiddenException('아이디가 중복되었습니다.'); + throw new ForbiddenException('DB에 계정 생성 중 에러 발생'); + } + // 회원가입 성공 응답 + return '회원가입 성공!'; + } + + async signIn(signInDto: SignInDto): Promise<{ accessToken: string; refreshToken: string }> { + const user = await this.userRepository.findOne({ id: signInDto.id }); + // DB에 아이디가 없으면 예외처리 + if (!user) throw new ForbiddenException('존재하는 아이디가 없습니다.'); + // 비밀번호가 일치하지 않으면 예외처리 + const isMatch = await argon.verify(user.password, signInDto.password); + if (!isMatch) { + throw new ForbiddenException('비밀번호가 일치하지 않습니다.'); + } + // accessToken, refreshToken 발행 + const accessToken = await this.signToken.signAccessToken(user._id, user.nickname); + const refreshToken = await this.signToken.signRefreshToken(user._id); + + // DB에 refreshToken 업데이트 + this.userRepository.updateOne({ _id: user._id }, { refreshToken }); + + return { accessToken, refreshToken }; + } + + async signOut(userId: string) { + try { + await this.userRepository.updateOne({ _id: userId }, { refreshToken: '' }); + } catch (error) { + throw new ForbiddenException('잘못된 접근입니다.'); + } + } +} diff --git a/server/apps/api/src/auth/dto/auth.dto.ts b/server/apps/api/src/auth/dto/auth.dto.ts new file mode 100644 index 00000000..87a5fdcd --- /dev/null +++ b/server/apps/api/src/auth/dto/auth.dto.ts @@ -0,0 +1,25 @@ +import { IsEmail, IsNotEmpty, IsString, Length, MinLength } from 'class-validator'; + +export class SignInDto { + @IsEmail() + @IsNotEmpty() + id: string; + + @IsString() + @MinLength(8) + password: string; +} + +export class SignUpDto { + @IsEmail() + @IsNotEmpty() + id: string; + + @IsString() + @MinLength(8) + password: string; + + @IsString() + @Length(2, 8) + nickname: string; +} diff --git a/server/apps/api/src/auth/dto/index.ts b/server/apps/api/src/auth/dto/index.ts new file mode 100644 index 00000000..0ee0429b --- /dev/null +++ b/server/apps/api/src/auth/dto/index.ts @@ -0,0 +1 @@ +export * from './auth.dto'; diff --git a/server/apps/api/src/auth/guard/index.ts b/server/apps/api/src/auth/guard/index.ts new file mode 100644 index 00000000..3f2c7d3f --- /dev/null +++ b/server/apps/api/src/auth/guard/index.ts @@ -0,0 +1,2 @@ +export * from './jwt-access.guard'; +export * from './jwt-refresh.guard'; diff --git a/server/apps/api/src/auth/guard/jwt-access.guard.ts b/server/apps/api/src/auth/guard/jwt-access.guard.ts new file mode 100644 index 00000000..a16f9923 --- /dev/null +++ b/server/apps/api/src/auth/guard/jwt-access.guard.ts @@ -0,0 +1,5 @@ +import { AuthGuard } from '@nestjs/passport'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class JwtAccessGuard extends AuthGuard('jwt-access-token') {} diff --git a/server/apps/api/src/auth/guard/jwt-refresh.guard.ts b/server/apps/api/src/auth/guard/jwt-refresh.guard.ts new file mode 100644 index 00000000..a758fd2e --- /dev/null +++ b/server/apps/api/src/auth/guard/jwt-refresh.guard.ts @@ -0,0 +1,5 @@ +import { AuthGuard } from '@nestjs/passport'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class JwtRefreshGuard extends AuthGuard('jwt-refresh-token') {} diff --git a/server/apps/api/src/auth/helper/signToken.ts b/server/apps/api/src/auth/helper/signToken.ts new file mode 100644 index 00000000..d390f43b --- /dev/null +++ b/server/apps/api/src/auth/helper/signToken.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@nestjs/common'; +import { JwtService } from '@nestjs/jwt'; +import { ConfigService } from '@nestjs/config'; + +@Injectable() +export class SignToken { + constructor(private jwt: JwtService, private config: ConfigService) {} + async signAccessToken(_id: number, nickname: string): Promise { + const accessTokenPayload = { + _id, + nickname, + }; + const accessToken = await this.jwt.signAsync(accessTokenPayload, { + expiresIn: '15m', + secret: this.config.get('JWT_SECRET'), + }); + return accessToken; + } + + async signRefreshToken(_id: number): Promise { + const refreshTokenPayload = { + _id, + }; + const refreshToken = await this.jwt.signAsync(refreshTokenPayload, { + expiresIn: '100hr', + secret: this.config.get('JWT_SECRET'), + }); + return refreshToken; + } +} diff --git a/server/apps/api/src/auth/strategy/index.ts b/server/apps/api/src/auth/strategy/index.ts new file mode 100644 index 00000000..845265dc --- /dev/null +++ b/server/apps/api/src/auth/strategy/index.ts @@ -0,0 +1,2 @@ +export * from './jwt-access.strategy'; +export * from './jwt-refresh.strategy'; diff --git a/server/apps/api/src/auth/strategy/jwt-access.strategy.ts b/server/apps/api/src/auth/strategy/jwt-access.strategy.ts new file mode 100644 index 00000000..e890d211 --- /dev/null +++ b/server/apps/api/src/auth/strategy/jwt-access.strategy.ts @@ -0,0 +1,24 @@ +import { PassportStrategy } from '@nestjs/passport'; +import { UserRepository } from '@repository/user.repository'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { ConfigService } from '@nestjs/config'; +import { ForbiddenException, Injectable } from '@nestjs/common'; + +@Injectable() +export class JwtAccessStrategy extends PassportStrategy(Strategy, 'jwt-access-token') { + constructor(config: ConfigService, private userRepository: UserRepository) { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + secretOrKey: config.get('JWT_SECRET'), + }); + } + + async validate(payload: any) { + const user = await this.userRepository.findById(payload._id); + if (!user) { + throw new ForbiddenException('잘못된 요청입니다.'); + } + delete user.password; + return user; + } +} diff --git a/server/apps/api/src/auth/strategy/jwt-refresh.strategy.ts b/server/apps/api/src/auth/strategy/jwt-refresh.strategy.ts new file mode 100644 index 00000000..77ca709f --- /dev/null +++ b/server/apps/api/src/auth/strategy/jwt-refresh.strategy.ts @@ -0,0 +1,41 @@ +import { ForbiddenException, Injectable, UnauthorizedException } from '@nestjs/common'; +import { PassportStrategy } from '@nestjs/passport'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { ConfigService } from '@nestjs/config'; +import { UserRepository } from '@repository/user.repository'; +import { SignToken } from '@api/src/auth/helper/signToken'; + +@Injectable() +export class JwtRefreshStrategy extends PassportStrategy(Strategy, 'jwt-refresh-token') { + constructor( + config: ConfigService, + private userRepository: UserRepository, + private signToken: SignToken, + ) { + super({ + jwtFromRequest: ExtractJwt.fromExtractors([ + (request) => { + return request?.cookies?.refreshToken; + }, + ]), + secretOrKey: config.get('JWT_SECRET'), + passReqToCallback: true, + }); + } + + async validate(req, payload: any) { + const refreshToken = req.cookies?.refreshToken; + const user = await this.userRepository.findById(payload._id); + if (!user) { + throw new ForbiddenException('잘못된 요청입니다.'); + } + + if (refreshToken !== user.refreshToken) { + throw new UnauthorizedException('refreshToken이 일치하지 않습니다.'); + } + + const accessToken = await this.signToken.signAccessToken(user._id, user.nickname); + + return accessToken; + } +} diff --git a/server/apps/api/src/channel/channel.controller.ts b/server/apps/api/src/channel/channel.controller.ts new file mode 100644 index 00000000..fff4d422 --- /dev/null +++ b/server/apps/api/src/channel/channel.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('channel') +export class ChannelController {} diff --git a/server/apps/api/src/channel/channel.module.ts b/server/apps/api/src/channel/channel.module.ts new file mode 100644 index 00000000..fe632c18 --- /dev/null +++ b/server/apps/api/src/channel/channel.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ChannelController } from './channel.controller'; +import { ChannelService } from './channel.service'; + +@Module({ + controllers: [ChannelController], + providers: [ChannelService] +}) +export class ChannelModule {} diff --git a/server/apps/api/src/channel/channel.service.ts b/server/apps/api/src/channel/channel.service.ts new file mode 100644 index 00000000..fc8cd3a7 --- /dev/null +++ b/server/apps/api/src/channel/channel.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class ChannelService {} diff --git a/server/apps/api/src/community/community.controller.ts b/server/apps/api/src/community/community.controller.ts new file mode 100644 index 00000000..a169f161 --- /dev/null +++ b/server/apps/api/src/community/community.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('community') +export class CommunityController {} diff --git a/server/apps/api/src/community/community.module.ts b/server/apps/api/src/community/community.module.ts new file mode 100644 index 00000000..d4fb4995 --- /dev/null +++ b/server/apps/api/src/community/community.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { CommunityController } from './community.controller'; +import { CommunityService } from './community.service'; + +@Module({ + controllers: [CommunityController], + providers: [CommunityService], +}) +export class CommunityModule {} diff --git a/server/apps/api/src/community/community.service.ts b/server/apps/api/src/community/community.service.ts new file mode 100644 index 00000000..4cd3bcc7 --- /dev/null +++ b/server/apps/api/src/community/community.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class CommunityService {} diff --git a/server/apps/api/src/main.ts b/server/apps/api/src/main.ts index 2801d0e3..22661db8 100644 --- a/server/apps/api/src/main.ts +++ b/server/apps/api/src/main.ts @@ -1,10 +1,23 @@ import { NestFactory } from '@nestjs/core'; +import { WINSTON_MODULE_NEST_PROVIDER } from 'nest-winston'; import { ApiModule } from './api.module'; -import * as dotenv from 'dotenv'; +import { ValidationPipe } from '@nestjs/common'; +import * as Sentry from '@sentry/node'; +import { SentryInterceptor } from '../../webhook.interceptor'; +import * as cookieParser from 'cookie-parser'; async function bootstrap() { const app = await NestFactory.create(ApiModule); + app.enableCors(); + if (process.env.NODE_ENV == 'prod') { + Sentry.init({ + dsn: process.env.SENTRY_DSN, + }); + app.useGlobalInterceptors(new SentryInterceptor()); + } + app.use(cookieParser()); + app.useLogger(app.get(WINSTON_MODULE_NEST_PROVIDER)); + app.useGlobalPipes(new ValidationPipe()); await app.listen(3000); - console.log(dotenv); } bootstrap(); diff --git a/server/apps/api/src/user/dto/create-user.dto.ts b/server/apps/api/src/user/dto/create-user.dto.ts new file mode 100644 index 00000000..2bcee758 --- /dev/null +++ b/server/apps/api/src/user/dto/create-user.dto.ts @@ -0,0 +1,16 @@ +import { IsEmail, IsIn, IsNotEmpty, IsString, Min } from 'class-validator'; +import { PROVIDER } from '@utils/def'; + +export class CreateUserDto { + @IsEmail() + @IsNotEmpty() + id: string; + + @IsString() + @Min(8) + password: string; + + @IsString() + @IsIn(PROVIDER) + provider: 'ASNITY' | 'GITHUB'; +} diff --git a/server/apps/api/src/user/dto/follower.dto.ts b/server/apps/api/src/user/dto/follower.dto.ts new file mode 100644 index 00000000..975bcd0f --- /dev/null +++ b/server/apps/api/src/user/dto/follower.dto.ts @@ -0,0 +1,9 @@ +import { IsString } from 'class-validator'; + +export class FollowerDto { + @IsString() + myId: string; + + @IsString() + followId: string; +} diff --git a/server/apps/api/src/user/dto/modify-user.dto.ts b/server/apps/api/src/user/dto/modify-user.dto.ts new file mode 100644 index 00000000..da03257e --- /dev/null +++ b/server/apps/api/src/user/dto/modify-user.dto.ts @@ -0,0 +1,36 @@ +import { + IsEmail, + IsIn, + IsNotEmpty, + IsOptional, + IsString, + Length, + Min, + MinLength, +} from 'class-validator'; +import { PROVIDER, STATUS } from '@utils/def'; +import { Prop } from '@nestjs/mongoose'; + +export class ModifyUserDto { + @IsOptional() + @IsString() + _id: string; + + @IsOptional() + @IsString() + @Length(2, 8) + nickname: string; + + @IsOptional() + @IsString() + profileUrl: string; + + @IsOptional() + @IsString() + description: string; + + @IsOptional() + @IsString() + @IsIn(STATUS) + status: string; +} diff --git a/server/apps/api/src/user/dto/user-basic-info.dto.ts b/server/apps/api/src/user/dto/user-basic-info.dto.ts new file mode 100644 index 00000000..0bcc0243 --- /dev/null +++ b/server/apps/api/src/user/dto/user-basic-info.dto.ts @@ -0,0 +1,10 @@ +export const getUserBasicInfo = (user) => { + return { + _id: user._id, + id: user.id, + nickname: user.nickname, + status: user.status, + profileUrl: user.profileUrl, + description: user.description, + }; +}; diff --git a/server/apps/api/src/user/user.controller.ts b/server/apps/api/src/user/user.controller.ts new file mode 100644 index 00000000..5d24caed --- /dev/null +++ b/server/apps/api/src/user/user.controller.ts @@ -0,0 +1,104 @@ +import { + Body, + Controller, + Delete, + Get, + Inject, + LoggerService, + Param, + Patch, + Post, + Res, +} from '@nestjs/common'; +import { UserService } from './user.service'; +import { FollowerDto } from '@user/dto/follower.dto'; +import { WINSTON_MODULE_NEST_PROVIDER } from 'nest-winston'; +import { responseForm } from '@utils/responseForm'; +import { ObjectIdValidationPipe } from '@custom_pipe/mongodbObjectIdValidation.pipe'; +import { ModifyUserDto } from '@user/dto/modify-user.dto'; +import { Response } from 'express'; + +@Controller('api/user') +export class UserController { + constructor( + @Inject(WINSTON_MODULE_NEST_PROVIDER) private readonly logger: LoggerService, + private userService: UserService, + ) {} + + // @Get() + // getUsers() { + // const createUserDto: CreateUserDto = { id: 'mj', pw: 'mjpw' }; + // this.userService.createUser(createUserDto); + // return 'hello user'; + // } + + @Post('following/:id') + async addFollowing(@Param('id', ObjectIdValidationPipe) id: string) { + try { + const myId = '63786b635d4f08bbe0c940de'; + // TODO: Request Header에서 access token으로 현재 사용자 알아내기 + const addFollowingDto: FollowerDto = { myId, followId: id }; + const result = await this.userService.toggleFollowing(addFollowingDto); + return responseForm(200, result); + } catch (error) { + this.logger.error(JSON.stringify(error.response)); + // res.status(400).json(error.response); + throw error; + } + } + + @Get('followers') + async getFollowers() { + try { + const _id = '63786b635d4f08bbe0c940dc'; + // TODO: Request Header에서 access token으로 현재 사용자 알아내기 + const result = await this.userService.getRelatedUsers(_id, 'followers'); + return responseForm(200, { followers: result }); + } catch (error) { + this.logger.error(JSON.stringify(error.response)); + throw error; + } + } + + @Get('followings') + async getFollowings() { + try { + const _id = '63739b643969101c3fec884'; + // TODO: Request Header에서 access token으로 현재 사용자 알아내기 + const result = await this.userService.getRelatedUsers(_id, 'followings'); + return responseForm(200, { followings: result }); + } catch (error) { + this.logger.error(JSON.stringify(error.response ?? error)); + throw error; + } + } + + @Get(':id') + async getUser(@Param('id') id: string) { + try { + const result = await this.userService.getUser(id); + return responseForm(200, { result }); + } catch (error) { + this.logger.error(JSON.stringify(error.response)); + throw error; + } + } + + @Patch('settings') + async modifyUserSetting(@Body() modifyUserDto: ModifyUserDto) { + try { + const _id = '63786b635d4f08bbe0c940de'; + // TODO: Request Header에서 access token으로 현재 사용자 알아내기 + await this.userService.modifyUser({ ...modifyUserDto, _id }); + return responseForm(200, {}); + } catch (error) { + this.logger.error(JSON.stringify(error.response)); + throw error; + } + } + + // @Post() + // createUser(@Body() createUserDto: CreateUserDto) { + // this.usersService.createUser(createUserDto); + // } +} diff --git a/server/apps/api/src/user/user.module.ts b/server/apps/api/src/user/user.module.ts new file mode 100644 index 00000000..7a7310b2 --- /dev/null +++ b/server/apps/api/src/user/user.module.ts @@ -0,0 +1,16 @@ +import { Module } from '@nestjs/common'; +import { UserController } from '@user/user.controller'; +import { UserService } from '@user/user.service'; +import { MongooseModule } from '@nestjs/mongoose'; +import { WinstonModule } from 'nest-winston'; +import { User, UserSchema } from '@schemas/user.schema'; +import { AuthModule } from '../auth/auth.module'; +import { UserRepository } from '@repository/user.repository'; +import { AuthController } from '../auth/auth.controller'; + +@Module({ + imports: [MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]), AuthModule], + controllers: [UserController], + providers: [UserService, UserRepository], +}) +export class UserModule {} diff --git a/server/apps/api/src/user/user.service.ts b/server/apps/api/src/user/user.service.ts new file mode 100644 index 00000000..32508f9b --- /dev/null +++ b/server/apps/api/src/user/user.service.ts @@ -0,0 +1,87 @@ +import { BadRequestException, ConflictException, Injectable, Param } from '@nestjs/common'; +import { FollowerDto } from '@user/dto/follower.dto'; +import { UserRepository } from '@repository/user.repository'; +import { getUserBasicInfo } from '@user/dto/user-basic-info.dto'; +import { ModifyUserDto } from '@user/dto/modify-user.dto'; + +@Injectable() +export class UserService { + constructor(private readonly userRepository: UserRepository) {} + + async toggleFollowing(followerDto: FollowerDto) { + const user = await this.userRepository.findById(followerDto.myId); + const otherUser = await this.userRepository.findById(followerDto.followId); + if (!user || !otherUser) { + throw new BadRequestException('해당하는 사용자의 _id가 올바르지 않습니다.'); + } + + const isAlreadyFollow = user.followings.includes(followerDto.followId); + const isAlreadyFollowAtOther = otherUser.followers.includes(followerDto.myId); + if (!isAlreadyFollow && isAlreadyFollowAtOther) { + throw new ConflictException('갱신 이상! (팔로우 안되어있으나, 상대방에겐 내가 팔로우됨)'); + } else if (isAlreadyFollow && !isAlreadyFollowAtOther) { + throw new ConflictException( + '갱신 이상! (팔로우 되어있으나, 상대방에겐 내가 팔로우되어있지 않음)', + ); + } else if (!isAlreadyFollow && !isAlreadyFollowAtOther) { + // 팔로우 되어있지 않은 경우 팔로우 필요 + this.userRepository.appendElementAtArr( + { _id: followerDto.myId }, + { followings: followerDto.followId }, + ); + this.userRepository.appendElementAtArr( + { _id: followerDto.followId }, + { followers: followerDto.myId }, + ); + return { message: '팔로우 신청 완료' }; + } else if (isAlreadyFollow && isAlreadyFollowAtOther) { + // 팔로우 되어있어 언팔로우 필요 + this.userRepository.deleteElementAtArr( + { _id: followerDto.myId }, + { followings: [followerDto.followId] }, + ); + this.userRepository.deleteElementAtArr( + { _id: followerDto.followId }, + { followers: [followerDto.myId] }, + ); + return { message: '언팔로우 완료' }; + } + } + + async getUser(id: string) { + const users = await this.userRepository.findOr([ + { id: { $regex: id } }, + { nickname: { $regex: id } }, + ]); + // if (!users) { + // throw new BadRequestException('요청한 사용자는 없는 사용자입니다.'); + // } + return users.map((user) => getUserBasicInfo(user)); + } + + async getRelatedUsers(_id: string, option: string) { + const user = await this.userRepository.findById(_id); + if (!user) { + throw new BadRequestException('요청한 사용자는 없는 사용자입니다.'); + } + + const { followings, followers } = user; + const userIdList = option == 'followers' ? followers : followings; + // TODO: 배열을 순회하면서 찾지 않고 한번에 db에서 찾도록하는 mongoose 명령 있는지 확인하기 + return await Promise.all( + userIdList.map(async (userId) => { + return getUserBasicInfo(await this.userRepository.findById(userId)); + }), + ); + } + + async modifyUser(modifyUserDto: ModifyUserDto) { + const { _id, ...updateField } = modifyUserDto; + const user = await this.userRepository.findById(_id); + if (!user) { + throw new BadRequestException('요청한 사용자는 없는 사용자입니다.'); + } + // TODO: 꼭 기다려줘야하는지 생각해보기 + return await this.userRepository.updateOne({ _id }, updateField); + } +} diff --git a/server/apps/api/test/user.service.spec.ts b/server/apps/api/test/user.service.spec.ts new file mode 100644 index 00000000..77a2d138 --- /dev/null +++ b/server/apps/api/test/user.service.spec.ts @@ -0,0 +1,149 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { UserService } from '@user/user.service'; +import { UserRepository } from '@repository/user.repository'; +import { getModelToken } from '@nestjs/mongoose'; +import { followerDtoMock, user1, user1Modify, user2 } from '@mock/user.mock'; +import { User } from '@schemas/user.schema'; +import * as _ from 'lodash'; +import { BadRequestException, ConflictException } from '@nestjs/common'; +import { getUserBasicInfo } from '@user/dto/user-basic-info.dto'; + +describe('[User Service]', () => { + let userService: UserService; + let userRepository: UserRepository; + + const user1Append = _.cloneDeep(user1); + user1Append.followings.push(followerDtoMock.followId); + const user2Append = _.cloneDeep(user2); + user2Append.followers.push(followerDtoMock.myId); + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + UserService, + UserRepository, + { + provide: getModelToken(User.name), + useFactory: () => {}, + }, + ], + }).compile(); + + userService = module.get(UserService); + userRepository = module.get(UserRepository); + }); + + it('should be defined', () => { + expect(userService).toBeDefined(); + }); + + describe('[toggleFollowing] 팔로잉, 언팔로잉', () => { + it('팔로잉 정상 동작', async () => { + jest + .spyOn(userRepository, 'findById') + .mockResolvedValueOnce(user1) + .mockResolvedValueOnce(user2); + jest + .spyOn(userRepository, 'appendElementAtArr') + .mockResolvedValueOnce(user1Append) + .mockResolvedValueOnce(user2Append); + expect(await userService.toggleFollowing(followerDtoMock)).toEqual({ + message: '팔로우 신청 완료', + }); + }); + + it('언팔로잉 정상 동작', async () => { + jest + .spyOn(userRepository, 'findById') + .mockResolvedValueOnce(user1Append) + .mockResolvedValueOnce(user2Append); + jest + .spyOn(userRepository, 'deleteElementAtArr') + .mockResolvedValueOnce(user1) + .mockResolvedValueOnce(user2); + expect(await userService.toggleFollowing(followerDtoMock)).toEqual({ + message: '언팔로우 완료', + }); + }); + + it('팔로우 하지 않았으나 상대방이 팔로우 한 경우 에러', async () => { + jest + .spyOn(userRepository, 'findById') + .mockResolvedValueOnce(user1) + .mockResolvedValueOnce(user2Append); + + try { + await userService.toggleFollowing(followerDtoMock); + } catch (e) { + expect(e).toBeInstanceOf(ConflictException); + expect(e.message).toBe('갱신 이상! (팔로우 안되어있으나, 상대방에겐 내가 팔로우됨)'); + } + }); + + it('팔로우 되어있으나, 상대방에겐 내가 팔로우되어있지 않은 경우 에러', async () => { + jest + .spyOn(userRepository, 'findById') + .mockResolvedValueOnce(user1Append) + .mockResolvedValueOnce(user2); + + try { + await userService.toggleFollowing(followerDtoMock); + } catch (e) { + expect(e).toBeInstanceOf(ConflictException); + expect(e.message).toBe( + '갱신 이상! (팔로우 되어있으나, 상대방에겐 내가 팔로우되어있지 않음)', + ); + } + }); + + // it('사용자가 없는 경우 에러', async () => { + // jest.spyOn(userRepository, 'findById').mockResolvedValue({} as any); + // + // try { + // await userService.toggleFollowing(followerDtoMock); + // } catch (e) { + // expect(e).toBeInstanceOf(BadRequestException); + // expect(e.message).toBe('해당하는 사용자의 _id가 올바르지 않습니다.'); + // } + // }); + }); + + describe('[getUser] 사용자 정보 검색', () => { + it('팔로잉 정상 동작', async () => { + jest.spyOn(userRepository, 'findOr').mockResolvedValueOnce([user1, user2]); + expect(await userService.getUser('test')).toEqual([ + getUserBasicInfo(user1), + getUserBasicInfo(user2), + ]); + }); + }); + + describe('[getRelatedUsers] 나의 팔로잉 정보', () => { + it('팔로잉 정보 정상 동작', async () => { + jest + .spyOn(userRepository, 'findById') + .mockResolvedValueOnce(user1Append) + .mockResolvedValueOnce(user2Append); + expect(await userService.getRelatedUsers('test', 'followings')).toEqual([ + getUserBasicInfo(user2Append), + ]); + }); + + it('팔로워 정보 정상 동작', async () => { + jest + .spyOn(userRepository, 'findById') + .mockResolvedValueOnce(user2Append) + .mockResolvedValueOnce(user1Append); + expect(await userService.getRelatedUsers('test', 'followers')).toEqual([ + getUserBasicInfo(user1Append), + ]); + }); + }); + + describe('[modifyUser] 사용자 정보 수', () => { + it('정보 수정 정상 동작', async () => { + jest.spyOn(userRepository, 'findById').mockResolvedValueOnce(user1); + jest.spyOn(userRepository, 'updateOne').mockResolvedValue(); + expect(await userService.modifyUser(user1Modify)).toBeUndefined(); + }); + }); +}); diff --git a/server/apps/server/src/app.controller.spec.ts b/server/apps/server/src/app.controller.spec.ts deleted file mode 100644 index d22f3890..00000000 --- a/server/apps/server/src/app.controller.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; - -describe('AppController', () => { - let appController: AppController; - - beforeEach(async () => { - const app: TestingModule = await Test.createTestingModule({ - controllers: [AppController], - providers: [AppService], - }).compile(); - - appController = app.get(AppController); - }); - - describe('root', () => { - it('should return "Hello World!"', () => { - expect(appController.getHello()).toBe('Hello World!'); - }); - }); -}); diff --git a/server/apps/server/src/app.controller.ts b/server/apps/server/src/app.controller.ts deleted file mode 100644 index cce879ee..00000000 --- a/server/apps/server/src/app.controller.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; -import { AppService } from './app.service'; - -@Controller() -export class AppController { - constructor(private readonly appService: AppService) {} - - @Get() - getHello(): string { - return this.appService.getHello(); - } -} diff --git a/server/apps/server/src/app.module.ts b/server/apps/server/src/app.module.ts deleted file mode 100644 index 86628031..00000000 --- a/server/apps/server/src/app.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Module } from '@nestjs/common'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; - -@Module({ - imports: [], - controllers: [AppController], - providers: [AppService], -}) -export class AppModule {} diff --git a/server/apps/server/src/main.ts b/server/apps/socket/src/main.ts similarity index 52% rename from server/apps/server/src/main.ts rename to server/apps/socket/src/main.ts index 13cad38c..43226903 100644 --- a/server/apps/server/src/main.ts +++ b/server/apps/socket/src/main.ts @@ -1,8 +1,8 @@ import { NestFactory } from '@nestjs/core'; -import { AppModule } from './app.module'; +import { SocketModule } from './socket.module'; async function bootstrap() { - const app = await NestFactory.create(AppModule); + const app = await NestFactory.create(SocketModule); await app.listen(3000); } bootstrap(); diff --git a/server/apps/socket/src/socket.controller.spec.ts b/server/apps/socket/src/socket.controller.spec.ts new file mode 100644 index 00000000..51eb2e93 --- /dev/null +++ b/server/apps/socket/src/socket.controller.spec.ts @@ -0,0 +1,22 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { SocketController } from './socket.controller'; +import { SocketService } from './socket.service'; + +describe('SocketController', () => { + let socketController: SocketController; + + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + controllers: [SocketController], + providers: [SocketService], + }).compile(); + + socketController = app.get(SocketController); + }); + + describe('root', () => { + it('should return "Hello World!"', () => { + expect(socketController.getHello()).toBe('Hello World!'); + }); + }); +}); diff --git a/server/apps/socket/src/socket.controller.ts b/server/apps/socket/src/socket.controller.ts new file mode 100644 index 00000000..eb604445 --- /dev/null +++ b/server/apps/socket/src/socket.controller.ts @@ -0,0 +1,12 @@ +import { Controller, Get } from '@nestjs/common'; +import { SocketService } from './socket.service'; + +@Controller() +export class SocketController { + constructor(private readonly socketService: SocketService) {} + + @Get() + getHello(): string { + return this.socketService.getHello(); + } +} diff --git a/server/apps/socket/src/socket.module.ts b/server/apps/socket/src/socket.module.ts new file mode 100644 index 00000000..a7f3be42 --- /dev/null +++ b/server/apps/socket/src/socket.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { SocketController } from './socket.controller'; +import { SocketService } from './socket.service'; + +@Module({ + imports: [], + controllers: [SocketController], + providers: [SocketService], +}) +export class SocketModule {} diff --git a/server/apps/server/src/app.service.ts b/server/apps/socket/src/socket.service.ts similarity index 80% rename from server/apps/server/src/app.service.ts rename to server/apps/socket/src/socket.service.ts index 927d7cca..707f5ec7 100644 --- a/server/apps/server/src/app.service.ts +++ b/server/apps/socket/src/socket.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; @Injectable() -export class AppService { +export class SocketService { getHello(): string { return 'Hello World!'; } diff --git a/server/apps/server/test/app.e2e-spec.ts b/server/apps/socket/test/app.e2e-spec.ts similarity index 86% rename from server/apps/server/test/app.e2e-spec.ts rename to server/apps/socket/test/app.e2e-spec.ts index 50cda623..67069274 100644 --- a/server/apps/server/test/app.e2e-spec.ts +++ b/server/apps/socket/test/app.e2e-spec.ts @@ -1,14 +1,14 @@ import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; import * as request from 'supertest'; -import { AppModule } from './../src/app.module'; +import { SocketModule } from '../src/socket.module'; describe('AppController (e2e)', () => { let app: INestApplication; beforeEach(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ - imports: [AppModule], + imports: [SocketModule], }).compile(); app = moduleFixture.createNestApplication(); diff --git a/server/apps/server/test/jest-e2e.json b/server/apps/socket/test/jest-e2e.json similarity index 100% rename from server/apps/server/test/jest-e2e.json rename to server/apps/socket/test/jest-e2e.json diff --git a/server/apps/server/tsconfig.app.json b/server/apps/socket/tsconfig.app.json similarity index 100% rename from server/apps/server/tsconfig.app.json rename to server/apps/socket/tsconfig.app.json diff --git a/server/apps/webhook.interceptor.ts b/server/apps/webhook.interceptor.ts new file mode 100644 index 00000000..ac0093c4 --- /dev/null +++ b/server/apps/webhook.interceptor.ts @@ -0,0 +1,36 @@ +import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'; +import { catchError } from 'rxjs/operators'; +import { IncomingWebhook } from '@slack/webhook'; +import { of } from 'rxjs'; +import * as Sentry from '@sentry/minimal'; +import * as ip from 'ip'; + +@Injectable() +export class SentryInterceptor implements NestInterceptor { + // TODO: logger로 error logging interceptor에서 하도록 refactoring + intercept(_: ExecutionContext, next: CallHandler) { + return next.handle().pipe( + catchError((error) => { + Sentry.captureException(error); + const webhook = new IncomingWebhook(process.env.ERROR_SLACK_WEBHOOK); + webhook.send({ + attachments: [ + { + color: 'danger', + text: '🚨asnity-server 에러 발생🚨', + fields: [ + { + title: error.message, + value: `Server IP : ${ip.address()}\n` + error.stack, + short: false, + }, + ], + ts: Math.floor(new Date().getTime() / 1000).toString(), + }, + ], + }); + return of(error.response ?? error); + }), + ); + } +} diff --git a/server/custom_pipe/mongodbObjectIdValidation.pipe.ts b/server/custom_pipe/mongodbObjectIdValidation.pipe.ts new file mode 100644 index 00000000..ee4a2631 --- /dev/null +++ b/server/custom_pipe/mongodbObjectIdValidation.pipe.ts @@ -0,0 +1,21 @@ +import { + ArgumentMetadata, + BadRequestException, + Inject, + LoggerService, + PipeTransform, +} from '@nestjs/common'; +import mongoose from 'mongoose'; +import { WINSTON_MODULE_NEST_PROVIDER } from 'nest-winston'; + +export class ObjectIdValidationPipe implements PipeTransform { + constructor(@Inject(WINSTON_MODULE_NEST_PROVIDER) private readonly logger: LoggerService) {} + + transform(value: any, metadata: ArgumentMetadata) { + if (!mongoose.Types.ObjectId.isValid(value)) { + this.logger.error(JSON.stringify('MongoDB 올바른 사용자 _id 형식이 아닙니다.')); + throw new BadRequestException('올바른 사용자 _id 형식이 아닙니다.'); + } + return value; + } +} diff --git a/server/dao/repository/user.repository.ts b/server/dao/repository/user.repository.ts new file mode 100644 index 00000000..60d99b9d --- /dev/null +++ b/server/dao/repository/user.repository.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@nestjs/common'; +import { InjectModel } from '@nestjs/mongoose'; +import { User, UserDocument } from '@schemas/user.schema'; +import { Model } from 'mongoose'; +import { CreateUserDto } from '@user/dto/create-user.dto'; + +@Injectable() +export class UserRepository { + constructor(@InjectModel(User.name) private userModel: Model) {} + + async create(createUserDto: CreateUserDto) { + await this.userModel.create(createUserDto); + return null; + } + + async findOne(condition: any) { + return await this.userModel.findOne(condition); + } + + async findOr(conditions: any) { + return await this.userModel.find({ $or: conditions }); + } + + async findById(_id: string) { + return await this.userModel.findById(_id); + } + + async updateOne(filter, updateField) { + await this.userModel.updateOne(filter, updateField); + } + + async appendElementAtArr(filter, appendElement) { + await this.userModel.updateOne(filter, { $push: appendElement }); + } + + async deleteElementAtArr(filter, removeElement) { + await this.userModel.updateOne(filter, { $pullAll: removeElement }); + } +} diff --git a/server/dao/schemas/channel.schema.ts b/server/dao/schemas/channel.schema.ts new file mode 100644 index 00000000..605b3d0d --- /dev/null +++ b/server/dao/schemas/channel.schema.ts @@ -0,0 +1,57 @@ +import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; +import { Document } from 'mongoose'; +import { CHANNEL_TYPE } from '@utils/def'; +import { IsBoolean, IsIn, IsNotEmpty, IsString } from 'class-validator'; + +export type ChannelDocument = Channel & Document; + +@Schema() +export class Channel { + @Prop({ + required: true, + unique: true, + }) + @IsString() + @IsNotEmpty() + name: string; + + @Prop({ + required: true, + unique: true, + }) + @IsString() + communityId: string; + + @Prop({ + required: true, + unique: true, + }) + @IsString() + @IsNotEmpty() + managerId: string; + + @Prop({ default: 'default channel description' }) + @IsString() + description: string; + + @Prop({ default: 'default channel profile' }) + @IsString() + profileUrl: string; + + @Prop() + @IsIn(CHANNEL_TYPE) + type: string; + + @Prop({ required: true }) + @IsBoolean() + isPrivate: boolean; + + @Prop() + @IsString() + users: string[]; + + @Prop() + @IsString() + chatLists: string[]; +} +export const ChannelSchema = SchemaFactory.createForClass(Channel); diff --git a/server/dao/schemas/chat.schema.ts b/server/dao/schemas/chat.schema.ts new file mode 100644 index 00000000..9af4d828 --- /dev/null +++ b/server/dao/schemas/chat.schema.ts @@ -0,0 +1,35 @@ +import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; +import mongoose, { Document } from 'mongoose'; +import { CHAT_TYPE } from '@utils/def'; +import { IsIn, IsString } from 'class-validator'; + +export type UserDocument = Chat & Document; + +@Schema() +export class Chat { + @Prop() + name: string; + + @Prop({ required: true }) + @IsIn(CHAT_TYPE) + type: string; + + @Prop({ required: true }) + @IsString() + senderId: string; + + @Prop({ required: true }) + @IsString() + content: string; + + @Prop({ default: new Date(), type: mongoose.Schema.Types.Date }) + createdAt: Date; + + @Prop({ default: new Date(), type: mongoose.Schema.Types.Date }) + updatedAt: Date; + + @Prop({ type: mongoose.Schema.Types.Date }) + deletedAt: Date; + Ï; +} +export const ChatSchema = SchemaFactory.createForClass(Chat); diff --git a/server/dao/schemas/chatList.schema.ts b/server/dao/schemas/chatList.schema.ts new file mode 100644 index 00000000..1b0d54a2 --- /dev/null +++ b/server/dao/schemas/chatList.schema.ts @@ -0,0 +1,23 @@ +import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; +import mongoose, { Document } from 'mongoose'; +import { Chat } from './chat.schema'; +import { ArrayMaxSize } from 'class-validator'; + +export type ChatListDocument = ChatList & Document; + +@Schema() +export class ChatList { + @Prop() + name: string; + + @Prop({ type: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Chat' }] }) + @ArrayMaxSize(100) + chat: Chat[]; + + @Prop({ default: new Date(), type: mongoose.Schema.Types.Date }) + firstChatTime: Date; + + @Prop({ type: mongoose.Schema.Types.Date }) + lastChatTime: Date; +} +export const ChatListSchema = SchemaFactory.createForClass(ChatList); diff --git a/server/dao/schemas/community.schema.ts b/server/dao/schemas/community.schema.ts new file mode 100644 index 00000000..87b231f8 --- /dev/null +++ b/server/dao/schemas/community.schema.ts @@ -0,0 +1,45 @@ +import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; +import mongoose, { Document } from 'mongoose'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export type CommunityDocument = Community & Document; + +@Schema() +export class Community { + @Prop() + @IsString() + @IsNotEmpty() + name: string; + + @Prop({ + required: true, + unique: true, + }) + @IsString() + @IsNotEmpty() + managerId: string; + + @Prop({ default: 'default community description' }) + @IsString() + description: string; + + @Prop({ default: 'default community profile' }) + @IsString() + profileUrl: string; + + @Prop({ default: new Date(), type: mongoose.Schema.Types.Date }) + createdAt: Date; + + @Prop({ default: new Date(), type: mongoose.Schema.Types.Date }) + updatedAt: Date; + + @Prop({ type: mongoose.Schema.Types.Date }) + deletedAt: Date; + + @Prop() + channels: string[]; + + @Prop() + users: string[]; +} +export const CommunitySchema = SchemaFactory.createForClass(Community); diff --git a/server/dao/schemas/user.schema.ts b/server/dao/schemas/user.schema.ts new file mode 100644 index 00000000..b7ec5881 --- /dev/null +++ b/server/dao/schemas/user.schema.ts @@ -0,0 +1,72 @@ +import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; +import { IsIn, IsString } from 'class-validator'; +import mongoose, { Document } from 'mongoose'; +import { STATUS } from '@utils/def'; + +export type UserDocument = User & Document; + +@Schema() +export class User { + @Prop() + name: string; + + @Prop({ + required: true, + unique: true, + }) + @IsString() + id: string; + + @Prop() + @IsString() + password: string; + + @Prop() + @IsString() + refreshToken: string; + + @Prop({ require: true }) + @IsString() + nickname: string; + + @Prop({ default: 'url' }) + @IsString() + profileUrl: string; + + @Prop({ require: true }) + @IsString() + provider: 'asnity' | 'github'; + + @Prop({ default: 'default description' }) + @IsString() + description: string; + + @Prop({ default: 'ONLINE' }) + @IsString() + @IsIn(STATUS) + status: string; + + @Prop({ default: new Date(), type: mongoose.Schema.Types.Date }) + lastLogin: Date; + + @Prop({ default: new Date(), type: mongoose.Schema.Types.Date }) + createdAt: Date; + + @Prop({ default: new Date(), type: mongoose.Schema.Types.Date }) + updatedAt: Date; + + @Prop({ type: mongoose.Schema.Types.Date }) + deletedAt: Date; + + @Prop() + @IsString() + followings: string[]; + + @Prop() + @IsString() + followers: string[]; + + @Prop() + communities: string[]; +} +export const UserSchema = SchemaFactory.createForClass(User); diff --git a/server/package.json b/server/package.json index 261f3ea7..aa476d44 100644 --- a/server/package.json +++ b/server/package.json @@ -11,8 +11,10 @@ "format": "prettier --write \"apps/**/*.ts\" \"libs/**/*.ts\"", "start": "nest start", "start:dev": "nest start --watch", - "api-dev" : "nest start api --watch", - "socket-dev" : "nest start socket --watch", + "api-dev": "NODE_ENV=dev nest start api --watch", + "socket-dev": "NODE_ENV=dev nest start socket --watch", + "api-prod": "NODE_ENV=prod nest start api", + "socket-prod": "NODE_ENV=prod nest start socket", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", @@ -20,31 +22,54 @@ "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./apps/server/test/jest-e2e.json" + "test:e2e": "jest --config apps/socket/test/jest-e2e.json", + "test:report": "jest --coverage --ci --reporters=default --reporters=jest-junit" }, "dependencies": { - "common" : "1.0.0", + "shared" : "1.0.0", "@nestjs/common": "^9.0.0", "@nestjs/core": "^9.0.0", + "@nestjs/jwt": "^9.0.0", + "@nestjs/passport": "^9.0.0", "@nestjs/platform-express": "^9.0.0", + "@types/cookie-parser": "^1.4.3", + "argon2": "^0.30.2", + "cookie-parser": "^1.4.6", + "passport": "^0.6.0", + "passport-jwt": "^4.0.0", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.2.0" }, "devDependencies": { "@nestjs/cli": "^9.0.0", + "@nestjs/config": "^2.2.0", + "@nestjs/mongoose": "^9.2.1", "@nestjs/schematics": "^9.0.0", "@nestjs/testing": "^9.0.0", + "@sentry/minimal": "^6.19.7", + "@sentry/node": "^7.20.0", + "@slack/client": "^5.0.2", + "@slack/webhook": "^6.1.0", + "@types/cookie-parser": "^1.4.3", "@types/express": "^4.17.13", "@types/jest": "28.1.8", "@types/node": "^16.0.0", + "@types/passport-jwt": "^3.0.7", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.13.2", + "class-validator-mongo-object-id": "^1.3.0", "eslint": "^8.0.1", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", "jest": "28.1.3", + "jest-junit": "^14.0.1", + "mongoose": "^6.7.2", + "nest-raven": "^9.0.0", + "nest-winston": "^1.8.0", "prettier": "^2.3.2", "source-map-support": "^0.5.20", "supertest": "^6.1.3", @@ -52,7 +77,8 @@ "ts-loader": "^9.2.3", "ts-node": "^10.0.0", "tsconfig-paths": "4.1.0", - "typescript": "^4.7.4" + "typescript": "^4.7.4", + "winston": "^3.8.2" }, "jest": { "moduleFileExtensions": [ @@ -72,6 +98,23 @@ "testEnvironment": "node", "roots": [ "/apps/" + ], + "moduleNameMapper": { + "@app/(.*)": "/src/$1", + "@schemas/(.*)": "/dao/schemas/$1", + "@repository/(.*)": "/dao/repository/$1", + "@utils/(.*)": "/utils/$1", + "@custom_pipe/(.*)": "/custom_pipe/$1", + "@user/(.*)": "/apps/api/src/user/$1", + "@api/(.*)": "/apps/api/$1", + "@mock/(.*)": "/__mock__/$1" + }, + "coveragePathIgnorePatterns": [ + ".module.ts", + ".controller.ts", + ".mock.ts", + ".dto.ts", + "main.ts" ] } -} \ No newline at end of file +} diff --git a/server/tsconfig.json b/server/tsconfig.json index f4f03e21..b43f558a 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -17,6 +17,14 @@ "strictBindCallApply": false, "forceConsistentCasingInFileNames": false, "noFallthroughCasesInSwitch": false, - "paths": {} + "paths": { + "@schemas/*": ["dao/schemas/*"], + "@repository/*": ["dao/repository/*"], + "@utils/*": ["utils/*"], + "@custom_pipe/*": ["custom_pipe/*"], + "@user/*": ["apps/api/src/user/*"], + "@api/*": ["apps/api/*"], + "@mock/*": ["__mock__/*"], + } } } \ No newline at end of file diff --git a/server/utils/def.ts b/server/utils/def.ts new file mode 100644 index 00000000..228c5217 --- /dev/null +++ b/server/utils/def.ts @@ -0,0 +1,4 @@ +export const STATUS = ['ONLINE', 'OFFLINE', 'CUSTOM_OFFLINE']; +export const PROVIDER = ['ASNITY', 'GITHUB']; +export const CHANNEL_TYPE = ['CHANNEL', 'DM']; +export const CHAT_TYPE = ['TEXT', 'IMAGE']; diff --git a/server/utils/responseForm.ts b/server/utils/responseForm.ts new file mode 100644 index 00000000..af292035 --- /dev/null +++ b/server/utils/responseForm.ts @@ -0,0 +1,8 @@ +export const responseForm = (statusCode: number, data: Record) => { + return { + statusCode, + result: { + ...data, + }, + }; +}; diff --git a/shared/lib/user.ts b/shared/lib/user.ts new file mode 100644 index 00000000..2b1bf864 --- /dev/null +++ b/shared/lib/user.ts @@ -0,0 +1,15 @@ +export interface User { + _id: string; + id: string; + nickname: string; + status: string; + profileUrl: string; + descrption: string; +} + +export interface GetUsersReponse { + statusCode: number; + result: { + users: User[]; + }; +} diff --git a/common/package.json b/shared/package.json similarity index 77% rename from common/package.json rename to shared/package.json index d41474a6..9ca7c851 100644 --- a/common/package.json +++ b/shared/package.json @@ -1,5 +1,5 @@ { - "name": "common", + "name": "shared", "version": "1.0.0", "main": "index.js", "license": "MIT" diff --git a/shared/tsconfig.json b/shared/tsconfig.json new file mode 100644 index 00000000..95d4048c --- /dev/null +++ b/shared/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "composite": true + }, +} \ No newline at end of file diff --git a/shared/utils/index.ts b/shared/utils/index.ts new file mode 100644 index 00000000..7ca65a0e --- /dev/null +++ b/shared/utils/index.ts @@ -0,0 +1,8 @@ +export type CommonFn = () => 'TEST'; + +const commonFn: CommonFn = () => { + console.log('TEST'); + return 'TEST'; +}; + +export default commonFn; diff --git a/yarn.lock b/yarn.lock index 7fd97bf8..e4da8cb0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -71,6 +71,736 @@ ora "5.4.1" rxjs "6.6.7" +"@aws-crypto/ie11-detection@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz#9c39f4a5558196636031a933ec1b4792de959d6a" + integrity sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/sha256-browser@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz#741c9024df55ec59b51e5b1f5d806a4852699fb5" + integrity sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A== + dependencies: + "@aws-crypto/ie11-detection" "^2.0.0" + "@aws-crypto/sha256-js" "^2.0.0" + "@aws-crypto/supports-web-crypto" "^2.0.0" + "@aws-crypto/util" "^2.0.0" + "@aws-sdk/types" "^3.1.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-crypto/sha256-js@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz#f1f936039bdebd0b9e2dd834d65afdc2aac4efcb" + integrity sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig== + dependencies: + "@aws-crypto/util" "^2.0.0" + "@aws-sdk/types" "^3.1.0" + tslib "^1.11.1" + +"@aws-crypto/sha256-js@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-2.0.2.tgz#c81e5d378b8a74ff1671b58632779986e50f4c99" + integrity sha512-iXLdKH19qPmIC73fVCrHWCSYjN/sxaAvZ3jNNyw6FclmHyjLKg0f69WlC9KTnyElxCR5MO9SKaG00VwlJwyAkQ== + dependencies: + "@aws-crypto/util" "^2.0.2" + "@aws-sdk/types" "^3.110.0" + tslib "^1.11.1" + +"@aws-crypto/supports-web-crypto@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz#9f02aafad8789cac9c0ab5faaebb1ab8aa841338" + integrity sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/util@^2.0.0", "@aws-crypto/util@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-2.0.2.tgz#adf5ff5dfbc7713082f897f1d01e551ce0edb9c0" + integrity sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA== + dependencies: + "@aws-sdk/types" "^3.110.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/abort-controller@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.212.0.tgz#a2fc86733a9e900e39f850335935ae7dd66b3687" + integrity sha512-mXeBSuDi0Fpul4zk9VH2z0VKN+/+6hyJ9SXSRhn3LpMcyj3GeZtXyTB2wCsfxXYGxeGbV+bIzbPbhZza6wNfWg== + dependencies: + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/client-cognito-identity@3.213.0": + version "3.213.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.213.0.tgz#b8f9dc7fe8b05b03e3c47f2e0b9f2304e19ec4b0" + integrity sha512-S2vYT+g8F/t55/6cMwmLxJr3hkv85SGKMONqmQJPxvxQbrYV54NNPdFylkrey9+xbY3VYHmTh2dZ7znjXrkJsw== + dependencies: + "@aws-crypto/sha256-browser" "2.0.0" + "@aws-crypto/sha256-js" "2.0.0" + "@aws-sdk/client-sts" "3.213.0" + "@aws-sdk/config-resolver" "3.212.0" + "@aws-sdk/credential-provider-node" "3.212.0" + "@aws-sdk/fetch-http-handler" "3.212.0" + "@aws-sdk/hash-node" "3.212.0" + "@aws-sdk/invalid-dependency" "3.212.0" + "@aws-sdk/middleware-content-length" "3.212.0" + "@aws-sdk/middleware-endpoint" "3.212.0" + "@aws-sdk/middleware-host-header" "3.212.0" + "@aws-sdk/middleware-logger" "3.212.0" + "@aws-sdk/middleware-recursion-detection" "3.212.0" + "@aws-sdk/middleware-retry" "3.212.0" + "@aws-sdk/middleware-serde" "3.212.0" + "@aws-sdk/middleware-signing" "3.212.0" + "@aws-sdk/middleware-stack" "3.212.0" + "@aws-sdk/middleware-user-agent" "3.212.0" + "@aws-sdk/node-config-provider" "3.212.0" + "@aws-sdk/node-http-handler" "3.212.0" + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/smithy-client" "3.212.0" + "@aws-sdk/types" "3.212.0" + "@aws-sdk/url-parser" "3.212.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.212.0" + "@aws-sdk/util-defaults-mode-node" "3.212.0" + "@aws-sdk/util-endpoints" "3.212.0" + "@aws-sdk/util-user-agent-browser" "3.212.0" + "@aws-sdk/util-user-agent-node" "3.212.0" + "@aws-sdk/util-utf8-browser" "3.188.0" + "@aws-sdk/util-utf8-node" "3.208.0" + tslib "^2.3.1" + +"@aws-sdk/client-sso-oidc@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.212.0.tgz#87305787a50228e44ef60355b2e8e68b8fab6401" + integrity sha512-Co0AU+y9KEAZUraT36ttFZlmwARsr82q2nQji5E8zg3zlUHtqGvMJqxArudz3iOb2E9WRi75MwAQmLO2xEk45A== + dependencies: + "@aws-crypto/sha256-browser" "2.0.0" + "@aws-crypto/sha256-js" "2.0.0" + "@aws-sdk/config-resolver" "3.212.0" + "@aws-sdk/fetch-http-handler" "3.212.0" + "@aws-sdk/hash-node" "3.212.0" + "@aws-sdk/invalid-dependency" "3.212.0" + "@aws-sdk/middleware-content-length" "3.212.0" + "@aws-sdk/middleware-endpoint" "3.212.0" + "@aws-sdk/middleware-host-header" "3.212.0" + "@aws-sdk/middleware-logger" "3.212.0" + "@aws-sdk/middleware-recursion-detection" "3.212.0" + "@aws-sdk/middleware-retry" "3.212.0" + "@aws-sdk/middleware-serde" "3.212.0" + "@aws-sdk/middleware-stack" "3.212.0" + "@aws-sdk/middleware-user-agent" "3.212.0" + "@aws-sdk/node-config-provider" "3.212.0" + "@aws-sdk/node-http-handler" "3.212.0" + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/smithy-client" "3.212.0" + "@aws-sdk/types" "3.212.0" + "@aws-sdk/url-parser" "3.212.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.212.0" + "@aws-sdk/util-defaults-mode-node" "3.212.0" + "@aws-sdk/util-endpoints" "3.212.0" + "@aws-sdk/util-user-agent-browser" "3.212.0" + "@aws-sdk/util-user-agent-node" "3.212.0" + "@aws-sdk/util-utf8-browser" "3.188.0" + "@aws-sdk/util-utf8-node" "3.208.0" + tslib "^2.3.1" + +"@aws-sdk/client-sso@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.212.0.tgz#8650c734adba00a0c5abc8b6737d73b2c68019f3" + integrity sha512-b9lFI8Uz6YxIzAlS2uq62y5fX097lwcdkiq2N8YN2U7YgHQaKMIFnV8ZqkDdhZi2eUKwhSdUZzQy0tF6en2Ubg== + dependencies: + "@aws-crypto/sha256-browser" "2.0.0" + "@aws-crypto/sha256-js" "2.0.0" + "@aws-sdk/config-resolver" "3.212.0" + "@aws-sdk/fetch-http-handler" "3.212.0" + "@aws-sdk/hash-node" "3.212.0" + "@aws-sdk/invalid-dependency" "3.212.0" + "@aws-sdk/middleware-content-length" "3.212.0" + "@aws-sdk/middleware-endpoint" "3.212.0" + "@aws-sdk/middleware-host-header" "3.212.0" + "@aws-sdk/middleware-logger" "3.212.0" + "@aws-sdk/middleware-recursion-detection" "3.212.0" + "@aws-sdk/middleware-retry" "3.212.0" + "@aws-sdk/middleware-serde" "3.212.0" + "@aws-sdk/middleware-stack" "3.212.0" + "@aws-sdk/middleware-user-agent" "3.212.0" + "@aws-sdk/node-config-provider" "3.212.0" + "@aws-sdk/node-http-handler" "3.212.0" + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/smithy-client" "3.212.0" + "@aws-sdk/types" "3.212.0" + "@aws-sdk/url-parser" "3.212.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.212.0" + "@aws-sdk/util-defaults-mode-node" "3.212.0" + "@aws-sdk/util-endpoints" "3.212.0" + "@aws-sdk/util-user-agent-browser" "3.212.0" + "@aws-sdk/util-user-agent-node" "3.212.0" + "@aws-sdk/util-utf8-browser" "3.188.0" + "@aws-sdk/util-utf8-node" "3.208.0" + tslib "^2.3.1" + +"@aws-sdk/client-sts@3.213.0": + version "3.213.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.213.0.tgz#cfc097ad1c4a02eec5623010a06f16a408014267" + integrity sha512-MCjtLaYVQJLIMeLubDc4yRjSyVVTOebKxhY4ix4cfpSA6X4jMc4gRY2eu4eja3qoISfHq/Ikrkxx9DD1+n1azg== + dependencies: + "@aws-crypto/sha256-browser" "2.0.0" + "@aws-crypto/sha256-js" "2.0.0" + "@aws-sdk/config-resolver" "3.212.0" + "@aws-sdk/credential-provider-node" "3.212.0" + "@aws-sdk/fetch-http-handler" "3.212.0" + "@aws-sdk/hash-node" "3.212.0" + "@aws-sdk/invalid-dependency" "3.212.0" + "@aws-sdk/middleware-content-length" "3.212.0" + "@aws-sdk/middleware-endpoint" "3.212.0" + "@aws-sdk/middleware-host-header" "3.212.0" + "@aws-sdk/middleware-logger" "3.212.0" + "@aws-sdk/middleware-recursion-detection" "3.212.0" + "@aws-sdk/middleware-retry" "3.212.0" + "@aws-sdk/middleware-sdk-sts" "3.212.0" + "@aws-sdk/middleware-serde" "3.212.0" + "@aws-sdk/middleware-signing" "3.212.0" + "@aws-sdk/middleware-stack" "3.212.0" + "@aws-sdk/middleware-user-agent" "3.212.0" + "@aws-sdk/node-config-provider" "3.212.0" + "@aws-sdk/node-http-handler" "3.212.0" + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/smithy-client" "3.212.0" + "@aws-sdk/types" "3.212.0" + "@aws-sdk/url-parser" "3.212.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.212.0" + "@aws-sdk/util-defaults-mode-node" "3.212.0" + "@aws-sdk/util-endpoints" "3.212.0" + "@aws-sdk/util-user-agent-browser" "3.212.0" + "@aws-sdk/util-user-agent-node" "3.212.0" + "@aws-sdk/util-utf8-browser" "3.188.0" + "@aws-sdk/util-utf8-node" "3.208.0" + fast-xml-parser "4.0.11" + tslib "^2.3.1" + +"@aws-sdk/config-resolver@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.212.0.tgz#9c7967c0058d7b8c8141db3ca25bf369223e5c20" + integrity sha512-hIP/Izpv6GCsDTnHCd/X9Ro7Mw5le+gr2VbkZHWR0c8+3xZWp8N5S0QnUBogF3Dv2KwPbmHP+bs/vqqo3miUjQ== + dependencies: + "@aws-sdk/signature-v4" "3.212.0" + "@aws-sdk/types" "3.212.0" + "@aws-sdk/util-config-provider" "3.208.0" + "@aws-sdk/util-middleware" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-cognito-identity@3.213.0": + version "3.213.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.213.0.tgz#5e4fb76c56190f944429618b5d612786cadfd219" + integrity sha512-gc7KSAFXvHlThemCoP/OawA1u7kwSjbLzePIRR7o6svgA6oUsvHMcOtE3fGW698qlr8aWMxYTuL99MaJotSVpQ== + dependencies: + "@aws-sdk/client-cognito-identity" "3.213.0" + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-env@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.212.0.tgz#30a7bc8761bd190405da66674e06e05ef831c6e1" + integrity sha512-HNYoqetLqTxwl0Grl4ez8Dx3I3hJfskxH2PTHYI1/iAqrY/gSB2oBOusvBeksbYrScnQM2IGqEcMJ4lzGLOH+w== + dependencies: + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-imds@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.212.0.tgz#a21c43251d16a57bfc104753549f32c1737abd07" + integrity sha512-Bg7cX2N5pJ//ft3Y8HWtpDSEMMgRTNMaNlIvTlDbAKYp7HBZRWSf9ZJnz2slT7qbyaJyRP5pSJC4XRm83g4leA== + dependencies: + "@aws-sdk/node-config-provider" "3.212.0" + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/types" "3.212.0" + "@aws-sdk/url-parser" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-ini@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.212.0.tgz#86bd24a8af17fed2e5e575be92c5ed9823adc144" + integrity sha512-H7qRIP8qV7tRrCSJx2p5oQVMJASQWZUmi4l699hDMejmCO/m4pUMQFmWn2FXtZv8gTfzlkmp3wMixD5jnfL7pw== + dependencies: + "@aws-sdk/credential-provider-env" "3.212.0" + "@aws-sdk/credential-provider-imds" "3.212.0" + "@aws-sdk/credential-provider-sso" "3.212.0" + "@aws-sdk/credential-provider-web-identity" "3.212.0" + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/shared-ini-file-loader" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-node@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.212.0.tgz#20201b5da84bc217bb9e428a82b13669b3e6f22c" + integrity sha512-T44hoU3GCYHS+4GDVs7S/v2bBHmmYpnPayQsYXhDElQKXP0cFzQ78F8et4IU5lM94hwK+ISRQPrKaq4p77evkw== + dependencies: + "@aws-sdk/credential-provider-env" "3.212.0" + "@aws-sdk/credential-provider-imds" "3.212.0" + "@aws-sdk/credential-provider-ini" "3.212.0" + "@aws-sdk/credential-provider-process" "3.212.0" + "@aws-sdk/credential-provider-sso" "3.212.0" + "@aws-sdk/credential-provider-web-identity" "3.212.0" + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/shared-ini-file-loader" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-process@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.212.0.tgz#9659a5e2bd2ae1a2f6d67a068d341c59f23fc7ae" + integrity sha512-bGaVKSm5Tf5VZtlM2V6k+M9nSKzlb14ldCcH0PGGMaK/dqnEJDVSxXPu3fWyomaxbLt7Is3AUMh6L2bq3kuXyA== + dependencies: + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/shared-ini-file-loader" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-sso@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.212.0.tgz#c74ae70a3c214c8dd131dfb688d15f0cc355def5" + integrity sha512-OGatVUnWLp7PePs2H2RyYmTrwurl0tAfW+LWfVAPgYyvi2RQgTmSK5LJ3pXKxz3TvaSHkCvsT0NWNqdWY+iKWQ== + dependencies: + "@aws-sdk/client-sso" "3.212.0" + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/shared-ini-file-loader" "3.212.0" + "@aws-sdk/token-providers" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-web-identity@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.212.0.tgz#9724033e623e75a4dbdce0697a3cfea2f21e12cf" + integrity sha512-zPF3KiVT14aeu4cRyEUelAJEAzFp++9ULLigQXhKBbFYaiOZMAHKRASO/WUK1ixYBC+ax4G1rbihLfQimXMtVA== + dependencies: + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/credential-providers@^3.186.0": + version "3.213.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.213.0.tgz#c74fd57e55ce6e6cc914784b73e5ce21fe279bc3" + integrity sha512-ksmJ+YPNbDceLskeBbTAuDvSRXK6jeY0XO1QUZ15yO8GRm90P85J7ouAsdNIKwZfeG1tkfFSSq/IaTTlIWFkbQ== + dependencies: + "@aws-sdk/client-cognito-identity" "3.213.0" + "@aws-sdk/client-sso" "3.212.0" + "@aws-sdk/client-sts" "3.213.0" + "@aws-sdk/credential-provider-cognito-identity" "3.213.0" + "@aws-sdk/credential-provider-env" "3.212.0" + "@aws-sdk/credential-provider-imds" "3.212.0" + "@aws-sdk/credential-provider-ini" "3.212.0" + "@aws-sdk/credential-provider-node" "3.212.0" + "@aws-sdk/credential-provider-process" "3.212.0" + "@aws-sdk/credential-provider-sso" "3.212.0" + "@aws-sdk/credential-provider-web-identity" "3.212.0" + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/shared-ini-file-loader" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/fetch-http-handler@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.212.0.tgz#8a2726d5907bc96a18434cc59f6303ad7db1204c" + integrity sha512-u7ehnpAVN8D0asWhyQitNVf1j5LdzCuxP/14Dx8+PvrUdZxQNVq2FVB+tkQvOs9pDHE/oROjVo7GNO42bmkitA== + dependencies: + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/querystring-builder" "3.212.0" + "@aws-sdk/types" "3.212.0" + "@aws-sdk/util-base64" "3.208.0" + tslib "^2.3.1" + +"@aws-sdk/hash-node@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.212.0.tgz#4c1a8e02ef7b6fea01f81c288122088fc945404c" + integrity sha512-pwZkz83EvXHGURBYjBYS7Cr+gSr6pi23RDlP/aXREjJGs9QUQyixBh78oX5a3p6bB8JeizPcZS1dXKJ9OKCHAw== + dependencies: + "@aws-sdk/types" "3.212.0" + "@aws-sdk/util-buffer-from" "3.208.0" + tslib "^2.3.1" + +"@aws-sdk/invalid-dependency@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.212.0.tgz#9e4dbbfcfdc6bbbc7be9c09775f6a2b8eb7f50d2" + integrity sha512-zKVx+4Silmsr5Nvv9aGL5FmuHvdP9Dcvy/22fmWa3RRvCSNRpvFDeXtcDB5FvNpbWbO+qJyGj/OeqB/XejV13w== + dependencies: + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/is-array-buffer@3.201.0": + version "3.201.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz#06e557adc284fac2f26071c2944ae01f61b95854" + integrity sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/middleware-content-length@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.212.0.tgz#a382cb298d0e1df337dd0d5d8271c6928d0f78d2" + integrity sha512-gR6jeKGYNYqNLFRcuX3vv5PN1POLlB/9LDVYl3k/NNaCg8L1EKqqEtG84Gmn1AXH+2s6zMNs+gt5ygeqZQe2Cw== + dependencies: + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-endpoint@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.212.0.tgz#f0a4de1d3c2da6c702ce296119d57eb5a9af521e" + integrity sha512-6ntKYehjxLun8hPXIPHSI2pGr/pHuQ6jcyO5wBq1kydSIIGiESl8H84DEt+yRvroCiYgbU+I8cACnRE0uv0bLA== + dependencies: + "@aws-sdk/middleware-serde" "3.212.0" + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/signature-v4" "3.212.0" + "@aws-sdk/types" "3.212.0" + "@aws-sdk/url-parser" "3.212.0" + "@aws-sdk/util-config-provider" "3.208.0" + "@aws-sdk/util-middleware" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-host-header@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.212.0.tgz#c1a6e38e8f861f7d76c69ff8d62a3da3846da41b" + integrity sha512-W00mxzK2OXy91Ncxri3cZJIxxSBzE72bX8FDa3xgC0ujbj49lw+rol6aV/Fw8Nda3CZ5xxulvJ4sXHt2eOtXSA== + dependencies: + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-logger@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.212.0.tgz#c43ec677be6913854b97fb48e0c3a53fe158d910" + integrity sha512-BSQqzKp4abf2wXvJEstB0zdr68yJMZXA14h53eSvtzykZLfvvFixR1nyVgKq+PKm1VaJ2fuZr10tjWRVQg1pYA== + dependencies: + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-recursion-detection@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.212.0.tgz#5aebe6164f2484fca47789da33f7f600c8e44391" + integrity sha512-ATHPNtnd7nlm0jRXvr/c2xbxcna5ZGXEWTM5tUjIflOK9Rl3PCRce/hoQnHs45kv4l3daC53sPuRvTQ8O7K67A== + dependencies: + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-retry@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.212.0.tgz#39c499cdf3423b99f16ca503bae90fd337536aef" + integrity sha512-lIi/JkYXalY6CYw2dJbQ/Xo64Ah3wfJ63BMTFQHQk1htnIDBnLd9a6ng96JgXJQMSO4ZEqRW/709NBlC157hbw== + dependencies: + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/service-error-classification" "3.212.0" + "@aws-sdk/types" "3.212.0" + "@aws-sdk/util-middleware" "3.212.0" + tslib "^2.3.1" + uuid "^8.3.2" + +"@aws-sdk/middleware-sdk-sts@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.212.0.tgz#cb46e56b072e2b02fb305878fa1b1262b2d368b7" + integrity sha512-IcMfno3RJEXXS1Ch5lY0hgdSkGn9XW9m3XoKu1DjhEqR34ENDzvUmEN2PimIcZnz+9W59CU9UAMs/amRhwhlmw== + dependencies: + "@aws-sdk/middleware-signing" "3.212.0" + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/signature-v4" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-serde@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.212.0.tgz#d5ed435769930019df61efa0410a58c63bb0dae3" + integrity sha512-KwRpwi/8vNDV0l8uvu1DPk0q3WR2pnp9VtUNZ6u9zU54hvVL+Z1PtQh/WfzJzNvtCHvtc/gVMs3Daqb/Ecrm5Q== + dependencies: + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-signing@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.212.0.tgz#9086db6e1baca5f80598239b51be4e131a26a92e" + integrity sha512-pth95aEsxqQO0lrRAHZNVI5hrMtA14nEUPFjiLaXtOssZrjD6mBzXPRy1nKob6XWXOp/Vy0mnyI/FT/NnMflFw== + dependencies: + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/signature-v4" "3.212.0" + "@aws-sdk/types" "3.212.0" + "@aws-sdk/util-middleware" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-stack@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.212.0.tgz#1399a0c03a6817fda804612b5760ddbff843ac0c" + integrity sha512-AZ5f9ChioHsxGUojlzqI57sYyM9oW9SN/7AuiNafXU02j9jw7DKiYRn43lRUhgYnb/REhedHA5SsqIBF5eut/w== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/middleware-user-agent@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.212.0.tgz#a1c2332eb867262b1271a21432baafb509014738" + integrity sha512-CVSY2kt+RaP6CVqSKp+1sPUAQFusTLZLFHVK0YPFzcIySJMqJC0l0/BzLhaIf5Bs3JHa/VGym8oDpp881yimHA== + dependencies: + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/node-config-provider@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.212.0.tgz#62d1815c23dc0836dee5c8fbe758200e8237f05f" + integrity sha512-8AfOEDPe/D9DccUgredYg07GH2jrw07FCTyA1Pug5Hgbas7w14zbhLyQB0l6gcOJEuh34e/7oV9hN3s1hctnJg== + dependencies: + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/shared-ini-file-loader" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/node-http-handler@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.212.0.tgz#9e9fc82fd856fd740f8d6c526627966b9aa11580" + integrity sha512-wt4jK8HeYMjuQbWB4+Xt/nGyTvIwtLhm0SHcRgcoTsUjEiaPio/xNanyBWhPSUM87jpyG6bQMCzUtDbPeLqhkA== + dependencies: + "@aws-sdk/abort-controller" "3.212.0" + "@aws-sdk/protocol-http" "3.212.0" + "@aws-sdk/querystring-builder" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/property-provider@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.212.0.tgz#0adcee53cc378de8f291f40e2427976b1e3f8801" + integrity sha512-NMCIABfw3VZ7Vtn6iSeZRuSToRLxIHq0eGoUgO7T4fUp3U5vqYt28A5UY65KB9ifUPpNSllEG3EhEqs5qFw5+w== + dependencies: + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/protocol-http@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.212.0.tgz#fc7c6239ad2caf39486ea495186174f53fbc2539" + integrity sha512-EhkLPQC2TeqC3RGKfW87zoKj/gsWS4JJlRl5U6KMXejBMKQPzuopUiF9gQJ2iuou9BT8B+RsG2qgSHzrxp6lKw== + dependencies: + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/querystring-builder@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.212.0.tgz#a7783429d4d4bdcd9a2d6895b5929716a6a4faa6" + integrity sha512-4CaQstj0Aki3vc96Z0d481raNagmy9gnJtIv6yveATJ/57lk/RUv2WtTUOzpFKv/oNx5khix2tpbRqK9nCUxVg== + dependencies: + "@aws-sdk/types" "3.212.0" + "@aws-sdk/util-uri-escape" "3.201.0" + tslib "^2.3.1" + +"@aws-sdk/querystring-parser@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.212.0.tgz#1a22d8fb472a1144d8780922bccaf43a9fc1fe06" + integrity sha512-ttarfAHMOYKgFHeBdgXID9SlNS7erH4gavN3fvf5R1RliCytUnzsTTvqa7CmVBFy0Xc/2yA+/6FFDKlOsS8tRg== + dependencies: + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/service-error-classification@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.212.0.tgz#b38928291966bb0e2f305f9685adac1b5151e9a7" + integrity sha512-jCv+uuFq4yGjP8FoCmoOGqnKNHHREDOFf7OxVSCluGMg2LXHfGxxqkqNFJlT3p+QdEp323GSWFY+PUsMJy7BLQ== + +"@aws-sdk/shared-ini-file-loader@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.212.0.tgz#b9c8bc4d8650d3d8a363c89d988bd173d2622a3b" + integrity sha512-wKWqCA1oU57V//D3uAjQKGGj6rm6YKH4pWIU38Ypb/xNafiB7C51KtwpQVsS2HCNfmGrD03sGLKEZCSy9jvIlA== + dependencies: + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/signature-v4@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.212.0.tgz#e66c0b89750e7dd79829db02c8c289deae15ea92" + integrity sha512-tCrzWA60AWGDRmY9OyUrG0BzD+dDbAtHSqcY2LchGHOlMmv501/WXBIvn9fDfKp8GJj6Lb3VcG9cY1jCuKKcmg== + dependencies: + "@aws-sdk/is-array-buffer" "3.201.0" + "@aws-sdk/types" "3.212.0" + "@aws-sdk/util-hex-encoding" "3.201.0" + "@aws-sdk/util-middleware" "3.212.0" + "@aws-sdk/util-uri-escape" "3.201.0" + tslib "^2.3.1" + +"@aws-sdk/smithy-client@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.212.0.tgz#500b3eedc4540e3d629618f46f6a9c3320495c7f" + integrity sha512-dQUlM/eltp9JVEVQWGxU/6Or8jGQWK5mgmbP+BUHkfDgoMIeOFksIYon211KhE18EjoGgav1mr4/HHlcnekI2w== + dependencies: + "@aws-sdk/middleware-stack" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/token-providers@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.212.0.tgz#bc76a7097e6501599925f86b77f5847c3f355f7a" + integrity sha512-pTe4PM14b58nbfvIP9B0zW5dUIxEb/ALVzSLuxpJwJRI51E5QZmXJMT3P77MUd6niqKw0cRrnEHIgznD67JHSg== + dependencies: + "@aws-sdk/client-sso-oidc" "3.212.0" + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/shared-ini-file-loader" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/types@3.212.0", "@aws-sdk/types@^3.1.0", "@aws-sdk/types@^3.110.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.212.0.tgz#199ceafa82c9c14ed31a3f25992042287d804ca9" + integrity sha512-uXBXB1PBYxfPyIvgmjbGdYBlS7rdeMG58uCaY3Ga5scY2xQnj7HU7knATKuIKk2DH1lLT0inqtsRVJS25zRK5w== + +"@aws-sdk/url-parser@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.212.0.tgz#d4fae88783a5e8f8b59bfceedce269ec87a18f37" + integrity sha512-mTUQQRcVYqur7aHDuDMDKxN7Yr/5kIZB1RtMjIwtimTcf7TZaskN6sLTPo42YgASM6XQQhJECZaOE7Ow16i6Mg== + dependencies: + "@aws-sdk/querystring-parser" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/util-base64@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz#36b430e5396251f761590f7c2f0c5c12193f353c" + integrity sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg== + dependencies: + "@aws-sdk/util-buffer-from" "3.208.0" + tslib "^2.3.1" + +"@aws-sdk/util-body-length-browser@3.188.0": + version "3.188.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz#e1d949318c10a621b38575a9ef01e39f9857ddb0" + integrity sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-body-length-node@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz#baabd1fa1206ff2bd4ce3785122d86eb3258dd20" + integrity sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-buffer-from@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz#285e86f6dc9030148a4147d65239e75cb254a1b0" + integrity sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw== + dependencies: + "@aws-sdk/is-array-buffer" "3.201.0" + tslib "^2.3.1" + +"@aws-sdk/util-config-provider@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz#c485fd83fbac051337e5f6be60ea3f9fa61c0139" + integrity sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-defaults-mode-browser@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.212.0.tgz#b3d0372129e544b02b5744393a3106c45656132d" + integrity sha512-tAs9+/lTtil545kyCqy7qjnnCq4S2S+4kBhHXgwRNPT85Nx5XCEEheWH6VZ45YufRaiRNFfX0n+odDwzDaev6g== + dependencies: + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/types" "3.212.0" + bowser "^2.11.0" + tslib "^2.3.1" + +"@aws-sdk/util-defaults-mode-node@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.212.0.tgz#9a3507715c3c83889c8577ffbf5ff9bd15a924fa" + integrity sha512-fNl1IDqn1mAoiM2Xv5KGAczXHy2+tPlouunIEePnQKTq0pzT3WqR13qleTfu1EcEz1oyGnDRoK91aP61Jxh3OQ== + dependencies: + "@aws-sdk/config-resolver" "3.212.0" + "@aws-sdk/credential-provider-imds" "3.212.0" + "@aws-sdk/node-config-provider" "3.212.0" + "@aws-sdk/property-provider" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/util-endpoints@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.212.0.tgz#95c94d83b49e2c069b0401ff2da8d8c4b5be2c69" + integrity sha512-/ADfvrZwhzUphre3pliO290IFOflvHyBBEaKn9WfRQ5veZxl+CuOEjxkwTJfHUrfWbh+xpCuOewWVLCptmoC4A== + dependencies: + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/util-hex-encoding@3.201.0": + version "3.201.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz#21d7ec319240ee68c33d938e71cb79830bea315d" + integrity sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz#0f598fc238a1256e4bcb64d01459f03a922dd4c3" + integrity sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-middleware@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.212.0.tgz#eae2f805269cae4c80b560674fabb94ffe42fdb4" + integrity sha512-621glUpwVKJRB8QxRG/5cAKIq8LKPdl/l8CS7vDg34f6j9BJmP5YVPcTzzQ6iskQAblkndiBAnSjp7kGujxuGg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-uri-escape@3.201.0": + version "3.201.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz#5e708d4cde001a4558ee616f889ceacfadd2ab03" + integrity sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-user-agent-browser@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.212.0.tgz#c7df623e2b6076bb5d3f346dc157c268a4636cf3" + integrity sha512-xXz16ge9NdKCwlD+952rfvgHdDe+pbCavbVMNdR60joHq5KYGR1e02l0LRNVe48/C9dAo2ezeJ+YnTPaw3Yl8Q== + dependencies: + "@aws-sdk/types" "3.212.0" + bowser "^2.11.0" + tslib "^2.3.1" + +"@aws-sdk/util-user-agent-node@3.212.0": + version "3.212.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.212.0.tgz#7ebf76afd6782ea46d891a8fccc5d53e925ec9b6" + integrity sha512-HE8VwtMtTXGkwUjryNpy+qyg7wrQxCGplDP59yo0YVn86B5f9nhRi/2jRAsKo9yf94iP7PXAz65TY9+KJC8UIg== + dependencies: + "@aws-sdk/node-config-provider" "3.212.0" + "@aws-sdk/types" "3.212.0" + tslib "^2.3.1" + +"@aws-sdk/util-utf8-browser@3.188.0", "@aws-sdk/util-utf8-browser@^3.0.0": + version "3.188.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz#484762bd600401350e148277731d6744a4a92225" + integrity sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-utf8-node@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz#eba17de0f92f87b98481c2e2d0ceaa05c7994d67" + integrity sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ== + dependencies: + "@aws-sdk/util-buffer-from" "3.208.0" + tslib "^2.3.1" + "@babel/cli@^7.19.3": version "7.19.3" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.19.3.tgz#55914ed388e658e0b924b3a95da1296267e278e2" @@ -1085,6 +1815,15 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -1105,6 +1844,36 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@graphql-tools/merge@8.3.11": + version "8.3.11" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.11.tgz#f5eab764e8d7032c1b7e32d5dc6dea5b2f5bb21e" + integrity sha512-IpZh8r8e8FycXaUv04xe5HQH9siD1tkS8MvaO8Wb2FaPXv15XSYP+Wsb2MUStpIqGfQxa6xY/+eEuxv+VqwXyg== + dependencies: + "@graphql-tools/utils" "9.1.0" + tslib "^2.4.0" + +"@graphql-tools/schema@9.0.9": + version "9.0.9" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.9.tgz#aa24869a2231039dcd9b6b882a5c5cb186d1116e" + integrity sha512-hwg8trUytO5ayQ8bzL3+sAyXcu2rhKt5pLXpLO0/TMTN2nXd3DBO4mqx+Ra4Er2mE/msInGQ5EmZbxVBPv+hSg== + dependencies: + "@graphql-tools/merge" "8.3.11" + "@graphql-tools/utils" "9.1.0" + tslib "^2.4.0" + value-or-promise "1.0.11" + +"@graphql-tools/utils@9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.1.0.tgz#c33893e0aa9cbd3760d94f1771477e722adb4e54" + integrity sha512-4Ketxo98IwKA/56LP6cI6PgQBwUCujszQcTNkzjq7liJPa2mLjKnmVOJ0bauMwKcEazeYuZagceljb0POmEGvQ== + dependencies: + tslib "^2.4.0" + +"@heroicons/react@^2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-2.0.13.tgz#9b1cc54ff77d6625c9565efdce0054a4bcd9074c" + integrity sha512-iSN5XwmagrnirWlYEWNPdCDj9aRYVD/lnK3JlsC9/+fqGF80k8C7rl+1HCvBX0dBoagKqOFBs6fMhJJ1hOg1EQ== + "@humanwhocodes/config-array@^0.10.4": version "0.10.7" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" @@ -1600,6 +2369,21 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== +"@mapbox/node-pre-gyp@^1.0.10": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz#8e6735ccebbb1581e5a7e652244cadc8a844d03c" + integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + "@mswjs/cookies@^0.2.2": version "0.2.2" resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" @@ -1622,6 +2406,15 @@ strict-event-emitter "^0.2.4" web-encoding "^1.1.5" +"@nestjs/apollo@^10.0.0": + version "10.1.6" + resolved "https://registry.yarnpkg.com/@nestjs/apollo/-/apollo-10.1.6.tgz#def8135ced4089c858153be6d76bff80668787e0" + integrity sha512-BQJBBUTjEQ6roCHPC2io/OV+4n/ph1kyN38FFHtTiGHAgWx+YdeMT4LEGcaM1qBOuGC7PyNYTL3Cm2gzsGPSdg== + dependencies: + iterall "1.3.0" + lodash.omit "4.5.0" + tslib "2.4.1" + "@nestjs/cli@^9.0.0": version "9.1.5" resolved "https://registry.yarnpkg.com/@nestjs/cli/-/cli-9.1.5.tgz#aa150991b209dc2b459c974cc1c43ea10a276ff8" @@ -1659,6 +2452,16 @@ tslib "2.4.1" uuid "9.0.0" +"@nestjs/config@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@nestjs/config/-/config-2.2.0.tgz#9f3da35f7c4a58724c0a0817d6f04b66e6703430" + integrity sha512-78Eg6oMbCy3D/YvqeiGBTOWei1Jwi3f2pSIZcZ1QxY67kYsJzTRTkwRT8Iv30DbK0sGKc1mcloDLD5UXgZAZtg== + dependencies: + dotenv "16.0.1" + dotenv-expand "8.0.3" + lodash "4.17.21" + uuid "8.3.2" + "@nestjs/core@^9.0.0": version "9.2.0" resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-9.2.0.tgz#12b021808f615d71302a2f675afc79347a1e6023" @@ -1672,6 +2475,49 @@ tslib "2.4.1" uuid "9.0.0" +"@nestjs/graphql@^10.0.0": + version "10.1.6" + resolved "https://registry.yarnpkg.com/@nestjs/graphql/-/graphql-10.1.6.tgz#cc9ec904f345cb4ccbbc65cd6d491587ebdce98e" + integrity sha512-RiDTqyBqk+qolcMMKBANuG5zw0q0zbVmkwWydB2F1ObvUyl5t/GOAcR8mbq3gvpfYzylQ5t5/svWUDq/7dcpaQ== + dependencies: + "@graphql-tools/merge" "8.3.11" + "@graphql-tools/schema" "9.0.9" + "@graphql-tools/utils" "9.1.0" + "@nestjs/mapped-types" "1.2.0" + chokidar "3.5.3" + fast-glob "3.2.12" + graphql-tag "2.12.6" + graphql-ws "5.5.5" + lodash "4.17.21" + normalize-path "3.0.0" + subscriptions-transport-ws "0.11.0" + tslib "2.4.1" + uuid "9.0.0" + ws "8.11.0" + +"@nestjs/jwt@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@nestjs/jwt/-/jwt-9.0.0.tgz#73e01338d2853a55033528b540cfd92c7996bae9" + integrity sha512-ZsXGY/wMYKzEhymw2+dxiwrHTRKIKrGszx6r2EjQqNLypdXMQu0QrujwZJ8k3+XQV4snmuJwwNakQoA2ILfq8w== + dependencies: + "@types/jsonwebtoken" "8.5.8" + jsonwebtoken "8.5.1" + +"@nestjs/mapped-types@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@nestjs/mapped-types/-/mapped-types-1.2.0.tgz#1bbdbb5c956f0adb3fd76add929137bc6ad3183f" + integrity sha512-NTFwPZkQWsArQH8QSyFWGZvJ08gR+R4TofglqZoihn/vU+ktHEJjMqsIsADwb7XD97DhiD+TVv5ac+jG33BHrg== + +"@nestjs/mongoose@^9.2.1": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@nestjs/mongoose/-/mongoose-9.2.1.tgz#b880feb7ce52a081e81374ddf3c3ed0eff1224f4" + integrity sha512-tMK5kKFjQnNVhqJDw1wa352z+VsODOFznTn74xSzrziof03qS+O6rLU4q1kMx0B4AmFbADf03GOdpvBc9bMWqw== + +"@nestjs/passport@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@nestjs/passport/-/passport-9.0.0.tgz#0571bb08f8043456bc6df44cd4f59ca5f10c9b9f" + integrity sha512-Gnh8n1wzFPOLSS/94X1sUP4IRAoXTgG4odl7/AO5h+uwscEGXxJFercrZfqdAwkWhqkKWbsntM3j5mRy/6ZQDA== + "@nestjs/platform-express@^9.0.0": version "9.2.0" resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-9.2.0.tgz#17e3a49df7bf8710f64c2b6db25c4457e6fd0ba9" @@ -1741,6 +2587,11 @@ resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== +"@phc/format@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@phc/format/-/format-1.0.0.tgz#b5627003b3216dc4362125b13f48a4daa76680e4" + integrity sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ== + "@pmmmwh/react-refresh-webpack-plugin@^0.5.9": version "0.5.9" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.9.tgz#35aae6624a6270ca7ad755800b7eec417fa6f830" @@ -1766,6 +2617,72 @@ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.0.3.tgz#953b88c20ea00d0eddaffdc1b115c08474aa295d" integrity sha512-ceuyTSs7PZ/tQqi19YZNBc5X7kj1f8p+4DIyrcIYFY9h+hd1OKm4RqtiWldR9eGEvIiJfsqwM4BsuCtRIuEw6Q== +"@sentry/core@7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.20.0.tgz#7becd848c982d5422627f69c4061d5914946c54a" + integrity sha512-8dIHk8niyEyVayUQpgECHnV2p444nPBjIyuQrtkdTxL7sBLC5+Y0DhRjxg9cJyZe/bZnXVerGkgcA7niKW4W8A== + dependencies: + "@sentry/types" "7.20.0" + "@sentry/utils" "7.20.0" + tslib "^1.9.3" + +"@sentry/hub@6.19.7": + version "6.19.7" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.19.7.tgz#58ad7776bbd31e9596a8ec46365b45cd8b9cfd11" + integrity sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA== + dependencies: + "@sentry/types" "6.19.7" + "@sentry/utils" "6.19.7" + tslib "^1.9.3" + +"@sentry/minimal@^6.19.7": + version "6.19.7" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.19.7.tgz#b3ee46d6abef9ef3dd4837ebcb6bdfd01b9aa7b4" + integrity sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ== + dependencies: + "@sentry/hub" "6.19.7" + "@sentry/types" "6.19.7" + tslib "^1.9.3" + +"@sentry/node@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.20.0.tgz#a32e37b2c93607e8b8d7f3741f60418ec2d99ddb" + integrity sha512-aB0VSueCiWPg53DIevnKNYSu2OGsPweWO1eKhMhu1uJNbL+ZYAFRczdcLdkWCqa38X5jjqO82GKuIZYpXUGX+A== + dependencies: + "@sentry/core" "7.20.0" + "@sentry/types" "7.20.0" + "@sentry/utils" "7.20.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/types@6.19.7": + version "6.19.7" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.19.7.tgz#c6b337912e588083fc2896eb012526cf7cfec7c7" + integrity sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg== + +"@sentry/types@7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.20.0.tgz#ace232e00407355dccedf65e27471635b4331265" + integrity sha512-x17ddduGWqW95neBFVvxzmInb5WXVw+2PcNASHXpGFhi7v2gz2a7/w2CcIKxsqODNnc+z/k1t0Y+uy9B6aH6ag== + +"@sentry/utils@6.19.7": + version "6.19.7" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.19.7.tgz#6edd739f8185fd71afe49cbe351c1bbf5e7b7c79" + integrity sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA== + dependencies: + "@sentry/types" "6.19.7" + tslib "^1.9.3" + +"@sentry/utils@7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.20.0.tgz#cca09e2256b64bfb41a78c89af3c88fcc7ca84c2" + integrity sha512-4lc122TFgkaCAvoPRy+uc5vgOCumTa/2nPkzCSxVsezQs+ebHxyMJQK7GWBLI6P+EzKfEjlgyMzRWaPJ3iJatA== + dependencies: + "@sentry/types" "7.20.0" + tslib "^1.9.3" + "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" @@ -1785,11 +2702,107 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@slack/client@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@slack/client/-/client-5.0.2.tgz#75a45bdd86a9eb8eaba2febb0bbdfeb281cf02e1" + integrity sha512-HurKTUBZlwj/1cnZ6QOHpYR7k+G62WlL+13DgYD7onVRnQWggkIyCg+ymX1kQn6txzNdUyDEaixyCvBvmhH8tQ== + dependencies: + "@slack/logger" "^1.0.0" + "@slack/rtm-api" "^5.0.2" + "@slack/types" "^1.1.0" + "@slack/web-api" "^5.1.0" + "@slack/webhook" "^5.0.1" + +"@slack/logger@>=1.0.0 <3.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@slack/logger/-/logger-2.0.0.tgz#6a4e1c755849bc0f66dac08a8be54ce790ec0e6b" + integrity sha512-OkIJpiU2fz6HOJujhlhfIGrc8hB4ibqtf7nnbJQDerG0BqwZCfmgtK5sWzZ0TkXVRBKD5MpLrTmCYyMxoMCgPw== + dependencies: + "@types/node" ">=8.9.0" + +"@slack/logger@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@slack/logger/-/logger-1.1.1.tgz#5cb0658abcd2c4ec39ecf04348ba4764b9f68e00" + integrity sha512-PAC5CMnNAv/FPtJ0le+YD2wUV+tZ7n3Bnjj9dBI+deIcHsExCnQkQmZE79cLvfuYXbz3PWyv5coti30MJQhEjA== + dependencies: + "@types/node" ">=8.9.0" + +"@slack/rtm-api@^5.0.2": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@slack/rtm-api/-/rtm-api-5.0.5.tgz#0dd7368dcbcf5a0114feb4f9860ae933f11a2b0e" + integrity sha512-x2B4hyoxjg62cxf4M5QRomx+xYp2XoajPKdd24SM2Sl4m+IrzwKzmcrysQuYmF6BMsm3IoTKymW5BBGckHGTIw== + dependencies: + "@slack/logger" ">=1.0.0 <3.0.0" + "@slack/web-api" "^5.3.0" + "@types/node" ">=8.9.0" + "@types/p-queue" "^2.3.2" + "@types/ws" "^7.2.5" + eventemitter3 "^3.1.0" + finity "^0.5.4" + p-cancelable "^1.1.0" + p-queue "^2.4.2" + ws "^5.2.0" + +"@slack/types@^1.1.0", "@slack/types@^1.2.1", "@slack/types@^1.7.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@slack/types/-/types-1.10.0.tgz#cbf7d83e1027f4cbfd13d6b429f120c7fb09127a" + integrity sha512-tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg== + +"@slack/web-api@^5.1.0", "@slack/web-api@^5.3.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@slack/web-api/-/web-api-5.15.0.tgz#6bcf1d0a833c0e87e45150c2fd1f9657e3ec0b0b" + integrity sha512-tjQ8Zqv/Fmj9SOL9yIEd7IpTiKfKHi9DKAkfRVeotoX0clMr3SqQtBqO+KZMX27gm7dmgJsQaDKlILyzdCO+IA== + dependencies: + "@slack/logger" ">=1.0.0 <3.0.0" + "@slack/types" "^1.7.0" + "@types/is-stream" "^1.1.0" + "@types/node" ">=8.9.0" + axios "^0.21.1" + eventemitter3 "^3.1.0" + form-data "^2.5.0" + is-stream "^1.1.0" + p-queue "^6.6.1" + p-retry "^4.0.0" + +"@slack/webhook@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@slack/webhook/-/webhook-5.0.4.tgz#5d3e947387c1d0ccb176a153cec68c594edb7060" + integrity sha512-IC1dpVSc2F/pmwCxOb0QzH2xnGKmyT7MofPGhNkeaoiMrLMU+Oc7xV/AxGnz40mURtCtaDchZSM3tDo9c9x6BA== + dependencies: + "@slack/types" "^1.2.1" + "@types/node" ">=8.9.0" + axios "^0.21.1" + +"@slack/webhook@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@slack/webhook/-/webhook-6.1.0.tgz#ac9c8add919f0f5ab9440a24e76b2f83adcc0f2c" + integrity sha512-7AYNISyAjn/lA/VDwZ307K5ft5DojXgBd3DRrGoFN8XxIwIyRALdFhxBiMgAqeJH8eWoktvNwLK24R9hREEqpA== + dependencies: + "@slack/types" "^1.2.1" + "@types/node" ">=12.0.0" + axios "^0.21.4" + +"@tanstack/match-sorter-utils@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@tanstack/match-sorter-utils/-/match-sorter-utils-8.1.1.tgz#895f407813254a46082a6bbafad9b39b943dc834" + integrity sha512-IdmEekEYxQsoLOR0XQyw3jD1GujBpRRYaGJYQUw1eOT1eUugWxdc7jomh1VQ1EKHcdwDLpLaCz/8y4KraU4T9A== + dependencies: + remove-accents "0.4.2" + "@tanstack/query-core@4.15.1": version "4.15.1" resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.15.1.tgz#a282f04fe5e612b50019e1cfaf0efabd220e00ce" integrity sha512-+UfqJsNbPIVo0a9ANW0ZxtjiMfGLaaoIaL9vZeVycvmBuWywJGtSi7fgPVMCPdZQFOzMsaXaOsDtSKQD5xLRVQ== +"@tanstack/react-query-devtools@^4.16.1": + version "4.16.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-query-devtools/-/react-query-devtools-4.16.1.tgz#38511e300b982607b841ae9e713e2280ffc23519" + integrity sha512-VrDYLmG+OOcvGSZL5avG4R8jhqeMFP7pzW2sh2BWEV9UfI+aocG+CW8y8ygacxuKy48m8Tyo/xfe8H1z9BGb+g== + dependencies: + "@tanstack/match-sorter-utils" "8.1.1" + superjson "^1.10.0" + use-sync-external-store "^1.2.0" + "@tanstack/react-query@^4.16.1": version "4.16.1" resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.16.1.tgz#077006b8eb2c87fbe8d1597c1a0083a2d218b791" @@ -1934,6 +2947,13 @@ dependencies: "@types/node" "*" +"@types/cookie-parser@^1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@types/cookie-parser/-/cookie-parser-1.4.3.tgz#3a01df117c5705cf89a84c876b50c5a1fd427a21" + integrity sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w== + dependencies: + "@types/express" "*" + "@types/cookie@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" @@ -2015,6 +3035,13 @@ dependencies: "@types/node" "*" +"@types/is-stream@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/is-stream/-/is-stream-1.1.0.tgz#b84d7bb207a210f2af9bed431dc0fbe9c4143be1" + integrity sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg== + dependencies: + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -2035,9 +3062,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@*", "@types/jest@^29.2.2": - version "29.2.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.2.tgz#874e7dc6702fa6a3fe6107792aa98636dcc480b4" - integrity sha512-og1wAmdxKoS71K2ZwSVqWPX6OVn3ihZ6ZT2qvZvZQm90lJVDyXIjYcu4Khx2CNIeaFv12rOU/YObOsI3VOkzog== + version "29.2.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.3.tgz#f5fd88e43e5a9e4221ca361e23790d48fcf0a211" + integrity sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2074,6 +3101,20 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/jsonwebtoken@*": + version "8.5.9" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz#2c064ecb0b3128d837d2764aa0b117b0ff6e4586" + integrity sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg== + dependencies: + "@types/node" "*" + +"@types/jsonwebtoken@8.5.8": + version "8.5.8" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz#01b39711eb844777b7af1d1f2b4cf22fda1c0c44" + integrity sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A== + dependencies: + "@types/node" "*" + "@types/mime@*": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" @@ -2084,7 +3125,7 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@*": +"@types/node@*", "@types/node@>=12.0.0", "@types/node@>=8.9.0": version "18.11.9" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== @@ -2094,11 +3135,40 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.3.tgz#d7f7ba828ad9e540270f01ce00d391c54e6e0abc" integrity sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg== +"@types/p-queue@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/p-queue/-/p-queue-2.3.2.tgz#16bc5fece69ef85efaf2bce8b13f3ebe39c5a1c8" + integrity sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/passport-jwt@^3.0.7": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/passport-jwt/-/passport-jwt-3.0.7.tgz#ef8d8160dd9f4a3426aec031080cce9538b044a3" + integrity sha512-qRQ4qlww1Yhs3IaioDKrsDNmKy6gLDLgFsGwpCnc2YqWovO2Oxu9yCQdWHMJafQ7UIuOba4C4/TNXcGkQfEjlQ== + dependencies: + "@types/express" "*" + "@types/jsonwebtoken" "*" + "@types/passport-strategy" "*" + +"@types/passport-strategy@*": + version "0.2.35" + resolved "https://registry.yarnpkg.com/@types/passport-strategy/-/passport-strategy-0.2.35.tgz#e52f5212279ea73f02d9b06af67efe9cefce2d0c" + integrity sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g== + dependencies: + "@types/express" "*" + "@types/passport" "*" + +"@types/passport@*": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.11.tgz#d046b41e28b280f4e7994614fb976e9b449cb7c6" + integrity sha512-pz1cx9ptZvozyGKKKIPLcVDVHwae4hrH5d6g5J+DkMRRjR3cVETb4jMabhXAUbg3Ov7T22nFHEgaK2jj+5CBpw== + dependencies: + "@types/express" "*" + "@types/prettier@^2.1.5": version "2.7.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" @@ -2120,9 +3190,9 @@ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-dom@^18.0.0", "@types/react-dom@^18.0.8": - version "18.0.8" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.8.tgz#d2606d855186cd42cc1b11e63a71c39525441685" - integrity sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw== + version "18.0.9" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.9.tgz#ffee5e4bfc2a2f8774b15496474f8e7fe8d0b504" + integrity sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg== dependencies: "@types/react" "*" @@ -2211,6 +3281,11 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== +"@types/webidl-conversions@*": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz#2b8e60e33906459219aa587e9d1a612ae994cfe7" + integrity sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog== + "@types/webpack-bundle-analyzer@^4.6.0": version "4.6.0" resolved "https://registry.yarnpkg.com/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.0.tgz#8863d62d2432126c2b3a9239cafa469215981c24" @@ -2220,6 +3295,21 @@ tapable "^2.2.0" webpack "^5" +"@types/whatwg-url@^8.2.1": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz#749d5b3873e845897ada99be4448041d4cc39e63" + integrity sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA== + dependencies: + "@types/node" "*" + "@types/webidl-conversions" "*" + +"@types/ws@^7.2.5": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + "@types/ws@^8.5.1": version "8.5.3" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" @@ -2240,13 +3330,13 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@^5.42.1": - version "5.42.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.42.1.tgz#696b9cc21dfd4749c1c8ad1307f76a36a00aa0e3" - integrity sha512-LyR6x784JCiJ1j6sH5Y0K6cdExqCCm8DJUTcwG5ThNXJj/G8o5E56u5EdG4SLy+bZAwZBswC+GYn3eGdttBVCg== + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.43.0.tgz#4a5248eb31b454715ddfbf8cfbf497529a0a78bc" + integrity sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA== dependencies: - "@typescript-eslint/scope-manager" "5.42.1" - "@typescript-eslint/type-utils" "5.42.1" - "@typescript-eslint/utils" "5.42.1" + "@typescript-eslint/scope-manager" "5.43.0" + "@typescript-eslint/type-utils" "5.43.0" + "@typescript-eslint/utils" "5.43.0" debug "^4.3.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" @@ -2255,71 +3345,71 @@ tsutils "^3.21.0" "@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.42.1": - version "5.42.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.42.1.tgz#3e66156f2f74b11690b45950d8f5f28a62751d35" - integrity sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q== + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.43.0.tgz#9c86581234b88f2ba406f0b99a274a91c11630fd" + integrity sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug== dependencies: - "@typescript-eslint/scope-manager" "5.42.1" - "@typescript-eslint/types" "5.42.1" - "@typescript-eslint/typescript-estree" "5.42.1" + "@typescript-eslint/scope-manager" "5.43.0" + "@typescript-eslint/types" "5.43.0" + "@typescript-eslint/typescript-estree" "5.43.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.42.1": - version "5.42.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.42.1.tgz#05e5e1351485637d466464237e5259b49f609b18" - integrity sha512-QAZY/CBP1Emx4rzxurgqj3rUinfsh/6mvuKbLNMfJMMKYLRBfweus8brgXF8f64ABkIZ3zdj2/rYYtF8eiuksQ== +"@typescript-eslint/scope-manager@5.43.0": + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz#566e46303392014d5d163704724872e1f2dd3c15" + integrity sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw== dependencies: - "@typescript-eslint/types" "5.42.1" - "@typescript-eslint/visitor-keys" "5.42.1" + "@typescript-eslint/types" "5.43.0" + "@typescript-eslint/visitor-keys" "5.43.0" -"@typescript-eslint/type-utils@5.42.1": - version "5.42.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.42.1.tgz#21328feb2d4b193c5852b35aabd241ccc1449daa" - integrity sha512-WWiMChneex5w4xPIX56SSnQQo0tEOy5ZV2dqmj8Z371LJ0E+aymWD25JQ/l4FOuuX+Q49A7pzh/CGIQflxMVXg== +"@typescript-eslint/type-utils@5.43.0": + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz#91110fb827df5161209ecca06f70d19a96030be6" + integrity sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg== dependencies: - "@typescript-eslint/typescript-estree" "5.42.1" - "@typescript-eslint/utils" "5.42.1" + "@typescript-eslint/typescript-estree" "5.43.0" + "@typescript-eslint/utils" "5.43.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.42.1": - version "5.42.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.42.1.tgz#0d4283c30e9b70d2aa2391c36294413de9106df2" - integrity sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA== +"@typescript-eslint/types@5.43.0": + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.43.0.tgz#e4ddd7846fcbc074325293515fa98e844d8d2578" + integrity sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg== -"@typescript-eslint/typescript-estree@5.42.1": - version "5.42.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.1.tgz#f9a223ecb547a781d37e07a5ac6ba9ff681eaef0" - integrity sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw== +"@typescript-eslint/typescript-estree@5.43.0": + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz#b6883e58ba236a602c334be116bfc00b58b3b9f2" + integrity sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg== dependencies: - "@typescript-eslint/types" "5.42.1" - "@typescript-eslint/visitor-keys" "5.42.1" + "@typescript-eslint/types" "5.43.0" + "@typescript-eslint/visitor-keys" "5.43.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.42.1": - version "5.42.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.42.1.tgz#2789b1cd990f0c07aaa3e462dbe0f18d736d5071" - integrity sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ== +"@typescript-eslint/utils@5.43.0": + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.43.0.tgz#00fdeea07811dbdf68774a6f6eacfee17fcc669f" + integrity sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.42.1" - "@typescript-eslint/types" "5.42.1" - "@typescript-eslint/typescript-estree" "5.42.1" + "@typescript-eslint/scope-manager" "5.43.0" + "@typescript-eslint/types" "5.43.0" + "@typescript-eslint/typescript-estree" "5.43.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.42.1": - version "5.42.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.1.tgz#df10839adf6605e1cdb79174cf21e46df9be4872" - integrity sha512-LOQtSF4z+hejmpUvitPlc4hA7ERGoj2BVkesOcG91HCn8edLGUXbTrErmutmPbl8Bo9HjAvOO/zBKQHExXNA2A== +"@typescript-eslint/visitor-keys@5.43.0": + version "5.43.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz#cbbdadfdfea385310a20a962afda728ea106befa" + integrity sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg== dependencies: - "@typescript-eslint/types" "5.42.1" + "@typescript-eslint/types" "5.43.0" eslint-visitor-keys "^3.3.0" "@webassemblyjs/ast@1.11.1": @@ -2485,6 +3575,11 @@ abab@^2.0.6: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -2540,7 +3635,7 @@ acorn@^7.0.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4, acorn@^8.1.0, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: +acorn@^8.0.4, acorn@^8.1.0, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1: version "8.8.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== @@ -2571,7 +3666,7 @@ ajv-keywords@^5.0.0: dependencies: fast-deep-equal "^3.1.3" -ajv@8.11.0, ajv@^8.0.0, ajv@^8.8.0: +ajv@8.11.0: version "8.11.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== @@ -2591,6 +3686,16 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.0, ajv@^8.8.0: + version "8.11.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" + integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ansi-colors@4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" @@ -2660,6 +3765,19 @@ append-field@^1.0.0: resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -2670,6 +3788,15 @@ arg@^5.0.2: resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== +argon2@^0.30.2: + version "0.30.2" + resolved "https://registry.yarnpkg.com/argon2/-/argon2-0.30.2.tgz#b308a039d6d0cda5a3c47cbddd12685f033c33fa" + integrity sha512-RBbXTUsrJUQH259/72CCJxQa0hV961pV4PyZ7R1czGkArSsQP4DToCS2axmNfHywXaBNEMPWMW6rM82EArulYA== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.10" + "@phc/format" "^1.0.0" + node-addon-api "^5.0.0" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2699,7 +3826,7 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.4, array-includes@^3.1.5: +array-includes@^3.1.4, array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== @@ -2725,7 +3852,7 @@ array.prototype.flat@^1.2.5: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.0: +array.prototype.flatmap@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== @@ -2735,6 +3862,17 @@ array.prototype.flatmap@^1.3.0: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -2745,16 +3883,45 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +autoprefixer@^10.4.13: + version "10.4.13" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + dependencies: + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +axios@^0.21.1, axios@^0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + axios@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/axios/-/axios-1.1.3.tgz#8274250dada2edf53814ed7db644b9c2866c1e35" @@ -2887,6 +4054,11 @@ babel-preset-jest@^29.2.0: babel-plugin-jest-hoist "^29.2.0" babel-preset-current-node-syntax "^1.0.0" +backo2@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -2954,6 +4126,11 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2993,12 +4170,24 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +bson@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/bson/-/bson-4.7.0.tgz#7874a60091ffc7a45c5dd2973b5cad7cded9718a" + integrity sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA== + dependencies: + buffer "^5.6.0" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.5.0: +buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3069,10 +4258,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001400: - version "1.0.30001431" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz#e7c59bd1bc518fae03a4656be442ce6c4887a795" - integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: + version "1.0.30001434" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz#ec1ec1cfb0a93a34a0600d37903853030520a4e5" + integrity sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA== chalk@3.0.0, chalk@^3.0.0: version "3.0.0" @@ -3132,21 +4321,47 @@ chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.4.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.5.0.tgz#bfac2a29263de4c829d806b1ab478e35091e171f" - integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== + version "3.6.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.6.1.tgz#7594f1c95cb7fdfddee7af95a13af7dbc67afdcf" + integrity sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w== cjs-module-lexer@^1.0.0: version "1.2.2" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== +class-transformer@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336" + integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== + +class-validator-mongo-object-id@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/class-validator-mongo-object-id/-/class-validator-mongo-object-id-1.3.0.tgz#87ff0226da8132cbaf05cc470dcbe9203e2a803e" + integrity sha512-LiXaZkhPoqZ2TvXV7duHsbed/cdM7uU/EOOIV53ZjsuS4N03e+wbQ64fxBr0AA3psrdhrD8llWe5FdttcqRqRA== + dependencies: + class-validator "^0.13.2" + mongoose "^6.2.1" + +class-validator@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.13.2.tgz#64b031e9f3f81a1e1dcd04a5d604734608b24143" + integrity sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw== + dependencies: + libphonenumber-js "^1.9.43" + validator "^13.7.0" + classnames@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" @@ -3220,6 +4435,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== +clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3230,7 +4450,7 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -3249,11 +4469,32 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@^1.1.4, color-name@~1.1.4: +color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + colord@^2.9.1: version "2.9.3" resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" @@ -3264,7 +4505,15 @@ colorette@^2.0.10, colorette@^2.0.14: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== -combined-stream@^1.0.8: +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +combined-stream@^1.0.6, combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -3351,6 +4600,11 @@ consola@^2.15.0: resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -3373,17 +4627,30 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cookie-parser@^1.4.6: + version "1.4.6" + resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.6.tgz#3ac3a7d35a7a03bbc7e365073a26074824214594" + integrity sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA== + dependencies: + cookie "0.4.1" + cookie-signature "1.0.6" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + cookie@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookie@^0.4.2: +cookie@^0.4.1, cookie@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== @@ -3393,22 +4660,29 @@ cookiejar@^2.1.3: resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== +copy-anything@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-3.0.2.tgz#7189171ff5e1893b2287e8bf574b8cd448ed50b1" + integrity sha512-CzATjGXzUQ0EvuvgOCI6A4BGOo2bcVx8B+eC2nF862iv9fopnPQwlrbACakNCHRIJbCSBj+J/9JeDf60k64MkA== + dependencies: + is-what "^4.1.6" + core-js-compat@^3.25.1: - version "3.26.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.0.tgz#94e2cf8ba3e63800c4956ea298a6473bc9d62b44" - integrity sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A== + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" + integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== dependencies: browserslist "^4.21.4" core-js-pure@^3.23.3: - version "3.26.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.0.tgz#7ad8a5dd7d910756f3124374b50026e23265ca9a" - integrity sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA== + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.1.tgz#653f4d7130c427820dcecd3168b594e8bb095a33" + integrity sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ== core-js@^3.26.0: - version "3.26.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.0.tgz#a516db0ed0811be10eac5d94f3b8463d03faccfe" - integrity sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw== + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e" + integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA== core-util-is@~1.0.0: version "1.0.3" @@ -3423,7 +4697,7 @@ cors@2.8.5: object-assign "^4" vary "^1" -cosmiconfig@^7.0.1: +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== @@ -3472,18 +4746,18 @@ css-declaration-sorter@^6.3.1: integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== css-loader@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" - integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + version "6.7.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.2.tgz#26bc22401b5921686a10fbeba75d124228302304" + integrity sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q== dependencies: icss-utils "^5.1.0" - postcss "^8.4.7" + postcss "^8.4.18" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.0" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.5" + semver "^7.3.8" css-minimizer-webpack-plugin@^4.2.2: version "4.2.2" @@ -3625,7 +4899,7 @@ debug@2.6.9, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@4.x, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3639,7 +4913,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -decimal.js@^10.4.1: +decimal.js@^10.4.2: version "10.4.2" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.2.tgz#0341651d1d997d86065a2ce3a441fbd0d8e8b98e" integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== @@ -3717,6 +4991,16 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +denque@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -3732,6 +5016,11 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-libc@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -3874,11 +5163,33 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dotenv-expand@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-8.0.3.tgz#29016757455bcc748469c83a19b36aaf2b83dd6e" + integrity sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg== + +dotenv@16.0.1: + version "16.0.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d" + integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== + +dotenv@^16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -3914,6 +5225,11 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -4125,24 +5441,25 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.31.10: - version "7.31.10" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz#6782c2c7fe91c09e715d536067644bbb9491419a" - integrity sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA== + version "7.31.11" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" + integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== dependencies: - array-includes "^3.1.5" - array.prototype.flatmap "^1.3.0" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.1" - object.values "^1.1.5" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" prop-types "^15.8.1" resolve "^2.0.0-next.3" semver "^6.3.0" - string.prototype.matchall "^4.0.7" + string.prototype.matchall "^4.0.8" eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" @@ -4285,9 +5602,9 @@ eslint@^5.10.0: text-table "^0.2.0" eslint@^8.0.1: - version "8.27.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.27.0.tgz#d547e2f7239994ad1faa4bb5d84e5d809db7cf64" - integrity sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ== + version "8.28.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e" + integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ== dependencies: "@eslint/eslintrc" "^1.3.3" "@humanwhocodes/config-array" "^0.11.6" @@ -4386,7 +5703,12 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -eventemitter3@^4.0.0: +eventemitter3@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + +eventemitter3@^4.0.0, eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== @@ -4509,7 +5831,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.2.12, fast-glob@^3.2.9: +fast-glob@3.2.12, fast-glob@^3.2.12, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== @@ -4535,6 +5857,13 @@ fast-safe-stringify@2.1.1, fast-safe-stringify@^2.1.1: resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== +fast-xml-parser@4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz#42332a9aca544520631c8919e6ea871c0185a985" + integrity sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA== + dependencies: + strnum "^1.0.5" + fastest-levenshtein@^1.0.12: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -4561,6 +5890,11 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -4634,6 +5968,11 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +finity@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/finity/-/finity-0.5.4.tgz#f2a8a9198e8286467328ec32c8bfcc19a2229c11" + integrity sha512-3l+5/1tuw616Lgb0QBimxfdd2TqaDGpfCBpfX6EqtFmqUV3FtQnVEX4Aa62DagYEqnsTIjZcTfbq9msDbXYgyA== + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -4661,7 +6000,12 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -follow-redirects@^1.0.0, follow-redirects@^1.15.0: +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -4691,6 +6035,15 @@ fork-ts-checker-webpack-plugin@7.2.13: semver "^7.3.5" tapable "^2.2.1" +form-data@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -4715,6 +6068,11 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -4729,6 +6087,13 @@ fs-extra@10.1.0, fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs-monkey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" @@ -4774,6 +6139,21 @@ functions-have-names@^1.2.2: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -4855,9 +6235,9 @@ globals@^11.1.0, globals@^11.7.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.15.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + version "13.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" + integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== dependencies: type-fest "^0.20.2" @@ -4890,6 +6270,18 @@ grapheme-splitter@^1.0.4: resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphql-tag@2.12.6: + version "2.12.6" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" + integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== + dependencies: + tslib "^2.1.0" + +graphql-ws@5.5.5: + version "5.5.5" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.5.5.tgz#f375486d3f196e2a2527b503644693ae3a8670a9" + integrity sha512-hvyIS71vs4Tu/yUYHPvGXsTgo0t3arU820+lT5VjZS2go0ewp2LqyCgxEN56CzOG7Iys52eRhHBiD1gGRdiQtw== + "graphql@^15.0.0 || ^16.0.0": version "16.6.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" @@ -4941,6 +6333,11 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -5084,7 +6481,7 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -https-proxy-agent@^5.0.1: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -5279,6 +6676,11 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -5302,6 +6704,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -5456,6 +6863,11 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -5511,6 +6923,11 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" +is-what@^4.1.6: + version "4.1.7" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.7.tgz#c41dc1d2d2d6a9285c624c2505f61849c8b1f9cc" + integrity sha512-DBVOQNiPKnGMxRMLIYSwERAS5MVY1B7xYiGnpgctsOFvVDz9f9PFXXxMcTOHuoqYp4NK9qFYQaIC1NRRxLMpBQ== + is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -5580,6 +6997,11 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +iterall@1.3.0, iterall@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" + integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== + iterare@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" @@ -5885,6 +7307,16 @@ jest-haste-map@^29.3.1: optionalDependencies: fsevents "^2.3.2" +jest-junit@^14.0.1: + version "14.0.1" + resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-14.0.1.tgz#5b357d6f5d333459585d628a24cd48b5bbc92ba2" + integrity sha512-h7/wwzPbllgpQhhVcRzRC76/cc89GlazThoV1fDxcALkf26IIlRsu/AcTG64f4nR2WPE3Cbd+i/sVf+NCUHrWQ== + dependencies: + mkdirp "^1.0.4" + strip-ansi "^6.0.1" + uuid "^8.3.2" + xml "^1.0.1" + jest-leak-detector@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" @@ -5969,9 +7401,9 @@ jest-mock@^29.3.1: jest-util "^29.3.1" jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^28.0.2: version "28.0.2" @@ -6328,9 +7760,9 @@ js-levenshtein@^1.1.6: integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== js-sdsl@^4.1.4: - version "4.1.5" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a" - integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== + version "4.2.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" + integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -6353,17 +7785,17 @@ js-yaml@^4.1.0: argparse "^2.0.1" jsdom@^20.0.0: - version "20.0.2" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.2.tgz#65ccbed81d5e877c433f353c58bb91ff374127db" - integrity sha512-AHWa+QO/cgRg4N+DsmHg1Y7xnz+8KU3EflM0LVDTdmrYOc1WWTSkOjtpUveQH+1Bqd5rtcVnb/DuxV/UjDO4rA== + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== dependencies: abab "^2.0.6" - acorn "^8.8.0" + acorn "^8.8.1" acorn-globals "^7.0.0" cssom "^0.5.0" cssstyle "^2.3.0" data-urls "^3.0.2" - decimal.js "^10.4.1" + decimal.js "^10.4.2" domexception "^4.0.0" escodegen "^2.0.0" form-data "^4.0.0" @@ -6376,12 +7808,12 @@ jsdom@^20.0.0: saxes "^6.0.0" symbol-tree "^3.2.4" tough-cookie "^4.1.2" - w3c-xmlserializer "^3.0.0" + w3c-xmlserializer "^4.0.0" webidl-conversions "^7.0.0" whatwg-encoding "^2.0.0" whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" - ws "^8.9.0" + ws "^8.11.0" xml-name-validator "^4.0.0" jsesc@^2.5.1: @@ -6445,6 +7877,22 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonwebtoken@8.5.1, jsonwebtoken@^8.2.0: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.3.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" @@ -6453,6 +7901,28 @@ jsonfile@^6.0.1: array-includes "^3.1.5" object.assign "^4.1.3" +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +kareem@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.4.1.tgz#7d81ec518204a48c1cb16554af126806c3cd82b0" + integrity sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA== + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -6463,6 +7933,16 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +klona@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -6484,6 +7964,11 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +libphonenumber-js@^1.9.43: + version "1.10.14" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.14.tgz#e29da7f539751f724ac54017a098e3c7ca23de94" + integrity sha512-McGS7GV/WjJ2KjfOGhJU1oJn29RYeo7Q+RpANRbUNMQ9gj5XArpbjurSuyYPTejFwbaUojstQ4XyWCrAzGOUXw== + lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" @@ -6527,6 +8012,36 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + lodash.memoize@4.x, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -6537,12 +8052,22 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.omit@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg== + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6555,6 +8080,17 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +logform@^2.3.2, logform@^2.4.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.4.2.tgz#a617983ac0334d0c3b942c34945380062795b47c" + integrity sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw== + dependencies: + "@colors/colors" "1.5.0" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -6576,6 +8112,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + lz-string@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" @@ -6601,7 +8142,7 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2: +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -6631,12 +8172,17 @@ media-typer@0.3.0: integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^3.4.1, memfs@^3.4.3: - version "3.4.10" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.10.tgz#4cdff7cfd21351a85e11b08aa276ebf100210a4d" - integrity sha512-0bCUP+L79P4am30yP1msPzApwuMQG23TjwlwdHeEV5MxioDR1a0AgB0T9FfggU52eJuDCq8WVwb5ekznFyWiTQ== + version "3.4.12" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.12.tgz#d00f8ad8dab132dc277c659dc85bfd14b07d03bd" + integrity sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw== dependencies: fs-monkey "^1.0.3" +memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" + integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -6703,9 +8249,9 @@ min-indent@^1.0.0: integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-css-extract-plugin@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz#9a1251d15f2035c342d99a468ab9da7a0451b71e" - integrity sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg== + version "2.7.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.0.tgz#d7d9ba0c5b596d155e36e2b174082fc7f010dd64" + integrity sha512-auqtVo8KhTScMsba7MbijqZTfibbXiBNlPAQbsVt7enQfcDYLdgG57eGxMqwVU3mfeWANY4F1wUg+rMF+ycZgw== dependencies: schema-utils "^4.0.0" @@ -6726,6 +8272,21 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== +minipass@^3.0.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" + integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + mkdirp@^0.5.1, mkdirp@^0.5.4: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -6733,6 +8294,57 @@ mkdirp@^0.5.1, mkdirp@^0.5.4: dependencies: minimist "^1.2.6" +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mongodb-connection-string-url@^2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz#1ee2496f4c4eae64f63c4b2d512aebc89996160a" + integrity sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w== + dependencies: + "@types/whatwg-url" "^8.2.1" + whatwg-url "^11.0.0" + +mongodb@4.11.0: + version "4.11.0" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.11.0.tgz#d28fdc7509f24d0d274f456529441fa3e570415c" + integrity sha512-9l9n4Nk2BYZzljW3vHah3Z0rfS5npKw6ktnkmFgTcnzaXH1DRm3pDl6VMHu84EVb1lzmSaJC4OzWZqTkB5i2wg== + dependencies: + bson "^4.7.0" + denque "^2.1.0" + mongodb-connection-string-url "^2.5.4" + socks "^2.7.1" + optionalDependencies: + "@aws-sdk/credential-providers" "^3.186.0" + saslprep "^1.0.3" + +mongoose@^6.2.1, mongoose@^6.7.2: + version "6.7.2" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.7.2.tgz#457994b254a2afd1e03dd8f0b3046ff3d2ed276e" + integrity sha512-lrP2V5U1qhaf+z33fiIn7aYAZZ1fVDly+TkFRjTujNBF/FIHESATj2RbgAOSlWqv32fsZXkXejXzeVfjbv35Ow== + dependencies: + bson "^4.7.0" + kareem "2.4.1" + mongodb "4.11.0" + mpath "0.9.0" + mquery "4.0.3" + ms "2.1.3" + sift "16.0.1" + +mpath@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" + integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== + +mquery@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.3.tgz#4d15f938e6247d773a942c912d9748bd1965f89d" + integrity sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA== + dependencies: + debug "4.x" + mrmime@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" @@ -6754,9 +8366,9 @@ ms@2.1.3, ms@^2.1.1: integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== msw@^0.48.2: - version "0.48.2" - resolved "https://registry.yarnpkg.com/msw/-/msw-0.48.2.tgz#9614ed5edec1c88e0a178fe5f507c17beaa7106d" - integrity sha512-kXeLiyf5CRYkRf+ve/Utmw5/Iii+y+Mcr8hzXSVFrvzWVDpBfYL/4vBEhQu4zrBPBhvPbTNrH7/Y0KDQilpBKg== + version "0.48.3" + resolved "https://registry.yarnpkg.com/msw/-/msw-0.48.3.tgz#e8328533ce4843e747371ffd57207d509b8cb3a6" + integrity sha512-8ENBcX7JVWPA5v9WTeOnCWCMOVtyBiXZyD/0+AKlhOysJRB1ZdBAcMGLIiQ2/VpQ2lC0Yd7SFKg9aviAQSVeaw== dependencies: "@mswjs/cookies" "^0.2.2" "@mswjs/interceptors" "^0.17.5" @@ -6774,7 +8386,6 @@ msw@^0.48.2: node-fetch "^2.6.7" outvariant "^1.3.0" path-to-regexp "^6.2.0" - statuses "^2.0.0" strict-event-emitter "^0.2.6" type-fest "^2.19.0" yargs "^17.3.1" @@ -6835,6 +8446,21 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +nest-raven@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/nest-raven/-/nest-raven-9.0.0.tgz#3a99264ebcb1a66158d348e9606b476bac692561" + integrity sha512-Pa+rR6cVMk9E33SIC8Uey3VWFLSERhxs2Rc0d4qZBvSHCyjYMx43EAZAwD0uvJMoydkYWEbhoF96lw5SPDtaaA== + optionalDependencies: + "@nestjs/apollo" "^10.0.0" + "@nestjs/graphql" "^10.0.0" + +nest-winston@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/nest-winston/-/nest-winston-1.8.0.tgz#86b5960f82ef0caf4e16c7f528ff10446abfd52f" + integrity sha512-DyoNrly6DXjNG2ZPXSD2+w+pgEE8u0y0iwsaLZsufFLIKB/YNgP7zIXV5JxIqns0e5QzLlxdHhO2hx+1W8dvCw== + dependencies: + fast-safe-stringify "^2.1.1" + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -6853,6 +8479,11 @@ node-abort-controller@^3.0.1: resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.0.1.tgz#f91fa50b1dee3f909afabb7e261b1e1d6b0cb74e" integrity sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw== +node-addon-api@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501" + integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== + node-emoji@1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" @@ -6882,11 +8513,23 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== -normalize-path@^3.0.0, normalize-path@~3.0.0: +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-path@3.0.0, normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" @@ -6899,6 +8542,16 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -6949,7 +8602,7 @@ object.assign@^4.1.3, object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.5: +object.entries@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== @@ -6958,7 +8611,7 @@ object.entries@^1.1.5: define-properties "^1.1.4" es-abstract "^1.20.4" -object.fromentries@^2.0.5: +object.fromentries@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== @@ -6967,7 +8620,7 @@ object.fromentries@^2.0.5: define-properties "^1.1.4" es-abstract "^1.20.4" -object.hasown@^1.1.1: +object.hasown@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== @@ -6975,7 +8628,7 @@ object.hasown@^1.1.1: define-properties "^1.1.4" es-abstract "^1.20.4" -object.values@^1.1.5: +object.values@^1.1.5, object.values@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== @@ -7008,6 +8661,13 @@ once@1.4.0, once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -7093,6 +8753,16 @@ outvariant@^1.2.1, outvariant@^1.3.0: resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.3.0.tgz#c39723b1d2cba729c930b74bf962317a81b9b1c9" integrity sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ== +p-cancelable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -7121,7 +8791,20 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-retry@^4.5.0: +p-queue@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-2.4.2.tgz#03609826682b743be9a22dba25051bd46724fc34" + integrity sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng== + +p-queue@^6.6.1: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-retry@^4.0.0, p-retry@^4.5.0: version "4.6.2" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== @@ -7129,6 +8812,13 @@ p-retry@^4.5.0: "@types/retry" "0.12.0" retry "^0.13.1" +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -7160,9 +8850,9 @@ parse-json@^5.0.0, parse-json@^5.2.0: lines-and-columns "^1.1.6" parse5@^7.0.0, parse5@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.1.tgz#4649f940ccfb95d8754f37f73078ea20afe0c746" - integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg== + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" @@ -7179,6 +8869,28 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +passport-jwt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/passport-jwt/-/passport-jwt-4.0.0.tgz#7f0be7ba942e28b9f5d22c2ebbb8ce96ef7cf065" + integrity sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg== + dependencies: + jsonwebtoken "^8.2.0" + passport-strategy "^1.0.0" + +passport-strategy@1.x.x, passport-strategy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" + integrity sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA== + +passport@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/passport/-/passport-0.6.0.tgz#e869579fab465b5c0b291e841e6cc95c005fac9d" + integrity sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug== + dependencies: + passport-strategy "1.x.x" + pause "0.0.1" + utils-merge "^1.0.1" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -7229,6 +8941,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pause@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -7336,6 +9053,15 @@ postcss-load-config@^3.1.4: lilconfig "^2.0.5" yaml "^1.10.2" +postcss-loader@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.0.1.tgz#4c883cc0a1b2bfe2074377b7a74c1cd805684395" + integrity sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.7" + postcss-merge-longhand@^5.1.7: version "5.1.7" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" @@ -7508,9 +9234,9 @@ postcss-reduce-transforms@^5.1.0: postcss-value-parser "^4.2.0" postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + version "6.0.11" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -7535,7 +9261,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.17, postcss@^8.4.18, postcss@^8.4.7: +postcss@^8.4.17, postcss@^8.4.18, postcss@^8.4.19: version "8.4.19" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== @@ -7717,6 +9443,11 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-hook-form@^7.39.4: + version "7.39.5" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.39.5.tgz#a4272b60288ef5e1bb42bbb6ba3b36d243ab2879" + integrity sha512-OE0HKyz5IPc6svN2wd+e+evidZrw4O4WZWAWYzQVZuHi+hYnHFSLnxOq0ddjbdmaLIsLHut/ab7j72y2QT3+KA== + react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -7752,6 +9483,13 @@ react-router@6.4.3: dependencies: "@remix-run/router" "1.0.3" +react-toastify@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-9.1.1.tgz#9280caea4a13dc1739c350d90660a630807bf10b" + integrity sha512-pkFCla1z3ve045qvjEmn2xOJOy4ZciwRXm1oMPULVkELi5aJdHCN/FHnuqXq8IwGDLB7PPk2/J6uP9D8ejuiRw== + dependencies: + clsx "^1.1.1" + react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -7779,7 +9517,7 @@ readable-stream@^2.0.1, readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.4.0: +readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -7835,14 +9573,14 @@ regenerate@^1.4.2: integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.10: - version "0.13.10" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regenerator-transform@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" - integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" @@ -7866,16 +9604,16 @@ regexpp@^3.2.0: integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.1.tgz#a69c26f324c1e962e9ffd0b88b055caba8089139" - integrity sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ== + version "5.2.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" + integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" regjsgen@^0.7.1: version "0.7.1" @@ -7894,6 +9632,11 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== +remove-accents@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" + integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== + renderkid@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" @@ -8031,7 +9774,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -8045,11 +9788,23 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" +safe-stable-stringify@^2.3.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz#34694bd8a30575b7f94792aa51527551bd733d61" + integrity sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +saslprep@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" + integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== + dependencies: + sparse-bitfield "^3.0.3" + saxes@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" @@ -8161,6 +9916,11 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + set-cookie-parser@^2.4.6: version "2.5.1" resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz#ddd3e9a566b0e8e0862aca974a6ac0e01349430b" @@ -8225,11 +9985,23 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +sift@16.0.1: + version "16.0.1" + resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.1.tgz#e9c2ccc72191585008cf3e36fc447b2d2633a053" + integrity sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ== + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + sirv@^1.0.7: version "1.0.19" resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" @@ -8263,6 +10035,11 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -8272,6 +10049,14 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" +socks@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -8308,6 +10093,13 @@ sourcemap-codec@^1.4.8: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" + integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== + dependencies: + memory-pager "^1.0.2" + spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -8341,6 +10133,11 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -8353,7 +10150,7 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -statuses@2.0.1, statuses@^2.0.0: +statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== @@ -8383,6 +10180,15 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -8400,16 +10206,7 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.matchall@^4.0.7: +string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== @@ -8508,6 +10305,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + style-loader@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" @@ -8521,6 +10323,17 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" +subscriptions-transport-ws@0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.11.0.tgz#baf88f050cba51d52afe781de5e81b3c31f89883" + integrity sha512-8D4C6DIH5tGiAIpp5I0wD/xRlNiZAPGHygzCe7VzyzUoxHtawzjNAY9SUTXU05/EY2NMY9/9GF0ycizkXr1CWQ== + dependencies: + backo2 "^1.0.2" + eventemitter3 "^3.1.0" + iterall "^1.2.1" + symbol-observable "^1.0.4" + ws "^5.2.0 || ^6.0.0 || ^7.0.0" + superagent@^8.0.3: version "8.0.3" resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.0.3.tgz#15c8ec5611a1f01386994cfeeda5aa138bcb7b17" @@ -8537,6 +10350,13 @@ superagent@^8.0.3: qs "^6.11.0" semver "^7.3.8" +superjson@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/superjson/-/superjson-1.11.0.tgz#f6e2ae0d8fbac61c3fca09ab6739ac9678414d1b" + integrity sha512-6PfAg1FKhqkwWvPb2uXhH4MkMttdc17eJ91+Aoz4s1XUEDZFmLfFx/xVA3wgkPxAGy5dpozgGdK6V/n20Wj9yg== + dependencies: + copy-anything "^3.0.2" + supertest@^6.1.3: version "6.3.1" resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.3.1.tgz#a8ad362fc6f323c88730ac191ce30427dc869088" @@ -8597,6 +10417,11 @@ symbol-observable@4.0.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== +symbol-observable@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -8646,6 +10471,18 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar@^6.1.11: + version "6.1.12" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.12.tgz#3b742fb05669b55671fb769ab67a7791ea1a62e6" + integrity sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -8684,6 +10521,11 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -8760,6 +10602,11 @@ tree-kill@1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +triple-beam@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + ts-jest@28.0.8: version "28.0.8" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.8.tgz#cd204b8e7a2f78da32cf6c95c9a6165c5b99cc73" @@ -8845,12 +10692,12 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.4.1, tslib@^2.0.3, tslib@^2.1.0: +tslib@2.4.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -8909,11 +10756,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@4.8.4, typescript@^4.7.4, typescript@^4.8.4: +typescript@4.8.4: version "4.8.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== +typescript@^4.7.4, typescript@^4.8.4: + version "4.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" + integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -8937,10 +10789,10 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" @@ -9011,21 +10863,21 @@ utila@~0.4: resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== -utils-merge@1.0.1: +utils-merge@1.0.1, utils-merge@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@8.3.2, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" @@ -9045,15 +10897,25 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" +validator@^13.7.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" + integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== + +value-or-promise@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" + integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -w3c-xmlserializer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" - integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== dependencies: xml-name-validator "^4.0.0" @@ -9351,6 +11213,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + wildcard@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" @@ -9363,6 +11232,32 @@ windows-release@^4.0.0: dependencies: execa "^4.0.2" +winston-transport@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa" + integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== + dependencies: + logform "^2.3.2" + readable-stream "^3.6.0" + triple-beam "^1.3.0" + +winston@^3.8.2: + version "3.8.2" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.8.2.tgz#56e16b34022eb4cff2638196d9646d7430fdad50" + integrity sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew== + dependencies: + "@colors/colors" "1.5.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.5.0" + word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -9397,21 +11292,33 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.3.1: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.4.2, ws@^8.9.0: +ws@8.11.0, ws@^8.11.0, ws@^8.4.2: version "8.11.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== +ws@^5.2.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== + dependencies: + async-limiter "~1.0.0" + +"ws@^5.2.0 || ^6.0.0 || ^7.0.0", ws@^7.3.1: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + xml-name-validator@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== +xml@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" + integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"