├── .gitignore
├── api
├── index.js
├── models
│ ├── Booking.js
│ ├── Place.js
│ └── User.js
├── package.json
└── yarn.lock
├── client
├── .env
├── .gitignore
├── index.html
├── package.json
├── postcss.config.cjs
├── public
│ └── vite.svg
├── src
│ ├── AccountNav.jsx
│ ├── AddressLink.jsx
│ ├── App.css
│ ├── App.jsx
│ ├── BookingDates.jsx
│ ├── BookingWidget.jsx
│ ├── Header.jsx
│ ├── Image.jsx
│ ├── Layout.jsx
│ ├── Perks.jsx
│ ├── PhotosUploader.jsx
│ ├── PlaceGallery.jsx
│ ├── PlaceImg.jsx
│ ├── UserContext.jsx
│ ├── assets
│ │ └── react.svg
│ ├── index.css
│ ├── main.jsx
│ └── pages
│ │ ├── BookingPage.jsx
│ │ ├── BookingsPage.jsx
│ │ ├── IndexPage.jsx
│ │ ├── LoginPage.jsx
│ │ ├── PlacePage.jsx
│ │ ├── PlacesFormPage.jsx
│ │ ├── PlacesPage.jsx
│ │ ├── ProfilePage.jsx
│ │ └── RegisterPage.jsx
├── tailwind.config.cjs
├── vite.config.js
└── yarn.lock
└── vercel.json
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | api/node_modules
3 | api/.env
4 | api/uploads/*
5 |
--------------------------------------------------------------------------------
/api/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const cors = require('cors');
3 | const mongoose = require("mongoose");
4 | const bcrypt = require('bcryptjs');
5 | const jwt = require('jsonwebtoken');
6 | const User = require('./models/User.js');
7 | const Place = require('./models/Place.js');
8 | const Booking = require('./models/Booking.js');
9 | const cookieParser = require('cookie-parser');
10 | const imageDownloader = require('image-downloader');
11 | const {S3Client, PutObjectCommand} = require('@aws-sdk/client-s3');
12 | const multer = require('multer');
13 | const fs = require('fs');
14 | const mime = require('mime-types');
15 |
16 | require('dotenv').config();
17 | const app = express();
18 |
19 | const bcryptSalt = bcrypt.genSaltSync(10);
20 | const jwtSecret = 'fasefraw4r5r3wq45wdfgw34twdfg';
21 | const bucket = 'dawid-booking-app';
22 |
23 | app.use(express.json());
24 | app.use(cookieParser());
25 | app.use('/uploads', express.static(__dirname+'/uploads'));
26 | app.use(cors({
27 | credentials: true,
28 | origin: 'http://127.0.0.1:5173',
29 | }));
30 |
31 | async function uploadToS3(path, originalFilename, mimetype) {
32 | const client = new S3Client({
33 | region: 'us-east-1',
34 | credentials: {
35 | accessKeyId: process.env.S3_ACCESS_KEY,
36 | secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
37 | },
38 | });
39 | const parts = originalFilename.split('.');
40 | const ext = parts[parts.length - 1];
41 | const newFilename = Date.now() + '.' + ext;
42 | await client.send(new PutObjectCommand({
43 | Bucket: bucket,
44 | Body: fs.readFileSync(path),
45 | Key: newFilename,
46 | ContentType: mimetype,
47 | ACL: 'public-read',
48 | }));
49 | return `https://${bucket}.s3.amazonaws.com/${newFilename}`;
50 | }
51 |
52 | function getUserDataFromReq(req) {
53 | return new Promise((resolve, reject) => {
54 | jwt.verify(req.cookies.token, jwtSecret, {}, async (err, userData) => {
55 | if (err) throw err;
56 | resolve(userData);
57 | });
58 | });
59 | }
60 |
61 | app.get('/api/test', (req,res) => {
62 | mongoose.connect(process.env.MONGO_URL);
63 | res.json('test ok');
64 | });
65 |
66 | app.post('/api/register', async (req,res) => {
67 | mongoose.connect(process.env.MONGO_URL);
68 | const {name,email,password} = req.body;
69 |
70 | try {
71 | const userDoc = await User.create({
72 | name,
73 | email,
74 | password:bcrypt.hashSync(password, bcryptSalt),
75 | });
76 | res.json(userDoc);
77 | } catch (e) {
78 | res.status(422).json(e);
79 | }
80 |
81 | });
82 |
83 | app.post('/api/login', async (req,res) => {
84 | mongoose.connect(process.env.MONGO_URL);
85 | const {email,password} = req.body;
86 | const userDoc = await User.findOne({email});
87 | if (userDoc) {
88 | const passOk = bcrypt.compareSync(password, userDoc.password);
89 | if (passOk) {
90 | jwt.sign({
91 | email:userDoc.email,
92 | id:userDoc._id
93 | }, jwtSecret, {}, (err,token) => {
94 | if (err) throw err;
95 | res.cookie('token', token).json(userDoc);
96 | });
97 | } else {
98 | res.status(422).json('pass not ok');
99 | }
100 | } else {
101 | res.json('not found');
102 | }
103 | });
104 |
105 | app.get('/api/profile', (req,res) => {
106 | mongoose.connect(process.env.MONGO_URL);
107 | const {token} = req.cookies;
108 | if (token) {
109 | jwt.verify(token, jwtSecret, {}, async (err, userData) => {
110 | if (err) throw err;
111 | const {name,email,_id} = await User.findById(userData.id);
112 | res.json({name,email,_id});
113 | });
114 | } else {
115 | res.json(null);
116 | }
117 | });
118 |
119 | app.post('/api/logout', (req,res) => {
120 | res.cookie('token', '').json(true);
121 | });
122 |
123 |
124 | app.post('/api/upload-by-link', async (req,res) => {
125 | const {link} = req.body;
126 | const newName = 'photo' + Date.now() + '.jpg';
127 | await imageDownloader.image({
128 | url: link,
129 | dest: '/tmp/' +newName,
130 | });
131 | const url = await uploadToS3('/tmp/' +newName, newName, mime.lookup('/tmp/' +newName));
132 | res.json(url);
133 | });
134 |
135 | const photosMiddleware = multer({dest:'/tmp'});
136 | app.post('/api/upload', photosMiddleware.array('photos', 100), async (req,res) => {
137 | const uploadedFiles = [];
138 | for (let i = 0; i < req.files.length; i++) {
139 | const {path,originalname,mimetype} = req.files[i];
140 | const url = await uploadToS3(path, originalname, mimetype);
141 | uploadedFiles.push(url);
142 | }
143 | res.json(uploadedFiles);
144 | });
145 |
146 | app.post('/api/places', (req,res) => {
147 | mongoose.connect(process.env.MONGO_URL);
148 | const {token} = req.cookies;
149 | const {
150 | title,address,addedPhotos,description,price,
151 | perks,extraInfo,checkIn,checkOut,maxGuests,
152 | } = req.body;
153 | jwt.verify(token, jwtSecret, {}, async (err, userData) => {
154 | if (err) throw err;
155 | const placeDoc = await Place.create({
156 | owner:userData.id,price,
157 | title,address,photos:addedPhotos,description,
158 | perks,extraInfo,checkIn,checkOut,maxGuests,
159 | });
160 | res.json(placeDoc);
161 | });
162 | });
163 |
164 | app.get('/api/user-places', (req,res) => {
165 | mongoose.connect(process.env.MONGO_URL);
166 | const {token} = req.cookies;
167 | jwt.verify(token, jwtSecret, {}, async (err, userData) => {
168 | const {id} = userData;
169 | res.json( await Place.find({owner:id}) );
170 | });
171 | });
172 |
173 | app.get('/api/places/:id', async (req,res) => {
174 | mongoose.connect(process.env.MONGO_URL);
175 | const {id} = req.params;
176 | res.json(await Place.findById(id));
177 | });
178 |
179 | app.put('/api/places', async (req,res) => {
180 | mongoose.connect(process.env.MONGO_URL);
181 | const {token} = req.cookies;
182 | const {
183 | id, title,address,addedPhotos,description,
184 | perks,extraInfo,checkIn,checkOut,maxGuests,price,
185 | } = req.body;
186 | jwt.verify(token, jwtSecret, {}, async (err, userData) => {
187 | if (err) throw err;
188 | const placeDoc = await Place.findById(id);
189 | if (userData.id === placeDoc.owner.toString()) {
190 | placeDoc.set({
191 | title,address,photos:addedPhotos,description,
192 | perks,extraInfo,checkIn,checkOut,maxGuests,price,
193 | });
194 | await placeDoc.save();
195 | res.json('ok');
196 | }
197 | });
198 | });
199 |
200 | app.get('/api/places', async (req,res) => {
201 | mongoose.connect(process.env.MONGO_URL);
202 | res.json( await Place.find() );
203 | });
204 |
205 | app.post('/api/bookings', async (req, res) => {
206 | mongoose.connect(process.env.MONGO_URL);
207 | const userData = await getUserDataFromReq(req);
208 | const {
209 | place,checkIn,checkOut,numberOfGuests,name,phone,price,
210 | } = req.body;
211 | Booking.create({
212 | place,checkIn,checkOut,numberOfGuests,name,phone,price,
213 | user:userData.id,
214 | }).then((doc) => {
215 | res.json(doc);
216 | }).catch((err) => {
217 | throw err;
218 | });
219 | });
220 |
221 |
222 |
223 | app.get('/api/bookings', async (req,res) => {
224 | mongoose.connect(process.env.MONGO_URL);
225 | const userData = await getUserDataFromReq(req);
226 | res.json( await Booking.find({user:userData.id}).populate('place') );
227 | });
228 |
229 | app.listen(4000);
--------------------------------------------------------------------------------
/api/models/Booking.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 |
3 | const bookingSchema = new mongoose.Schema({
4 | place: {type:mongoose.Schema.Types.ObjectId, required:true, ref:'Place'},
5 | user: {type:mongoose.Schema.Types.ObjectId, required:true},
6 | checkIn: {type:Date, required:true},
7 | checkOut: {type:Date, required:true},
8 | name: {type:String, required:true},
9 | phone: {type:String, required:true},
10 | price: Number,
11 | });
12 |
13 | const BookingModel = mongoose.model('Booking', bookingSchema);
14 |
15 | module.exports = BookingModel;
--------------------------------------------------------------------------------
/api/models/Place.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 |
3 | const placeSchema = new mongoose.Schema({
4 | owner: {type:mongoose.Schema.Types.ObjectId, ref:'User'},
5 | title: String,
6 | address: String,
7 | photos: [String],
8 | description: String,
9 | perks: [String],
10 | extraInfo: String,
11 | checkIn: Number,
12 | checkOut: Number,
13 | maxGuests: Number,
14 | price: Number,
15 | });
16 |
17 | const PlaceModel = mongoose.model('Place', placeSchema);
18 |
19 | module.exports = PlaceModel;
--------------------------------------------------------------------------------
/api/models/User.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 | const {Schema} = mongoose;
3 |
4 | const UserSchema = new Schema({
5 | name: String,
6 | email: {type:String, unique:true},
7 | password: String,
8 | });
9 |
10 | const UserModel = mongoose.model('User', UserSchema);
11 |
12 | module.exports = UserModel;
--------------------------------------------------------------------------------
/api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "@aws-sdk/client-s3": "^3.279.0",
4 | "bcryptjs": "^2.4.3",
5 | "cookie-parser": "^1.4.6",
6 | "cors": "^2.8.5",
7 | "dotenv": "^16.0.3",
8 | "express": "^4.18.2",
9 | "image-downloader": "^4.3.0",
10 | "jsonwebtoken": "^9.0.0",
11 | "mime-types": "^2.1.35",
12 | "mongoose": "^6.8.3",
13 | "multer": "^1.4.5-lts.1"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/client/.env:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dejwid/airbnb-clone/5fda1b2a18c55b0facb961b3fe38570e090ba4a1/client/.env
--------------------------------------------------------------------------------
/client/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + React
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "preview": "vite preview"
10 | },
11 | "dependencies": {
12 | "autoprefixer": "^10.4.13",
13 | "axios": "^1.2.2",
14 | "date-fns": "^2.29.3",
15 | "postcss": "^8.4.21",
16 | "react": "^18.2.0",
17 | "react-dom": "^18.2.0",
18 | "react-router-dom": "^6.6.2",
19 | "tailwindcss": "^3.2.4"
20 | },
21 | "devDependencies": {
22 | "@types/react": "^18.0.26",
23 | "@types/react-dom": "^18.0.9",
24 | "@vitejs/plugin-react": "^3.0.0",
25 | "vite": "^4.0.0"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/client/postcss.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/client/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client/src/AccountNav.jsx:
--------------------------------------------------------------------------------
1 | import {Link, useLocation} from "react-router-dom";
2 |
3 | export default function AccountNav() {
4 | const {pathname} = useLocation();
5 | let subpage = pathname.split('/')?.[2];
6 | if (subpage === undefined) {
7 | subpage = 'profile';
8 | }
9 | function linkClasses (type=null) {
10 | let classes = 'inline-flex gap-1 py-2 px-6 rounded-full';
11 | if (type === subpage) {
12 | classes += ' bg-primary text-white';
13 | } else {
14 | classes += ' bg-gray-200';
15 | }
16 | return classes;
17 | }
18 | return (
19 |
39 | );
40 | }
--------------------------------------------------------------------------------
/client/src/AddressLink.jsx:
--------------------------------------------------------------------------------
1 | export default function AddressLink({children,className=null}) {
2 | if (!className) {
3 | className = 'my-3 block';
4 | }
5 | className += ' flex gap-1 font-semibold underline';
6 | return (
7 |
8 |
12 | {children}
13 |
14 | );
15 | }
--------------------------------------------------------------------------------
/client/src/App.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dejwid/airbnb-clone/5fda1b2a18c55b0facb961b3fe38570e090ba4a1/client/src/App.css
--------------------------------------------------------------------------------
/client/src/App.jsx:
--------------------------------------------------------------------------------
1 | import './App.css'
2 | import {Route, Routes} from "react-router-dom";
3 | import IndexPage from "./pages/IndexPage.jsx";
4 | import LoginPage from "./pages/LoginPage";
5 | import Layout from "./Layout";
6 | import RegisterPage from "./pages/RegisterPage";
7 | import axios from "axios";
8 | import {UserContextProvider} from "./UserContext";
9 | import ProfilePage from "./pages/ProfilePage.jsx";
10 | import PlacesPage from "./pages/PlacesPage";
11 | import PlacesFormPage from "./pages/PlacesFormPage";
12 | import PlacePage from "./pages/PlacePage";
13 | import BookingsPage from "./pages/BookingsPage";
14 | import BookingPage from "./pages/BookingPage";
15 |
16 | axios.defaults.baseURL = import.meta.env.VITE_API_BASE_URL;
17 | axios.defaults.withCredentials = true;
18 |
19 | function App() {
20 | return (
21 |
22 |
23 | }>
24 | } />
25 | } />
26 | } />
27 | } />
28 | } />
29 | } />
30 | } />
31 | } />
32 | } />
33 | } />
34 |
35 |
36 |
37 | )
38 | }
39 |
40 | export default App
41 |
--------------------------------------------------------------------------------
/client/src/BookingDates.jsx:
--------------------------------------------------------------------------------
1 | import {differenceInCalendarDays, format} from "date-fns";
2 |
3 | export default function BookingDates({booking,className}) {
4 | return (
5 |
6 |
9 | {differenceInCalendarDays(new Date(booking.checkOut), new Date(booking.checkIn))} nights:
10 |
11 |
14 | {format(new Date(booking.checkIn), 'yyyy-MM-dd')}
15 |
16 | →
17 |
18 |
21 | {format(new Date(booking.checkOut), 'yyyy-MM-dd')}
22 |
23 |
24 | );
25 | }
--------------------------------------------------------------------------------
/client/src/BookingWidget.jsx:
--------------------------------------------------------------------------------
1 | import {useContext, useEffect, useState} from "react";
2 | import {differenceInCalendarDays} from "date-fns";
3 | import axios from "axios";
4 | import {Navigate} from "react-router-dom";
5 | import {UserContext} from "./UserContext.jsx";
6 |
7 | export default function BookingWidget({place}) {
8 | const [checkIn,setCheckIn] = useState('');
9 | const [checkOut,setCheckOut] = useState('');
10 | const [numberOfGuests,setNumberOfGuests] = useState(1);
11 | const [name,setName] = useState('');
12 | const [phone,setPhone] = useState('');
13 | const [redirect,setRedirect] = useState('');
14 | const {user} = useContext(UserContext);
15 |
16 | useEffect(() => {
17 | if (user) {
18 | setName(user.name);
19 | }
20 | }, [user]);
21 |
22 | let numberOfNights = 0;
23 | if (checkIn && checkOut) {
24 | numberOfNights = differenceInCalendarDays(new Date(checkOut), new Date(checkIn));
25 | }
26 |
27 | async function bookThisPlace() {
28 | const response = await axios.post('/bookings', {
29 | checkIn,checkOut,numberOfGuests,name,phone,
30 | place:place._id,
31 | price:numberOfNights * place.price,
32 | });
33 | const bookingId = response.data._id;
34 | setRedirect(`/account/bookings/${bookingId}`);
35 | }
36 |
37 | if (redirect) {
38 | return
39 | }
40 |
41 | return (
42 |
43 |
44 | Price: ${place.price} / per night
45 |
46 |
79 |
85 |
86 | );
87 | }
--------------------------------------------------------------------------------
/client/src/Header.jsx:
--------------------------------------------------------------------------------
1 | import {Link} from "react-router-dom";
2 | import {useContext} from "react";
3 | import {UserContext} from "./UserContext.jsx";
4 |
5 | export default function Header() {
6 | const {user} = useContext(UserContext);
7 | return (
8 |
9 |
10 |
13 | airbnb
14 |
15 |
16 |
Anywhere
17 |
18 |
Any week
19 |
20 |
Add guests
21 |
26 |
27 |
28 |
31 |
36 | {!!user && (
37 |
38 | {user.name}
39 |
40 | )}
41 |
42 |
43 | );
44 | }
--------------------------------------------------------------------------------
/client/src/Image.jsx:
--------------------------------------------------------------------------------
1 | export default function Image({src,...rest}) {
2 | src = src && src.includes('https://')
3 | ? src
4 | : 'http://localhost:4000/uploads/'+src;
5 | return (
6 |
7 | );
8 | }
--------------------------------------------------------------------------------
/client/src/Layout.jsx:
--------------------------------------------------------------------------------
1 | import Header from "./Header";
2 | import {Outlet} from "react-router-dom";
3 |
4 | export default function Layout() {
5 | return (
6 |
7 |
8 |
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/client/src/Perks.jsx:
--------------------------------------------------------------------------------
1 | export default function Perks({selected,onChange}) {
2 | function handleCbClick(ev) {
3 | const {checked,name} = ev.target;
4 | if (checked) {
5 | onChange([...selected,name]);
6 | } else {
7 | onChange([...selected.filter(selectedName => selectedName !== name)]);
8 | }
9 | }
10 | return (
11 | <>
12 |
19 |
26 |
33 |
40 |
49 |
56 | >
57 | );
58 | }
--------------------------------------------------------------------------------
/client/src/PhotosUploader.jsx:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 | import {useState} from "react";
3 | import Image from "./Image.jsx";
4 |
5 | export default function PhotosUploader({addedPhotos,onChange}) {
6 | const [photoLink,setPhotoLink] = useState('');
7 | async function addPhotoByLink(ev) {
8 | ev.preventDefault();
9 | const {data:filename} = await axios.post('/upload-by-link', {link: photoLink});
10 | onChange(prev => {
11 | return [...prev, filename];
12 | });
13 | setPhotoLink('');
14 | }
15 | function uploadPhoto(ev) {
16 | const files = ev.target.files;
17 | const data = new FormData();
18 | for (let i = 0; i < files.length; i++) {
19 | data.append('photos', files[i]);
20 | }
21 | axios.post('/upload', data, {
22 | headers: {'Content-type':'multipart/form-data'}
23 | }).then(response => {
24 | const {data:filenames} = response;
25 | onChange(prev => {
26 | return [...prev, ...filenames];
27 | });
28 | })
29 | }
30 | function removePhoto(ev,filename) {
31 | ev.preventDefault();
32 | onChange([...addedPhotos.filter(photo => photo !== filename)]);
33 | }
34 | function selectAsMainPhoto(ev,filename) {
35 | ev.preventDefault();
36 | onChange([filename,...addedPhotos.filter(photo => photo !== filename)]);
37 | }
38 | return (
39 | <>
40 |
41 | setPhotoLink(ev.target.value)}
43 | type="text" placeholder={'Add using a link ....jpg'}/>
44 |
45 |
46 |
47 | {addedPhotos.length > 0 && addedPhotos.map(link => (
48 |
49 |
50 |
55 |
67 |
68 | ))}
69 |
76 |
77 | >
78 | );
79 | }
--------------------------------------------------------------------------------
/client/src/PlaceGallery.jsx:
--------------------------------------------------------------------------------
1 | import {useState} from "react";
2 | import Image from "./Image.jsx";
3 |
4 | export default function PlaceGallery({place}) {
5 |
6 | const [showAllPhotos,setShowAllPhotos] = useState(false);
7 |
8 | if (showAllPhotos) {
9 | return (
10 |
11 |
12 |
13 |
Photos of {place.title}
14 |
20 |
21 | {place?.photos?.length > 0 && place.photos.map(photo => (
22 |
23 |
24 |
25 | ))}
26 |
27 |
28 | );
29 | }
30 |
31 | return (
32 |
33 |
34 |
35 | {place.photos?.[0] && (
36 |
37 | setShowAllPhotos(true)} className="aspect-square cursor-pointer object-cover" src={place.photos[0]} alt=""/>
38 |
39 | )}
40 |
41 |
42 | {place.photos?.[1] && (
43 |
setShowAllPhotos(true)} className="aspect-square cursor-pointer object-cover" src={place.photos[1]} alt=""/>
44 | )}
45 |
46 | {place.photos?.[2] && (
47 | setShowAllPhotos(true)} className="aspect-square cursor-pointer object-cover relative top-2" src={place.photos[2]} alt=""/>
48 | )}
49 |
50 |
51 |
52 |
58 |
59 | );
60 | }
--------------------------------------------------------------------------------
/client/src/PlaceImg.jsx:
--------------------------------------------------------------------------------
1 | import Image from "./Image.jsx";
2 |
3 | export default function PlaceImg({place,index=0,className=null}) {
4 | if (!place.photos?.length) {
5 | return '';
6 | }
7 | if (!className) {
8 | className = 'object-cover';
9 | }
10 | return (
11 |
12 | );
13 | }
--------------------------------------------------------------------------------
/client/src/UserContext.jsx:
--------------------------------------------------------------------------------
1 | import {createContext, useEffect, useState} from "react";
2 | import axios from "axios";
3 | import {data} from "autoprefixer";
4 |
5 | export const UserContext = createContext({});
6 |
7 | export function UserContextProvider({children}) {
8 | const [user,setUser] = useState(null);
9 | const [ready,setReady] = useState(false);
10 | useEffect(() => {
11 | if (!user) {
12 | axios.get('/profile').then(({data}) => {
13 | setUser(data);
14 | setReady(true);
15 | });
16 | }
17 | }, []);
18 | return (
19 |
20 | {children}
21 |
22 | );
23 | }
--------------------------------------------------------------------------------
/client/src/assets/react.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client/src/index.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | input[type="text"],input[type="password"],
6 | input[type="email"],input[type="number"],
7 | input[type="tel"],
8 | textarea{
9 | @apply w-full border my-1 py-2 px-3 rounded-2xl;
10 | }
11 | textarea{
12 | height: 140px;
13 | }
14 | button{
15 | @apply bg-gray-300;
16 | }
17 | button.primary{
18 | background-color: #F5385D;
19 | @apply bg-primary p-2 w-full text-white rounded-2xl;
20 | }
--------------------------------------------------------------------------------
/client/src/main.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom/client'
3 | import App from './App'
4 | import './index.css'
5 | import {BrowserRouter} from "react-router-dom";
6 |
7 | ReactDOM.createRoot(document.getElementById('root')).render(
8 |
9 |
10 |
11 |
12 | ,
13 | )
14 |
--------------------------------------------------------------------------------
/client/src/pages/BookingPage.jsx:
--------------------------------------------------------------------------------
1 | import {useParams} from "react-router-dom";
2 | import {useEffect, useState} from "react";
3 | import axios from "axios";
4 | import AddressLink from "../AddressLink";
5 | import PlaceGallery from "../PlaceGallery";
6 | import BookingDates from "../BookingDates";
7 |
8 | export default function BookingPage() {
9 | const {id} = useParams();
10 | const [booking,setBooking] = useState(null);
11 | useEffect(() => {
12 | if (id) {
13 | axios.get('/bookings').then(response => {
14 | const foundBooking = response.data.find(({_id}) => _id === id);
15 | if (foundBooking) {
16 | setBooking(foundBooking);
17 | }
18 | });
19 | }
20 | }, [id]);
21 |
22 | if (!booking) {
23 | return '';
24 | }
25 |
26 | return (
27 |
28 |
{booking.place.title}
29 |
{booking.place.address}
30 |
31 |
32 |
Your booking information:
33 |
34 |
35 |
36 |
Total price
37 |
${booking.price}
38 |
39 |
40 |
41 |
42 | );
43 | }
--------------------------------------------------------------------------------
/client/src/pages/BookingsPage.jsx:
--------------------------------------------------------------------------------
1 | import AccountNav from "../AccountNav";
2 | import {useEffect, useState} from "react";
3 | import axios from "axios";
4 | import PlaceImg from "../PlaceImg";
5 | import {differenceInCalendarDays, format} from "date-fns";
6 | import {Link} from "react-router-dom";
7 | import BookingDates from "../BookingDates";
8 |
9 | export default function BookingsPage() {
10 | const [bookings,setBookings] = useState([]);
11 | useEffect(() => {
12 | axios.get('/bookings').then(response => {
13 | setBookings(response.data);
14 | });
15 | }, []);
16 | return (
17 |
18 |
19 |
20 | {bookings?.length > 0 && bookings.map(booking => (
21 |
22 |
25 |
26 |
{booking.place.title}
27 |
28 |
29 |
30 |
33 |
34 | Total price: ${booking.price}
35 |
36 |
37 |
38 |
39 |
40 | ))}
41 |
42 |
43 | );
44 | }
--------------------------------------------------------------------------------
/client/src/pages/IndexPage.jsx:
--------------------------------------------------------------------------------
1 | import {useEffect, useState} from "react";
2 | import axios from "axios";
3 | import {Link} from "react-router-dom";
4 | import Image from "../Image.jsx";
5 |
6 | export default function IndexPage() {
7 | const [places,setPlaces] = useState([]);
8 | useEffect(() => {
9 | axios.get('/places').then(response => {
10 | setPlaces(response.data);
11 | });
12 | }, []);
13 | return (
14 |
15 | {places.length > 0 && places.map(place => (
16 |
17 |
18 | {place.photos?.[0] && (
19 |
20 | )}
21 |
22 |
{place.address}
23 |
{place.title}
24 |
25 | ${place.price} per night
26 |
27 |
28 | ))}
29 |
30 | );
31 | }
32 |
--------------------------------------------------------------------------------
/client/src/pages/LoginPage.jsx:
--------------------------------------------------------------------------------
1 | import {Link, Navigate} from "react-router-dom";
2 | import {useContext, useState} from "react";
3 | import axios from "axios";
4 | import {UserContext} from "../UserContext.jsx";
5 |
6 | export default function LoginPage() {
7 | const [email, setEmail] = useState('');
8 | const [password, setPassword] = useState('');
9 | const [redirect, setRedirect] = useState(false);
10 | const {setUser} = useContext(UserContext);
11 | async function handleLoginSubmit(ev) {
12 | ev.preventDefault();
13 | try {
14 | const {data} = await axios.post('/login', {email,password});
15 | setUser(data);
16 | alert('Login successful');
17 | setRedirect(true);
18 | } catch (e) {
19 | alert('Login failed');
20 | }
21 | }
22 |
23 | if (redirect) {
24 | return
25 | }
26 |
27 | return (
28 |
47 | );
48 | }
--------------------------------------------------------------------------------
/client/src/pages/PlacePage.jsx:
--------------------------------------------------------------------------------
1 | import {Link, useParams} from "react-router-dom";
2 | import {useEffect, useState} from "react";
3 | import axios from "axios";
4 | import BookingWidget from "../BookingWidget";
5 | import PlaceGallery from "../PlaceGallery";
6 | import AddressLink from "../AddressLink";
7 |
8 | export default function PlacePage() {
9 | const {id} = useParams();
10 | const [place,setPlace] = useState(null);
11 | useEffect(() => {
12 | if (!id) {
13 | return;
14 | }
15 | axios.get(`/places/${id}`).then(response => {
16 | setPlace(response.data);
17 | });
18 | }, [id]);
19 |
20 | if (!place) return '';
21 |
22 |
23 |
24 | return (
25 |
26 |
{place.title}
27 |
{place.address}
28 |
29 |
30 |
31 |
32 |
Description
33 | {place.description}
34 |
35 | Check-in: {place.checkIn}
36 | Check-out: {place.checkOut}
37 | Max number of guests: {place.maxGuests}
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
Extra info
46 |
47 |
{place.extraInfo}
48 |
49 |
50 | );
51 | }
52 |
--------------------------------------------------------------------------------
/client/src/pages/PlacesFormPage.jsx:
--------------------------------------------------------------------------------
1 | import PhotosUploader from "../PhotosUploader.jsx";
2 | import Perks from "../Perks.jsx";
3 | import {useEffect, useState} from "react";
4 | import axios from "axios";
5 | import AccountNav from "../AccountNav";
6 | import {Navigate, useParams} from "react-router-dom";
7 |
8 | export default function PlacesFormPage() {
9 | const {id} = useParams();
10 | const [title,setTitle] = useState('');
11 | const [address,setAddress] = useState('');
12 | const [addedPhotos,setAddedPhotos] = useState([]);
13 | const [description,setDescription] = useState('');
14 | const [perks,setPerks] = useState([]);
15 | const [extraInfo,setExtraInfo] = useState('');
16 | const [checkIn,setCheckIn] = useState('');
17 | const [checkOut,setCheckOut] = useState('');
18 | const [maxGuests,setMaxGuests] = useState(1);
19 | const [price,setPrice] = useState(100);
20 | const [redirect,setRedirect] = useState(false);
21 | useEffect(() => {
22 | if (!id) {
23 | return;
24 | }
25 | axios.get('/places/'+id).then(response => {
26 | const {data} = response;
27 | setTitle(data.title);
28 | setAddress(data.address);
29 | setAddedPhotos(data.photos);
30 | setDescription(data.description);
31 | setPerks(data.perks);
32 | setExtraInfo(data.extraInfo);
33 | setCheckIn(data.checkIn);
34 | setCheckOut(data.checkOut);
35 | setMaxGuests(data.maxGuests);
36 | setPrice(data.price);
37 | });
38 | }, [id]);
39 | function inputHeader(text) {
40 | return (
41 | {text}
42 | );
43 | }
44 | function inputDescription(text) {
45 | return (
46 | {text}
47 | );
48 | }
49 | function preInput(header,description) {
50 | return (
51 | <>
52 | {inputHeader(header)}
53 | {inputDescription(description)}
54 | >
55 | );
56 | }
57 |
58 | async function savePlace(ev) {
59 | ev.preventDefault();
60 | const placeData = {
61 | title, address, addedPhotos,
62 | description, perks, extraInfo,
63 | checkIn, checkOut, maxGuests, price,
64 | };
65 | if (id) {
66 | // update
67 | await axios.put('/places', {
68 | id, ...placeData
69 | });
70 | setRedirect(true);
71 | } else {
72 | // new place
73 | await axios.post('/places', placeData);
74 | setRedirect(true);
75 | }
76 |
77 | }
78 |
79 | if (redirect) {
80 | return
81 | }
82 |
83 | return (
84 |
131 | );
132 | }
--------------------------------------------------------------------------------
/client/src/pages/PlacesPage.jsx:
--------------------------------------------------------------------------------
1 | import {Link, useParams} from "react-router-dom";
2 | import AccountNav from "../AccountNav";
3 | import {useEffect, useState} from "react";
4 | import axios from "axios";
5 | import PlaceImg from "../PlaceImg";
6 | export default function PlacesPage() {
7 | const [places,setPlaces] = useState([]);
8 | useEffect(() => {
9 | axios.get('/user-places').then(({data}) => {
10 | setPlaces(data);
11 | });
12 | }, []);
13 | return (
14 |
15 |
16 |
17 |
18 |
21 | Add new place
22 |
23 |
24 |
25 | {places.length > 0 && places.map(place => (
26 |
27 |
30 |
31 |
{place.title}
32 |
{place.description}
33 |
34 |
35 | ))}
36 |
37 |
38 | );
39 | }
--------------------------------------------------------------------------------
/client/src/pages/ProfilePage.jsx:
--------------------------------------------------------------------------------
1 | import {useContext, useState} from "react";
2 | import {UserContext} from "../UserContext.jsx";
3 | import {Link, Navigate, useParams} from "react-router-dom";
4 | import axios from "axios";
5 | import PlacesPage from "./PlacesPage";
6 | import AccountNav from "../AccountNav";
7 |
8 | export default function ProfilePage() {
9 | const [redirect,setRedirect] = useState(null);
10 | const {ready,user,setUser} = useContext(UserContext);
11 | let {subpage} = useParams();
12 | if (subpage === undefined) {
13 | subpage = 'profile';
14 | }
15 |
16 | async function logout() {
17 | await axios.post('/logout');
18 | setRedirect('/');
19 | setUser(null);
20 | }
21 |
22 | if (!ready) {
23 | return 'Loading...';
24 | }
25 |
26 | if (ready && !user && !redirect) {
27 | return
28 | }
29 |
30 | if (redirect) {
31 | return
32 | }
33 | return (
34 |
35 |
36 | {subpage === 'profile' && (
37 |
38 | Logged in as {user.name} ({user.email})
39 |
40 |
41 | )}
42 | {subpage === 'places' && (
43 |
44 | )}
45 |
46 | );
47 | }
--------------------------------------------------------------------------------
/client/src/pages/RegisterPage.jsx:
--------------------------------------------------------------------------------
1 | import {Link} from "react-router-dom";
2 | import {useState} from "react";
3 | import axios from "axios";
4 |
5 | export default function RegisterPage() {
6 | const [name,setName] = useState('');
7 | const [email,setEmail] = useState('');
8 | const [password,setPassword] = useState('');
9 | async function registerUser(ev) {
10 | ev.preventDefault();
11 | try {
12 | await axios.post('/register', {
13 | name,
14 | email,
15 | password,
16 | });
17 | alert('Registration successful. Now you can log in');
18 | } catch (e) {
19 | alert('Registration failed. Please try again later');
20 | }
21 | }
22 | return (
23 |
46 | );
47 | }
--------------------------------------------------------------------------------
/client/tailwind.config.cjs:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: [
4 | "./index.html",
5 | "./src/**/*.{js,ts,jsx,tsx}",
6 | ],
7 | theme: {
8 | extend: {
9 | colors: {
10 | primary: '#F5385D',
11 | },
12 | },
13 | },
14 | plugins: [],
15 | }
16 |
--------------------------------------------------------------------------------
/client/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [react()],
7 | })
8 |
--------------------------------------------------------------------------------
/client/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@ampproject/remapping@^2.1.0":
6 | version "2.2.0"
7 | resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
8 | integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
9 | dependencies:
10 | "@jridgewell/gen-mapping" "^0.1.0"
11 | "@jridgewell/trace-mapping" "^0.3.9"
12 |
13 | "@babel/code-frame@^7.18.6":
14 | version "7.18.6"
15 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
16 | integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
17 | dependencies:
18 | "@babel/highlight" "^7.18.6"
19 |
20 | "@babel/compat-data@^7.20.5":
21 | version "7.20.10"
22 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec"
23 | integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==
24 |
25 | "@babel/core@^7.20.7":
26 | version "7.20.12"
27 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d"
28 | integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==
29 | dependencies:
30 | "@ampproject/remapping" "^2.1.0"
31 | "@babel/code-frame" "^7.18.6"
32 | "@babel/generator" "^7.20.7"
33 | "@babel/helper-compilation-targets" "^7.20.7"
34 | "@babel/helper-module-transforms" "^7.20.11"
35 | "@babel/helpers" "^7.20.7"
36 | "@babel/parser" "^7.20.7"
37 | "@babel/template" "^7.20.7"
38 | "@babel/traverse" "^7.20.12"
39 | "@babel/types" "^7.20.7"
40 | convert-source-map "^1.7.0"
41 | debug "^4.1.0"
42 | gensync "^1.0.0-beta.2"
43 | json5 "^2.2.2"
44 | semver "^6.3.0"
45 |
46 | "@babel/generator@^7.20.7":
47 | version "7.20.7"
48 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a"
49 | integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==
50 | dependencies:
51 | "@babel/types" "^7.20.7"
52 | "@jridgewell/gen-mapping" "^0.3.2"
53 | jsesc "^2.5.1"
54 |
55 | "@babel/helper-compilation-targets@^7.20.7":
56 | version "7.20.7"
57 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb"
58 | integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==
59 | dependencies:
60 | "@babel/compat-data" "^7.20.5"
61 | "@babel/helper-validator-option" "^7.18.6"
62 | browserslist "^4.21.3"
63 | lru-cache "^5.1.1"
64 | semver "^6.3.0"
65 |
66 | "@babel/helper-environment-visitor@^7.18.9":
67 | version "7.18.9"
68 | resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
69 | integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
70 |
71 | "@babel/helper-function-name@^7.19.0":
72 | version "7.19.0"
73 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c"
74 | integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==
75 | dependencies:
76 | "@babel/template" "^7.18.10"
77 | "@babel/types" "^7.19.0"
78 |
79 | "@babel/helper-hoist-variables@^7.18.6":
80 | version "7.18.6"
81 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
82 | integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==
83 | dependencies:
84 | "@babel/types" "^7.18.6"
85 |
86 | "@babel/helper-module-imports@^7.18.6":
87 | version "7.18.6"
88 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
89 | integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
90 | dependencies:
91 | "@babel/types" "^7.18.6"
92 |
93 | "@babel/helper-module-transforms@^7.20.11":
94 | version "7.20.11"
95 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0"
96 | integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==
97 | dependencies:
98 | "@babel/helper-environment-visitor" "^7.18.9"
99 | "@babel/helper-module-imports" "^7.18.6"
100 | "@babel/helper-simple-access" "^7.20.2"
101 | "@babel/helper-split-export-declaration" "^7.18.6"
102 | "@babel/helper-validator-identifier" "^7.19.1"
103 | "@babel/template" "^7.20.7"
104 | "@babel/traverse" "^7.20.10"
105 | "@babel/types" "^7.20.7"
106 |
107 | "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0":
108 | version "7.20.2"
109 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629"
110 | integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==
111 |
112 | "@babel/helper-simple-access@^7.20.2":
113 | version "7.20.2"
114 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9"
115 | integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==
116 | dependencies:
117 | "@babel/types" "^7.20.2"
118 |
119 | "@babel/helper-split-export-declaration@^7.18.6":
120 | version "7.18.6"
121 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075"
122 | integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==
123 | dependencies:
124 | "@babel/types" "^7.18.6"
125 |
126 | "@babel/helper-string-parser@^7.19.4":
127 | version "7.19.4"
128 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63"
129 | integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
130 |
131 | "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1":
132 | version "7.19.1"
133 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
134 | integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
135 |
136 | "@babel/helper-validator-option@^7.18.6":
137 | version "7.18.6"
138 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8"
139 | integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==
140 |
141 | "@babel/helpers@^7.20.7":
142 | version "7.20.7"
143 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce"
144 | integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==
145 | dependencies:
146 | "@babel/template" "^7.20.7"
147 | "@babel/traverse" "^7.20.7"
148 | "@babel/types" "^7.20.7"
149 |
150 | "@babel/highlight@^7.18.6":
151 | version "7.18.6"
152 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
153 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
154 | dependencies:
155 | "@babel/helper-validator-identifier" "^7.18.6"
156 | chalk "^2.0.0"
157 | js-tokens "^4.0.0"
158 |
159 | "@babel/parser@^7.20.7":
160 | version "7.20.7"
161 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b"
162 | integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==
163 |
164 | "@babel/plugin-transform-react-jsx-self@^7.18.6":
165 | version "7.18.6"
166 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7"
167 | integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==
168 | dependencies:
169 | "@babel/helper-plugin-utils" "^7.18.6"
170 |
171 | "@babel/plugin-transform-react-jsx-source@^7.19.6":
172 | version "7.19.6"
173 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz#88578ae8331e5887e8ce28e4c9dc83fb29da0b86"
174 | integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==
175 | dependencies:
176 | "@babel/helper-plugin-utils" "^7.19.0"
177 |
178 | "@babel/template@^7.18.10", "@babel/template@^7.20.7":
179 | version "7.20.7"
180 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8"
181 | integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==
182 | dependencies:
183 | "@babel/code-frame" "^7.18.6"
184 | "@babel/parser" "^7.20.7"
185 | "@babel/types" "^7.20.7"
186 |
187 | "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.7":
188 | version "7.20.12"
189 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5"
190 | integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==
191 | dependencies:
192 | "@babel/code-frame" "^7.18.6"
193 | "@babel/generator" "^7.20.7"
194 | "@babel/helper-environment-visitor" "^7.18.9"
195 | "@babel/helper-function-name" "^7.19.0"
196 | "@babel/helper-hoist-variables" "^7.18.6"
197 | "@babel/helper-split-export-declaration" "^7.18.6"
198 | "@babel/parser" "^7.20.7"
199 | "@babel/types" "^7.20.7"
200 | debug "^4.1.0"
201 | globals "^11.1.0"
202 |
203 | "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7":
204 | version "7.20.7"
205 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f"
206 | integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==
207 | dependencies:
208 | "@babel/helper-string-parser" "^7.19.4"
209 | "@babel/helper-validator-identifier" "^7.19.1"
210 | to-fast-properties "^2.0.0"
211 |
212 | "@esbuild/android-arm64@0.16.17":
213 | version "0.16.17"
214 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23"
215 | integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==
216 |
217 | "@esbuild/android-arm@0.16.17":
218 | version "0.16.17"
219 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2"
220 | integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==
221 |
222 | "@esbuild/android-x64@0.16.17":
223 | version "0.16.17"
224 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e"
225 | integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==
226 |
227 | "@esbuild/darwin-arm64@0.16.17":
228 | version "0.16.17"
229 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220"
230 | integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==
231 |
232 | "@esbuild/darwin-x64@0.16.17":
233 | version "0.16.17"
234 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4"
235 | integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==
236 |
237 | "@esbuild/freebsd-arm64@0.16.17":
238 | version "0.16.17"
239 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27"
240 | integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==
241 |
242 | "@esbuild/freebsd-x64@0.16.17":
243 | version "0.16.17"
244 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72"
245 | integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==
246 |
247 | "@esbuild/linux-arm64@0.16.17":
248 | version "0.16.17"
249 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca"
250 | integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==
251 |
252 | "@esbuild/linux-arm@0.16.17":
253 | version "0.16.17"
254 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196"
255 | integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==
256 |
257 | "@esbuild/linux-ia32@0.16.17":
258 | version "0.16.17"
259 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54"
260 | integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==
261 |
262 | "@esbuild/linux-loong64@0.16.17":
263 | version "0.16.17"
264 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8"
265 | integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==
266 |
267 | "@esbuild/linux-mips64el@0.16.17":
268 | version "0.16.17"
269 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726"
270 | integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==
271 |
272 | "@esbuild/linux-ppc64@0.16.17":
273 | version "0.16.17"
274 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8"
275 | integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==
276 |
277 | "@esbuild/linux-riscv64@0.16.17":
278 | version "0.16.17"
279 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9"
280 | integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==
281 |
282 | "@esbuild/linux-s390x@0.16.17":
283 | version "0.16.17"
284 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87"
285 | integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==
286 |
287 | "@esbuild/linux-x64@0.16.17":
288 | version "0.16.17"
289 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f"
290 | integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==
291 |
292 | "@esbuild/netbsd-x64@0.16.17":
293 | version "0.16.17"
294 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775"
295 | integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==
296 |
297 | "@esbuild/openbsd-x64@0.16.17":
298 | version "0.16.17"
299 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35"
300 | integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==
301 |
302 | "@esbuild/sunos-x64@0.16.17":
303 | version "0.16.17"
304 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c"
305 | integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==
306 |
307 | "@esbuild/win32-arm64@0.16.17":
308 | version "0.16.17"
309 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a"
310 | integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==
311 |
312 | "@esbuild/win32-ia32@0.16.17":
313 | version "0.16.17"
314 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09"
315 | integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==
316 |
317 | "@esbuild/win32-x64@0.16.17":
318 | version "0.16.17"
319 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091"
320 | integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==
321 |
322 | "@jridgewell/gen-mapping@^0.1.0":
323 | version "0.1.1"
324 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
325 | integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
326 | dependencies:
327 | "@jridgewell/set-array" "^1.0.0"
328 | "@jridgewell/sourcemap-codec" "^1.4.10"
329 |
330 | "@jridgewell/gen-mapping@^0.3.2":
331 | version "0.3.2"
332 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
333 | integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
334 | dependencies:
335 | "@jridgewell/set-array" "^1.0.1"
336 | "@jridgewell/sourcemap-codec" "^1.4.10"
337 | "@jridgewell/trace-mapping" "^0.3.9"
338 |
339 | "@jridgewell/resolve-uri@3.1.0":
340 | version "3.1.0"
341 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
342 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
343 |
344 | "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
345 | version "1.1.2"
346 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
347 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
348 |
349 | "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13":
350 | version "1.4.14"
351 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
352 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
353 |
354 | "@jridgewell/trace-mapping@^0.3.9":
355 | version "0.3.17"
356 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985"
357 | integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==
358 | dependencies:
359 | "@jridgewell/resolve-uri" "3.1.0"
360 | "@jridgewell/sourcemap-codec" "1.4.14"
361 |
362 | "@nodelib/fs.scandir@2.1.5":
363 | version "2.1.5"
364 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
365 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
366 | dependencies:
367 | "@nodelib/fs.stat" "2.0.5"
368 | run-parallel "^1.1.9"
369 |
370 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
371 | version "2.0.5"
372 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
373 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
374 |
375 | "@nodelib/fs.walk@^1.2.3":
376 | version "1.2.8"
377 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
378 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
379 | dependencies:
380 | "@nodelib/fs.scandir" "2.1.5"
381 | fastq "^1.6.0"
382 |
383 | "@remix-run/router@1.2.1":
384 | version "1.2.1"
385 | resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.2.1.tgz#812edd4104a15a493dda1ccac0b352270d7a188c"
386 | integrity sha512-XiY0IsyHR+DXYS5vBxpoBe/8veTeoRpMHP+vDosLZxL5bnpetzI0igkxkLZS235ldLzyfkxF+2divEwWHP3vMQ==
387 |
388 | "@types/prop-types@*":
389 | version "15.7.5"
390 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
391 | integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
392 |
393 | "@types/react-dom@^18.0.9":
394 | version "18.0.10"
395 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.10.tgz#3b66dec56aa0f16a6cc26da9e9ca96c35c0b4352"
396 | integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==
397 | dependencies:
398 | "@types/react" "*"
399 |
400 | "@types/react@*", "@types/react@^18.0.26":
401 | version "18.0.26"
402 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917"
403 | integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==
404 | dependencies:
405 | "@types/prop-types" "*"
406 | "@types/scheduler" "*"
407 | csstype "^3.0.2"
408 |
409 | "@types/scheduler@*":
410 | version "0.16.2"
411 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
412 | integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
413 |
414 | "@vitejs/plugin-react@^3.0.0":
415 | version "3.0.1"
416 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-3.0.1.tgz#ad21fb81377970dd4021a31cd95a03eb6f5c4c48"
417 | integrity sha512-mx+QvYwIbbpOIJw+hypjnW1lAbKDHtWK5ibkF/V1/oMBu8HU/chb+SnqJDAsLq1+7rGqjktCEomMTM5KShzUKQ==
418 | dependencies:
419 | "@babel/core" "^7.20.7"
420 | "@babel/plugin-transform-react-jsx-self" "^7.18.6"
421 | "@babel/plugin-transform-react-jsx-source" "^7.19.6"
422 | magic-string "^0.27.0"
423 | react-refresh "^0.14.0"
424 |
425 | acorn-node@^1.8.2:
426 | version "1.8.2"
427 | resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8"
428 | integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==
429 | dependencies:
430 | acorn "^7.0.0"
431 | acorn-walk "^7.0.0"
432 | xtend "^4.0.2"
433 |
434 | acorn-walk@^7.0.0:
435 | version "7.2.0"
436 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
437 | integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
438 |
439 | acorn@^7.0.0:
440 | version "7.4.1"
441 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
442 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
443 |
444 | ansi-styles@^3.2.1:
445 | version "3.2.1"
446 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
447 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
448 | dependencies:
449 | color-convert "^1.9.0"
450 |
451 | anymatch@~3.1.2:
452 | version "3.1.3"
453 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
454 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
455 | dependencies:
456 | normalize-path "^3.0.0"
457 | picomatch "^2.0.4"
458 |
459 | arg@^5.0.2:
460 | version "5.0.2"
461 | resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
462 | integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
463 |
464 | asynckit@^0.4.0:
465 | version "0.4.0"
466 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
467 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
468 |
469 | autoprefixer@^10.4.13:
470 | version "10.4.13"
471 | resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8"
472 | integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==
473 | dependencies:
474 | browserslist "^4.21.4"
475 | caniuse-lite "^1.0.30001426"
476 | fraction.js "^4.2.0"
477 | normalize-range "^0.1.2"
478 | picocolors "^1.0.0"
479 | postcss-value-parser "^4.2.0"
480 |
481 | axios@^1.2.2:
482 | version "1.2.2"
483 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.2.tgz#72681724c6e6a43a9fea860fc558127dbe32f9f1"
484 | integrity sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==
485 | dependencies:
486 | follow-redirects "^1.15.0"
487 | form-data "^4.0.0"
488 | proxy-from-env "^1.1.0"
489 |
490 | binary-extensions@^2.0.0:
491 | version "2.2.0"
492 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
493 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
494 |
495 | braces@^3.0.2, braces@~3.0.2:
496 | version "3.0.2"
497 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
498 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
499 | dependencies:
500 | fill-range "^7.0.1"
501 |
502 | browserslist@^4.21.3, browserslist@^4.21.4:
503 | version "4.21.4"
504 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987"
505 | integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==
506 | dependencies:
507 | caniuse-lite "^1.0.30001400"
508 | electron-to-chromium "^1.4.251"
509 | node-releases "^2.0.6"
510 | update-browserslist-db "^1.0.9"
511 |
512 | camelcase-css@^2.0.1:
513 | version "2.0.1"
514 | resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
515 | integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
516 |
517 | caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426:
518 | version "1.0.30001445"
519 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001445.tgz#cf2d4eb93f2bcdf0310de9dd6d18be271bc0b447"
520 | integrity sha512-8sdQIdMztYmzfTMO6KfLny878Ln9c2M0fc7EH60IjlP4Dc4PiCy7K2Vl3ITmWgOyPgVQKa5x+UP/KqFsxj4mBg==
521 |
522 | chalk@^2.0.0:
523 | version "2.4.2"
524 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
525 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
526 | dependencies:
527 | ansi-styles "^3.2.1"
528 | escape-string-regexp "^1.0.5"
529 | supports-color "^5.3.0"
530 |
531 | chokidar@^3.5.3:
532 | version "3.5.3"
533 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
534 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
535 | dependencies:
536 | anymatch "~3.1.2"
537 | braces "~3.0.2"
538 | glob-parent "~5.1.2"
539 | is-binary-path "~2.1.0"
540 | is-glob "~4.0.1"
541 | normalize-path "~3.0.0"
542 | readdirp "~3.6.0"
543 | optionalDependencies:
544 | fsevents "~2.3.2"
545 |
546 | color-convert@^1.9.0:
547 | version "1.9.3"
548 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
549 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
550 | dependencies:
551 | color-name "1.1.3"
552 |
553 | color-name@1.1.3:
554 | version "1.1.3"
555 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
556 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
557 |
558 | color-name@^1.1.4:
559 | version "1.1.4"
560 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
561 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
562 |
563 | combined-stream@^1.0.8:
564 | version "1.0.8"
565 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
566 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
567 | dependencies:
568 | delayed-stream "~1.0.0"
569 |
570 | convert-source-map@^1.7.0:
571 | version "1.9.0"
572 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
573 | integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
574 |
575 | cssesc@^3.0.0:
576 | version "3.0.0"
577 | resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
578 | integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
579 |
580 | csstype@^3.0.2:
581 | version "3.1.1"
582 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9"
583 | integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
584 |
585 | date-fns@^2.29.3:
586 | version "2.29.3"
587 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8"
588 | integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==
589 |
590 | debug@^4.1.0:
591 | version "4.3.4"
592 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
593 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
594 | dependencies:
595 | ms "2.1.2"
596 |
597 | defined@^1.0.0:
598 | version "1.0.1"
599 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf"
600 | integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==
601 |
602 | delayed-stream@~1.0.0:
603 | version "1.0.0"
604 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
605 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
606 |
607 | detective@^5.2.1:
608 | version "5.2.1"
609 | resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034"
610 | integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==
611 | dependencies:
612 | acorn-node "^1.8.2"
613 | defined "^1.0.0"
614 | minimist "^1.2.6"
615 |
616 | didyoumean@^1.2.2:
617 | version "1.2.2"
618 | resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
619 | integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==
620 |
621 | dlv@^1.1.3:
622 | version "1.1.3"
623 | resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
624 | integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
625 |
626 | electron-to-chromium@^1.4.251:
627 | version "1.4.284"
628 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592"
629 | integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==
630 |
631 | esbuild@^0.16.3:
632 | version "0.16.17"
633 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259"
634 | integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==
635 | optionalDependencies:
636 | "@esbuild/android-arm" "0.16.17"
637 | "@esbuild/android-arm64" "0.16.17"
638 | "@esbuild/android-x64" "0.16.17"
639 | "@esbuild/darwin-arm64" "0.16.17"
640 | "@esbuild/darwin-x64" "0.16.17"
641 | "@esbuild/freebsd-arm64" "0.16.17"
642 | "@esbuild/freebsd-x64" "0.16.17"
643 | "@esbuild/linux-arm" "0.16.17"
644 | "@esbuild/linux-arm64" "0.16.17"
645 | "@esbuild/linux-ia32" "0.16.17"
646 | "@esbuild/linux-loong64" "0.16.17"
647 | "@esbuild/linux-mips64el" "0.16.17"
648 | "@esbuild/linux-ppc64" "0.16.17"
649 | "@esbuild/linux-riscv64" "0.16.17"
650 | "@esbuild/linux-s390x" "0.16.17"
651 | "@esbuild/linux-x64" "0.16.17"
652 | "@esbuild/netbsd-x64" "0.16.17"
653 | "@esbuild/openbsd-x64" "0.16.17"
654 | "@esbuild/sunos-x64" "0.16.17"
655 | "@esbuild/win32-arm64" "0.16.17"
656 | "@esbuild/win32-ia32" "0.16.17"
657 | "@esbuild/win32-x64" "0.16.17"
658 |
659 | escalade@^3.1.1:
660 | version "3.1.1"
661 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
662 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
663 |
664 | escape-string-regexp@^1.0.5:
665 | version "1.0.5"
666 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
667 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
668 |
669 | fast-glob@^3.2.12:
670 | version "3.2.12"
671 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
672 | integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
673 | dependencies:
674 | "@nodelib/fs.stat" "^2.0.2"
675 | "@nodelib/fs.walk" "^1.2.3"
676 | glob-parent "^5.1.2"
677 | merge2 "^1.3.0"
678 | micromatch "^4.0.4"
679 |
680 | fastq@^1.6.0:
681 | version "1.15.0"
682 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
683 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
684 | dependencies:
685 | reusify "^1.0.4"
686 |
687 | fill-range@^7.0.1:
688 | version "7.0.1"
689 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
690 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
691 | dependencies:
692 | to-regex-range "^5.0.1"
693 |
694 | follow-redirects@^1.15.0:
695 | version "1.15.2"
696 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
697 | integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
698 |
699 | form-data@^4.0.0:
700 | version "4.0.0"
701 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
702 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
703 | dependencies:
704 | asynckit "^0.4.0"
705 | combined-stream "^1.0.8"
706 | mime-types "^2.1.12"
707 |
708 | fraction.js@^4.2.0:
709 | version "4.2.0"
710 | resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950"
711 | integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==
712 |
713 | fsevents@~2.3.2:
714 | version "2.3.2"
715 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
716 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
717 |
718 | function-bind@^1.1.1:
719 | version "1.1.1"
720 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
721 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
722 |
723 | gensync@^1.0.0-beta.2:
724 | version "1.0.0-beta.2"
725 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
726 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
727 |
728 | glob-parent@^5.1.2, glob-parent@~5.1.2:
729 | version "5.1.2"
730 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
731 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
732 | dependencies:
733 | is-glob "^4.0.1"
734 |
735 | glob-parent@^6.0.2:
736 | version "6.0.2"
737 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
738 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
739 | dependencies:
740 | is-glob "^4.0.3"
741 |
742 | globals@^11.1.0:
743 | version "11.12.0"
744 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
745 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
746 |
747 | has-flag@^3.0.0:
748 | version "3.0.0"
749 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
750 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
751 |
752 | has@^1.0.3:
753 | version "1.0.3"
754 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
755 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
756 | dependencies:
757 | function-bind "^1.1.1"
758 |
759 | is-binary-path@~2.1.0:
760 | version "2.1.0"
761 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
762 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
763 | dependencies:
764 | binary-extensions "^2.0.0"
765 |
766 | is-core-module@^2.9.0:
767 | version "2.11.0"
768 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
769 | integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
770 | dependencies:
771 | has "^1.0.3"
772 |
773 | is-extglob@^2.1.1:
774 | version "2.1.1"
775 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
776 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
777 |
778 | is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
779 | version "4.0.3"
780 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
781 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
782 | dependencies:
783 | is-extglob "^2.1.1"
784 |
785 | is-number@^7.0.0:
786 | version "7.0.0"
787 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
788 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
789 |
790 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
791 | version "4.0.0"
792 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
793 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
794 |
795 | jsesc@^2.5.1:
796 | version "2.5.2"
797 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
798 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
799 |
800 | json5@^2.2.2:
801 | version "2.2.3"
802 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
803 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
804 |
805 | lilconfig@^2.0.5, lilconfig@^2.0.6:
806 | version "2.0.6"
807 | resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4"
808 | integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==
809 |
810 | loose-envify@^1.1.0:
811 | version "1.4.0"
812 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
813 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
814 | dependencies:
815 | js-tokens "^3.0.0 || ^4.0.0"
816 |
817 | lru-cache@^5.1.1:
818 | version "5.1.1"
819 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
820 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
821 | dependencies:
822 | yallist "^3.0.2"
823 |
824 | magic-string@^0.27.0:
825 | version "0.27.0"
826 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3"
827 | integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==
828 | dependencies:
829 | "@jridgewell/sourcemap-codec" "^1.4.13"
830 |
831 | merge2@^1.3.0:
832 | version "1.4.1"
833 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
834 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
835 |
836 | micromatch@^4.0.4, micromatch@^4.0.5:
837 | version "4.0.5"
838 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
839 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
840 | dependencies:
841 | braces "^3.0.2"
842 | picomatch "^2.3.1"
843 |
844 | mime-db@1.52.0:
845 | version "1.52.0"
846 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
847 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
848 |
849 | mime-types@^2.1.12:
850 | version "2.1.35"
851 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
852 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
853 | dependencies:
854 | mime-db "1.52.0"
855 |
856 | minimist@^1.2.6:
857 | version "1.2.7"
858 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"
859 | integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
860 |
861 | ms@2.1.2:
862 | version "2.1.2"
863 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
864 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
865 |
866 | nanoid@^3.3.4:
867 | version "3.3.4"
868 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
869 | integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
870 |
871 | node-releases@^2.0.6:
872 | version "2.0.8"
873 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae"
874 | integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==
875 |
876 | normalize-path@^3.0.0, normalize-path@~3.0.0:
877 | version "3.0.0"
878 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
879 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
880 |
881 | normalize-range@^0.1.2:
882 | version "0.1.2"
883 | resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
884 | integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==
885 |
886 | object-hash@^3.0.0:
887 | version "3.0.0"
888 | resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
889 | integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
890 |
891 | path-parse@^1.0.7:
892 | version "1.0.7"
893 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
894 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
895 |
896 | picocolors@^1.0.0:
897 | version "1.0.0"
898 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
899 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
900 |
901 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
902 | version "2.3.1"
903 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
904 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
905 |
906 | pify@^2.3.0:
907 | version "2.3.0"
908 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
909 | integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
910 |
911 | postcss-import@^14.1.0:
912 | version "14.1.0"
913 | resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0"
914 | integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==
915 | dependencies:
916 | postcss-value-parser "^4.0.0"
917 | read-cache "^1.0.0"
918 | resolve "^1.1.7"
919 |
920 | postcss-js@^4.0.0:
921 | version "4.0.0"
922 | resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00"
923 | integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==
924 | dependencies:
925 | camelcase-css "^2.0.1"
926 |
927 | postcss-load-config@^3.1.4:
928 | version "3.1.4"
929 | resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855"
930 | integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==
931 | dependencies:
932 | lilconfig "^2.0.5"
933 | yaml "^1.10.2"
934 |
935 | postcss-nested@6.0.0:
936 | version "6.0.0"
937 | resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735"
938 | integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==
939 | dependencies:
940 | postcss-selector-parser "^6.0.10"
941 |
942 | postcss-selector-parser@^6.0.10:
943 | version "6.0.11"
944 | resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc"
945 | integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==
946 | dependencies:
947 | cssesc "^3.0.0"
948 | util-deprecate "^1.0.2"
949 |
950 | postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
951 | version "4.2.0"
952 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
953 | integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
954 |
955 | postcss@^8.4.18, postcss@^8.4.20, postcss@^8.4.21:
956 | version "8.4.21"
957 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4"
958 | integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==
959 | dependencies:
960 | nanoid "^3.3.4"
961 | picocolors "^1.0.0"
962 | source-map-js "^1.0.2"
963 |
964 | proxy-from-env@^1.1.0:
965 | version "1.1.0"
966 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
967 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
968 |
969 | queue-microtask@^1.2.2:
970 | version "1.2.3"
971 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
972 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
973 |
974 | quick-lru@^5.1.1:
975 | version "5.1.1"
976 | resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
977 | integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
978 |
979 | react-dom@^18.2.0:
980 | version "18.2.0"
981 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
982 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
983 | dependencies:
984 | loose-envify "^1.1.0"
985 | scheduler "^0.23.0"
986 |
987 | react-refresh@^0.14.0:
988 | version "0.14.0"
989 | resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e"
990 | integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==
991 |
992 | react-router-dom@^6.6.2:
993 | version "6.6.2"
994 | resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.6.2.tgz#bbf1f9b45855b218d22fc2d294b79408a084740a"
995 | integrity sha512-6SCDXxRQqW5af8ImOqKza7icmQ47/EMbz572uFjzvcArg3lZ+04PxSPp8qGs+p2Y+q+b+S/AjXv8m8dyLndIIA==
996 | dependencies:
997 | "@remix-run/router" "1.2.1"
998 | react-router "6.6.2"
999 |
1000 | react-router@6.6.2:
1001 | version "6.6.2"
1002 | resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.6.2.tgz#556f7b56cff7fe32c5c02429fef3fcb2ecd08111"
1003 | integrity sha512-uJPG55Pek3orClbURDvfljhqFvMgJRo59Pktywkk8hUUkTY2aRfza8Yhl/vZQXs+TNQyr6tu+uqz/fLxPICOGQ==
1004 | dependencies:
1005 | "@remix-run/router" "1.2.1"
1006 |
1007 | react@^18.2.0:
1008 | version "18.2.0"
1009 | resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
1010 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
1011 | dependencies:
1012 | loose-envify "^1.1.0"
1013 |
1014 | read-cache@^1.0.0:
1015 | version "1.0.0"
1016 | resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
1017 | integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==
1018 | dependencies:
1019 | pify "^2.3.0"
1020 |
1021 | readdirp@~3.6.0:
1022 | version "3.6.0"
1023 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
1024 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
1025 | dependencies:
1026 | picomatch "^2.2.1"
1027 |
1028 | resolve@^1.1.7, resolve@^1.22.1:
1029 | version "1.22.1"
1030 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
1031 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
1032 | dependencies:
1033 | is-core-module "^2.9.0"
1034 | path-parse "^1.0.7"
1035 | supports-preserve-symlinks-flag "^1.0.0"
1036 |
1037 | reusify@^1.0.4:
1038 | version "1.0.4"
1039 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
1040 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
1041 |
1042 | rollup@^3.7.0:
1043 | version "3.10.0"
1044 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.10.0.tgz#6eb19196d8b3b375ca651cb78261faac48e24cd6"
1045 | integrity sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==
1046 | optionalDependencies:
1047 | fsevents "~2.3.2"
1048 |
1049 | run-parallel@^1.1.9:
1050 | version "1.2.0"
1051 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
1052 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
1053 | dependencies:
1054 | queue-microtask "^1.2.2"
1055 |
1056 | scheduler@^0.23.0:
1057 | version "0.23.0"
1058 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
1059 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
1060 | dependencies:
1061 | loose-envify "^1.1.0"
1062 |
1063 | semver@^6.3.0:
1064 | version "6.3.0"
1065 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
1066 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
1067 |
1068 | source-map-js@^1.0.2:
1069 | version "1.0.2"
1070 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
1071 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
1072 |
1073 | supports-color@^5.3.0:
1074 | version "5.5.0"
1075 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
1076 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
1077 | dependencies:
1078 | has-flag "^3.0.0"
1079 |
1080 | supports-preserve-symlinks-flag@^1.0.0:
1081 | version "1.0.0"
1082 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
1083 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
1084 |
1085 | tailwindcss@^3.2.4:
1086 | version "3.2.4"
1087 | resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.4.tgz#afe3477e7a19f3ceafb48e4b083e292ce0dc0250"
1088 | integrity sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==
1089 | dependencies:
1090 | arg "^5.0.2"
1091 | chokidar "^3.5.3"
1092 | color-name "^1.1.4"
1093 | detective "^5.2.1"
1094 | didyoumean "^1.2.2"
1095 | dlv "^1.1.3"
1096 | fast-glob "^3.2.12"
1097 | glob-parent "^6.0.2"
1098 | is-glob "^4.0.3"
1099 | lilconfig "^2.0.6"
1100 | micromatch "^4.0.5"
1101 | normalize-path "^3.0.0"
1102 | object-hash "^3.0.0"
1103 | picocolors "^1.0.0"
1104 | postcss "^8.4.18"
1105 | postcss-import "^14.1.0"
1106 | postcss-js "^4.0.0"
1107 | postcss-load-config "^3.1.4"
1108 | postcss-nested "6.0.0"
1109 | postcss-selector-parser "^6.0.10"
1110 | postcss-value-parser "^4.2.0"
1111 | quick-lru "^5.1.1"
1112 | resolve "^1.22.1"
1113 |
1114 | to-fast-properties@^2.0.0:
1115 | version "2.0.0"
1116 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
1117 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
1118 |
1119 | to-regex-range@^5.0.1:
1120 | version "5.0.1"
1121 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
1122 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
1123 | dependencies:
1124 | is-number "^7.0.0"
1125 |
1126 | update-browserslist-db@^1.0.9:
1127 | version "1.0.10"
1128 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3"
1129 | integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==
1130 | dependencies:
1131 | escalade "^3.1.1"
1132 | picocolors "^1.0.0"
1133 |
1134 | util-deprecate@^1.0.2:
1135 | version "1.0.2"
1136 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
1137 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
1138 |
1139 | vite@^4.0.0:
1140 | version "4.0.4"
1141 | resolved "https://registry.yarnpkg.com/vite/-/vite-4.0.4.tgz#4612ce0b47bbb233a887a54a4ae0c6e240a0da31"
1142 | integrity sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==
1143 | dependencies:
1144 | esbuild "^0.16.3"
1145 | postcss "^8.4.20"
1146 | resolve "^1.22.1"
1147 | rollup "^3.7.0"
1148 | optionalDependencies:
1149 | fsevents "~2.3.2"
1150 |
1151 | xtend@^4.0.2:
1152 | version "4.0.2"
1153 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
1154 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
1155 |
1156 | yallist@^3.0.2:
1157 | version "3.1.1"
1158 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
1159 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
1160 |
1161 | yaml@^1.10.2:
1162 | version "1.10.2"
1163 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
1164 | integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
1165 |
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "buildCommand": "cd client && yarn install && ./node_modules/vite/bin/vite.js build",
3 | "outputDirectory": "client/dist",
4 | "framework": "vite",
5 | "rewrites": [
6 | {
7 | "source": "/api/(.*)",
8 | "destination": "/api/index.js"
9 | },
10 | {"source": "/(.*)", "destination": "/"}
11 | ]
12 | }
13 |
--------------------------------------------------------------------------------