├── packages ├── webapp │ ├── src │ │ ├── App.css │ │ ├── index.css │ │ ├── react-app-env.d.ts │ │ ├── constants.ts │ │ ├── types │ │ │ ├── features.ts │ │ │ └── BaseOutput.ts │ │ ├── layout │ │ │ ├── BaseLayout.tsx │ │ │ ├── LoggedInLayout.tsx │ │ │ ├── RequireAnonym.tsx │ │ │ └── RequireAuth.tsx │ │ ├── hooks │ │ │ ├── useMe.ts │ │ │ └── useFeatures.ts │ │ ├── env.d.ts │ │ ├── setupTests.ts │ │ ├── App.test.tsx │ │ ├── pages │ │ │ ├── TestPage.tsx │ │ │ ├── HomePage.tsx │ │ │ ├── email │ │ │ │ └── VerifyPage.tsx │ │ │ └── auth │ │ │ │ ├── LoginPage.tsx │ │ │ │ └── RegisterPage.tsx │ │ ├── services │ │ │ ├── endpoints │ │ │ │ ├── userEndpoints.ts │ │ │ │ ├── featuresEndpoints.ts │ │ │ │ ├── authEndpoints.ts │ │ │ │ └── emailEndpoints.ts │ │ │ └── api.ts │ │ ├── reportWebVitals.ts │ │ ├── components │ │ │ └── shared │ │ │ │ ├── Header.tsx │ │ │ │ └── HttpResult.tsx │ │ ├── slices │ │ │ └── authSlice.ts │ │ ├── index.tsx │ │ ├── features │ │ │ └── email-verification │ │ │ │ └── EmailVerifyInformation.tsx │ │ ├── App.tsx │ │ ├── store.ts │ │ └── logo.svg │ ├── .env.example │ ├── .DS_Store │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ └── manifest.json │ ├── tsconfig.node.json │ ├── index.html │ ├── tsconfig.json │ ├── vite.config.ts │ ├── package.json │ └── yarn.lock ├── dtos │ ├── index.ts │ ├── user.ts │ ├── package.json │ ├── auth.ts │ ├── tsconfig.json │ └── yarn.lock ├── server │ ├── .prettierrc │ ├── src │ │ ├── modules │ │ │ ├── auth │ │ │ │ ├── constants.ts │ │ │ │ ├── jwt.guard.ts │ │ │ │ ├── auth.utils.ts │ │ │ │ ├── jwt.strategy.ts │ │ │ │ ├── auth.controller.ts │ │ │ │ ├── auth.module.ts │ │ │ │ └── auth.service.ts │ │ │ ├── communication │ │ │ │ ├── communication.module.ts │ │ │ │ └── communication.service.ts │ │ │ ├── features │ │ │ │ ├── types.ts │ │ │ │ ├── features.module.ts │ │ │ │ ├── features.controller.ts │ │ │ │ └── features.service.ts │ │ │ ├── user │ │ │ │ ├── user.module.ts │ │ │ │ ├── user.controller.ts │ │ │ │ └── user.service.ts │ │ │ ├── email-verification │ │ │ │ ├── email-verification.module.ts │ │ │ │ ├── email-verification.controller.ts │ │ │ │ └── email-verification.service.ts │ │ │ └── base │ │ │ │ └── logging.interceptor.ts │ │ ├── app.service.ts │ │ ├── app.controller.ts │ │ ├── utils │ │ │ └── httpUtils.ts │ │ ├── services │ │ │ └── prisma.service.ts │ │ ├── filters │ │ │ └── http-exception.filter.ts │ │ ├── main.ts │ │ └── app.module.ts │ ├── tsconfig.build.json │ ├── nest-cli.json │ ├── .env.example │ ├── test │ │ ├── jest-e2e.json │ │ └── app.e2e-spec.ts │ ├── .gitignore │ ├── tsconfig.json │ ├── .eslintrc.js │ └── package.json └── prisma │ ├── dev.db │ ├── migrations │ ├── 20220902121525_email_verified_column │ │ └── migration.sql │ ├── migration_lock.toml │ └── 20220821123848_init │ │ └── migration.sql │ ├── package.json │ ├── index.ts │ ├── schema.prisma │ └── yarn.lock ├── .DS_Store ├── .gitignore ├── images ├── 1.png └── 2.png ├── lerna.json ├── package.json └── README.md /packages/webapp/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/webapp/src/index.css: -------------------------------------------------------------------------------- 1 | // Global CSS rules -------------------------------------------------------------------------------- /packages/dtos/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./auth"; 2 | export * from "./user"; 3 | -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozgurrgul/ReactNestStarter/HEAD/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /**/**/node_modules 2 | /**/**/dist 3 | 4 | .env 5 | 6 | yarn-error.log -------------------------------------------------------------------------------- /packages/webapp/src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozgurrgul/ReactNestStarter/HEAD/images/1.png -------------------------------------------------------------------------------- /images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozgurrgul/ReactNestStarter/HEAD/images/2.png -------------------------------------------------------------------------------- /packages/server/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } -------------------------------------------------------------------------------- /packages/webapp/src/constants.ts: -------------------------------------------------------------------------------- 1 | export const API_URL = import.meta.env.VITE_API_URL; 2 | -------------------------------------------------------------------------------- /packages/server/src/modules/auth/constants.ts: -------------------------------------------------------------------------------- 1 | export const JWT_SECRET = 'jwtSecretx0192ks'; 2 | -------------------------------------------------------------------------------- /packages/webapp/.env.example: -------------------------------------------------------------------------------- 1 | VITE_API_URL=http://localhost:3002 2 | VITE_RECAPTCHA_SITE_KEY=xxx -------------------------------------------------------------------------------- /packages/prisma/dev.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozgurrgul/ReactNestStarter/HEAD/packages/prisma/dev.db -------------------------------------------------------------------------------- /packages/webapp/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozgurrgul/ReactNestStarter/HEAD/packages/webapp/.DS_Store -------------------------------------------------------------------------------- /packages/webapp/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /packages/webapp/src/types/features.ts: -------------------------------------------------------------------------------- 1 | export type AppFeatures = { 2 | emailVerification: boolean; 3 | }; 4 | -------------------------------------------------------------------------------- /packages/webapp/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozgurrgul/ReactNestStarter/HEAD/packages/webapp/public/favicon.ico -------------------------------------------------------------------------------- /packages/webapp/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozgurrgul/ReactNestStarter/HEAD/packages/webapp/public/logo192.png -------------------------------------------------------------------------------- /packages/webapp/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ozgurrgul/ReactNestStarter/HEAD/packages/webapp/public/logo512.png -------------------------------------------------------------------------------- /packages/webapp/src/layout/BaseLayout.tsx: -------------------------------------------------------------------------------- 1 | import { Outlet } from "react-router-dom"; 2 | 3 | export const BaseLayout = () => ; 4 | -------------------------------------------------------------------------------- /packages/webapp/src/types/BaseOutput.ts: -------------------------------------------------------------------------------- 1 | export type BaseOutput = { 2 | succeed: boolean; 3 | data: T; 4 | message?: string; 5 | }; 6 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": [ 3 | "packages/*" 4 | ], 5 | "useNx": false, 6 | "version": "0.0.0", 7 | "npmClient": "yarn" 8 | } 9 | -------------------------------------------------------------------------------- /packages/server/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/prisma/migrations/20220902121525_email_verified_column/migration.sql: -------------------------------------------------------------------------------- 1 | -- AlterTable 2 | ALTER TABLE "User" ADD COLUMN "emailVerified" BOOLEAN; 3 | -------------------------------------------------------------------------------- /packages/dtos/user.ts: -------------------------------------------------------------------------------- 1 | import { IsNotEmpty } from "class-validator"; 2 | 3 | export class VerifyTokenInput { 4 | @IsNotEmpty() 5 | token: string; 6 | } 7 | -------------------------------------------------------------------------------- /packages/server/nest-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/nest-cli", 3 | "collection": "@nestjs/schematics", 4 | "sourceRoot": "src" 5 | } 6 | -------------------------------------------------------------------------------- /packages/prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "sqlite" -------------------------------------------------------------------------------- /packages/server/.env.example: -------------------------------------------------------------------------------- 1 | RECAPTCHA_SECRET_KEY=xxx 2 | WEBAPP_URL=http://localhost:5173 3 | 4 | FEATURE_EMAIL_VERIFICATION_ENABLED=true 5 | FEATURE_EMAIL_VERIFICATION_TOKEN_SECRET=xxx -------------------------------------------------------------------------------- /packages/server/src/app.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | 3 | @Injectable() 4 | export class AppService { 5 | getHello(): string { 6 | return 'Hello World!'; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/server/src/app.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller } from '@nestjs/common'; 2 | 3 | @Controller() 4 | export class AppController { 5 | async test(): Promise { 6 | return 'test'; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/server/src/modules/auth/jwt.guard.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { AuthGuard } from '@nestjs/passport'; 3 | 4 | @Injectable() 5 | export class JwtGuard extends AuthGuard('jwt') {} 6 | -------------------------------------------------------------------------------- /packages/server/test/jest-e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": ["js", "json", "ts"], 3 | "rootDir": ".", 4 | "testEnvironment": "node", 5 | "testRegex": ".e2e-spec.ts$", 6 | "transform": { 7 | "^.+\\.(t|j)s$": "ts-jest" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/webapp/src/hooks/useMe.ts: -------------------------------------------------------------------------------- 1 | import { useGetMeQuery } from "../services/api"; 2 | 3 | export const useMe = () => { 4 | const { data, isLoading } = useGetMeQuery(null); 5 | return { 6 | isLoading, 7 | me: data?.data, 8 | }; 9 | }; 10 | -------------------------------------------------------------------------------- /packages/server/src/utils/httpUtils.ts: -------------------------------------------------------------------------------- 1 | export const ok = (data: any) => { 2 | return { 3 | data, 4 | succeed: true, 5 | }; 6 | }; 7 | 8 | export const error = (message: any) => { 9 | return { 10 | message, 11 | succeed: false, 12 | }; 13 | }; 14 | -------------------------------------------------------------------------------- /packages/webapp/src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface ImportMetaEnv { 4 | readonly VITE_API_URL: string; 5 | readonly VITE_RECAPTCHA_SITE_KEY: string; 6 | } 7 | 8 | interface ImportMeta { 9 | readonly env: ImportMetaEnv; 10 | } 11 | -------------------------------------------------------------------------------- /packages/webapp/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /packages/webapp/src/setupTests.ts: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /packages/webapp/src/App.test.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { render, screen } from '@testing-library/react'; 3 | import App from './App'; 4 | 5 | test('renders learn react link', () => { 6 | render(); 7 | const linkElement = screen.getByText(/learn react/i); 8 | expect(linkElement).toBeInTheDocument(); 9 | }); 10 | -------------------------------------------------------------------------------- /packages/dtos/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@rns/dtos", 3 | "version": "1.0.0", 4 | "main": "dist/index.js", 5 | "license": "MIT", 6 | "private": true, 7 | "dependencies": { 8 | "class-validator": "^0.13.2", 9 | "typescript": "^4.7.4" 10 | }, 11 | "scripts": { 12 | "compile": "tsc -p tsconfig.json" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/prisma/migrations/20220821123848_init/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "User" ( 3 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 4 | "email" TEXT NOT NULL, 5 | "fullName" TEXT, 6 | "password" TEXT NOT NULL 7 | ); 8 | 9 | -- CreateIndex 10 | CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); 11 | -------------------------------------------------------------------------------- /packages/server/src/modules/communication/communication.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { CommunicationService } from './communication.service'; 3 | 4 | @Module({ 5 | providers: [CommunicationService], 6 | exports: [CommunicationService], 7 | controllers: [], 8 | }) 9 | export class CommunicationModule {} 10 | -------------------------------------------------------------------------------- /packages/prisma/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@rns/prisma", 3 | "version": "1.0.0", 4 | "main": "node_modules/.prisma/client/index.js", 5 | "license": "MIT", 6 | "private": true, 7 | "dependencies": { 8 | "@prisma/client": "^4.2.1", 9 | "prisma": "^4.2.1" 10 | }, 11 | "scripts": { 12 | "prisma:migrate": "prisma migrate dev" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/server/src/modules/features/types.ts: -------------------------------------------------------------------------------- 1 | export type AppFeature = { 2 | enabled: boolean; 3 | privateConfig: Record; 4 | }; 5 | 6 | export type EmailVerificationFeature = AppFeature & { 7 | privateConfig: { 8 | tokenSecret: string; 9 | }; 10 | }; 11 | 12 | export type AppFeatures = { 13 | emailVerification: EmailVerificationFeature; 14 | }; 15 | -------------------------------------------------------------------------------- /packages/webapp/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ReactNestStarter 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /packages/webapp/src/pages/TestPage.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Result } from "antd"; 2 | import { Link } from "react-router-dom"; 3 | 4 | export const TestPage = () => ( 5 | 11 | 12 | 13 | } 14 | /> 15 | ); 16 | -------------------------------------------------------------------------------- /packages/server/src/modules/auth/auth.utils.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | export const checkRecaptcha = async (token: string) => { 4 | const captchaResponse = await axios.post( 5 | `https://www.google.com/recaptcha/api/siteverify?secret=${process.env.RECAPTCHA_SECRET_KEY}&response=${token}`, 6 | ); 7 | if (!captchaResponse.data.success) { 8 | throw new Error('RECAPTCHA_FAIL'); 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /packages/server/src/modules/user/user.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { PrismaService } from 'src/services/prisma.service'; 3 | import { UserService } from 'src/modules/user/user.service'; 4 | import { UserController } from './user.controller'; 5 | 6 | @Module({ 7 | providers: [PrismaService, UserService], 8 | exports: [UserService], 9 | controllers: [UserController], 10 | }) 11 | export class UserModule {} 12 | -------------------------------------------------------------------------------- /packages/webapp/src/hooks/useFeatures.ts: -------------------------------------------------------------------------------- 1 | import { useListFeaturesQuery } from "../services/api"; 2 | import { AppFeatures } from "../types/features"; 3 | 4 | export const useFeatures = () => { 5 | const { data } = useListFeaturesQuery(null); 6 | const features = data?.data; 7 | 8 | return { 9 | isFeatureEnabled: (featureName: keyof AppFeatures) => { 10 | return features ? features[featureName] : false; 11 | }, 12 | }; 13 | }; 14 | -------------------------------------------------------------------------------- /packages/prisma/index.ts: -------------------------------------------------------------------------------- 1 | import { PrismaClient } from "@prisma/client"; 2 | export * from "@prisma/client"; 3 | 4 | interface CustomNodeJsGlobal { 5 | prisma: PrismaClient; 6 | } 7 | 8 | declare const global: CustomNodeJsGlobal; 9 | 10 | const prisma = 11 | global.prisma || 12 | new PrismaClient({ 13 | // log: ['query', 'info', 'warn', 'error'], 14 | }); 15 | 16 | // @ts-ignore 17 | if (process.env.NODE_ENV === "development") global.prisma = prisma; 18 | -------------------------------------------------------------------------------- /packages/dtos/auth.ts: -------------------------------------------------------------------------------- 1 | import { IsEmail, IsNotEmpty } from "class-validator"; 2 | 3 | export class LoginInput { 4 | @IsEmail() 5 | email: string; 6 | 7 | @IsNotEmpty() 8 | password: string; 9 | 10 | @IsNotEmpty() 11 | recaptcha_token: string; 12 | } 13 | 14 | export class RegisterInput { 15 | @IsEmail() 16 | email: string; 17 | 18 | @IsNotEmpty() 19 | password: string; 20 | 21 | @IsNotEmpty() 22 | recaptcha_token: string; 23 | 24 | fullName?: string; 25 | } 26 | -------------------------------------------------------------------------------- /packages/server/src/modules/features/features.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { PrismaService } from 'src/services/prisma.service'; 3 | import { FeaturesController } from './features.controller'; 4 | import { FeaturesService } from './features.service'; 5 | 6 | @Module({ 7 | imports: [], 8 | providers: [PrismaService, FeaturesService], 9 | exports: [FeaturesService], 10 | controllers: [FeaturesController], 11 | }) 12 | export class FeaturesModule {} 13 | -------------------------------------------------------------------------------- /packages/server/src/modules/features/features.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | import { ok } from '../../utils/httpUtils'; 3 | import { FeaturesService } from './features.service'; 4 | 5 | @Controller({ 6 | path: 'features', 7 | }) 8 | export class FeaturesController { 9 | constructor(private readonly featuresService: FeaturesService) {} 10 | 11 | @Get('list') 12 | async listFeatures() { 13 | return ok(this.featuresService.listFeatures()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/server/src/services/prisma.service.ts: -------------------------------------------------------------------------------- 1 | import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common'; 2 | import { PrismaClient } from '@rns/prisma'; 3 | 4 | @Injectable() 5 | export class PrismaService extends PrismaClient implements OnModuleInit { 6 | async onModuleInit() { 7 | await this.$connect(); 8 | } 9 | 10 | async enableShutdownHooks(app: INestApplication) { 11 | this.$on('beforeExit', async () => { 12 | await app.close(); 13 | }); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/webapp/src/services/endpoints/userEndpoints.ts: -------------------------------------------------------------------------------- 1 | import { EndpointBuilder } from "@reduxjs/toolkit/dist/query/endpointDefinitions"; 2 | import { BaseOutput } from "../../types/BaseOutput"; 3 | import { User } from "@rns/prisma"; 4 | 5 | export const userEndpoints = ( 6 | builder: EndpointBuilder, string, "api"> 7 | ) => ({ 8 | getMe: builder.query, null>({ 9 | query: () => ({ 10 | url: "/user/me", 11 | method: "GET", 12 | }), 13 | }), 14 | }); 15 | -------------------------------------------------------------------------------- /packages/webapp/src/reportWebVitals.ts: -------------------------------------------------------------------------------- 1 | import { ReportHandler } from 'web-vitals'; 2 | 3 | const reportWebVitals = (onPerfEntry?: ReportHandler) => { 4 | if (onPerfEntry && onPerfEntry instanceof Function) { 5 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 6 | getCLS(onPerfEntry); 7 | getFID(onPerfEntry); 8 | getFCP(onPerfEntry); 9 | getLCP(onPerfEntry); 10 | getTTFB(onPerfEntry); 11 | }); 12 | } 13 | }; 14 | 15 | export default reportWebVitals; 16 | -------------------------------------------------------------------------------- /packages/webapp/src/services/endpoints/featuresEndpoints.ts: -------------------------------------------------------------------------------- 1 | import { EndpointBuilder } from "@reduxjs/toolkit/dist/query/endpointDefinitions"; 2 | import { BaseOutput } from "../../types/BaseOutput"; 3 | import { AppFeatures } from "../../types/features"; 4 | 5 | export const featuresEndpoints = ( 6 | builder: EndpointBuilder, string, "api"> 7 | ) => ({ 8 | listFeatures: builder.query, null>({ 9 | query: () => ({ 10 | url: "/features/list", 11 | method: "GET", 12 | }), 13 | }), 14 | }); 15 | -------------------------------------------------------------------------------- /packages/server/src/modules/communication/communication.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, Logger } from '@nestjs/common'; 2 | 3 | @Injectable() 4 | export class CommunicationService { 5 | private readonly logger = new Logger(CommunicationService.name); 6 | 7 | /** 8 | * Connect to your favorite email provider or a direct SMTP 9 | * Send the email 10 | */ 11 | async sendEmail(to: string, title: string, content: string) { 12 | this.logger.log(`sendEmail() called to send email ${to}`, { 13 | title, 14 | content, 15 | }); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/webapp/src/layout/LoggedInLayout.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Header } from "../components/shared/Header"; 3 | import { useGetMeQuery } from "../services/api"; 4 | 5 | type Props = { 6 | children?: React.ReactNode; 7 | }; 8 | 9 | export const LoggedInLayout: React.FC = ({ children }) => { 10 | useGetMeQuery(null); 11 | return ( 12 |
17 |
18 |
19 | {children} 20 |
21 |
22 | ); 23 | }; 24 | -------------------------------------------------------------------------------- /packages/prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | generator client { 5 | provider = "prisma-client-js" 6 | } 7 | 8 | datasource db { 9 | provider = "sqlite" 10 | url = env("DATABASE_URL") 11 | } 12 | 13 | model User { 14 | id Int @id @default(autoincrement()) 15 | email String @unique 16 | fullName String? 17 | password String 18 | emailVerified Boolean? 19 | } 20 | -------------------------------------------------------------------------------- /packages/server/.gitignore: -------------------------------------------------------------------------------- 1 | # compiled output 2 | /dist 3 | /node_modules 4 | 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | pnpm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | lerna-debug.log* 13 | 14 | # OS 15 | .DS_Store 16 | 17 | # Tests 18 | /coverage 19 | /.nyc_output 20 | 21 | # IDEs and editors 22 | /.idea 23 | .project 24 | .classpath 25 | .c9/ 26 | *.launch 27 | .settings/ 28 | *.sublime-workspace 29 | 30 | # IDE - VSCode 31 | .vscode/* 32 | !.vscode/settings.json 33 | !.vscode/tasks.json 34 | !.vscode/launch.json 35 | !.vscode/extensions.json 36 | 37 | .env -------------------------------------------------------------------------------- /packages/webapp/src/layout/RequireAnonym.tsx: -------------------------------------------------------------------------------- 1 | import { useSelector } from "react-redux"; 2 | import { Navigate, useLocation } from "react-router-dom"; 3 | import { selectAuthToken } from "../slices/authSlice"; 4 | 5 | type Props = { 6 | children?: React.ReactNode; 7 | }; 8 | 9 | export const RequireAnonym: React.FC = ({ children }) => { 10 | const token = useSelector(selectAuthToken); 11 | const location = useLocation(); 12 | 13 | if (!token) { 14 | return <>{children}; 15 | } 16 | 17 | return ; 18 | }; 19 | -------------------------------------------------------------------------------- /packages/webapp/src/layout/RequireAuth.tsx: -------------------------------------------------------------------------------- 1 | import { useSelector } from "react-redux"; 2 | import { Navigate, useLocation } from "react-router-dom"; 3 | import { selectAuthToken } from "../slices/authSlice"; 4 | 5 | type Props = { 6 | children?: React.ReactNode; 7 | }; 8 | 9 | export const RequireAuth: React.FC = ({ children }) => { 10 | const token = useSelector(selectAuthToken); 11 | const location = useLocation(); 12 | 13 | if (!token) { 14 | return ; 15 | } 16 | 17 | return <>{children}; 18 | }; 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rns", 3 | "private": true, 4 | "scripts": { 5 | "web:start": "cd packages/webapp && yarn start", 6 | "web:build": "cd packages/webapp && yarn build", 7 | "web:serve": "cd packages/webapp && yarn serve", 8 | "server:start": "cd packages/server && yarn start:dev", 9 | "server:start:prod": "cd packages/server && yarn build && yarn start:prod", 10 | "dto:compile": "cd packages/dtos && yarn compile" 11 | }, 12 | "devDependencies": { 13 | "lerna": "^5.1.4" 14 | }, 15 | "dependencies": { 16 | "@prisma/client": "^4.2.1" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/webapp/src/pages/HomePage.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Result } from "antd"; 2 | import { Link } from "react-router-dom"; 3 | import { EmailVerifyInformation } from "../features/email-verification/EmailVerifyInformation"; 4 | 5 | export const HomePage = () => ( 6 |
7 | 8 | 14 | 15 | 16 | } 17 | /> 18 |
19 | ); 20 | -------------------------------------------------------------------------------- /packages/server/src/modules/auth/jwt.strategy.ts: -------------------------------------------------------------------------------- 1 | import { ExtractJwt, Strategy } from 'passport-jwt'; 2 | import { PassportStrategy } from '@nestjs/passport'; 3 | import { Injectable } from '@nestjs/common'; 4 | import { JWT_SECRET } from './constants'; 5 | 6 | @Injectable() 7 | export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { 8 | constructor() { 9 | super({ 10 | jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), 11 | ignoreExpiration: false, 12 | secretOrKey: JWT_SECRET, 13 | }); 14 | } 15 | 16 | async validate(payload: any) { 17 | return payload; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/webapp/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /packages/server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "removeComments": true, 6 | "emitDecoratorMetadata": true, 7 | "experimentalDecorators": true, 8 | "allowSyntheticDefaultImports": true, 9 | "target": "es2017", 10 | "sourceMap": true, 11 | "outDir": "./dist", 12 | "baseUrl": "./", 13 | "incremental": true, 14 | "skipLibCheck": true, 15 | "strictNullChecks": false, 16 | "noImplicitAny": false, 17 | "strictBindCallApply": false, 18 | "forceConsistentCasingInFileNames": false, 19 | "noFallthroughCasesInSwitch": false 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/server/src/modules/user/user.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get, Request, UseGuards } from '@nestjs/common'; 2 | import { ok } from '../../utils/httpUtils'; 3 | import { JwtGuard } from '../auth/jwt.guard'; 4 | import { UserService } from './user.service'; 5 | 6 | @Controller({ 7 | path: 'user', 8 | }) 9 | export class UserController { 10 | constructor(private userService: UserService) {} 11 | 12 | @UseGuards(JwtGuard) 13 | @Get('me') 14 | async profile(@Request() req) { 15 | const user = await this.userService.findUser({ id: req.user.id }); 16 | if (!user) { 17 | throw new Error('ME_USER_NOT_FOUND'); 18 | } 19 | delete user['password']; 20 | return ok(user); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /packages/dtos/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "useDefineForClassFields": true, 5 | "allowJs": false, 6 | "skipLibCheck": true, 7 | "esModuleInterop": false, 8 | "allowSyntheticDefaultImports": true, 9 | "strict": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "module": "commonjs", 12 | "moduleResolution": "Node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "emitDecoratorMetadata": true, 16 | "experimentalDecorators": true, 17 | "strictPropertyInitialization": false, 18 | "outDir": "./dist" 19 | }, 20 | "include": [ 21 | "./*.ts" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /packages/server/test/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { INestApplication } from '@nestjs/common'; 3 | import * as request from 'supertest'; 4 | import { AppModule } from './../src/app.module'; 5 | 6 | describe('AppController (e2e)', () => { 7 | let app: INestApplication; 8 | 9 | beforeEach(async () => { 10 | const moduleFixture: TestingModule = await Test.createTestingModule({ 11 | imports: [AppModule], 12 | }).compile(); 13 | 14 | app = moduleFixture.createNestApplication(); 15 | await app.init(); 16 | }); 17 | 18 | it('/ (GET)', () => { 19 | return request(app.getHttpServer()) 20 | .get('/') 21 | .expect(200) 22 | .expect('Hello World!'); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /packages/webapp/src/services/endpoints/authEndpoints.ts: -------------------------------------------------------------------------------- 1 | import { EndpointBuilder } from "@reduxjs/toolkit/dist/query/endpointDefinitions"; 2 | import { BaseOutput } from "../../types/BaseOutput"; 3 | import { LoginInput, RegisterInput } from "@rns/dtos"; 4 | 5 | export const authEndpoints = ( 6 | builder: EndpointBuilder, string, "api"> 7 | ) => ({ 8 | login: builder.mutation, LoginInput>({ 9 | query: (body) => ({ 10 | url: "/auth/login", 11 | method: "POST", 12 | body, 13 | }), 14 | }), 15 | register: builder.mutation, RegisterInput>({ 16 | query: (body) => ({ 17 | url: "/auth/register", 18 | method: "POST", 19 | body, 20 | }), 21 | }), 22 | }); 23 | -------------------------------------------------------------------------------- /packages/webapp/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": false, 7 | "skipLibCheck": true, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx", 18 | "experimentalDecorators": true, 19 | "strictPropertyInitialization": false, 20 | }, 21 | "include": ["src"], 22 | "references": [{ "path": "./tsconfig.node.json" }] 23 | } 24 | -------------------------------------------------------------------------------- /packages/webapp/src/services/endpoints/emailEndpoints.ts: -------------------------------------------------------------------------------- 1 | import { EndpointBuilder } from "@reduxjs/toolkit/dist/query/endpointDefinitions"; 2 | import { BaseOutput } from "../../types/BaseOutput"; 3 | import { VerifyTokenInput } from "@rns/dtos"; 4 | 5 | export const emailEndpoints = ( 6 | builder: EndpointBuilder, string, "api"> 7 | ) => ({ 8 | verifyEmail: builder.mutation, VerifyTokenInput>({ 9 | query: (body) => ({ 10 | url: "/email/verify-token", 11 | method: "POST", 12 | body, 13 | }), 14 | }), 15 | resendVerification: builder.mutation, null>({ 16 | query: () => ({ 17 | url: "/email/resend-verification", 18 | method: "POST", 19 | }), 20 | }), 21 | }); 22 | -------------------------------------------------------------------------------- /packages/server/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: '@typescript-eslint/parser', 3 | parserOptions: { 4 | project: 'tsconfig.json', 5 | tsconfigRootDir : __dirname, 6 | sourceType: 'module', 7 | }, 8 | plugins: ['@typescript-eslint/eslint-plugin'], 9 | extends: [ 10 | 'plugin:@typescript-eslint/recommended', 11 | 'plugin:prettier/recommended', 12 | ], 13 | root: true, 14 | env: { 15 | node: true, 16 | jest: true, 17 | }, 18 | ignorePatterns: ['.eslintrc.js'], 19 | rules: { 20 | '@typescript-eslint/interface-name-prefix': 'off', 21 | '@typescript-eslint/explicit-function-return-type': 'off', 22 | '@typescript-eslint/explicit-module-boundary-types': 'off', 23 | '@typescript-eslint/no-explicit-any': 'off', 24 | }, 25 | }; 26 | -------------------------------------------------------------------------------- /packages/server/src/modules/auth/auth.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Post, Body } from '@nestjs/common'; 2 | import { ok } from '../../utils/httpUtils'; 3 | import { AuthService } from './auth.service'; 4 | import { LoginInput, RegisterInput } from '@rns/dtos'; 5 | import { checkRecaptcha } from './auth.utils'; 6 | 7 | @Controller({ 8 | path: 'auth', 9 | }) 10 | export class AuthController { 11 | constructor(private readonly authService: AuthService) {} 12 | 13 | @Post('login') 14 | async login(@Body() body: LoginInput) { 15 | await checkRecaptcha(body.recaptcha_token); 16 | return ok(await this.authService.login(body)); 17 | } 18 | 19 | @Post('register') 20 | async register(@Body() body: RegisterInput) { 21 | await checkRecaptcha(body.recaptcha_token); 22 | return ok(await this.authService.register(body)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /packages/webapp/src/components/shared/Header.tsx: -------------------------------------------------------------------------------- 1 | import { PageHeader, Button, Popconfirm, Spin } from "antd"; 2 | import { useDispatch } from "react-redux"; 3 | import { useMe } from "../../hooks/useMe"; 4 | import { logout } from "../../slices/authSlice"; 5 | 6 | export const Header = () => { 7 | const { me, isLoading } = useMe(); 8 | const dispatch = useDispatch(); 9 | const onConfirmLogout = () => { 10 | dispatch(logout()); 11 | }; 12 | 13 | return ( 14 | window.history.back()} 17 | title="Dashboard" 18 | subTitle="" 19 | extra={[ 20 | 21 | 22 | , 23 | ]} 24 | > 25 | ); 26 | }; 27 | -------------------------------------------------------------------------------- /packages/server/src/modules/email-verification/email-verification.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { PrismaService } from 'src/services/prisma.service'; 3 | import { CommunicationModule } from '../communication/communication.module'; 4 | import { UserModule } from '../user/user.module'; 5 | import { EmailVerificationController } from './email-verification.controller'; 6 | import { EmailVerificationService } from './email-verification.service'; 7 | import { JwtModule } from '@nestjs/jwt'; 8 | import { FeaturesModule } from '../features/features.module'; 9 | 10 | @Module({ 11 | imports: [CommunicationModule, UserModule, JwtModule, FeaturesModule], 12 | providers: [PrismaService, EmailVerificationService], 13 | exports: [EmailVerificationService], 14 | controllers: [EmailVerificationController], 15 | }) 16 | export class EmailVerificationModule {} 17 | -------------------------------------------------------------------------------- /packages/server/src/modules/base/logging.interceptor.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Injectable, 3 | NestInterceptor, 4 | ExecutionContext, 5 | CallHandler, 6 | Logger, 7 | } from '@nestjs/common'; 8 | import { Observable } from 'rxjs'; 9 | import { Request } from 'express'; 10 | 11 | /** 12 | * Logs controllers incoming requests 13 | */ 14 | @Injectable() 15 | export class LoggingInterceptor implements NestInterceptor { 16 | private readonly logger = new Logger(LoggingInterceptor.name); 17 | 18 | intercept(context: ExecutionContext, next: CallHandler): Observable { 19 | const request: Request = context.switchToHttp().getRequest(); 20 | const userId = request.user ? request.user.id : null; 21 | const ip = request.headers['X-Forwarded-For'] || request.ip; 22 | this.logger.log( 23 | `${request.method} ${request.url} ${ip} | userId: ${userId}`, 24 | ); 25 | return next.handle(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /packages/webapp/src/slices/authSlice.ts: -------------------------------------------------------------------------------- 1 | import { createSlice, PayloadAction } from "@reduxjs/toolkit"; 2 | import { RootState } from "../store"; 3 | 4 | interface AuthState { 5 | token?: string; 6 | } 7 | 8 | const initialState: AuthState = { 9 | token: localStorage.getItem("token") || undefined, 10 | }; 11 | 12 | export const authSlice = createSlice({ 13 | name: "auth", 14 | initialState, 15 | reducers: { 16 | setToken: (state, action: PayloadAction) => { 17 | state.token = action.payload; 18 | localStorage.setItem("token", action.payload); 19 | }, 20 | logout: (state) => { 21 | state.token = undefined; 22 | localStorage.removeItem("token"); 23 | }, 24 | }, 25 | }); 26 | 27 | export const { setToken, logout } = authSlice.actions; 28 | 29 | export const selectAuthToken = (state: RootState) => state.auth.token; 30 | 31 | export const authReducer = authSlice.reducer; 32 | -------------------------------------------------------------------------------- /packages/webapp/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import "./index.css"; 4 | import App from "./App"; 5 | import reportWebVitals from "./reportWebVitals"; 6 | import { BrowserRouter } from "react-router-dom"; 7 | import { store } from "./store"; 8 | import { Provider } from "react-redux"; 9 | import "antd/dist/antd.css"; 10 | import "@ant-design/pro-components/dist/components.css"; 11 | 12 | const root = ReactDOM.createRoot( 13 | document.getElementById("root") as HTMLElement 14 | ); 15 | root.render( 16 | 17 | 18 | 19 | 20 | 21 | ); 22 | 23 | // If you want to start measuring performance in your app, pass a function 24 | // to log results (for example: reportWebVitals(console.log)) 25 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 26 | reportWebVitals(); 27 | -------------------------------------------------------------------------------- /packages/webapp/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | import vitePluginImp from "vite-plugin-imp"; 4 | import path from "path"; 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [ 9 | react(), 10 | vitePluginImp({ 11 | optimize: true, 12 | libList: [ 13 | { 14 | libName: "antd", 15 | libDirectory: "es", 16 | style: (name) => `antd/es/${name}/style`, 17 | }, 18 | ], 19 | }), 20 | ], 21 | css: { 22 | preprocessorOptions: { 23 | less: { 24 | javascriptEnabled: true, 25 | }, 26 | }, 27 | }, 28 | resolve: { 29 | alias: [ 30 | { 31 | find: /^~/, 32 | replacement: "", 33 | }, 34 | { 35 | find: "@", 36 | replacement: path.resolve(__dirname, "./src"), 37 | }, 38 | ], 39 | }, 40 | }); 41 | -------------------------------------------------------------------------------- /packages/server/src/filters/http-exception.filter.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/ban-ts-comment */ 2 | import { Catch, ArgumentsHost, Logger } from '@nestjs/common'; 3 | import { BaseExceptionFilter } from '@nestjs/core'; 4 | import { Response } from 'express'; 5 | import { error } from '../utils/httpUtils'; 6 | 7 | @Catch() 8 | export class HttpExceptionFilter extends BaseExceptionFilter { 9 | private readonly logger = new Logger(HttpExceptionFilter.name); 10 | 11 | catch(exception: unknown, host: ArgumentsHost) { 12 | this.logger.error(exception); 13 | const context = host.switchToHttp(); 14 | const response = context.getResponse(); 15 | 16 | const errorMessage = 17 | // @ts-ignore 18 | exception.message || 19 | // @ts-ignore 20 | (exception.getMessage && exception.getMessage()) || 21 | 'UNKNOWN_ERROR'; 22 | 23 | // @ts-ignore 24 | response.status(exception.status || 400).json(error(errorMessage)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /packages/server/src/modules/auth/auth.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { JwtModule } from '@nestjs/jwt'; 3 | import { PassportModule } from '@nestjs/passport'; 4 | import { PrismaService } from 'src/services/prisma.service'; 5 | import { EmailVerificationModule } from '../email-verification/email-verification.module'; 6 | import { FeaturesModule } from '../features/features.module'; 7 | import { UserModule } from '../user/user.module'; 8 | import { AuthController } from './auth.controller'; 9 | import { AuthService } from './auth.service'; 10 | import { JWT_SECRET } from './constants'; 11 | import { JwtStrategy } from './jwt.strategy'; 12 | 13 | @Module({ 14 | imports: [ 15 | UserModule, 16 | PassportModule, 17 | JwtModule.register({ 18 | secret: JWT_SECRET, 19 | signOptions: { expiresIn: '30d' }, 20 | }), 21 | EmailVerificationModule, 22 | FeaturesModule, 23 | ], 24 | providers: [AuthService, PrismaService, JwtStrategy], 25 | exports: [AuthService], 26 | controllers: [AuthController], 27 | }) 28 | export class AuthModule {} 29 | -------------------------------------------------------------------------------- /packages/server/src/modules/user/user.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { PrismaService } from '../../services/prisma.service'; 3 | import { User, Prisma } from '@rns/prisma'; 4 | import { RegisterInput } from '@rns/dtos'; 5 | 6 | @Injectable() 7 | export class UserService { 8 | constructor(private prisma: PrismaService) {} 9 | 10 | async findUser( 11 | userWhereUniqueInput: Prisma.UserWhereUniqueInput, 12 | ): Promise { 13 | return this.prisma.user.findUnique({ 14 | where: userWhereUniqueInput, 15 | }); 16 | } 17 | 18 | async createUser({ 19 | email, 20 | password, 21 | fullName, 22 | }: RegisterInput): Promise { 23 | try { 24 | return await this.prisma.user.create({ 25 | data: { email, password, fullName, emailVerified: false }, 26 | }); 27 | } catch (e) { 28 | if (e instanceof Prisma.PrismaClientKnownRequestError) { 29 | if (e.code === 'P2002') { 30 | throw new Error('EMAIL_IN_USE'); 31 | } 32 | } 33 | throw e; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /packages/server/src/main.ts: -------------------------------------------------------------------------------- 1 | import { ValidationPipe } from '@nestjs/common'; 2 | import { HttpAdapterHost, NestFactory } from '@nestjs/core'; 3 | import { ValidationError } from 'class-validator'; 4 | import { AppModule } from './app.module'; 5 | import { HttpExceptionFilter } from './filters/http-exception.filter'; 6 | import { LoggingInterceptor } from './modules/base/logging.interceptor'; 7 | 8 | async function bootstrap() { 9 | const app = await NestFactory.create(AppModule); 10 | 11 | const { httpAdapter } = app.get(HttpAdapterHost); 12 | app.useGlobalFilters(new HttpExceptionFilter(httpAdapter)); 13 | app.useGlobalInterceptors(new LoggingInterceptor()); 14 | app.enableCors(); 15 | 16 | app.useGlobalPipes( 17 | new ValidationPipe({ 18 | transform: true, 19 | exceptionFactory: (errors: ValidationError[]) => { 20 | let message = ''; 21 | errors.forEach((error) => { 22 | for (const key in error.constraints) { 23 | message += `${error.constraints[key]}. `; 24 | } 25 | }); 26 | return new Error(message); 27 | }, 28 | }), 29 | ); 30 | 31 | await app.listen(3002); 32 | } 33 | bootstrap(); 34 | -------------------------------------------------------------------------------- /packages/server/src/modules/features/features.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { AppFeature, AppFeatures } from './types'; 3 | 4 | @Injectable() 5 | export class FeaturesService { 6 | private readonly FEATURES: AppFeatures = { 7 | emailVerification: { 8 | enabled: process.env.FEATURE_EMAIL_VERIFICATION_ENABLED === 'true', 9 | privateConfig: { 10 | tokenSecret: process.env.FEATURE_EMAIL_VERIFICATION_TOKEN_SECRET, 11 | }, 12 | }, 13 | }; 14 | 15 | getFeaturesWithConfigs(): AppFeatures { 16 | return this.FEATURES; 17 | } 18 | 19 | /** 20 | * 21 | * Expose method for controller, remove private configs from each feature 22 | */ 23 | listFeatures() { 24 | const features = {}; 25 | for (const key in { ...this.FEATURES }) { 26 | const f: AppFeature = this.FEATURES[key]; 27 | features[key] = f.enabled; 28 | } 29 | return features; 30 | } 31 | 32 | getFeature(featureName: keyof AppFeatures): AppFeature { 33 | return this.FEATURES[featureName]; 34 | } 35 | 36 | isFeatureEnabled(featureName: keyof AppFeatures): boolean { 37 | return this.FEATURES[featureName].enabled; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /packages/webapp/src/pages/email/VerifyPage.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from "react"; 2 | import { useNavigate, useSearchParams } from "react-router-dom"; 3 | import { useVerifyEmailMutation } from "../../services/api"; 4 | import { message, Spin } from "antd"; 5 | import { useFeatures } from "../../hooks/useFeatures"; 6 | 7 | export const VerifyPage: React.FC = () => { 8 | const [searchParams] = useSearchParams(); 9 | const navigate = useNavigate(); 10 | const [verify, { isLoading }] = useVerifyEmailMutation(); 11 | const token = searchParams.get("token"); 12 | const { isFeatureEnabled } = useFeatures(); 13 | 14 | useEffect(() => { 15 | if (token) { 16 | verify({ token }) 17 | .unwrap() 18 | .then((response) => { 19 | if (response.succeed) { 20 | message.success("Email successfully verified!"); 21 | } 22 | navigate("/"); 23 | }); 24 | } 25 | }, [token]); 26 | 27 | if (!isFeatureEnabled("emailVerification")) { 28 | return null; 29 | } 30 | 31 | if (isLoading) { 32 | return ( 33 |
34 | Verifying email 35 |
36 | ); 37 | } 38 | 39 | return null; 40 | }; 41 | -------------------------------------------------------------------------------- /packages/webapp/src/features/email-verification/EmailVerifyInformation.tsx: -------------------------------------------------------------------------------- 1 | import { Alert, Space, Button } from "antd"; 2 | import { useFeatures } from "../../hooks/useFeatures"; 3 | import { useMe } from "../../hooks/useMe"; 4 | import { useResendVerificationMutation } from "../../services/api"; 5 | 6 | export const EmailVerifyInformation = () => { 7 | const { isFeatureEnabled } = useFeatures(); 8 | const { me } = useMe(); 9 | const [resend, { isLoading, isSuccess }] = useResendVerificationMutation(); 10 | 11 | if (!isFeatureEnabled("emailVerification") || me?.emailVerified) { 12 | return null; 13 | } 14 | 15 | return ( 16 | 20 |
21 | Your email is not verified yet. Please check your inbox to verify 22 | your email 23 |
24 | 32 | 33 | } 34 | closable 35 | /> 36 | ); 37 | }; 38 | -------------------------------------------------------------------------------- /packages/dtos/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | class-validator@^0.13.2: 6 | version "0.13.2" 7 | resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.13.2.tgz#64b031e9f3f81a1e1dcd04a5d604734608b24143" 8 | integrity sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw== 9 | dependencies: 10 | libphonenumber-js "^1.9.43" 11 | validator "^13.7.0" 12 | 13 | libphonenumber-js@^1.9.43: 14 | version "1.10.13" 15 | resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.13.tgz#0b5833c7fdbf671140530d83531c6753f7e0ea3c" 16 | integrity sha512-b74iyWmwb4GprAUPjPkJ11GTC7KX4Pd3onpJfKxYyY8y9Rbb4ERY47LvCMEDM09WD3thiLDMXtkfDK/AX+zT7Q== 17 | 18 | typescript@^4.7.4: 19 | version "4.7.4" 20 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" 21 | integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== 22 | 23 | validator@^13.7.0: 24 | version "13.7.0" 25 | resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" 26 | integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== 27 | -------------------------------------------------------------------------------- /packages/webapp/src/components/shared/HttpResult.tsx: -------------------------------------------------------------------------------- 1 | import { SerializedError } from "@reduxjs/toolkit/dist/createAsyncThunk"; 2 | import { Alert } from "antd"; 3 | import { BaseOutput } from "../../types/BaseOutput"; 4 | 5 | type Props = { 6 | style?: React.CSSProperties; 7 | error?: 8 | | { 9 | data: BaseOutput; 10 | } 11 | | SerializedError; 12 | result?: BaseOutput; 13 | }; 14 | 15 | export const HttpResult: React.FC = ({ error, result, style }) => { 16 | if (result && result.succeed) { 17 | return ( 18 | 25 | ); 26 | } 27 | 28 | if (!error) { 29 | return null; 30 | } 31 | 32 | if ("data" in error && error.data) { 33 | return ( 34 | 41 | ); 42 | } 43 | 44 | return ( 45 | 54 | ); 55 | }; 56 | -------------------------------------------------------------------------------- /packages/webapp/src/services/api.ts: -------------------------------------------------------------------------------- 1 | import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; 2 | import { RootState } from "../store"; 3 | import { authEndpoints } from "./endpoints/authEndpoints"; 4 | import { emailEndpoints } from "./endpoints/emailEndpoints"; 5 | import { API_URL } from "../constants"; 6 | import { selectAuthToken } from "../slices/authSlice"; 7 | import { userEndpoints } from "./endpoints/userEndpoints"; 8 | import { featuresEndpoints } from "./endpoints/featuresEndpoints"; 9 | 10 | export const baseQuery = fetchBaseQuery({ 11 | baseUrl: API_URL, 12 | prepareHeaders: (headers, { getState }) => { 13 | const token = selectAuthToken(getState() as RootState); 14 | if (token) { 15 | headers.set("Authorization", `Bearer ${token}`); 16 | } 17 | return headers; 18 | }, 19 | }); 20 | 21 | // Define a service using a base URL and expected endpoints 22 | export const api = createApi({ 23 | reducerPath: "api", 24 | baseQuery, 25 | tagTypes: [], 26 | endpoints: (builder) => ({ 27 | ...authEndpoints(builder), 28 | ...userEndpoints(builder), 29 | ...emailEndpoints(builder), 30 | ...featuresEndpoints(builder), 31 | }), 32 | }); 33 | 34 | export const { 35 | useLoginMutation, 36 | useRegisterMutation, 37 | useGetMeQuery, 38 | useVerifyEmailMutation, 39 | useResendVerificationMutation, 40 | useListFeaturesQuery, 41 | } = api; 42 | -------------------------------------------------------------------------------- /packages/server/src/modules/email-verification/email-verification.controller.ts: -------------------------------------------------------------------------------- 1 | import { Body, Controller, Post, Request, UseGuards } from '@nestjs/common'; 2 | import { VerifyTokenInput } from '@rns/dtos'; 3 | import { error, ok } from '../../utils/httpUtils'; 4 | import { JwtGuard } from '../auth/jwt.guard'; 5 | import { EmailVerificationService } from '../email-verification/email-verification.service'; 6 | import { FeaturesService } from '../features/features.service'; 7 | 8 | @Controller({ 9 | path: 'email', 10 | }) 11 | export class EmailVerificationController { 12 | constructor( 13 | private readonly featuresService: FeaturesService, 14 | private readonly emailVerificationService: EmailVerificationService, 15 | ) {} 16 | 17 | @Post('verify-token') 18 | async verifyToken(@Body() body: VerifyTokenInput) { 19 | if (!this.featuresService.isFeatureEnabled('emailVerification')) { 20 | return error('emailVerification is not enabled'); 21 | } 22 | return ok(await this.emailVerificationService.verifyToken(body)); 23 | } 24 | 25 | @UseGuards(JwtGuard) 26 | @Post('resend-verification') 27 | async resendVerification(@Request() req) { 28 | if (!this.featuresService.isFeatureEnabled('emailVerification')) { 29 | return error('emailVerification is not enabled'); 30 | } 31 | return ok( 32 | await this.emailVerificationService.resendVerificationEmail(req.user.id), 33 | ); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /packages/webapp/src/App.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Routes, Route } from "react-router-dom"; 3 | import { BaseLayout } from "./layout/BaseLayout"; 4 | import { RequireAuth } from "./layout/RequireAuth"; 5 | import { RequireAnonym } from "./layout/RequireAnonym"; 6 | import { LoginPage } from "./pages/auth/LoginPage"; 7 | import { RegisterPage } from "./pages/auth/RegisterPage"; 8 | import { HomePage } from "./pages/HomePage"; 9 | import { TestPage } from "./pages/TestPage"; 10 | import { LoggedInLayout } from "./layout/LoggedInLayout"; 11 | import { VerifyPage } from "./pages/email/VerifyPage"; 12 | import { useFeatures } from "./hooks/useFeatures"; 13 | 14 | const auth = (component: React.ReactElement) => ( 15 | 16 | {component} 17 | 18 | ); 19 | 20 | const anon = (component: React.ReactElement) => ( 21 | {component} 22 | ); 23 | 24 | export default function App() { 25 | useFeatures(); 26 | return ( 27 | 28 | }> 29 | )} /> 30 | )} /> 31 | )} /> 32 | )} /> 33 | } /> 34 | 35 | 36 | ); 37 | } 38 | -------------------------------------------------------------------------------- /packages/webapp/src/store.ts: -------------------------------------------------------------------------------- 1 | import { configureStore } from "@reduxjs/toolkit"; 2 | import { api } from "./services/api"; 3 | import { authReducer } from "./slices/authSlice"; 4 | import { isRejectedWithValue, Middleware } from "@reduxjs/toolkit"; 5 | import { message } from "antd"; 6 | 7 | export const rtkQueryErrorLogger: Middleware = () => (next) => (action) => { 8 | if (isRejectedWithValue(action)) { 9 | if (action.payload.status === 401) { 10 | // Ignore 401 Authorization errors, user doesn't need to see them in message 11 | } else if (action.payload.status === 404) { 12 | message.error("Error 404, related API endpoint is not found"); 13 | } else if (action.payload.data && action.payload.data.message) { 14 | message.error(action.payload.data.message); 15 | } else { 16 | message.error( 17 | "Unknown error occured in the API. Please try again or reach administrator." 18 | ); 19 | } 20 | } 21 | 22 | return next(action); 23 | }; 24 | 25 | export const store = configureStore({ 26 | reducer: { 27 | [api.reducerPath]: api.reducer, 28 | auth: authReducer, 29 | }, 30 | middleware: (getDefaultMiddleware) => 31 | getDefaultMiddleware({ 32 | immutableCheck: false, 33 | serializableCheck: false, 34 | }).concat(api.middleware, rtkQueryErrorLogger), 35 | }); 36 | 37 | export type RootState = ReturnType; 38 | export type AppDispatch = typeof store.dispatch; 39 | -------------------------------------------------------------------------------- /packages/server/src/app.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { APP_FILTER } from '@nestjs/core'; 3 | import { AppController } from './app.controller'; 4 | import { AppService } from './app.service'; 5 | import { PrismaService } from './services/prisma.service'; 6 | import { AuthModule } from './modules/auth/auth.module'; 7 | import { HttpExceptionFilter } from './filters/http-exception.filter'; 8 | import { UserModule } from './modules/user/user.module'; 9 | import { ConfigModule } from '@nestjs/config'; 10 | import { CommunicationModule } from './modules/communication/communication.module'; 11 | import { EmailVerificationModule } from './modules/email-verification/email-verification.module'; 12 | import { FeaturesModule } from './modules/features/features.module'; 13 | 14 | ConfigModule.forRoot(); 15 | 16 | // Extended 'User' type of Passportjs 17 | // TODO: Move somewhere else 18 | declare global { 19 | // eslint-disable-next-line @typescript-eslint/no-namespace 20 | namespace Express { 21 | interface User { 22 | id: number; 23 | } 24 | } 25 | } 26 | 27 | @Module({ 28 | imports: [ 29 | AuthModule, 30 | UserModule, 31 | FeaturesModule, 32 | CommunicationModule, 33 | EmailVerificationModule, 34 | ], 35 | controllers: [AppController], 36 | providers: [ 37 | { 38 | provide: APP_FILTER, 39 | useClass: HttpExceptionFilter, 40 | }, 41 | AppService, 42 | PrismaService, 43 | ], 44 | }) 45 | export class AppModule {} 46 | -------------------------------------------------------------------------------- /packages/prisma/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@prisma/client@^4.2.1": 6 | version "4.2.1" 7 | resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.2.1.tgz#b384587f6066070381ea4c90228a14697a0c271b" 8 | integrity sha512-PZBkY60+k5oix+e6IUfl3ub8TbRLNsPLdfWrdy2eh80WcHTaT+/UfvXf/B7gXedH7FRtbPFHZXk1hZenJiJZFQ== 9 | dependencies: 10 | "@prisma/engines-version" "4.2.0-33.2920a97877e12e055c1333079b8d19cee7f33826" 11 | 12 | "@prisma/engines-version@4.2.0-33.2920a97877e12e055c1333079b8d19cee7f33826": 13 | version "4.2.0-33.2920a97877e12e055c1333079b8d19cee7f33826" 14 | resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.2.0-33.2920a97877e12e055c1333079b8d19cee7f33826.tgz#63917e579b9f15460f102eaf08a4411a7e0666e7" 15 | integrity sha512-tktkqdiwqE4QhmE088boPt+FwPj1Jub/zk+5F6sEfcRHzO5yz9jyMD5HFVtiwxZPLx/8Xg9ElnuTi8E5lWVQFQ== 16 | 17 | "@prisma/engines@4.2.1": 18 | version "4.2.1" 19 | resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.2.1.tgz#60c7d0acc1c0c5b70ece712e2cbe13f46a345d6e" 20 | integrity sha512-0KqBwREUOjBiHwITsQzw2DWfLHjntvbqzGRawj4sBMnIiL5CXwyDUKeHOwXzKMtNr1rEjxEsypM14g0CzLRK3g== 21 | 22 | prisma@^4.2.1: 23 | version "4.2.1" 24 | resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.2.1.tgz#3558359f15021aa4767de8c6d0ca1f285cf33d65" 25 | integrity sha512-HuYqnTDgH8atjPGtYmY0Ql9XrrJnfW7daG1PtAJRW0E6gJxc50lY3vrIDn0yjMR3TvRlypjTcspQX8DT+xD4Sg== 26 | dependencies: 27 | "@prisma/engines" "4.2.1" 28 | -------------------------------------------------------------------------------- /packages/webapp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webapp", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@ant-design/icons": "^4.7.0", 7 | "@ant-design/pro-components": "^1.1.6", 8 | "@reduxjs/toolkit": "^1.8.2", 9 | "@rns/dtos": "1.0.0", 10 | "@rns/prisma": "1.0.0", 11 | "@types/react-google-recaptcha": "^2.1.5", 12 | "antd": "^4.21.3", 13 | "axios": "^0.27.2", 14 | "react": "^18.2.0", 15 | "react-dom": "^18.2.0", 16 | "react-google-recaptcha": "^2.1.0", 17 | "react-redux": "^8.0.2", 18 | "react-router-dom": "^6.3.0", 19 | "web-vitals": "^2.1.4" 20 | }, 21 | "scripts": { 22 | "start": "vite", 23 | "build": "tsc && vite build", 24 | "serve": "vite preview" 25 | }, 26 | "eslintConfig": { 27 | "extends": [ 28 | "react-app", 29 | "react-app/jest" 30 | ] 31 | }, 32 | "browserslist": { 33 | "production": [ 34 | ">0.2%", 35 | "not dead", 36 | "not op_mini all" 37 | ], 38 | "development": [ 39 | "last 1 chrome version", 40 | "last 1 firefox version", 41 | "last 1 safari version" 42 | ] 43 | }, 44 | "devDependencies": { 45 | "@testing-library/jest-dom": "^5.16.4", 46 | "@testing-library/react": "^13.3.0", 47 | "@testing-library/user-event": "^13.5.0", 48 | "@types/jest": "^27.5.2", 49 | "@types/node": "^16.11.41", 50 | "@types/react": "^18.0.14", 51 | "@types/react-dom": "^18.0.5", 52 | "@vitejs/plugin-react": "^2.0.1", 53 | "less": "^4.1.3", 54 | "less-loader": "^11.0.0", 55 | "typescript": "^4.7.4", 56 | "vite": "^3.0.9", 57 | "vite-plugin-imp": "^2.2.0" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /packages/server/src/modules/auth/auth.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, Logger } from '@nestjs/common'; 2 | import { JwtService } from '@nestjs/jwt'; 3 | import { UserService } from 'src/modules/user/user.service'; 4 | import * as bcrypt from 'bcrypt'; 5 | import { LoginInput, RegisterInput } from '@rns/dtos'; 6 | import { EmailVerificationService } from '../email-verification/email-verification.service'; 7 | import { FeaturesService } from '../features/features.service'; 8 | 9 | @Injectable() 10 | export class AuthService { 11 | private readonly logger = new Logger(AuthService.name); 12 | 13 | constructor( 14 | private userService: UserService, 15 | private jwtService: JwtService, 16 | private emailVerificationService: EmailVerificationService, 17 | private featuresService: FeaturesService, 18 | ) {} 19 | 20 | async login(body: LoginInput) { 21 | const user = await this.userService.findUser({ 22 | email: body.email, 23 | }); 24 | if (user) { 25 | const isValidPassword = await bcrypt.compare( 26 | body.password, 27 | user.password, 28 | ); 29 | if (isValidPassword) { 30 | this.logger.log( 31 | `Credentials are matched, signing jwt for user ${user.email}`, 32 | ); 33 | return this.jwtService.sign({ id: user.id, email: user.email }); 34 | } 35 | } 36 | 37 | this.logger.log(`Invalid login attempt for user ${body.email}`); 38 | 39 | throw new Error('WRONG_CREDENTIALS'); 40 | } 41 | 42 | async register(body: RegisterInput) { 43 | const salt = await bcrypt.genSalt(10); 44 | const user = await this.userService.createUser({ 45 | ...body, 46 | password: await bcrypt.hash(body.password, salt), 47 | }); 48 | this.logger.log(`User registered successfully ${body.email}`); 49 | this.logger.log(`Signing jwt for user ${user.email}`); 50 | 51 | if (this.featuresService.getFeature('emailVerification').enabled) { 52 | // Don't block the HTTP call with verification email sending, so no await here 53 | this.emailVerificationService.sendVerificationEmail(user); 54 | } 55 | 56 | return this.jwtService.sign({ id: user.id, email: user.email }); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /packages/webapp/src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ReactNestStarter 2 | 3 | _Scroll down for images_ 4 | 5 | This starter includes a ReactJS application with Nest backend. Features: 6 | 7 | - JWT user authentication with Nest/Passport js ⭐ 8 | - Prisma ORM ⭐ 9 | - Full Typescript ⭐ 10 | - Lerna monorepo ⭐ 11 | - Antd / RTK Query libraries used ⭐ 12 | - Email verification api and pages 13 | 14 | #### A React js application for frontend 15 | 16 | - React-router integrated 17 | - Login/register user flows added 18 | - Base layout, logged in layout logics added 19 | - [Vitejs](https://vitejs.dev/) used for build 20 | - [RTK Query](https://redux-toolkit.js.org/rtk-query/overview) used for api calls 21 | - [Antd](https://github.com/ant-design/ant-design) / [Antd Pro components](https://procomponents.ant.design/en-US/components/) used for UI 22 | - Directory: - packages/webapp 23 | 24 | #### A Nest js application for backend 25 | 26 | - [Nestjs](https://nestjs.com/) for server used 27 | - [Prisma](https://www.prisma.io/) for ORM used 28 | - Sqlite for database used 29 | - Login/register endpoints added with validations 30 | - Directory: - packages/server 31 | 32 | ### How to use this starter kit? 33 | 34 | First clone the repository, cd into it and install dependencies: 35 | 36 | ``` 37 | git clone https://github.com/ozgurrgul/ReactNestStarter.git 38 | cd ReactNestStarter 39 | yarn 40 | lerna bootstrap # will install dependencies in each package 41 | ``` 42 | 43 | Then run using following commands: 44 | 45 | In order to run frontend: 46 | 47 | ``` 48 | web:start 49 | ``` 50 | 51 | Go to [http://127.0.0.1:5173](http://127.0.0.1:5173) 52 | 53 | In order to run server: 54 | 55 | ``` 56 | server:start 57 | ``` 58 | 59 | Server runs on http://127.0.0.1:3002 by default 60 | 61 | ⚠️ The `webapp` and `server` shared the `dtos` project in order to reduce code duplication. When you make a change to `dtos` package, you need to run: 62 | 63 | ``` 64 | yarn dto:compile 65 | ``` 66 | 67 | _Execute all commands from the main directory_ 68 | 69 | ### Environment 70 | 71 | /packages/server/.env: 72 | 73 | ``` 74 | RECAPTCHA_SECRET_KEY=xxx 75 | WEBAPP_URL=http://localhost:5173 76 | 77 | FEATURE_EMAIL_VERIFICATION_ENABLED=true 78 | FEATURE_EMAIL_VERIFICATION_TOKEN_SECRET=xxx 79 | ``` 80 | 81 | /packages/webapp/.env 82 | 83 | ``` 84 | VITE_API_URL=http://localhost:3002 # url of running server 85 | VITE_RECAPTCHA_SITE_KEY= 86 | ``` 87 | 88 | /packages/prisma/.env 89 | 90 | ``` 91 | DATABASE_URL="file:./dev.db" 92 | ``` 93 | 94 | ### Images 95 | 96 | - Login screen ![Login screen](https://github.com/ozgurrgul/ReactNestStarter/blob/main/images/1.png?raw=true) 97 | 98 | - Dashboard screen ![Dashboard screen](https://github.com/ozgurrgul/ReactNestStarter/blob/main/images/2.png?raw=true) 99 | -------------------------------------------------------------------------------- /packages/server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@rns/server", 3 | "version": "0.0.1", 4 | "description": "", 5 | "author": "", 6 | "private": true, 7 | "license": "UNLICENSED", 8 | "scripts": { 9 | "prebuild": "rimraf dist", 10 | "build": "nest build", 11 | "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", 12 | "start": "nest start", 13 | "start:dev": "nest start --watch", 14 | "start:debug": "nest start --debug --watch", 15 | "start:prod": "node dist/main", 16 | "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", 17 | "test": "jest", 18 | "test:watch": "jest --watch", 19 | "test:cov": "jest --coverage", 20 | "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", 21 | "test:e2e": "jest --config ./test/jest-e2e.json" 22 | }, 23 | "dependencies": { 24 | "@nestjs/common": "^8.0.0", 25 | "@nestjs/config": "^2.2.0", 26 | "@nestjs/core": "^8.0.0", 27 | "@nestjs/jwt": "^8.0.1", 28 | "@nestjs/passport": "^8.2.2", 29 | "@nestjs/platform-express": "^9.0.11", 30 | "@rns/dtos": "1.0.0", 31 | "@rns/prisma": "1.0.0", 32 | "axios": "^0.27.2", 33 | "bcrypt": "^5.0.1", 34 | "class-transformer": "^0.5.1", 35 | "class-validator": "^0.13.2", 36 | "passport": "^0.6.0", 37 | "passport-jwt": "^4.0.0", 38 | "passport-local": "^1.0.0", 39 | "reflect-metadata": "^0.1.13", 40 | "rxjs": "^7.5.6" 41 | }, 42 | "devDependencies": { 43 | "@nestjs/cli": "^8.0.0", 44 | "@nestjs/schematics": "^8.0.0", 45 | "@nestjs/testing": "^8.0.0", 46 | "@types/express": "^4.17.13", 47 | "@types/jest": "27.5.0", 48 | "@types/node": "^16.0.0", 49 | "@types/passport-jwt": "^3.0.6", 50 | "@types/passport-local": "^1.0.34", 51 | "@types/supertest": "^2.0.11", 52 | "@typescript-eslint/eslint-plugin": "^5.0.0", 53 | "@typescript-eslint/parser": "^5.0.0", 54 | "eslint": "^8.0.1", 55 | "eslint-config-prettier": "^8.3.0", 56 | "eslint-plugin-prettier": "^4.0.0", 57 | "jest": "28.0.3", 58 | "prettier": "^2.3.2", 59 | "prisma": "^3.15.2", 60 | "source-map-support": "^0.5.20", 61 | "supertest": "^6.1.3", 62 | "ts-jest": "28.0.1", 63 | "ts-loader": "^9.2.3", 64 | "ts-node": "^10.0.0", 65 | "tsconfig-paths": "4.0.0", 66 | "typescript": "^4.3.5" 67 | }, 68 | "jest": { 69 | "moduleFileExtensions": [ 70 | "js", 71 | "json", 72 | "ts" 73 | ], 74 | "rootDir": "src", 75 | "testRegex": ".*\\.spec\\.ts$", 76 | "transform": { 77 | "^.+\\.(t|j)s$": "ts-jest" 78 | }, 79 | "collectCoverageFrom": [ 80 | "**/*.(t|j)s" 81 | ], 82 | "coverageDirectory": "../coverage", 83 | "testEnvironment": "node" 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /packages/server/src/modules/email-verification/email-verification.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, Logger } from '@nestjs/common'; 2 | import { PrismaService } from '../../services/prisma.service'; 3 | import { User } from '@rns/prisma'; 4 | import { VerifyTokenInput } from '@rns/dtos'; 5 | import { CommunicationService } from '../communication/communication.service'; 6 | import { JwtService } from '@nestjs/jwt'; 7 | import { UserService } from '../user/user.service'; 8 | import { FeaturesService } from '../features/features.service'; 9 | import { EmailVerificationFeature } from '../features/types'; 10 | 11 | type TokenPayload = { userId: number }; 12 | 13 | @Injectable() 14 | export class EmailVerificationService { 15 | private readonly logger = new Logger(EmailVerificationService.name); 16 | 17 | constructor( 18 | private prisma: PrismaService, 19 | private communicationService: CommunicationService, 20 | private jwtService: JwtService, 21 | private userService: UserService, 22 | private featuresService: FeaturesService, 23 | ) {} 24 | 25 | async sendVerificationEmail(user: User) { 26 | this.logger.log( 27 | `Started send verification email process for user ${user.email}`, 28 | ); 29 | const payload: TokenPayload = { userId: user.id }; 30 | const token = this.jwtService.sign(payload, { 31 | expiresIn: `300s`, 32 | secret: ( 33 | this.featuresService.getFeature( 34 | 'emailVerification', 35 | ) as EmailVerificationFeature 36 | ).privateConfig.tokenSecret, 37 | }); 38 | const title = 'Email Verification'; 39 | const content = `Please go to following link to verify your email: ${process.env.WEBAPP_URL}/email/verify?token=${token}`; 40 | await this.communicationService.sendEmail(user.email, title, content); 41 | } 42 | 43 | async resendVerificationEmail(userId: number) { 44 | const user = await this.userService.findUser({ id: userId }); 45 | if (!user) { 46 | this.logger.log(`User ${userId} not found`); 47 | throw new Error('USER_NOT_FOUND'); 48 | } 49 | if (user.emailVerified) { 50 | this.logger.log( 51 | `User ${userId} is already verified, not sending verify email`, 52 | ); 53 | return; 54 | } 55 | await this.sendVerificationEmail(user); 56 | } 57 | 58 | async verifyToken(body: VerifyTokenInput) { 59 | const { token } = body; 60 | this.logger.log(`Started verifying email for token ${token}`); 61 | let payload: TokenPayload; 62 | try { 63 | payload = await this.jwtService.verify(token, { 64 | secret: ( 65 | this.featuresService.getFeature( 66 | 'emailVerification', 67 | ) as EmailVerificationFeature 68 | ).privateConfig.tokenSecret, 69 | }); 70 | } catch (err) { 71 | this.logger.log('Token verifying failed ' + err); 72 | throw new Error('USER_EMAIL_VERIFICATION_TOKEN_VERIFY_FAILED'); 73 | } 74 | 75 | if (!payload) { 76 | throw new Error('USER_EMAIL_VERIFICATION_TOKEN_NOT_VALID'); 77 | } 78 | 79 | const { userId } = payload; 80 | const user = await this.prisma.user.findFirst({ where: { id: userId } }); 81 | if (user.emailVerified) { 82 | throw new Error('USER_EMAIL_VERIFICATION_ALREADY_VERIFIED'); 83 | } 84 | 85 | await this.prisma.user.update({ 86 | where: { 87 | id: userId, 88 | }, 89 | data: { 90 | emailVerified: true, 91 | }, 92 | }); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /packages/webapp/src/pages/auth/LoginPage.tsx: -------------------------------------------------------------------------------- 1 | import React, { useRef } from "react"; 2 | import { Link, useNavigate } from "react-router-dom"; 3 | import ReCaptcha from "react-google-recaptcha"; 4 | import { api, useLoginMutation } from "../../services/api"; 5 | import { setToken } from "../../slices/authSlice"; 6 | import { useDispatch } from "react-redux"; 7 | import { HttpResult } from "../../components/shared/HttpResult"; 8 | import { 9 | MailOutlined, 10 | LockOutlined, 11 | RightCircleOutlined, 12 | } from "@ant-design/icons"; 13 | import { ProFormText, LoginFormPage } from "@ant-design/pro-components"; 14 | import { Space } from "antd"; 15 | 16 | export const LoginPage: React.FC = () => { 17 | const navigate = useNavigate(); 18 | const dispatch = useDispatch(); 19 | const captchaRef = useRef(null); 20 | 21 | const [login, { isLoading, error }] = useLoginMutation(); 22 | 23 | const onFinish = async (formState: any) => { 24 | if (isLoading) { 25 | return; 26 | } 27 | if (!captchaRef.current) { 28 | return; 29 | } 30 | const token = captchaRef.current.getValue(); 31 | if (!token) { 32 | return; 33 | } 34 | captchaRef.current.reset(); 35 | const loginOutput = await login({ 36 | email: formState.email, 37 | password: formState.password, 38 | recaptcha_token: token, 39 | }).unwrap(); 40 | dispatch(setToken(loginOutput.data)); 41 | dispatch(api.util.resetApiState()); 42 | navigate("/"); 43 | }; 44 | 45 | return ( 46 |
51 | 64 | 65 | Register 66 | 67 | 68 | 69 | } 70 | > 71 | <> 72 |
73 | 74 |
75 | , 80 | }} 81 | placeholder="Email" 82 | rules={[ 83 | { 84 | required: true, 85 | message: "Required", 86 | }, 87 | ]} 88 | /> 89 | , 94 | }} 95 | placeholder={"Password"} 96 | rules={[ 97 | { 98 | required: true, 99 | message: "Required", 100 | }, 101 | ]} 102 | /> 103 | 104 |
109 | {/* TODO: remember me functionality */} 110 | {/* 111 | Remember me 112 | */} 113 | {/* 118 | Forgot password 119 | */} 120 |
121 | 122 | 126 | 127 |
128 |
129 | ); 130 | }; 131 | -------------------------------------------------------------------------------- /packages/webapp/src/pages/auth/RegisterPage.tsx: -------------------------------------------------------------------------------- 1 | import React, { useRef } from "react"; 2 | import { Link, useNavigate } from "react-router-dom"; 3 | import ReCaptcha from "react-google-recaptcha"; 4 | import { Space } from "antd"; 5 | import { api, useRegisterMutation } from "../../services/api"; 6 | import { setToken } from "../../slices/authSlice"; 7 | import { useDispatch } from "react-redux"; 8 | import { HttpResult } from "../../components/shared/HttpResult"; 9 | import { 10 | RightCircleOutlined, 11 | UserOutlined, 12 | LockOutlined, 13 | MailOutlined, 14 | } from "@ant-design/icons"; 15 | import { LoginFormPage, ProFormText } from "@ant-design/pro-components"; 16 | import { useFeatures } from "../../hooks/useFeatures"; 17 | 18 | export const RegisterPage: React.FC = () => { 19 | const navigate = useNavigate(); 20 | const dispatch = useDispatch(); 21 | const captchaRef = useRef(null); 22 | const { isFeatureEnabled } = useFeatures(); 23 | 24 | const [register, { isLoading, error }] = useRegisterMutation(); 25 | 26 | const onFinish = async (formState: any) => { 27 | if (isLoading || !captchaRef.current) { 28 | return; 29 | } 30 | 31 | const token = captchaRef.current.getValue(); 32 | if (!token) { 33 | return; 34 | } 35 | 36 | captchaRef.current.reset(); 37 | const registerOutput = await register({ 38 | email: formState.email, 39 | password: formState.password, 40 | fullName: formState.fullName, 41 | recaptcha_token: token, 42 | }).unwrap(); 43 | 44 | dispatch(setToken(registerOutput.data)); 45 | dispatch(api.util.resetApiState()); 46 | navigate("/"); 47 | }; 48 | 49 | return ( 50 |
55 | 68 | 69 | Login 70 | 71 | 72 | 73 | } 74 | > 75 |
76 | 77 |
78 | , 83 | }} 84 | placeholder="Full name" 85 | rules={[ 86 | { 87 | required: true, 88 | message: "Required", 89 | }, 90 | ]} 91 | /> 92 | , 97 | }} 98 | placeholder="Email" 99 | rules={[ 100 | { 101 | required: true, 102 | message: "Required", 103 | }, 104 | ]} 105 | extra={ 106 | isFeatureEnabled("emailVerification") 107 | ? "Check your inbox after registering to verify your email" 108 | : undefined 109 | } 110 | /> 111 | , 116 | }} 117 | placeholder={"Password"} 118 | rules={[ 119 | { 120 | required: true, 121 | message: "Required", 122 | }, 123 | ]} 124 | /> 125 | 126 | 130 | 131 |
132 |
133 | ); 134 | }; 135 | -------------------------------------------------------------------------------- /packages/webapp/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@adobe/css-tools@^4.0.1": 6 | version "4.0.1" 7 | resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" 8 | integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== 9 | 10 | "@ampproject/remapping@^2.1.0": 11 | version "2.2.0" 12 | resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" 13 | integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== 14 | dependencies: 15 | "@jridgewell/gen-mapping" "^0.1.0" 16 | "@jridgewell/trace-mapping" "^0.3.9" 17 | 18 | "@ant-design/colors@^6.0.0": 19 | version "6.0.0" 20 | resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298" 21 | integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ== 22 | dependencies: 23 | "@ctrl/tinycolor" "^3.4.0" 24 | 25 | "@ant-design/icons-svg@^4.2.1": 26 | version "4.2.1" 27 | resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz#8630da8eb4471a4aabdaed7d1ff6a97dcb2cf05a" 28 | integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw== 29 | 30 | "@ant-design/icons@^4.0.0", "@ant-design/icons@^4.1.0", "@ant-design/icons@^4.2.1", "@ant-design/icons@^4.3.0", "@ant-design/icons@^4.7.0": 31 | version "4.7.0" 32 | resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-4.7.0.tgz#8c3cbe0a556ba92af5dc7d1e70c0b25b5179af0f" 33 | integrity sha512-aoB4Z7JA431rt6d4u+8xcNPPCrdufSRMUOpxa1ab6mz1JCQZOEVolj2WVs/tDFmN62zzK30mNelEsprLYsSF3g== 34 | dependencies: 35 | "@ant-design/colors" "^6.0.0" 36 | "@ant-design/icons-svg" "^4.2.1" 37 | "@babel/runtime" "^7.11.2" 38 | classnames "^2.2.6" 39 | rc-util "^5.9.4" 40 | 41 | "@ant-design/pro-card@1.20.18": 42 | version "1.20.18" 43 | resolved "https://registry.yarnpkg.com/@ant-design/pro-card/-/pro-card-1.20.18.tgz#6566bc41775f35867b0400737b4e48baca04b6a2" 44 | integrity sha512-wXv+EP07TRWGwpL1D0jpy0yLyQVMlV3Uv405iP/pT32gF0KV2ex0nd6+udCFf4QpTVhiJAPz3/JUbDhYGxnuIw== 45 | dependencies: 46 | "@ant-design/icons" "^4.2.1" 47 | "@ant-design/pro-utils" "1.45.0" 48 | "@babel/runtime" "^7.18.0" 49 | antd "^4.20.0 " 50 | classnames "^2.2.6" 51 | omit.js "^2.0.2" 52 | rc-util "^5.4.0" 53 | 54 | "@ant-design/pro-components@^1.1.6": 55 | version "1.1.17" 56 | resolved "https://registry.yarnpkg.com/@ant-design/pro-components/-/pro-components-1.1.17.tgz#d53b507ef9c3b195ef4394fe5830ecb6b12293bb" 57 | integrity sha512-Q3fYwA9Xuen/u6gM3ErnIJIFSrsI2hnSKBBq7e+JaocukTagMwwhO8cZoZcRTLj/o5rUkx8AT7cfD/wgljniZg== 58 | dependencies: 59 | "@ant-design/pro-card" "1.20.18" 60 | "@ant-design/pro-descriptions" "1.12.0" 61 | "@ant-design/pro-field" "1.36.0" 62 | "@ant-design/pro-form" "1.74.0" 63 | "@ant-design/pro-layout" "6.38.19" 64 | "@ant-design/pro-list" "1.21.79" 65 | "@ant-design/pro-provider" "1.10.0" 66 | "@ant-design/pro-skeleton" "1.0.13" 67 | "@ant-design/pro-table" "2.80.0" 68 | "@ant-design/pro-utils" "1.45.0" 69 | "@babel/runtime" "^7.16.3" 70 | antd "^4.20.0 " 71 | 72 | "@ant-design/pro-descriptions@1.12.0": 73 | version "1.12.0" 74 | resolved "https://registry.yarnpkg.com/@ant-design/pro-descriptions/-/pro-descriptions-1.12.0.tgz#e654c6f4a4e12e4f7da9028c51721066721239b0" 75 | integrity sha512-r1LgcFUWaJZ9MzGcYp9cKH/bG14u4gKEwqTv0PkyEGW6prLz/pHQj8iUMm0eYe7OgCRG667eKKpGoby4OfPVxA== 76 | dependencies: 77 | "@ant-design/pro-field" "1.36.0" 78 | "@ant-design/pro-form" "1.74.0" 79 | "@ant-design/pro-skeleton" "1.0.13" 80 | "@ant-design/pro-utils" "1.45.0" 81 | "@babel/runtime" "^7.18.0" 82 | antd "^4.20.0 " 83 | rc-util "^5.0.6" 84 | use-json-comparison "^1.0.5" 85 | 86 | "@ant-design/pro-field@1.36.0": 87 | version "1.36.0" 88 | resolved "https://registry.yarnpkg.com/@ant-design/pro-field/-/pro-field-1.36.0.tgz#e0918f6cb6c670f25242682d92c54668324f3de0" 89 | integrity sha512-MLwjXTzKq1YrwBV4RHrJIclCYx12iEAy3NCT3hPWBOTHds4BDwTcNOm8f8NmbZ/s2KtSBwujqFl+iC1+kDBJ8g== 90 | dependencies: 91 | "@ant-design/icons" "^4.2.1" 92 | "@ant-design/pro-provider" "1.10.0" 93 | "@ant-design/pro-utils" "1.45.0" 94 | "@babel/runtime" "^7.18.0" 95 | "@chenshuai2144/sketch-color" "^1.0.8" 96 | antd "^4.20.0 " 97 | classnames "^2.2.6" 98 | lodash.tonumber "^4.0.3" 99 | moment "^2.27.0" 100 | omit.js "^2.0.2" 101 | rc-util "^5.4.0" 102 | swr "^1.2.0" 103 | 104 | "@ant-design/pro-form@1.74.0": 105 | version "1.74.0" 106 | resolved "https://registry.yarnpkg.com/@ant-design/pro-form/-/pro-form-1.74.0.tgz#ea758d3d847c368d0f6e348e3301705998ca1bbd" 107 | integrity sha512-11aOOoXug3eGC3C1ELPQLmREoQQ8LOMMil9cUVdmXvC5WuZzu2NWrDvnxeFYADjmrexVTo59TfnytEJWRgulvw== 108 | dependencies: 109 | "@ant-design/icons" "^4.2.1" 110 | "@ant-design/pro-field" "1.36.0" 111 | "@ant-design/pro-provider" "1.10.0" 112 | "@ant-design/pro-utils" "1.45.0" 113 | "@babel/runtime" "^7.18.0" 114 | "@umijs/use-params" "^1.0.9" 115 | antd "^4.20.0 " 116 | classnames "^2.2.6" 117 | lodash.merge "^4.6.2" 118 | omit.js "^2.0.2" 119 | rc-resize-observer "^1.1.0" 120 | rc-util "^5.0.6" 121 | use-json-comparison "^1.0.5" 122 | use-media-antd-query "^1.1.0" 123 | 124 | "@ant-design/pro-layout@6.38.19": 125 | version "6.38.19" 126 | resolved "https://registry.yarnpkg.com/@ant-design/pro-layout/-/pro-layout-6.38.19.tgz#9e8a8c3e5aea42dc5bf5b54a883763cb181dbc2a" 127 | integrity sha512-GH88dJWvR2yuZL5K4fbIKm0PW3Y/LUsjC3xHZuazbaQJvHlFjm2L7xvSP3hd5FLkSABcbMVe6Ol6WC1/Br73FA== 128 | dependencies: 129 | "@ant-design/icons" "^4.0.0" 130 | "@ant-design/pro-provider" "1.10.0" 131 | "@ant-design/pro-utils" "1.45.0" 132 | "@babel/runtime" "^7.18.0" 133 | "@umijs/route-utils" "^2.1.0" 134 | "@umijs/ssr-darkreader" "^4.9.44" 135 | "@umijs/use-params" "^1.0.9" 136 | antd "^4.20.0 " 137 | classnames "^2.2.6" 138 | lodash.merge "^4.6.2" 139 | omit.js "^2.0.2" 140 | path-to-regexp "2.4.0" 141 | rc-resize-observer "^1.1.0" 142 | rc-util "^5.0.6" 143 | swr "^1.2.0" 144 | unstated-next "^1.1.0" 145 | use-json-comparison "^1.0.3" 146 | use-media-antd-query "^1.1.0" 147 | warning "^4.0.3" 148 | 149 | "@ant-design/pro-list@1.21.79": 150 | version "1.21.79" 151 | resolved "https://registry.yarnpkg.com/@ant-design/pro-list/-/pro-list-1.21.79.tgz#facb5521bf4378d0d346420791f50990373a32f3" 152 | integrity sha512-BjqaIXoRtC2qPkzVRfFDzv5FTaURJHGujbnR1sHw1DSOYvKTMW59oPRomFqHQxH6YsgS9qKYPKK/SmmcOSTcag== 153 | dependencies: 154 | "@ant-design/icons" "^4.0.0" 155 | "@ant-design/pro-card" "1.20.18" 156 | "@ant-design/pro-field" "1.36.0" 157 | "@ant-design/pro-table" "2.80.0" 158 | "@babel/runtime" "^7.18.0" 159 | antd "^4.20.0 " 160 | classnames "^2.2.6" 161 | moment "^2.24.0" 162 | rc-resize-observer "^1.0.0" 163 | rc-util "^4.19.0" 164 | unstated-next "^1.1.0" 165 | use-media-antd-query "^1.1.0" 166 | 167 | "@ant-design/pro-provider@1.10.0": 168 | version "1.10.0" 169 | resolved "https://registry.yarnpkg.com/@ant-design/pro-provider/-/pro-provider-1.10.0.tgz#6f15a5a7600d6ec7dd42755c4727254a9df46dbd" 170 | integrity sha512-gbQtq+Qlnob6aEghiWX/kXEzNhe4eOFlv5Ue2/xsal+22qvot/kFoOB652TD76fMI7vlkoema1pTKsvD5Uji6A== 171 | dependencies: 172 | "@babel/runtime" "^7.18.0" 173 | antd "^4.20.0 " 174 | rc-util "^5.0.1" 175 | swr "^1.2.0" 176 | 177 | "@ant-design/pro-skeleton@1.0.13": 178 | version "1.0.13" 179 | resolved "https://registry.yarnpkg.com/@ant-design/pro-skeleton/-/pro-skeleton-1.0.13.tgz#09443af2f104cca63ecf48b9c3713a9c431721b2" 180 | integrity sha512-EWkW7ZqnT7NsyJTmxd0btrRpJFNLBkE2ceaKgp2Cz7GOC0l8yWX/TaNs6yb10j0DH6AB9YBXZNd2mxZ2MyQgGA== 181 | dependencies: 182 | "@babel/runtime" "^7.18.0" 183 | antd "^4.20.0 " 184 | use-media-antd-query "^1.1.0" 185 | 186 | "@ant-design/pro-table@2.80.0": 187 | version "2.80.0" 188 | resolved "https://registry.yarnpkg.com/@ant-design/pro-table/-/pro-table-2.80.0.tgz#8b7e9597a03eb9ace28cfbbdc8d4cfb13e83ee8b" 189 | integrity sha512-mumG8uDjInXC9pdxebhO5wLWHraBgqIyt7fnRGw+zRwPQ38mA5NNe42amqPuXM2gpv+Jr4QYc505xcv+l84heA== 190 | dependencies: 191 | "@ant-design/icons" "^4.1.0" 192 | "@ant-design/pro-card" "1.20.18" 193 | "@ant-design/pro-field" "1.36.0" 194 | "@ant-design/pro-form" "1.74.0" 195 | "@ant-design/pro-provider" "1.10.0" 196 | "@ant-design/pro-utils" "1.45.0" 197 | "@babel/runtime" "^7.18.0" 198 | antd "^4.20.0 " 199 | classnames "^2.2.6" 200 | moment "^2.24.0" 201 | omit.js "^2.0.2" 202 | rc-util "^5.0.1" 203 | react-sortable-hoc "^2.0.0" 204 | unstated-next "^1.1.0" 205 | use-json-comparison "^1.0.5" 206 | use-media-antd-query "^1.1.0" 207 | 208 | "@ant-design/pro-utils@1.45.0": 209 | version "1.45.0" 210 | resolved "https://registry.yarnpkg.com/@ant-design/pro-utils/-/pro-utils-1.45.0.tgz#3853d7bf69e66eb78781671bb0d03b35a4edf54d" 211 | integrity sha512-Tk9uYj1Ep7ISeC4pk701jeQ91fUOG5zQmyNrKqeBo1i402ErcK7Nw9uCCvCUU3KxWmgywhWLy1VaVFl0KDQTgQ== 212 | dependencies: 213 | "@ant-design/icons" "^4.3.0" 214 | "@ant-design/pro-provider" "1.10.0" 215 | "@babel/runtime" "^7.18.0" 216 | antd "^4.20.0 " 217 | classnames "^2.2.6" 218 | moment "^2.27.0" 219 | rc-util "^5.0.6" 220 | react-sortable-hoc "^2.0.0" 221 | swr "^1.2.0" 222 | 223 | "@ant-design/react-slick@~0.29.1": 224 | version "0.29.2" 225 | resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-0.29.2.tgz#53e6a7920ea3562eebb304c15a7fc2d7e619d29c" 226 | integrity sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA== 227 | dependencies: 228 | "@babel/runtime" "^7.10.4" 229 | classnames "^2.2.5" 230 | json2mq "^0.2.0" 231 | lodash "^4.17.21" 232 | resize-observer-polyfill "^1.5.1" 233 | 234 | "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": 235 | version "7.18.6" 236 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" 237 | integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== 238 | dependencies: 239 | "@babel/highlight" "^7.18.6" 240 | 241 | "@babel/compat-data@^7.18.8": 242 | version "7.18.8" 243 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" 244 | integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== 245 | 246 | "@babel/core@^7.12.10", "@babel/core@^7.18.10": 247 | version "7.18.10" 248 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" 249 | integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== 250 | dependencies: 251 | "@ampproject/remapping" "^2.1.0" 252 | "@babel/code-frame" "^7.18.6" 253 | "@babel/generator" "^7.18.10" 254 | "@babel/helper-compilation-targets" "^7.18.9" 255 | "@babel/helper-module-transforms" "^7.18.9" 256 | "@babel/helpers" "^7.18.9" 257 | "@babel/parser" "^7.18.10" 258 | "@babel/template" "^7.18.10" 259 | "@babel/traverse" "^7.18.10" 260 | "@babel/types" "^7.18.10" 261 | convert-source-map "^1.7.0" 262 | debug "^4.1.0" 263 | gensync "^1.0.0-beta.2" 264 | json5 "^2.2.1" 265 | semver "^6.3.0" 266 | 267 | "@babel/generator@^7.12.11", "@babel/generator@^7.18.10": 268 | version "7.18.12" 269 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.12.tgz#fa58daa303757bd6f5e4bbca91b342040463d9f4" 270 | integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== 271 | dependencies: 272 | "@babel/types" "^7.18.10" 273 | "@jridgewell/gen-mapping" "^0.3.2" 274 | jsesc "^2.5.1" 275 | 276 | "@babel/helper-annotate-as-pure@^7.18.6": 277 | version "7.18.6" 278 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" 279 | integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== 280 | dependencies: 281 | "@babel/types" "^7.18.6" 282 | 283 | "@babel/helper-compilation-targets@^7.18.9": 284 | version "7.18.9" 285 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" 286 | integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== 287 | dependencies: 288 | "@babel/compat-data" "^7.18.8" 289 | "@babel/helper-validator-option" "^7.18.6" 290 | browserslist "^4.20.2" 291 | semver "^6.3.0" 292 | 293 | "@babel/helper-environment-visitor@^7.18.9": 294 | version "7.18.9" 295 | resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" 296 | integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== 297 | 298 | "@babel/helper-function-name@^7.18.9": 299 | version "7.18.9" 300 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" 301 | integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== 302 | dependencies: 303 | "@babel/template" "^7.18.6" 304 | "@babel/types" "^7.18.9" 305 | 306 | "@babel/helper-hoist-variables@^7.18.6": 307 | version "7.18.6" 308 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" 309 | integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== 310 | dependencies: 311 | "@babel/types" "^7.18.6" 312 | 313 | "@babel/helper-module-imports@^7.18.6": 314 | version "7.18.6" 315 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" 316 | integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== 317 | dependencies: 318 | "@babel/types" "^7.18.6" 319 | 320 | "@babel/helper-module-transforms@^7.18.9": 321 | version "7.18.9" 322 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" 323 | integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== 324 | dependencies: 325 | "@babel/helper-environment-visitor" "^7.18.9" 326 | "@babel/helper-module-imports" "^7.18.6" 327 | "@babel/helper-simple-access" "^7.18.6" 328 | "@babel/helper-split-export-declaration" "^7.18.6" 329 | "@babel/helper-validator-identifier" "^7.18.6" 330 | "@babel/template" "^7.18.6" 331 | "@babel/traverse" "^7.18.9" 332 | "@babel/types" "^7.18.9" 333 | 334 | "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9": 335 | version "7.18.9" 336 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" 337 | integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== 338 | 339 | "@babel/helper-simple-access@^7.18.6": 340 | version "7.18.6" 341 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" 342 | integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== 343 | dependencies: 344 | "@babel/types" "^7.18.6" 345 | 346 | "@babel/helper-split-export-declaration@^7.18.6": 347 | version "7.18.6" 348 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" 349 | integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== 350 | dependencies: 351 | "@babel/types" "^7.18.6" 352 | 353 | "@babel/helper-string-parser@^7.18.10": 354 | version "7.18.10" 355 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" 356 | integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== 357 | 358 | "@babel/helper-validator-identifier@^7.18.6": 359 | version "7.18.6" 360 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" 361 | integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== 362 | 363 | "@babel/helper-validator-option@^7.18.6": 364 | version "7.18.6" 365 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" 366 | integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== 367 | 368 | "@babel/helpers@^7.18.9": 369 | version "7.18.9" 370 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" 371 | integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== 372 | dependencies: 373 | "@babel/template" "^7.18.6" 374 | "@babel/traverse" "^7.18.9" 375 | "@babel/types" "^7.18.9" 376 | 377 | "@babel/highlight@^7.18.6": 378 | version "7.18.6" 379 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" 380 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== 381 | dependencies: 382 | "@babel/helper-validator-identifier" "^7.18.6" 383 | chalk "^2.0.0" 384 | js-tokens "^4.0.0" 385 | 386 | "@babel/parser@^7.12.11", "@babel/parser@^7.18.10", "@babel/parser@^7.18.11": 387 | version "7.18.11" 388 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" 389 | integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== 390 | 391 | "@babel/plugin-syntax-jsx@^7.18.6": 392 | version "7.18.6" 393 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" 394 | integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== 395 | dependencies: 396 | "@babel/helper-plugin-utils" "^7.18.6" 397 | 398 | "@babel/plugin-transform-react-jsx-development@^7.18.6": 399 | version "7.18.6" 400 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" 401 | integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== 402 | dependencies: 403 | "@babel/plugin-transform-react-jsx" "^7.18.6" 404 | 405 | "@babel/plugin-transform-react-jsx-self@^7.18.6": 406 | version "7.18.6" 407 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7" 408 | integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== 409 | dependencies: 410 | "@babel/helper-plugin-utils" "^7.18.6" 411 | 412 | "@babel/plugin-transform-react-jsx-source@^7.18.6": 413 | version "7.18.6" 414 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz#06e9ae8a14d2bc19ce6e3c447d842032a50598fc" 415 | integrity sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw== 416 | dependencies: 417 | "@babel/helper-plugin-utils" "^7.18.6" 418 | 419 | "@babel/plugin-transform-react-jsx@^7.18.10", "@babel/plugin-transform-react-jsx@^7.18.6": 420 | version "7.18.10" 421 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz#ea47b2c4197102c196cbd10db9b3bb20daa820f1" 422 | integrity sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A== 423 | dependencies: 424 | "@babel/helper-annotate-as-pure" "^7.18.6" 425 | "@babel/helper-module-imports" "^7.18.6" 426 | "@babel/helper-plugin-utils" "^7.18.9" 427 | "@babel/plugin-syntax-jsx" "^7.18.6" 428 | "@babel/types" "^7.18.10" 429 | 430 | "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.2.0", "@babel/runtime@^7.7.6", "@babel/runtime@^7.9.2": 431 | version "7.18.9" 432 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" 433 | integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== 434 | dependencies: 435 | regenerator-runtime "^0.13.4" 436 | 437 | "@babel/template@^7.18.10", "@babel/template@^7.18.6": 438 | version "7.18.10" 439 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" 440 | integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== 441 | dependencies: 442 | "@babel/code-frame" "^7.18.6" 443 | "@babel/parser" "^7.18.10" 444 | "@babel/types" "^7.18.10" 445 | 446 | "@babel/traverse@^7.12.12", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9": 447 | version "7.18.11" 448 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.11.tgz#3d51f2afbd83ecf9912bcbb5c4d94e3d2ddaa16f" 449 | integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ== 450 | dependencies: 451 | "@babel/code-frame" "^7.18.6" 452 | "@babel/generator" "^7.18.10" 453 | "@babel/helper-environment-visitor" "^7.18.9" 454 | "@babel/helper-function-name" "^7.18.9" 455 | "@babel/helper-hoist-variables" "^7.18.6" 456 | "@babel/helper-split-export-declaration" "^7.18.6" 457 | "@babel/parser" "^7.18.11" 458 | "@babel/types" "^7.18.10" 459 | debug "^4.1.0" 460 | globals "^11.1.0" 461 | 462 | "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9": 463 | version "7.18.10" 464 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" 465 | integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== 466 | dependencies: 467 | "@babel/helper-string-parser" "^7.18.10" 468 | "@babel/helper-validator-identifier" "^7.18.6" 469 | to-fast-properties "^2.0.0" 470 | 471 | "@chenshuai2144/sketch-color@^1.0.8": 472 | version "1.0.8" 473 | resolved "https://registry.yarnpkg.com/@chenshuai2144/sketch-color/-/sketch-color-1.0.8.tgz#5cde7ac1dae5687223a8f751b0e4f77a5776d566" 474 | integrity sha512-dPAzzWc+w7zyTAi71WXYZpiTYyIS80MxYyy2E/7jufhnJI1Z29wCPL35VvuJ/gs5zYpF2+w/B7BizWa2zKXpGw== 475 | dependencies: 476 | reactcss "^1.2.3" 477 | tinycolor2 "^1.4.2" 478 | 479 | "@ctrl/tinycolor@^3.4.0": 480 | version "3.4.1" 481 | resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz#75b4c27948c81e88ccd3a8902047bcd797f38d32" 482 | integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw== 483 | 484 | "@esbuild/linux-loong64@0.14.54": 485 | version "0.14.54" 486 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" 487 | integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== 488 | 489 | "@jest/expect-utils@^28.1.3": 490 | version "28.1.3" 491 | resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" 492 | integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== 493 | dependencies: 494 | jest-get-type "^28.0.2" 495 | 496 | "@jest/schemas@^28.1.3": 497 | version "28.1.3" 498 | resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" 499 | integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== 500 | dependencies: 501 | "@sinclair/typebox" "^0.24.1" 502 | 503 | "@jest/types@^28.1.3": 504 | version "28.1.3" 505 | resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" 506 | integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== 507 | dependencies: 508 | "@jest/schemas" "^28.1.3" 509 | "@types/istanbul-lib-coverage" "^2.0.0" 510 | "@types/istanbul-reports" "^3.0.0" 511 | "@types/node" "*" 512 | "@types/yargs" "^17.0.8" 513 | chalk "^4.0.0" 514 | 515 | "@jridgewell/gen-mapping@^0.1.0": 516 | version "0.1.1" 517 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" 518 | integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== 519 | dependencies: 520 | "@jridgewell/set-array" "^1.0.0" 521 | "@jridgewell/sourcemap-codec" "^1.4.10" 522 | 523 | "@jridgewell/gen-mapping@^0.3.2": 524 | version "0.3.2" 525 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" 526 | integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== 527 | dependencies: 528 | "@jridgewell/set-array" "^1.0.1" 529 | "@jridgewell/sourcemap-codec" "^1.4.10" 530 | "@jridgewell/trace-mapping" "^0.3.9" 531 | 532 | "@jridgewell/resolve-uri@^3.0.3": 533 | version "3.1.0" 534 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 535 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 536 | 537 | "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": 538 | version "1.1.2" 539 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" 540 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== 541 | 542 | "@jridgewell/sourcemap-codec@^1.4.10": 543 | version "1.4.14" 544 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 545 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 546 | 547 | "@jridgewell/trace-mapping@^0.3.9": 548 | version "0.3.15" 549 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" 550 | integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== 551 | dependencies: 552 | "@jridgewell/resolve-uri" "^3.0.3" 553 | "@jridgewell/sourcemap-codec" "^1.4.10" 554 | 555 | "@qixian.cs/path-to-regexp@^6.1.0": 556 | version "6.1.0" 557 | resolved "https://registry.yarnpkg.com/@qixian.cs/path-to-regexp/-/path-to-regexp-6.1.0.tgz#6b84ad01596332aba95fa29d2e70104698cd5c45" 558 | integrity sha512-2jIiLiVZB1jnY7IIRQKtoV8Gnr7XIhk4mC88ONGunZE3hYt5IHUG4BE/6+JiTBjjEWQLBeWnZB8hGpppkufiVw== 559 | 560 | "@reduxjs/toolkit@^1.8.2": 561 | version "1.8.5" 562 | resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.8.5.tgz#c14bece03ee08be88467f22dc0ecf9cf875527cd" 563 | integrity sha512-f4D5EXO7A7Xq35T0zRbWq5kJQyXzzscnHKmjnu2+37B3rwHU6mX9PYlbfXdnxcY6P/7zfmjhgan0Z+yuOfeBmA== 564 | dependencies: 565 | immer "^9.0.7" 566 | redux "^4.1.2" 567 | redux-thunk "^2.4.1" 568 | reselect "^4.1.5" 569 | 570 | "@sinclair/typebox@^0.24.1": 571 | version "0.24.28" 572 | resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.28.tgz#15aa0b416f82c268b1573ab653e4413c965fe794" 573 | integrity sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow== 574 | 575 | "@testing-library/dom@^8.5.0": 576 | version "8.17.1" 577 | resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.17.1.tgz#2d7af4ff6dad8d837630fecd08835aee08320ad7" 578 | integrity sha512-KnH2MnJUzmFNPW6RIKfd+zf2Wue8mEKX0M3cpX6aKl5ZXrJM1/c/Pc8c2xDNYQCnJO48Sm5ITbMXgqTr3h4jxQ== 579 | dependencies: 580 | "@babel/code-frame" "^7.10.4" 581 | "@babel/runtime" "^7.12.5" 582 | "@types/aria-query" "^4.2.0" 583 | aria-query "^5.0.0" 584 | chalk "^4.1.0" 585 | dom-accessibility-api "^0.5.9" 586 | lz-string "^1.4.4" 587 | pretty-format "^27.0.2" 588 | 589 | "@testing-library/jest-dom@^5.16.4": 590 | version "5.16.5" 591 | resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" 592 | integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== 593 | dependencies: 594 | "@adobe/css-tools" "^4.0.1" 595 | "@babel/runtime" "^7.9.2" 596 | "@types/testing-library__jest-dom" "^5.9.1" 597 | aria-query "^5.0.0" 598 | chalk "^3.0.0" 599 | css.escape "^1.5.1" 600 | dom-accessibility-api "^0.5.6" 601 | lodash "^4.17.15" 602 | redent "^3.0.0" 603 | 604 | "@testing-library/react@^13.3.0": 605 | version "13.3.0" 606 | resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.3.0.tgz#bf298bfbc5589326bbcc8052b211f3bb097a97c5" 607 | integrity sha512-DB79aA426+deFgGSjnf5grczDPiL4taK3hFaa+M5q7q20Kcve9eQottOG5kZ74KEr55v0tU2CQormSSDK87zYQ== 608 | dependencies: 609 | "@babel/runtime" "^7.12.5" 610 | "@testing-library/dom" "^8.5.0" 611 | "@types/react-dom" "^18.0.0" 612 | 613 | "@testing-library/user-event@^13.5.0": 614 | version "13.5.0" 615 | resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-13.5.0.tgz#69d77007f1e124d55314a2b73fd204b333b13295" 616 | integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg== 617 | dependencies: 618 | "@babel/runtime" "^7.12.5" 619 | 620 | "@types/aria-query@^4.2.0": 621 | version "4.2.2" 622 | resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" 623 | integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== 624 | 625 | "@types/hoist-non-react-statics@^3.3.1": 626 | version "3.3.1" 627 | resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" 628 | integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== 629 | dependencies: 630 | "@types/react" "*" 631 | hoist-non-react-statics "^3.3.0" 632 | 633 | "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": 634 | version "2.0.4" 635 | resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" 636 | integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== 637 | 638 | "@types/istanbul-lib-report@*": 639 | version "3.0.0" 640 | resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" 641 | integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== 642 | dependencies: 643 | "@types/istanbul-lib-coverage" "*" 644 | 645 | "@types/istanbul-reports@^3.0.0": 646 | version "3.0.1" 647 | resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" 648 | integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== 649 | dependencies: 650 | "@types/istanbul-lib-report" "*" 651 | 652 | "@types/jest@*": 653 | version "28.1.7" 654 | resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.7.tgz#a680c5d05b69634c2d54a63cb106d7fb1adaba16" 655 | integrity sha512-acDN4VHD40V24tgu0iC44jchXavRNVFXQ/E6Z5XNsswgoSO/4NgsXoEYmPUGookKldlZQyIpmrEXsHI9cA3ZTA== 656 | dependencies: 657 | expect "^28.0.0" 658 | pretty-format "^28.0.0" 659 | 660 | "@types/jest@^27.5.2": 661 | version "27.5.2" 662 | resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" 663 | integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== 664 | dependencies: 665 | jest-matcher-utils "^27.0.0" 666 | pretty-format "^27.0.0" 667 | 668 | "@types/node@*": 669 | version "18.7.8" 670 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.8.tgz#6bbf2be6fbf9c187a5040d4277d24a06a18957a1" 671 | integrity sha512-/YP55EMK2341JkODUb8DM9O0x1SIz2aBvyF33Uf1c76St3VpsMXEIW0nxuKkq/5cxnbz0RD9cfwNZHEAZQD3ag== 672 | 673 | "@types/node@^16.11.41": 674 | version "16.11.51" 675 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.51.tgz#bb2114485e6fc1460f630702fb992007d120e928" 676 | integrity sha512-h6p1A77pHBDdOcI9y6Wfh9iRGa8lMUZMk2ebHJTNTtRwgbQzgemZow6PW7+Xs7Z0r0IQFY1+iRlcNAkRrf53nA== 677 | 678 | "@types/prop-types@*": 679 | version "15.7.5" 680 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" 681 | integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== 682 | 683 | "@types/react-dom@^18.0.0", "@types/react-dom@^18.0.5": 684 | version "18.0.6" 685 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.6.tgz#36652900024842b74607a17786b6662dd1e103a1" 686 | integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA== 687 | dependencies: 688 | "@types/react" "*" 689 | 690 | "@types/react-google-recaptcha@^2.1.5": 691 | version "2.1.5" 692 | resolved "https://registry.yarnpkg.com/@types/react-google-recaptcha/-/react-google-recaptcha-2.1.5.tgz#af157dc2e4bde3355f9b815a64f90e85cfa9df8b" 693 | integrity sha512-iWTjmVttlNgp0teyh7eBXqNOQzVq2RWNiFROWjraOptRnb1OcHJehQnji0sjqIRAk9K0z8stjyhU+OLpPb0N6w== 694 | dependencies: 695 | "@types/react" "*" 696 | 697 | "@types/react@*", "@types/react@^18.0.14": 698 | version "18.0.17" 699 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.17.tgz#4583d9c322d67efe4b39a935d223edcc7050ccf4" 700 | integrity sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ== 701 | dependencies: 702 | "@types/prop-types" "*" 703 | "@types/scheduler" "*" 704 | csstype "^3.0.2" 705 | 706 | "@types/scheduler@*": 707 | version "0.16.2" 708 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" 709 | integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== 710 | 711 | "@types/stack-utils@^2.0.0": 712 | version "2.0.1" 713 | resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" 714 | integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== 715 | 716 | "@types/testing-library__jest-dom@^5.9.1": 717 | version "5.14.5" 718 | resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" 719 | integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== 720 | dependencies: 721 | "@types/jest" "*" 722 | 723 | "@types/use-sync-external-store@^0.0.3": 724 | version "0.0.3" 725 | resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" 726 | integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== 727 | 728 | "@types/yargs-parser@*": 729 | version "21.0.0" 730 | resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" 731 | integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== 732 | 733 | "@types/yargs@^17.0.8": 734 | version "17.0.11" 735 | resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.11.tgz#5e10ca33e219807c0eee0f08b5efcba9b6a42c06" 736 | integrity sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA== 737 | dependencies: 738 | "@types/yargs-parser" "*" 739 | 740 | "@umijs/route-utils@^2.1.0": 741 | version "2.2.0" 742 | resolved "https://registry.yarnpkg.com/@umijs/route-utils/-/route-utils-2.2.0.tgz#f76a02d2fc19ce70f9ad17308f80a4f3550ee65b" 743 | integrity sha512-1t/A5+KuoK+AX0FcddNbUKMpMskuDsSSZRlQoTXDBBTDKUgWwG8KSX/NnfTCYJQrntL4A9WYymygop1jAw+Wdw== 744 | dependencies: 745 | "@qixian.cs/path-to-regexp" "^6.1.0" 746 | fast-deep-equal "^3.1.3" 747 | lodash.isequal "^4.5.0" 748 | memoize-one "^5.1.1" 749 | 750 | "@umijs/ssr-darkreader@^4.9.44": 751 | version "4.9.45" 752 | resolved "https://registry.yarnpkg.com/@umijs/ssr-darkreader/-/ssr-darkreader-4.9.45.tgz#7f13cfc89616f3203290775eb61b53047ece1733" 753 | integrity sha512-XlcwzSYQ/SRZpHdwIyMDS4FOGX5kP4U/2g2mykyn/iPQTK4xTiQAyBu6UnnDnn7d5P8s7Atzh1C7H0ETNOypJg== 754 | 755 | "@umijs/use-params@^1.0.9": 756 | version "1.0.9" 757 | resolved "https://registry.yarnpkg.com/@umijs/use-params/-/use-params-1.0.9.tgz#0ae4a87f4922d8e8e3fb4495b0f8f4de9ca38c52" 758 | integrity sha512-QlN0RJSBVQBwLRNxbxjQ5qzqYIGn+K7USppMoIOVlf7fxXHsnQZ2bEsa6Pm74bt6DVQxpUE8HqvdStn6Y9FV1w== 759 | 760 | "@vitejs/plugin-react@^2.0.1": 761 | version "2.0.1" 762 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-2.0.1.tgz#3197c01d8e4a4eb9fed829c7888c467a43aadd4e" 763 | integrity sha512-uINzNHmjrbunlFtyVkST6lY1ewSfz/XwLufG0PIqvLGnpk2nOIOa/1CACTDNcKi1/RwaCzJLmsXwm1NsUVV/NA== 764 | dependencies: 765 | "@babel/core" "^7.18.10" 766 | "@babel/plugin-transform-react-jsx" "^7.18.10" 767 | "@babel/plugin-transform-react-jsx-development" "^7.18.6" 768 | "@babel/plugin-transform-react-jsx-self" "^7.18.6" 769 | "@babel/plugin-transform-react-jsx-source" "^7.18.6" 770 | magic-string "^0.26.2" 771 | react-refresh "^0.14.0" 772 | 773 | add-dom-event-listener@^1.1.0: 774 | version "1.1.0" 775 | resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz#6a92db3a0dd0abc254e095c0f1dc14acbbaae310" 776 | integrity sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw== 777 | dependencies: 778 | object-assign "4.x" 779 | 780 | ansi-regex@^5.0.1: 781 | version "5.0.1" 782 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 783 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 784 | 785 | ansi-styles@^3.2.1: 786 | version "3.2.1" 787 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 788 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 789 | dependencies: 790 | color-convert "^1.9.0" 791 | 792 | ansi-styles@^4.1.0: 793 | version "4.3.0" 794 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 795 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 796 | dependencies: 797 | color-convert "^2.0.1" 798 | 799 | ansi-styles@^5.0.0: 800 | version "5.2.0" 801 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" 802 | integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== 803 | 804 | "antd@^4.20.0 ", antd@^4.21.3: 805 | version "4.22.7" 806 | resolved "https://registry.yarnpkg.com/antd/-/antd-4.22.7.tgz#3c94bbc37466a727f6f4eac2ca6adb5fb0eb7a25" 807 | integrity sha512-CMf5tYHtlhP1blYjwNTRsB7G/bocwKmIFHgYYk4pZNgo1kk/XnPPI2/MKRCXWc54wuCQQlnmL/2AKtE7HWaE8g== 808 | dependencies: 809 | "@ant-design/colors" "^6.0.0" 810 | "@ant-design/icons" "^4.7.0" 811 | "@ant-design/react-slick" "~0.29.1" 812 | "@babel/runtime" "^7.18.3" 813 | "@ctrl/tinycolor" "^3.4.0" 814 | classnames "^2.2.6" 815 | copy-to-clipboard "^3.2.0" 816 | lodash "^4.17.21" 817 | memoize-one "^6.0.0" 818 | moment "^2.29.2" 819 | rc-cascader "~3.6.0" 820 | rc-checkbox "~2.3.0" 821 | rc-collapse "~3.3.0" 822 | rc-dialog "~8.9.0" 823 | rc-drawer "~5.1.0" 824 | rc-dropdown "~4.0.0" 825 | rc-field-form "~1.27.0" 826 | rc-image "~5.7.0" 827 | rc-input "~0.0.1-alpha.5" 828 | rc-input-number "~7.3.5" 829 | rc-mentions "~1.9.1" 830 | rc-menu "~9.6.3" 831 | rc-motion "^2.6.1" 832 | rc-notification "~4.6.0" 833 | rc-pagination "~3.1.17" 834 | rc-picker "~2.6.10" 835 | rc-progress "~3.3.2" 836 | rc-rate "~2.9.0" 837 | rc-resize-observer "^1.2.0" 838 | rc-segmented "~2.1.0" 839 | rc-select "~14.1.1" 840 | rc-slider "~10.0.0" 841 | rc-steps "~4.1.0" 842 | rc-switch "~3.2.0" 843 | rc-table "~7.25.3" 844 | rc-tabs "~11.16.0" 845 | rc-textarea "~0.3.0" 846 | rc-tooltip "~5.2.0" 847 | rc-tree "~5.6.5" 848 | rc-tree-select "~5.4.0" 849 | rc-trigger "^5.2.10" 850 | rc-upload "~4.3.0" 851 | rc-util "^5.22.5" 852 | scroll-into-view-if-needed "^2.2.25" 853 | 854 | aria-query@^5.0.0: 855 | version "5.0.0" 856 | resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" 857 | integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== 858 | 859 | array-tree-filter@^2.1.0: 860 | version "2.1.0" 861 | resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" 862 | integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== 863 | 864 | async-validator@^4.1.0: 865 | version "4.2.5" 866 | resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" 867 | integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== 868 | 869 | asynckit@^0.4.0: 870 | version "0.4.0" 871 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 872 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 873 | 874 | axios@^0.27.2: 875 | version "0.27.2" 876 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" 877 | integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== 878 | dependencies: 879 | follow-redirects "^1.14.9" 880 | form-data "^4.0.0" 881 | 882 | braces@^3.0.2: 883 | version "3.0.2" 884 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 885 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 886 | dependencies: 887 | fill-range "^7.0.1" 888 | 889 | browserslist@^4.20.2: 890 | version "4.21.3" 891 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" 892 | integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== 893 | dependencies: 894 | caniuse-lite "^1.0.30001370" 895 | electron-to-chromium "^1.4.202" 896 | node-releases "^2.0.6" 897 | update-browserslist-db "^1.0.5" 898 | 899 | caniuse-lite@^1.0.30001370: 900 | version "1.0.30001380" 901 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001380.tgz#6f2427ad8ebee1b400a38ca3560515756ba352bb" 902 | integrity sha512-OO+pPubxx16lkI7TVrbFpde8XHz66SMwstl1YWpg6uMGw56XnhYVwtPIjvX4kYpzwMwQKr4DDce394E03dQPGg== 903 | 904 | chalk@^2.0.0: 905 | version "2.4.2" 906 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 907 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 908 | dependencies: 909 | ansi-styles "^3.2.1" 910 | escape-string-regexp "^1.0.5" 911 | supports-color "^5.3.0" 912 | 913 | chalk@^3.0.0: 914 | version "3.0.0" 915 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 916 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 917 | dependencies: 918 | ansi-styles "^4.1.0" 919 | supports-color "^7.1.0" 920 | 921 | chalk@^4.0.0, chalk@^4.1.0: 922 | version "4.1.2" 923 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 924 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 925 | dependencies: 926 | ansi-styles "^4.1.0" 927 | supports-color "^7.1.0" 928 | 929 | ci-info@^3.2.0: 930 | version "3.3.2" 931 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" 932 | integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== 933 | 934 | classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1: 935 | version "2.3.1" 936 | resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" 937 | integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== 938 | 939 | color-convert@^1.9.0: 940 | version "1.9.3" 941 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 942 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 943 | dependencies: 944 | color-name "1.1.3" 945 | 946 | color-convert@^2.0.1: 947 | version "2.0.1" 948 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 949 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 950 | dependencies: 951 | color-name "~1.1.4" 952 | 953 | color-name@1.1.3: 954 | version "1.1.3" 955 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 956 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 957 | 958 | color-name@~1.1.4: 959 | version "1.1.4" 960 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 961 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 962 | 963 | combined-stream@^1.0.8: 964 | version "1.0.8" 965 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 966 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 967 | dependencies: 968 | delayed-stream "~1.0.0" 969 | 970 | compute-scroll-into-view@^1.0.17: 971 | version "1.0.17" 972 | resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" 973 | integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg== 974 | 975 | convert-source-map@^1.7.0: 976 | version "1.8.0" 977 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" 978 | integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== 979 | dependencies: 980 | safe-buffer "~5.1.1" 981 | 982 | copy-anything@^2.0.1: 983 | version "2.0.6" 984 | resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" 985 | integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== 986 | dependencies: 987 | is-what "^3.14.1" 988 | 989 | copy-to-clipboard@^3.2.0: 990 | version "3.3.2" 991 | resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz#5b263ec2366224b100181dded7ce0579b340c107" 992 | integrity sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg== 993 | dependencies: 994 | toggle-selection "^1.0.6" 995 | 996 | css.escape@^1.5.1: 997 | version "1.5.1" 998 | resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" 999 | integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== 1000 | 1001 | csstype@^3.0.2: 1002 | version "3.1.0" 1003 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" 1004 | integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== 1005 | 1006 | date-fns@2.x: 1007 | version "2.29.2" 1008 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.2.tgz#0d4b3d0f3dff0f920820a070920f0d9662c51931" 1009 | integrity sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA== 1010 | 1011 | dayjs@1.x: 1012 | version "1.11.5" 1013 | resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93" 1014 | integrity sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA== 1015 | 1016 | debug@^3.2.6: 1017 | version "3.2.7" 1018 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 1019 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 1020 | dependencies: 1021 | ms "^2.1.1" 1022 | 1023 | debug@^4.1.0: 1024 | version "4.3.4" 1025 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 1026 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 1027 | dependencies: 1028 | ms "2.1.2" 1029 | 1030 | delayed-stream@~1.0.0: 1031 | version "1.0.0" 1032 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 1033 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 1034 | 1035 | diff-sequences@^27.5.1: 1036 | version "27.5.1" 1037 | resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" 1038 | integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== 1039 | 1040 | diff-sequences@^28.1.1: 1041 | version "28.1.1" 1042 | resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" 1043 | integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== 1044 | 1045 | dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: 1046 | version "0.5.14" 1047 | resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56" 1048 | integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== 1049 | 1050 | dom-align@^1.7.0: 1051 | version "1.12.3" 1052 | resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.3.tgz#a36d02531dae0eefa2abb0c4db6595250526f103" 1053 | integrity sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA== 1054 | 1055 | dot-case@^3.0.4: 1056 | version "3.0.4" 1057 | resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" 1058 | integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== 1059 | dependencies: 1060 | no-case "^3.0.4" 1061 | tslib "^2.0.3" 1062 | 1063 | electron-to-chromium@^1.4.202: 1064 | version "1.4.225" 1065 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.225.tgz#3e27bdd157cbaf19768141f2e0f0f45071e52338" 1066 | integrity sha512-ICHvGaCIQR3P88uK8aRtx8gmejbVJyC6bB4LEC3anzBrIzdzC7aiZHY4iFfXhN4st6I7lMO0x4sgBHf/7kBvRw== 1067 | 1068 | errno@^0.1.1: 1069 | version "0.1.8" 1070 | resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" 1071 | integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== 1072 | dependencies: 1073 | prr "~1.0.1" 1074 | 1075 | esbuild-android-64@0.14.54: 1076 | version "0.14.54" 1077 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" 1078 | integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== 1079 | 1080 | esbuild-android-arm64@0.14.54: 1081 | version "0.14.54" 1082 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" 1083 | integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== 1084 | 1085 | esbuild-darwin-64@0.14.54: 1086 | version "0.14.54" 1087 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" 1088 | integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== 1089 | 1090 | esbuild-darwin-arm64@0.14.54: 1091 | version "0.14.54" 1092 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" 1093 | integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== 1094 | 1095 | esbuild-freebsd-64@0.14.54: 1096 | version "0.14.54" 1097 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" 1098 | integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== 1099 | 1100 | esbuild-freebsd-arm64@0.14.54: 1101 | version "0.14.54" 1102 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" 1103 | integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== 1104 | 1105 | esbuild-linux-32@0.14.54: 1106 | version "0.14.54" 1107 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" 1108 | integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== 1109 | 1110 | esbuild-linux-64@0.14.54: 1111 | version "0.14.54" 1112 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" 1113 | integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== 1114 | 1115 | esbuild-linux-arm64@0.14.54: 1116 | version "0.14.54" 1117 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" 1118 | integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== 1119 | 1120 | esbuild-linux-arm@0.14.54: 1121 | version "0.14.54" 1122 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" 1123 | integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== 1124 | 1125 | esbuild-linux-mips64le@0.14.54: 1126 | version "0.14.54" 1127 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" 1128 | integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== 1129 | 1130 | esbuild-linux-ppc64le@0.14.54: 1131 | version "0.14.54" 1132 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" 1133 | integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== 1134 | 1135 | esbuild-linux-riscv64@0.14.54: 1136 | version "0.14.54" 1137 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" 1138 | integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== 1139 | 1140 | esbuild-linux-s390x@0.14.54: 1141 | version "0.14.54" 1142 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" 1143 | integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== 1144 | 1145 | esbuild-netbsd-64@0.14.54: 1146 | version "0.14.54" 1147 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" 1148 | integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== 1149 | 1150 | esbuild-openbsd-64@0.14.54: 1151 | version "0.14.54" 1152 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" 1153 | integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== 1154 | 1155 | esbuild-sunos-64@0.14.54: 1156 | version "0.14.54" 1157 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" 1158 | integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== 1159 | 1160 | esbuild-windows-32@0.14.54: 1161 | version "0.14.54" 1162 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" 1163 | integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== 1164 | 1165 | esbuild-windows-64@0.14.54: 1166 | version "0.14.54" 1167 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" 1168 | integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== 1169 | 1170 | esbuild-windows-arm64@0.14.54: 1171 | version "0.14.54" 1172 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" 1173 | integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== 1174 | 1175 | esbuild@^0.14.47: 1176 | version "0.14.54" 1177 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" 1178 | integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== 1179 | optionalDependencies: 1180 | "@esbuild/linux-loong64" "0.14.54" 1181 | esbuild-android-64 "0.14.54" 1182 | esbuild-android-arm64 "0.14.54" 1183 | esbuild-darwin-64 "0.14.54" 1184 | esbuild-darwin-arm64 "0.14.54" 1185 | esbuild-freebsd-64 "0.14.54" 1186 | esbuild-freebsd-arm64 "0.14.54" 1187 | esbuild-linux-32 "0.14.54" 1188 | esbuild-linux-64 "0.14.54" 1189 | esbuild-linux-arm "0.14.54" 1190 | esbuild-linux-arm64 "0.14.54" 1191 | esbuild-linux-mips64le "0.14.54" 1192 | esbuild-linux-ppc64le "0.14.54" 1193 | esbuild-linux-riscv64 "0.14.54" 1194 | esbuild-linux-s390x "0.14.54" 1195 | esbuild-netbsd-64 "0.14.54" 1196 | esbuild-openbsd-64 "0.14.54" 1197 | esbuild-sunos-64 "0.14.54" 1198 | esbuild-windows-32 "0.14.54" 1199 | esbuild-windows-64 "0.14.54" 1200 | esbuild-windows-arm64 "0.14.54" 1201 | 1202 | escalade@^3.1.1: 1203 | version "3.1.1" 1204 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 1205 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 1206 | 1207 | escape-string-regexp@^1.0.5: 1208 | version "1.0.5" 1209 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 1210 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 1211 | 1212 | escape-string-regexp@^2.0.0: 1213 | version "2.0.0" 1214 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" 1215 | integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== 1216 | 1217 | expect@^28.0.0: 1218 | version "28.1.3" 1219 | resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" 1220 | integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== 1221 | dependencies: 1222 | "@jest/expect-utils" "^28.1.3" 1223 | jest-get-type "^28.0.2" 1224 | jest-matcher-utils "^28.1.3" 1225 | jest-message-util "^28.1.3" 1226 | jest-util "^28.1.3" 1227 | 1228 | fast-deep-equal@^3.1.3: 1229 | version "3.1.3" 1230 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1231 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1232 | 1233 | fill-range@^7.0.1: 1234 | version "7.0.1" 1235 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1236 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1237 | dependencies: 1238 | to-regex-range "^5.0.1" 1239 | 1240 | follow-redirects@^1.14.9: 1241 | version "1.15.1" 1242 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" 1243 | integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== 1244 | 1245 | form-data@^4.0.0: 1246 | version "4.0.0" 1247 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 1248 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 1249 | dependencies: 1250 | asynckit "^0.4.0" 1251 | combined-stream "^1.0.8" 1252 | mime-types "^2.1.12" 1253 | 1254 | fsevents@~2.3.2: 1255 | version "2.3.2" 1256 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 1257 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 1258 | 1259 | function-bind@^1.1.1: 1260 | version "1.1.1" 1261 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1262 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1263 | 1264 | gensync@^1.0.0-beta.2: 1265 | version "1.0.0-beta.2" 1266 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 1267 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 1268 | 1269 | globals@^11.1.0: 1270 | version "11.12.0" 1271 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 1272 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 1273 | 1274 | graceful-fs@^4.1.2, graceful-fs@^4.2.9: 1275 | version "4.2.10" 1276 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" 1277 | integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== 1278 | 1279 | has-flag@^3.0.0: 1280 | version "3.0.0" 1281 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1282 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 1283 | 1284 | has-flag@^4.0.0: 1285 | version "4.0.0" 1286 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1287 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1288 | 1289 | has@^1.0.3: 1290 | version "1.0.3" 1291 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1292 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1293 | dependencies: 1294 | function-bind "^1.1.1" 1295 | 1296 | history@^5.2.0: 1297 | version "5.3.0" 1298 | resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" 1299 | integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== 1300 | dependencies: 1301 | "@babel/runtime" "^7.7.6" 1302 | 1303 | hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: 1304 | version "3.3.2" 1305 | resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" 1306 | integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== 1307 | dependencies: 1308 | react-is "^16.7.0" 1309 | 1310 | iconv-lite@^0.6.3: 1311 | version "0.6.3" 1312 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 1313 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 1314 | dependencies: 1315 | safer-buffer ">= 2.1.2 < 3.0.0" 1316 | 1317 | image-size@~0.5.0: 1318 | version "0.5.5" 1319 | resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" 1320 | integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== 1321 | 1322 | immer@^9.0.7: 1323 | version "9.0.15" 1324 | resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.15.tgz#0b9169e5b1d22137aba7d43f8a81a495dd1b62dc" 1325 | integrity sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ== 1326 | 1327 | indent-string@^4.0.0: 1328 | version "4.0.0" 1329 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" 1330 | integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== 1331 | 1332 | invariant@^2.2.4: 1333 | version "2.2.4" 1334 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 1335 | integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== 1336 | dependencies: 1337 | loose-envify "^1.0.0" 1338 | 1339 | is-core-module@^2.9.0: 1340 | version "2.10.0" 1341 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" 1342 | integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== 1343 | dependencies: 1344 | has "^1.0.3" 1345 | 1346 | is-number@^7.0.0: 1347 | version "7.0.0" 1348 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1349 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1350 | 1351 | is-what@^3.14.1: 1352 | version "3.14.1" 1353 | resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" 1354 | integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== 1355 | 1356 | jest-diff@^27.5.1: 1357 | version "27.5.1" 1358 | resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" 1359 | integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== 1360 | dependencies: 1361 | chalk "^4.0.0" 1362 | diff-sequences "^27.5.1" 1363 | jest-get-type "^27.5.1" 1364 | pretty-format "^27.5.1" 1365 | 1366 | jest-diff@^28.1.3: 1367 | version "28.1.3" 1368 | resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" 1369 | integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== 1370 | dependencies: 1371 | chalk "^4.0.0" 1372 | diff-sequences "^28.1.1" 1373 | jest-get-type "^28.0.2" 1374 | pretty-format "^28.1.3" 1375 | 1376 | jest-get-type@^27.5.1: 1377 | version "27.5.1" 1378 | resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" 1379 | integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== 1380 | 1381 | jest-get-type@^28.0.2: 1382 | version "28.0.2" 1383 | resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" 1384 | integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== 1385 | 1386 | jest-matcher-utils@^27.0.0: 1387 | version "27.5.1" 1388 | resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" 1389 | integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== 1390 | dependencies: 1391 | chalk "^4.0.0" 1392 | jest-diff "^27.5.1" 1393 | jest-get-type "^27.5.1" 1394 | pretty-format "^27.5.1" 1395 | 1396 | jest-matcher-utils@^28.1.3: 1397 | version "28.1.3" 1398 | resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" 1399 | integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== 1400 | dependencies: 1401 | chalk "^4.0.0" 1402 | jest-diff "^28.1.3" 1403 | jest-get-type "^28.0.2" 1404 | pretty-format "^28.1.3" 1405 | 1406 | jest-message-util@^28.1.3: 1407 | version "28.1.3" 1408 | resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" 1409 | integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== 1410 | dependencies: 1411 | "@babel/code-frame" "^7.12.13" 1412 | "@jest/types" "^28.1.3" 1413 | "@types/stack-utils" "^2.0.0" 1414 | chalk "^4.0.0" 1415 | graceful-fs "^4.2.9" 1416 | micromatch "^4.0.4" 1417 | pretty-format "^28.1.3" 1418 | slash "^3.0.0" 1419 | stack-utils "^2.0.3" 1420 | 1421 | jest-util@^28.1.3: 1422 | version "28.1.3" 1423 | resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" 1424 | integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== 1425 | dependencies: 1426 | "@jest/types" "^28.1.3" 1427 | "@types/node" "*" 1428 | chalk "^4.0.0" 1429 | ci-info "^3.2.0" 1430 | graceful-fs "^4.2.9" 1431 | picomatch "^2.2.3" 1432 | 1433 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1434 | version "4.0.0" 1435 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1436 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1437 | 1438 | jsesc@^2.5.1: 1439 | version "2.5.2" 1440 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 1441 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 1442 | 1443 | json2mq@^0.2.0: 1444 | version "0.2.0" 1445 | resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" 1446 | integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA== 1447 | dependencies: 1448 | string-convert "^0.2.0" 1449 | 1450 | json5@^2.2.1: 1451 | version "2.2.1" 1452 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" 1453 | integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== 1454 | 1455 | klona@^2.0.4: 1456 | version "2.0.5" 1457 | resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" 1458 | integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== 1459 | 1460 | less-loader@^11.0.0: 1461 | version "11.0.0" 1462 | resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-11.0.0.tgz#a31b2bc5cdfb62f1c7de9b2d01cd944c22b1a024" 1463 | integrity sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw== 1464 | dependencies: 1465 | klona "^2.0.4" 1466 | 1467 | less@^4.1.3: 1468 | version "4.1.3" 1469 | resolved "https://registry.yarnpkg.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" 1470 | integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== 1471 | dependencies: 1472 | copy-anything "^2.0.1" 1473 | parse-node-version "^1.0.1" 1474 | tslib "^2.3.0" 1475 | optionalDependencies: 1476 | errno "^0.1.1" 1477 | graceful-fs "^4.1.2" 1478 | image-size "~0.5.0" 1479 | make-dir "^2.1.0" 1480 | mime "^1.4.1" 1481 | needle "^3.1.0" 1482 | source-map "~0.6.0" 1483 | 1484 | lodash.isequal@^4.5.0: 1485 | version "4.5.0" 1486 | resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" 1487 | integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== 1488 | 1489 | lodash.merge@^4.6.2: 1490 | version "4.6.2" 1491 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1492 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1493 | 1494 | lodash.tonumber@^4.0.3: 1495 | version "4.0.3" 1496 | resolved "https://registry.yarnpkg.com/lodash.tonumber/-/lodash.tonumber-4.0.3.tgz#0b96b31b35672793eb7f5a63ee791f1b9e9025d9" 1497 | integrity sha512-SY0SwuPOHRwKcCNTdsntPYb+Zddz5mDUIVFABzRMqmAiL41pMeyoQFGxYAw5zdc9NnH4pbJqiqqp5ckfxa+zSA== 1498 | 1499 | lodash@^4.0.1, lodash@^4.17.15, lodash@^4.17.21: 1500 | version "4.17.21" 1501 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1502 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1503 | 1504 | loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: 1505 | version "1.4.0" 1506 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1507 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1508 | dependencies: 1509 | js-tokens "^3.0.0 || ^4.0.0" 1510 | 1511 | lower-case@^2.0.2: 1512 | version "2.0.2" 1513 | resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" 1514 | integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== 1515 | dependencies: 1516 | tslib "^2.0.3" 1517 | 1518 | lz-string@^1.4.4: 1519 | version "1.4.4" 1520 | resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" 1521 | integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== 1522 | 1523 | magic-string@^0.26.2: 1524 | version "0.26.2" 1525 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.2.tgz#5331700e4158cd6befda738bb6b0c7b93c0d4432" 1526 | integrity sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A== 1527 | dependencies: 1528 | sourcemap-codec "^1.4.8" 1529 | 1530 | make-dir@^2.1.0: 1531 | version "2.1.0" 1532 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" 1533 | integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== 1534 | dependencies: 1535 | pify "^4.0.1" 1536 | semver "^5.6.0" 1537 | 1538 | memoize-one@^5.1.1: 1539 | version "5.2.1" 1540 | resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" 1541 | integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== 1542 | 1543 | memoize-one@^6.0.0: 1544 | version "6.0.0" 1545 | resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" 1546 | integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== 1547 | 1548 | micromatch@^4.0.4: 1549 | version "4.0.5" 1550 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1551 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1552 | dependencies: 1553 | braces "^3.0.2" 1554 | picomatch "^2.3.1" 1555 | 1556 | mime-db@1.52.0: 1557 | version "1.52.0" 1558 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1559 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1560 | 1561 | mime-types@^2.1.12: 1562 | version "2.1.35" 1563 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1564 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1565 | dependencies: 1566 | mime-db "1.52.0" 1567 | 1568 | mime@^1.4.1: 1569 | version "1.6.0" 1570 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1571 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1572 | 1573 | min-indent@^1.0.0: 1574 | version "1.0.1" 1575 | resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" 1576 | integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== 1577 | 1578 | moment@^2.24.0, moment@^2.27.0, moment@^2.29.2: 1579 | version "2.29.4" 1580 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" 1581 | integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== 1582 | 1583 | ms@2.1.2: 1584 | version "2.1.2" 1585 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1586 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1587 | 1588 | ms@^2.1.1: 1589 | version "2.1.3" 1590 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1591 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1592 | 1593 | nanoid@^3.3.4: 1594 | version "3.3.4" 1595 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" 1596 | integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== 1597 | 1598 | needle@^3.1.0: 1599 | version "3.1.0" 1600 | resolved "https://registry.yarnpkg.com/needle/-/needle-3.1.0.tgz#3bf5cd090c28eb15644181ab6699e027bd6c53c9" 1601 | integrity sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw== 1602 | dependencies: 1603 | debug "^3.2.6" 1604 | iconv-lite "^0.6.3" 1605 | sax "^1.2.4" 1606 | 1607 | no-case@^3.0.4: 1608 | version "3.0.4" 1609 | resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" 1610 | integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== 1611 | dependencies: 1612 | lower-case "^2.0.2" 1613 | tslib "^2.0.3" 1614 | 1615 | node-releases@^2.0.6: 1616 | version "2.0.6" 1617 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" 1618 | integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== 1619 | 1620 | object-assign@4.x, object-assign@^4.1.1: 1621 | version "4.1.1" 1622 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1623 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 1624 | 1625 | omit.js@^2.0.2: 1626 | version "2.0.2" 1627 | resolved "https://registry.yarnpkg.com/omit.js/-/omit.js-2.0.2.tgz#dd9b8436fab947a5f3ff214cb2538631e313ec2f" 1628 | integrity sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg== 1629 | 1630 | param-case@^3.0.4: 1631 | version "3.0.4" 1632 | resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" 1633 | integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== 1634 | dependencies: 1635 | dot-case "^3.0.4" 1636 | tslib "^2.0.3" 1637 | 1638 | parse-node-version@^1.0.1: 1639 | version "1.0.1" 1640 | resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" 1641 | integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== 1642 | 1643 | pascal-case@^3.1.2: 1644 | version "3.1.2" 1645 | resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" 1646 | integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== 1647 | dependencies: 1648 | no-case "^3.0.4" 1649 | tslib "^2.0.3" 1650 | 1651 | path-parse@^1.0.7: 1652 | version "1.0.7" 1653 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1654 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1655 | 1656 | path-to-regexp@2.4.0: 1657 | version "2.4.0" 1658 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.4.0.tgz#35ce7f333d5616f1c1e1bfe266c3aba2e5b2e704" 1659 | integrity sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w== 1660 | 1661 | picocolors@^1.0.0: 1662 | version "1.0.0" 1663 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1664 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1665 | 1666 | picomatch@^2.2.3, picomatch@^2.3.1: 1667 | version "2.3.1" 1668 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1669 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1670 | 1671 | pify@^4.0.1: 1672 | version "4.0.1" 1673 | resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" 1674 | integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== 1675 | 1676 | postcss@^8.4.16: 1677 | version "8.4.16" 1678 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" 1679 | integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== 1680 | dependencies: 1681 | nanoid "^3.3.4" 1682 | picocolors "^1.0.0" 1683 | source-map-js "^1.0.2" 1684 | 1685 | pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: 1686 | version "27.5.1" 1687 | resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" 1688 | integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== 1689 | dependencies: 1690 | ansi-regex "^5.0.1" 1691 | ansi-styles "^5.0.0" 1692 | react-is "^17.0.1" 1693 | 1694 | pretty-format@^28.0.0, pretty-format@^28.1.3: 1695 | version "28.1.3" 1696 | resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" 1697 | integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== 1698 | dependencies: 1699 | "@jest/schemas" "^28.1.3" 1700 | ansi-regex "^5.0.1" 1701 | ansi-styles "^5.0.0" 1702 | react-is "^18.0.0" 1703 | 1704 | prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.7: 1705 | version "15.8.1" 1706 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" 1707 | integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== 1708 | dependencies: 1709 | loose-envify "^1.4.0" 1710 | object-assign "^4.1.1" 1711 | react-is "^16.13.1" 1712 | 1713 | prr@~1.0.1: 1714 | version "1.0.1" 1715 | resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" 1716 | integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== 1717 | 1718 | rc-align@^4.0.0: 1719 | version "4.0.12" 1720 | resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.12.tgz#065b5c68a1cc92a00800c9239320d9fdf5f16207" 1721 | integrity sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ== 1722 | dependencies: 1723 | "@babel/runtime" "^7.10.1" 1724 | classnames "2.x" 1725 | dom-align "^1.7.0" 1726 | lodash "^4.17.21" 1727 | rc-util "^5.3.0" 1728 | resize-observer-polyfill "^1.5.1" 1729 | 1730 | rc-cascader@~3.6.0: 1731 | version "3.6.2" 1732 | resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-3.6.2.tgz#2b5c108807234898cd9a0366d0626f786b7b5622" 1733 | integrity sha512-sf2otpazlROTzkD3nZVfIzXmfBLiEOBTXA5wxozGXBpS902McDpvF0bdcYBu5hN+rviEAm6Mh9cLXNQ1Ty8wKQ== 1734 | dependencies: 1735 | "@babel/runtime" "^7.12.5" 1736 | array-tree-filter "^2.1.0" 1737 | classnames "^2.3.1" 1738 | rc-select "~14.1.0" 1739 | rc-tree "~5.6.3" 1740 | rc-util "^5.6.1" 1741 | 1742 | rc-checkbox@~2.3.0: 1743 | version "2.3.2" 1744 | resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-2.3.2.tgz#f91b3678c7edb2baa8121c9483c664fa6f0aefc1" 1745 | integrity sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg== 1746 | dependencies: 1747 | "@babel/runtime" "^7.10.1" 1748 | classnames "^2.2.1" 1749 | 1750 | rc-collapse@~3.3.0: 1751 | version "3.3.1" 1752 | resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.3.1.tgz#fc66d4c9cfeaf41e932b2de6da2d454874aee55a" 1753 | integrity sha512-cOJfcSe3R8vocrF8T+PgaHDrgeA1tX+lwfhwSj60NX9QVRidsILIbRNDLD6nAzmcvVC5PWiIRiR4S1OobxdhCg== 1754 | dependencies: 1755 | "@babel/runtime" "^7.10.1" 1756 | classnames "2.x" 1757 | rc-motion "^2.3.4" 1758 | rc-util "^5.2.1" 1759 | shallowequal "^1.1.0" 1760 | 1761 | rc-dialog@~8.9.0: 1762 | version "8.9.0" 1763 | resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.9.0.tgz#04dc39522f0321ed2e06018d4a7e02a4c32bd3ea" 1764 | integrity sha512-Cp0tbJnrvPchJfnwIvOMWmJ4yjX3HWFatO6oBFD1jx8QkgsQCR0p8nUWAKdd3seLJhEC39/v56kZaEjwp9muoQ== 1765 | dependencies: 1766 | "@babel/runtime" "^7.10.1" 1767 | classnames "^2.2.6" 1768 | rc-motion "^2.3.0" 1769 | rc-util "^5.21.0" 1770 | 1771 | rc-drawer@~5.1.0: 1772 | version "5.1.0" 1773 | resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-5.1.0.tgz#c1b8a46e5c064ba46a16233fbcfb1ccec6a73c10" 1774 | integrity sha512-pU3Tsn99pxGdYowXehzZbdDVE+4lDXSGb7p8vA9mSmr569oc2Izh4Zw5vLKSe/Xxn2p5MSNbLVqD4tz+pK6SOw== 1775 | dependencies: 1776 | "@babel/runtime" "^7.10.1" 1777 | classnames "^2.2.6" 1778 | rc-motion "^2.6.1" 1779 | rc-util "^5.21.2" 1780 | 1781 | rc-dropdown@~4.0.0: 1782 | version "4.0.1" 1783 | resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.0.1.tgz#f65d9d3d89750241057db59d5a75e43cd4576b68" 1784 | integrity sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g== 1785 | dependencies: 1786 | "@babel/runtime" "^7.18.3" 1787 | classnames "^2.2.6" 1788 | rc-trigger "^5.3.1" 1789 | rc-util "^5.17.0" 1790 | 1791 | rc-field-form@~1.27.0: 1792 | version "1.27.1" 1793 | resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.27.1.tgz#11d61ccb43679e71fdbbff0d821326202554df84" 1794 | integrity sha512-RShegnwFu6TH8tl2olCxn+B4Wyh5EiQH8c/7wucbkLNyue05YiH5gomUAg1vbZjp71yFKwegClctsEG5CNBWAA== 1795 | dependencies: 1796 | "@babel/runtime" "^7.18.0" 1797 | async-validator "^4.1.0" 1798 | rc-util "^5.8.0" 1799 | 1800 | rc-image@~5.7.0: 1801 | version "5.7.1" 1802 | resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-5.7.1.tgz#678dc014845954c30237808c00c7b12e5f2a0b07" 1803 | integrity sha512-QyMfdhoUfb5W14plqXSisaYwpdstcLYnB0MjX5ccIK2rydQM9sDPuekQWu500DDGR2dBaIF5vx9XbWkNFK17Fg== 1804 | dependencies: 1805 | "@babel/runtime" "^7.11.2" 1806 | classnames "^2.2.6" 1807 | rc-dialog "~8.9.0" 1808 | rc-util "^5.0.6" 1809 | 1810 | rc-input-number@~7.3.5: 1811 | version "7.3.6" 1812 | resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-7.3.6.tgz#54d66bd3fdaef0abfded4c734a12ac6d9461ebab" 1813 | integrity sha512-Se62oMOBn9HwF/gSag+YtAYyKZsjJzEsqmyAJHAnAvPfjZJOu7dLMlQRwBbTtELbKXM/Y5Fztcq8CW2Y9f49qA== 1814 | dependencies: 1815 | "@babel/runtime" "^7.10.1" 1816 | classnames "^2.2.5" 1817 | rc-util "^5.23.0" 1818 | 1819 | rc-input@~0.0.1-alpha.5: 1820 | version "0.0.1-alpha.7" 1821 | resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-0.0.1-alpha.7.tgz#53e3f13871275c21d92b51f80b698f389ad45dd3" 1822 | integrity sha512-eozaqpCYWSY5LBMwlHgC01GArkVEP+XlJ84OMvdkwUnJBSv83Yxa15pZpn7vACAj84uDC4xOA2CoFdbLuqB08Q== 1823 | dependencies: 1824 | "@babel/runtime" "^7.11.1" 1825 | classnames "^2.2.1" 1826 | rc-util "^5.18.1" 1827 | 1828 | rc-mentions@~1.9.1: 1829 | version "1.9.2" 1830 | resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-1.9.2.tgz#f264ebc4ec734dad9edc8e078b65ab3586d94a7b" 1831 | integrity sha512-uxb/lzNnEGmvraKWNGE6KXMVXvt8RQv9XW8R0Dqi3hYsyPiAZeHRCHQKdLARuk5YBhFhZ6ga55D/8XuY367g3g== 1832 | dependencies: 1833 | "@babel/runtime" "^7.10.1" 1834 | classnames "^2.2.6" 1835 | rc-menu "~9.6.0" 1836 | rc-textarea "^0.3.0" 1837 | rc-trigger "^5.0.4" 1838 | rc-util "^5.22.5" 1839 | 1840 | rc-menu@~9.6.0, rc-menu@~9.6.3: 1841 | version "9.6.3" 1842 | resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.6.3.tgz#f0373d0391a97db94147106cddffe87b1e4f4e36" 1843 | integrity sha512-KY9QilKWgkJZ0JSpOBgIpQF2wMRRodRxpIMYyIJ3Nd5N6xfVLOxXCxevHcBplt+Ez7MhUF+I03MuAKqWQJLZgw== 1844 | dependencies: 1845 | "@babel/runtime" "^7.10.1" 1846 | classnames "2.x" 1847 | rc-motion "^2.4.3" 1848 | rc-overflow "^1.2.0" 1849 | rc-trigger "^5.1.2" 1850 | rc-util "^5.12.0" 1851 | shallowequal "^1.1.0" 1852 | 1853 | rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.6.1: 1854 | version "2.6.2" 1855 | resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.6.2.tgz#3d31f97e41fb8e4f91a4a4189b6a98ac63342869" 1856 | integrity sha512-4w1FaX3dtV749P8GwfS4fYnFG4Rb9pxvCYPc/b2fw1cmlHJWNNgOFIz7ysiD+eOrzJSvnLJWlNQQncpNMXwwpg== 1857 | dependencies: 1858 | "@babel/runtime" "^7.11.1" 1859 | classnames "^2.2.1" 1860 | rc-util "^5.21.0" 1861 | 1862 | rc-notification@~4.6.0: 1863 | version "4.6.0" 1864 | resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-4.6.0.tgz#4e76fc2d0568f03cc93ac18c9e20763ebe29fa46" 1865 | integrity sha512-xF3MKgIoynzjQAO4lqsoraiFo3UXNYlBfpHs0VWvwF+4pimen9/H1DYLN2mfRWhHovW6gRpla73m2nmyIqAMZQ== 1866 | dependencies: 1867 | "@babel/runtime" "^7.10.1" 1868 | classnames "2.x" 1869 | rc-motion "^2.2.0" 1870 | rc-util "^5.20.1" 1871 | 1872 | rc-overflow@^1.0.0, rc-overflow@^1.2.0: 1873 | version "1.2.8" 1874 | resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.2.8.tgz#40f140fabc244118543e627cdd1ef750d9481a88" 1875 | integrity sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ== 1876 | dependencies: 1877 | "@babel/runtime" "^7.11.1" 1878 | classnames "^2.2.1" 1879 | rc-resize-observer "^1.0.0" 1880 | rc-util "^5.19.2" 1881 | 1882 | rc-pagination@~3.1.17: 1883 | version "3.1.17" 1884 | resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.1.17.tgz#91e690aa894806e344cea88ea4a16d244194a1bd" 1885 | integrity sha512-/BQ5UxcBnW28vFAcP2hfh+Xg15W0QZn8TWYwdCApchMH1H0CxiaUUcULP8uXcFM1TygcdKWdt3JqsL9cTAfdkQ== 1886 | dependencies: 1887 | "@babel/runtime" "^7.10.1" 1888 | classnames "^2.2.1" 1889 | 1890 | rc-picker@~2.6.10: 1891 | version "2.6.10" 1892 | resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-2.6.10.tgz#8d0a473c079388bdb2d7358a2a54c7d5095893b4" 1893 | integrity sha512-9wYtw0DFWs9FO92Qh2D76P0iojUr8ZhLOtScUeOit6ks/F+TBLrOC1uze3IOu+u9gbDAjmosNWLKbBzx/Yuv2w== 1894 | dependencies: 1895 | "@babel/runtime" "^7.10.1" 1896 | classnames "^2.2.1" 1897 | date-fns "2.x" 1898 | dayjs "1.x" 1899 | moment "^2.24.0" 1900 | rc-trigger "^5.0.4" 1901 | rc-util "^5.4.0" 1902 | shallowequal "^1.1.0" 1903 | 1904 | rc-progress@~3.3.2: 1905 | version "3.3.3" 1906 | resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.3.3.tgz#eb9bffbacab1534f2542f9f6861ce772254362b1" 1907 | integrity sha512-MDVNVHzGanYtRy2KKraEaWeZLri2ZHWIRyaE1a9MQ2MuJ09m+Wxj5cfcaoaR6z5iRpHpA59YeUxAlpML8N4PJw== 1908 | dependencies: 1909 | "@babel/runtime" "^7.10.1" 1910 | classnames "^2.2.6" 1911 | rc-util "^5.16.1" 1912 | 1913 | rc-rate@~2.9.0: 1914 | version "2.9.2" 1915 | resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.9.2.tgz#4a58965d1ecf91896ebae01d458b59056df0b4ea" 1916 | integrity sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g== 1917 | dependencies: 1918 | "@babel/runtime" "^7.10.1" 1919 | classnames "^2.2.5" 1920 | rc-util "^5.0.1" 1921 | 1922 | rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.2.0: 1923 | version "1.2.0" 1924 | resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-1.2.0.tgz#9f46052f81cdf03498be35144cb7c53fd282c4c7" 1925 | integrity sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ== 1926 | dependencies: 1927 | "@babel/runtime" "^7.10.1" 1928 | classnames "^2.2.1" 1929 | rc-util "^5.15.0" 1930 | resize-observer-polyfill "^1.5.1" 1931 | 1932 | rc-segmented@~2.1.0: 1933 | version "2.1.0" 1934 | resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.1.0.tgz#0e0afe646c1a0e44a0e18785f518c42633ec8efc" 1935 | integrity sha512-hUlonro+pYoZcwrH6Vm56B2ftLfQh046hrwif/VwLIw1j3zGt52p5mREBwmeVzXnSwgnagpOpfafspzs1asjGw== 1936 | dependencies: 1937 | "@babel/runtime" "^7.11.1" 1938 | classnames "^2.2.1" 1939 | rc-motion "^2.4.4" 1940 | rc-util "^5.17.0" 1941 | 1942 | rc-select@~14.1.0, rc-select@~14.1.1: 1943 | version "14.1.9" 1944 | resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-14.1.9.tgz#9c9eceff00920ad8a0a53b77b76afc177ffe5ab4" 1945 | integrity sha512-DK01+Q7oCWr5jVPiEp/BTQ8xCB4rI4LfXzZtSmBWJhOMuibyZD1Vlz/DlVKCUFmtBM4SzG4/SltGHoGlcbCqiw== 1946 | dependencies: 1947 | "@babel/runtime" "^7.10.1" 1948 | classnames "2.x" 1949 | rc-motion "^2.0.1" 1950 | rc-overflow "^1.0.0" 1951 | rc-trigger "^5.0.4" 1952 | rc-util "^5.16.1" 1953 | rc-virtual-list "^3.2.0" 1954 | 1955 | rc-slider@~10.0.0: 1956 | version "10.0.1" 1957 | resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-10.0.1.tgz#7058c68ff1e1aa4e7c3536e5e10128bdbccb87f9" 1958 | integrity sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q== 1959 | dependencies: 1960 | "@babel/runtime" "^7.10.1" 1961 | classnames "^2.2.5" 1962 | rc-util "^5.18.1" 1963 | shallowequal "^1.1.0" 1964 | 1965 | rc-steps@~4.1.0: 1966 | version "4.1.4" 1967 | resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-4.1.4.tgz#0ba82db202d59ca52d0693dc9880dd145b19dc23" 1968 | integrity sha512-qoCqKZWSpkh/b03ASGx1WhpKnuZcRWmvuW+ZUu4mvMdfvFzVxblTwUM+9aBd0mlEUFmt6GW8FXhMpHkK3Uzp3w== 1969 | dependencies: 1970 | "@babel/runtime" "^7.10.2" 1971 | classnames "^2.2.3" 1972 | rc-util "^5.0.1" 1973 | 1974 | rc-switch@~3.2.0: 1975 | version "3.2.2" 1976 | resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-3.2.2.tgz#d001f77f12664d52595b4f6fb425dd9e66fba8e8" 1977 | integrity sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A== 1978 | dependencies: 1979 | "@babel/runtime" "^7.10.1" 1980 | classnames "^2.2.1" 1981 | rc-util "^5.0.1" 1982 | 1983 | rc-table@~7.25.3: 1984 | version "7.25.3" 1985 | resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.25.3.tgz#a2941d4fde4c181e687e97a294faca8e4122e26d" 1986 | integrity sha512-McsLJ2rg8EEpRBRYN4Pf9gT7ZNYnjvF9zrBpUBBbUX/fxk+eGi5ff1iPIhMyiHsH71/BmTUzX9nc9XqupD0nMg== 1987 | dependencies: 1988 | "@babel/runtime" "^7.10.1" 1989 | classnames "^2.2.5" 1990 | rc-resize-observer "^1.1.0" 1991 | rc-util "^5.22.5" 1992 | shallowequal "^1.1.0" 1993 | 1994 | rc-tabs@~11.16.0: 1995 | version "11.16.1" 1996 | resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-11.16.1.tgz#7c57b6a092d9d0e2df54413b0319f195c27214a9" 1997 | integrity sha512-bR7Dap23YyfzZQwtKomhiFEFzZuE7WaKWo+ypNRSGB9PDKSc6tM12VP8LWYkvmmQHthgwP0WRN8nFbSJWuqLYw== 1998 | dependencies: 1999 | "@babel/runtime" "^7.11.2" 2000 | classnames "2.x" 2001 | rc-dropdown "~4.0.0" 2002 | rc-menu "~9.6.0" 2003 | rc-resize-observer "^1.0.0" 2004 | rc-util "^5.5.0" 2005 | 2006 | rc-textarea@^0.3.0, rc-textarea@~0.3.0: 2007 | version "0.3.7" 2008 | resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-0.3.7.tgz#987142891efdedb774883c07e2f51b318fde5a11" 2009 | integrity sha512-yCdZ6binKmAQB13hc/oehh0E/QRwoPP1pjF21aHBxlgXO3RzPF6dUu4LG2R4FZ1zx/fQd2L1faktulrXOM/2rw== 2010 | dependencies: 2011 | "@babel/runtime" "^7.10.1" 2012 | classnames "^2.2.1" 2013 | rc-resize-observer "^1.0.0" 2014 | rc-util "^5.7.0" 2015 | shallowequal "^1.1.0" 2016 | 2017 | rc-tooltip@~5.2.0: 2018 | version "5.2.2" 2019 | resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-5.2.2.tgz#e5cafa8ecebf78108936a0bcb93c150fa81ac93b" 2020 | integrity sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg== 2021 | dependencies: 2022 | "@babel/runtime" "^7.11.2" 2023 | classnames "^2.3.1" 2024 | rc-trigger "^5.0.0" 2025 | 2026 | rc-tree-select@~5.4.0: 2027 | version "5.4.0" 2028 | resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-5.4.0.tgz#c94b961aca68689f5ee3a43e33881cf693d195ef" 2029 | integrity sha512-reRbOqC7Ic/nQocJAJeCl4n6nJUY3NoqiwRXKvhjgZJU7NGr9vIccXEsY+Lghkw5UMpPoxGsIJB0jiAvM18XYA== 2030 | dependencies: 2031 | "@babel/runtime" "^7.10.1" 2032 | classnames "2.x" 2033 | rc-select "~14.1.0" 2034 | rc-tree "~5.6.1" 2035 | rc-util "^5.16.1" 2036 | 2037 | rc-tree@~5.6.1, rc-tree@~5.6.3, rc-tree@~5.6.5: 2038 | version "5.6.6" 2039 | resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-5.6.6.tgz#c04253d8f8345ec52fc196dec2be06c7e708125b" 2040 | integrity sha512-HI/q4D4AHOp48OZcBUvJFWkI5OfnZivvGYI0xzI0dy0Mita2KcTGZv7/Yl6Aq3bL3od3x5AqAXq/7qxR3x4Kkg== 2041 | dependencies: 2042 | "@babel/runtime" "^7.10.1" 2043 | classnames "2.x" 2044 | rc-motion "^2.0.1" 2045 | rc-util "^5.16.1" 2046 | rc-virtual-list "^3.4.8" 2047 | 2048 | rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.10, rc-trigger@^5.3.1: 2049 | version "5.3.1" 2050 | resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.3.1.tgz#acafadf3eaf384e7f466c303bfa0f34c8137d7b8" 2051 | integrity sha512-5gaFbDkYSefZ14j2AdzucXzlWgU2ri5uEjkHvsf1ynRhdJbKxNOnw4PBZ9+FVULNGFiDzzlVF8RJnR9P/xrnKQ== 2052 | dependencies: 2053 | "@babel/runtime" "^7.18.3" 2054 | classnames "^2.2.6" 2055 | rc-align "^4.0.0" 2056 | rc-motion "^2.0.0" 2057 | rc-util "^5.19.2" 2058 | 2059 | rc-upload@~4.3.0: 2060 | version "4.3.4" 2061 | resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.3.4.tgz#83ff7d3867631c37adbfd72ea3d1fd7e97ca84af" 2062 | integrity sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ== 2063 | dependencies: 2064 | "@babel/runtime" "^7.18.3" 2065 | classnames "^2.2.5" 2066 | rc-util "^5.2.0" 2067 | 2068 | rc-util@^4.19.0: 2069 | version "4.21.1" 2070 | resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.21.1.tgz#88602d0c3185020aa1053d9a1e70eac161becb05" 2071 | integrity sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg== 2072 | dependencies: 2073 | add-dom-event-listener "^1.1.0" 2074 | prop-types "^15.5.10" 2075 | react-is "^16.12.0" 2076 | react-lifecycles-compat "^3.0.4" 2077 | shallowequal "^1.1.0" 2078 | 2079 | rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.12.0, rc-util@^5.15.0, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.19.2, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.21.2, rc-util@^5.22.5, rc-util@^5.23.0, rc-util@^5.3.0, rc-util@^5.4.0, rc-util@^5.5.0, rc-util@^5.6.1, rc-util@^5.7.0, rc-util@^5.8.0, rc-util@^5.9.4: 2080 | version "5.23.0" 2081 | resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.23.0.tgz#a583b1ec3e1832a80eced7a700a494af0b590743" 2082 | integrity sha512-lgm6diJ/pLgyfoZY59Vz7sW4mSoQCgozqbBye9IJ7/mb5w5h4T7h+i2JpXAx/UBQxscBZe68q0sP7EW+qfkKUg== 2083 | dependencies: 2084 | "@babel/runtime" "^7.18.3" 2085 | react-is "^16.12.0" 2086 | shallowequal "^1.1.0" 2087 | 2088 | rc-virtual-list@^3.2.0, rc-virtual-list@^3.4.8: 2089 | version "3.4.8" 2090 | resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.4.8.tgz#c24c10c6940546b7e2a5e9809402c6716adfd26c" 2091 | integrity sha512-qSN+Rv4i/E7RCTvTMr1uZo7f3crJJg/5DekoCagydo9zsXrxj07zsFSxqizqW+ldGA16lwa8So/bIbV9Ofjddg== 2092 | dependencies: 2093 | classnames "^2.2.6" 2094 | rc-resize-observer "^1.0.0" 2095 | rc-util "^5.15.0" 2096 | 2097 | react-async-script@^1.1.1: 2098 | version "1.2.0" 2099 | resolved "https://registry.yarnpkg.com/react-async-script/-/react-async-script-1.2.0.tgz#ab9412a26f0b83f5e2e00de1d2befc9400834b21" 2100 | integrity sha512-bCpkbm9JiAuMGhkqoAiC0lLkb40DJ0HOEJIku+9JDjxX3Rcs+ztEOG13wbrOskt3n2DTrjshhaQ/iay+SnGg5Q== 2101 | dependencies: 2102 | hoist-non-react-statics "^3.3.0" 2103 | prop-types "^15.5.0" 2104 | 2105 | react-dom@^18.2.0: 2106 | version "18.2.0" 2107 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" 2108 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== 2109 | dependencies: 2110 | loose-envify "^1.1.0" 2111 | scheduler "^0.23.0" 2112 | 2113 | react-google-recaptcha@^2.1.0: 2114 | version "2.1.0" 2115 | resolved "https://registry.yarnpkg.com/react-google-recaptcha/-/react-google-recaptcha-2.1.0.tgz#9f6f4954ce49c1dedabc2c532347321d892d0a16" 2116 | integrity sha512-K9jr7e0CWFigi8KxC3WPvNqZZ47df2RrMAta6KmRoE4RUi7Ys6NmNjytpXpg4HI/svmQJLKR+PncEPaNJ98DqQ== 2117 | dependencies: 2118 | prop-types "^15.5.0" 2119 | react-async-script "^1.1.1" 2120 | 2121 | react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0: 2122 | version "16.13.1" 2123 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 2124 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 2125 | 2126 | react-is@^17.0.1: 2127 | version "17.0.2" 2128 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" 2129 | integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== 2130 | 2131 | react-is@^18.0.0: 2132 | version "18.2.0" 2133 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" 2134 | integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== 2135 | 2136 | react-lifecycles-compat@^3.0.4: 2137 | version "3.0.4" 2138 | resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" 2139 | integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== 2140 | 2141 | react-redux@^8.0.2: 2142 | version "8.0.2" 2143 | resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.0.2.tgz#bc2a304bb21e79c6808e3e47c50fe1caf62f7aad" 2144 | integrity sha512-nBwiscMw3NoP59NFCXFf02f8xdo+vSHT/uZ1ldDwF7XaTpzm+Phk97VT4urYBl5TYAPNVaFm12UHAEyzkpNzRA== 2145 | dependencies: 2146 | "@babel/runtime" "^7.12.1" 2147 | "@types/hoist-non-react-statics" "^3.3.1" 2148 | "@types/use-sync-external-store" "^0.0.3" 2149 | hoist-non-react-statics "^3.3.2" 2150 | react-is "^18.0.0" 2151 | use-sync-external-store "^1.0.0" 2152 | 2153 | react-refresh@^0.14.0: 2154 | version "0.14.0" 2155 | resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" 2156 | integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== 2157 | 2158 | react-router-dom@^6.3.0: 2159 | version "6.3.0" 2160 | resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.3.0.tgz#a0216da813454e521905b5fa55e0e5176123f43d" 2161 | integrity sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw== 2162 | dependencies: 2163 | history "^5.2.0" 2164 | react-router "6.3.0" 2165 | 2166 | react-router@6.3.0: 2167 | version "6.3.0" 2168 | resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557" 2169 | integrity sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ== 2170 | dependencies: 2171 | history "^5.2.0" 2172 | 2173 | react-sortable-hoc@^2.0.0: 2174 | version "2.0.0" 2175 | resolved "https://registry.yarnpkg.com/react-sortable-hoc/-/react-sortable-hoc-2.0.0.tgz#f6780d8aa4b922a21f3e754af542f032677078b7" 2176 | integrity sha512-JZUw7hBsAHXK7PTyErJyI7SopSBFRcFHDjWW5SWjcugY0i6iH7f+eJkY8cJmGMlZ1C9xz1J3Vjz0plFpavVeRg== 2177 | dependencies: 2178 | "@babel/runtime" "^7.2.0" 2179 | invariant "^2.2.4" 2180 | prop-types "^15.5.7" 2181 | 2182 | react@^18.2.0: 2183 | version "18.2.0" 2184 | resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" 2185 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== 2186 | dependencies: 2187 | loose-envify "^1.1.0" 2188 | 2189 | reactcss@^1.2.3: 2190 | version "1.2.3" 2191 | resolved "https://registry.yarnpkg.com/reactcss/-/reactcss-1.2.3.tgz#c00013875e557b1cf0dfd9a368a1c3dab3b548dd" 2192 | integrity sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A== 2193 | dependencies: 2194 | lodash "^4.0.1" 2195 | 2196 | redent@^3.0.0: 2197 | version "3.0.0" 2198 | resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" 2199 | integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== 2200 | dependencies: 2201 | indent-string "^4.0.0" 2202 | strip-indent "^3.0.0" 2203 | 2204 | redux-thunk@^2.4.1: 2205 | version "2.4.1" 2206 | resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.1.tgz#0dd8042cf47868f4b29699941de03c9301a75714" 2207 | integrity sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q== 2208 | 2209 | redux@^4.1.2: 2210 | version "4.2.0" 2211 | resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13" 2212 | integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== 2213 | dependencies: 2214 | "@babel/runtime" "^7.9.2" 2215 | 2216 | regenerator-runtime@^0.13.4: 2217 | version "0.13.9" 2218 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" 2219 | integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== 2220 | 2221 | reselect@^4.1.5: 2222 | version "4.1.6" 2223 | resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.6.tgz#19ca2d3d0b35373a74dc1c98692cdaffb6602656" 2224 | integrity sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ== 2225 | 2226 | resize-observer-polyfill@^1.5.1: 2227 | version "1.5.1" 2228 | resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" 2229 | integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== 2230 | 2231 | resolve@^1.22.1: 2232 | version "1.22.1" 2233 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 2234 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 2235 | dependencies: 2236 | is-core-module "^2.9.0" 2237 | path-parse "^1.0.7" 2238 | supports-preserve-symlinks-flag "^1.0.0" 2239 | 2240 | "rollup@>=2.75.6 <2.77.0 || ~2.77.0": 2241 | version "2.77.3" 2242 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12" 2243 | integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== 2244 | optionalDependencies: 2245 | fsevents "~2.3.2" 2246 | 2247 | safe-buffer@~5.1.1: 2248 | version "5.1.2" 2249 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 2250 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 2251 | 2252 | "safer-buffer@>= 2.1.2 < 3.0.0": 2253 | version "2.1.2" 2254 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2255 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2256 | 2257 | sax@^1.2.4: 2258 | version "1.2.4" 2259 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 2260 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 2261 | 2262 | scheduler@^0.23.0: 2263 | version "0.23.0" 2264 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" 2265 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== 2266 | dependencies: 2267 | loose-envify "^1.1.0" 2268 | 2269 | scroll-into-view-if-needed@^2.2.25: 2270 | version "2.2.29" 2271 | resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz#551791a84b7e2287706511f8c68161e4990ab885" 2272 | integrity sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg== 2273 | dependencies: 2274 | compute-scroll-into-view "^1.0.17" 2275 | 2276 | semver@^5.6.0: 2277 | version "5.7.1" 2278 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 2279 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 2280 | 2281 | semver@^6.3.0: 2282 | version "6.3.0" 2283 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 2284 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 2285 | 2286 | shallowequal@^1.1.0: 2287 | version "1.1.0" 2288 | resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" 2289 | integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== 2290 | 2291 | slash@^3.0.0: 2292 | version "3.0.0" 2293 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 2294 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 2295 | 2296 | source-map-js@^1.0.2: 2297 | version "1.0.2" 2298 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 2299 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 2300 | 2301 | source-map@~0.6.0: 2302 | version "0.6.1" 2303 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2304 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 2305 | 2306 | sourcemap-codec@^1.4.8: 2307 | version "1.4.8" 2308 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 2309 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 2310 | 2311 | stack-utils@^2.0.3: 2312 | version "2.0.5" 2313 | resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" 2314 | integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== 2315 | dependencies: 2316 | escape-string-regexp "^2.0.0" 2317 | 2318 | string-convert@^0.2.0: 2319 | version "0.2.1" 2320 | resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" 2321 | integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== 2322 | 2323 | strip-indent@^3.0.0: 2324 | version "3.0.0" 2325 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" 2326 | integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== 2327 | dependencies: 2328 | min-indent "^1.0.0" 2329 | 2330 | supports-color@^5.3.0: 2331 | version "5.5.0" 2332 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2333 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2334 | dependencies: 2335 | has-flag "^3.0.0" 2336 | 2337 | supports-color@^7.1.0: 2338 | version "7.2.0" 2339 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2340 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2341 | dependencies: 2342 | has-flag "^4.0.0" 2343 | 2344 | supports-preserve-symlinks-flag@^1.0.0: 2345 | version "1.0.0" 2346 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 2347 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 2348 | 2349 | swr@^1.2.0: 2350 | version "1.3.0" 2351 | resolved "https://registry.yarnpkg.com/swr/-/swr-1.3.0.tgz#c6531866a35b4db37b38b72c45a63171faf9f4e8" 2352 | integrity sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw== 2353 | 2354 | tinycolor2@^1.4.2: 2355 | version "1.4.2" 2356 | resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" 2357 | integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== 2358 | 2359 | to-fast-properties@^2.0.0: 2360 | version "2.0.0" 2361 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 2362 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== 2363 | 2364 | to-regex-range@^5.0.1: 2365 | version "5.0.1" 2366 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2367 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2368 | dependencies: 2369 | is-number "^7.0.0" 2370 | 2371 | toggle-selection@^1.0.6: 2372 | version "1.0.6" 2373 | resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" 2374 | integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== 2375 | 2376 | tslib@^2.0.3, tslib@^2.3.0: 2377 | version "2.4.0" 2378 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" 2379 | integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== 2380 | 2381 | typescript@^4.7.4: 2382 | version "4.7.4" 2383 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" 2384 | integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== 2385 | 2386 | unstated-next@^1.1.0: 2387 | version "1.1.0" 2388 | resolved "https://registry.yarnpkg.com/unstated-next/-/unstated-next-1.1.0.tgz#7bb4911a12fdf3cc8ad3eb11a0b315e4a8685ea8" 2389 | integrity sha512-AAn47ZncPvgBGOvMcn8tSRxsrqwf2VdAPxLASTuLJvZt4rhKfDvUkmYZLGfclImSfTVMv7tF4ynaVxin0JjDCA== 2390 | 2391 | update-browserslist-db@^1.0.5: 2392 | version "1.0.5" 2393 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" 2394 | integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== 2395 | dependencies: 2396 | escalade "^3.1.1" 2397 | picocolors "^1.0.0" 2398 | 2399 | use-json-comparison@^1.0.3, use-json-comparison@^1.0.5: 2400 | version "1.0.6" 2401 | resolved "https://registry.yarnpkg.com/use-json-comparison/-/use-json-comparison-1.0.6.tgz#a012bbc258ce745db1f56745dc653f575226cb21" 2402 | integrity sha512-xPadt5yMRbEmVfOSGFSMqjjICrq7nLbfSH3rYIXsrtcuFX7PmbYDN/ku8ObBn3v8o/yZelO1OxUS5+5TI3+fUw== 2403 | 2404 | use-media-antd-query@^1.1.0: 2405 | version "1.1.0" 2406 | resolved "https://registry.yarnpkg.com/use-media-antd-query/-/use-media-antd-query-1.1.0.tgz#f083ad7e292c1c0261b6bbfaac0edc3e0920d85d" 2407 | integrity sha512-B6kKZwNV4R+l4Rl11sWO7HqOay9alzs1Vp1b4YJqjz33YxbltBCZtt/yxXxkXN9rc1S7OeEL/GbwC30Wmqhw6Q== 2408 | 2409 | use-sync-external-store@^1.0.0: 2410 | version "1.2.0" 2411 | resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" 2412 | integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== 2413 | 2414 | vite-plugin-imp@^2.2.0: 2415 | version "2.2.0" 2416 | resolved "https://registry.yarnpkg.com/vite-plugin-imp/-/vite-plugin-imp-2.2.0.tgz#537628fdce546f6b52356b286aae0a5bfdb96539" 2417 | integrity sha512-L7qHTtgwbv8c05SEXAo7xhHeROW5Su8tWWUud+cFQWWHBixkBAcxqZmGFe/UoH0AhOFVqLVFAh/L+1v7W7TEiQ== 2418 | dependencies: 2419 | "@babel/core" "^7.12.10" 2420 | "@babel/generator" "^7.12.11" 2421 | "@babel/parser" "^7.12.11" 2422 | "@babel/traverse" "^7.12.12" 2423 | chalk "^4.1.0" 2424 | param-case "^3.0.4" 2425 | pascal-case "^3.1.2" 2426 | 2427 | vite@^3.0.9: 2428 | version "3.0.9" 2429 | resolved "https://registry.yarnpkg.com/vite/-/vite-3.0.9.tgz#45fac22c2a5290a970f23d66c1aef56a04be8a30" 2430 | integrity sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw== 2431 | dependencies: 2432 | esbuild "^0.14.47" 2433 | postcss "^8.4.16" 2434 | resolve "^1.22.1" 2435 | rollup ">=2.75.6 <2.77.0 || ~2.77.0" 2436 | optionalDependencies: 2437 | fsevents "~2.3.2" 2438 | 2439 | warning@^4.0.3: 2440 | version "4.0.3" 2441 | resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" 2442 | integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== 2443 | dependencies: 2444 | loose-envify "^1.0.0" 2445 | 2446 | web-vitals@^2.1.4: 2447 | version "2.1.4" 2448 | resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" 2449 | integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== 2450 | --------------------------------------------------------------------------------