From 05f5504c583d6a53877cc8f04c335d941696f4b6 Mon Sep 17 00:00:00 2001 From: sunpaaaa Date: Wed, 8 Nov 2023 15:59:03 +0900 Subject: [PATCH 1/8] =?UTF-8?q?=F0=9F=93=9DChore:=20initial=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 18 + .gitignore | 26 + .prettierrc.json | 12 + README.md | 893 +-------- index.html | 13 + package-lock.json | 2636 ++++++++++++++++++++++++++ package.json | 33 + public/.gitkeep | 0 src/App.tsx | 30 + src/api/.gitkeep | 0 src/assets/.gitkeep | 0 src/assets/images/.gitkeep | 0 src/components/.gitkeep | 0 src/hooks/.gitkeep | 0 src/index.css | 0 src/main.tsx | 9 + src/pages/auth/Signin.tsx | 7 + src/pages/auth/Signup.tsx | 7 + src/pages/auth/login.tsx | 1 + src/pages/game/Chat.tsx | 7 + src/pages/game/Hanging.tsx | 7 + src/pages/game/Night.tsx | 7 + src/pages/game/Result.tsx | 7 + src/pages/game/Role.tsx | 7 + src/pages/game/Vote.tsx | 7 + src/pages/lobby/Lobby.tsx | 7 + src/store/.gitkeep | 0 src/styles/abstracts/_index.scss | 2 + src/styles/abstracts/_mixin.scss | 30 + src/styles/abstracts/_variables.scss | 34 + src/styles/base/_index.scss | 1 + src/styles/base/_normalize.scss | 0 src/styles/components/.gitkeep | 0 src/styles/pages/signin.module.scss | 8 + src/vite-env.d.ts | 1 + tsconfig.json | 40 + tsconfig.node.json | 10 + vite.config.ts | 13 + 38 files changed, 2998 insertions(+), 875 deletions(-) create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 .prettierrc.json create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/.gitkeep create mode 100644 src/App.tsx create mode 100644 src/api/.gitkeep create mode 100644 src/assets/.gitkeep create mode 100644 src/assets/images/.gitkeep create mode 100644 src/components/.gitkeep create mode 100644 src/hooks/.gitkeep create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/pages/auth/Signin.tsx create mode 100644 src/pages/auth/Signup.tsx create mode 100644 src/pages/auth/login.tsx create mode 100644 src/pages/game/Chat.tsx create mode 100644 src/pages/game/Hanging.tsx create mode 100644 src/pages/game/Night.tsx create mode 100644 src/pages/game/Result.tsx create mode 100644 src/pages/game/Role.tsx create mode 100644 src/pages/game/Vote.tsx create mode 100644 src/pages/lobby/Lobby.tsx create mode 100644 src/store/.gitkeep create mode 100644 src/styles/abstracts/_index.scss create mode 100644 src/styles/abstracts/_mixin.scss create mode 100644 src/styles/abstracts/_variables.scss create mode 100644 src/styles/base/_index.scss create mode 100644 src/styles/base/_normalize.scss create mode 100644 src/styles/components/.gitkeep create mode 100644 src/styles/pages/signin.module.scss create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 00000000..d6c95379 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..9b6dd35d --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local +.env + + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..acaf7dc8 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,12 @@ +{ + "printWidth": 80, + "singleQuote": true, + "trailingComma": "all", + "tabWidth": 2, + "bracketSameLine": true, + "orderedImports": true, + "bracketSpacing": true, + "jsxBracketSameLine": true, + "arrowParens": "always", + "endOfLine": "lf" +} diff --git a/README.md b/README.md index 28a2b985..1ebe379f 100644 --- a/README.md +++ b/README.md @@ -1,884 +1,27 @@ -# πŸ‹ μ†ŒμΌ“ 기반 μ±„νŒ…μ•± +# React + TypeScript + Vite -주어진 API와 μ†ŒμΌ“μ„ 뢄석해 μ–΄λ–€ ν”„λ‘œμ νŠΈλ₯Ό 진행/μ™„μ„±ν•  것인지 νŒ€ λ‹¨μœ„λ‘œ 자유둭게 κ²°μ •ν•˜κ³  λ§Œλ“€μ–΄λ³΄μ„Έμš”. -과제 μˆ˜ν–‰ 및 리뷰 기간은 별도 곡지λ₯Ό μ°Έκ³ ν•˜μ„Έμš”! +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. -## 과제 μˆ˜ν–‰ 및 제좜 방법 +Currently, two official plugins are available: -``` -Y_FE_Toy2_{νŒ€λͺ…} - -E.g, Y_FE_Toy2_GYOHEON -``` - -1. ν˜„μž¬ μ €μž₯μ†Œλ₯Ό λ‘œμ»¬μ— 클둠(Clone)ν•©λ‹ˆλ‹€. -1. μžμ‹ μ˜ νŒ€λͺ…μœΌλ‘œ 브랜치λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.(ꡬ뢄 κ°€λŠ₯ν•˜λ„λ‘ νŒ€λͺ…을 κΌ­ νŒŒμŠ€μΉΌμΌ€μ΄μŠ€λ‘œ ν‘œμ‹œν•˜μ„Έμš”, `git branch Y_FE_Toy2_Team13`) -1. μžμ‹ μ˜ νŒ€λͺ… λΈŒλžœμΉ˜μ—μ„œ 과제λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. -1. 과제 μˆ˜ν–‰μ΄ μ™„λ£Œλ˜λ©΄, μžμ‹ μ˜ νŒ€λͺ… 브랜치λ₯Ό 원격 μ €μž₯μ†Œμ— ν‘Έμ‹œ(Push)ν•©λ‹ˆλ‹€.(`main` λΈŒλžœμΉ˜μ— ν‘Έμ‹œν•˜μ§€ μ•Šλ„λ‘ κΌ­ μ£Όμ˜ν•˜μ„Έμš”, `git push origin Y_FE_Toy2_Team13`) -1. μ €μž₯μ†Œμ—μ„œ `main` 브랜치λ₯Ό λŒ€μƒμœΌλ‘œ Pull Request μƒμ„±ν•˜λ©΄, 과제 제좜이 μ™„λ£Œλ©λ‹ˆλ‹€!(E.g, `main` <== `Y_FE_Toy2_Team13`) -1. Pull Request 링크λ₯Ό LMSλ‘œλ„ μ œμΆœν•΄ μ£Όμ…”μ•Ό ν•©λ‹ˆλ‹€. -1. main ν˜Ήμ€ λ‹€λ₯Έ μ‚¬λžŒμ˜ 브랜치둜 μ ˆλŒ€ λ³‘ν•©ν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•˜μ„Έμš”! -1. Pull Requestμ—μ„œ λ³΄μ΄λŠ” μ„€λͺ…을 λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ μ΄ν•΄ν•˜κΈ° 쉽도둝 κΌΌκΌΌν•˜κ²Œ μž‘μ„±ν•˜μ„Έμš”! - -- 과제 μˆ˜ν–‰ 및 제좜 κ³Όμ •μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•œ 경우, λ°”λ‘œ λ‹΄λ‹Ή λ©˜ν† λ‚˜ κ°•μ‚¬μ—κ²Œ μ–˜κΈ°ν•˜μ„Έμš”! - -- λ°±μ—”λ“œ μ„œλ²„μ— λ¬Έμ œκ°€ 생겼을 경우, λ°”λ‘œ μŠ¬λž™μ˜ GyoHeon Leeμ—κ²Œ μ—°λ½ν•˜μ„Έμš”! - -## ν•„μˆ˜ κ΅¬ν˜„ 사항 -- [ ] `useState` λ˜λŠ” `useReducer`λ₯Ό ν™œμš©ν•œ μƒνƒœ 관리 κ΅¬ν˜„ -- [ ] `Sass`, `styled-component`, `emotion`, `Chakra UI`, `tailwind CSS` 등을 ν™œμš©ν•œ μŠ€νƒ€μΌ κ΅¬ν˜„ -- [ ] `react` μƒνƒœλ₯Ό ν†΅ν•œ CRUD κ΅¬ν˜„ -- [ ] μƒνƒœμ— 따라 λ‹¬λΌμ§€λŠ” μŠ€νƒ€μΌ κ΅¬ν˜„ -- [ ] `custom hook`을 ν†΅ν•œ 비동기 처리 κ΅¬ν˜„ -- [ ] μœ μ €μΈμ¦ μ‹œμŠ€ν…œ(둜그인, νšŒμ›κ°€μž…) κ΅¬ν˜„ -- [ ] `jwt`λ“±μ˜ μœ μ € 인증 μ‹œμŠ€ν…œ (둜그인, νšŒμ›κ°€μž… κΈ°λŠ₯) -- [ ] μ†ŒμΌ“μ„ μ΄μš©ν•œ μ±„νŒ… κ΅¬ν˜„ - -## 선택 κ΅¬ν˜„ 사항 -- [ ] `Next.js`λ₯Ό ν™œμš©ν•œ μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§ κ΅¬ν˜„ -- [ ] `typescript`λ₯Ό ν™œμš©ν•œ μ•± κ΅¬ν˜„ -- [ ] `storybook`을 ν™œμš©ν•œ λ””μžμΈ μ‹œμŠ€ν…œ κ΅¬ν˜„ -- [ ] `jest`λ₯Ό ν™œμš©ν•œ λ‹¨μœ„ ν…ŒμŠ€νŠΈ κ΅¬ν˜„ - -## μΆ”κ°€ 사항 -- apiλ“€μ˜ 응닡 데이터듀을 μΌλΆ€λŸ¬ νŒŒνŽΈν™” ν•΄λ‘μ—ˆμŠ΅λ‹ˆλ‹€! -- apiλ“€ κ°„μ˜ 데이터λ₯Ό μ‘°ν•©ν•˜μ—¬ 이상적인 ꡬ쑰λ₯Ό λ§Œλ“€μ–΄λ³΄μ„Έμš”. - -## μ˜ˆμ‹œ ν”„λ‘œμ νŠΈ - -![private-messaging-part-1-chat-ab610e9e03738ad37f7b0fb55c771087](https://github.com/KDT1-FE/Y_FE_Toy2/assets/66263916/c5247dde-2ca6-4285-a60e-8dcf23326d0e) - -## API μ‚¬μš©λ²• - -- λͺ¨λ“  network μš”μ²­(Request) `headers`에 μ•„λž˜ 정보가 κΌ­ 포함돼야 ν•©λ‹ˆλ‹€! -- serverIdλŠ” νŒ€λ§ˆλ‹€ κ°œλ³„ μ „λ‹¬λ©λ‹ˆλ‹€. -- 확인할 수 μ—†λŠ” μ‚¬μš©μžλ‚˜ νŒ€μ˜ DB μ •λ³΄λŠ” μž„μ˜λ‘œ μ‚­μ œλ  수 μžˆμŠ΅λ‹ˆλ‹€! - -```json -{ - "content-type": "application/json", - "serverId": "nREmPe9B", -} -``` - -## κΈ°λ³Έ 데이터 ꡬ쑰 -### user -```ts -interface User { - id: string; - password: string; - name: string; - picture: string; - chats: string[]; // chat id만 μ†ν•©λ‹ˆλ‹€. -} -``` -### chat -```ts -interface Chat { - id: string; - name: string; - isPrivate: boolean; - users: string[]; - messages: Message[]; // message 객체가 μ†ν•©λ‹ˆλ‹€. - - updatedAt: Date; -} -``` -### message -```ts -interface Message { - id: string; - text: string; - userId: string; - - createdAt: Date; -} -``` -## νšŒμ› - -### νšŒμ›κ°€μž… - -μ‚¬μš©μžκ°€ `id`에 μ’…μ†λ˜μ–΄ νšŒμ›κ°€μž…ν•©λ‹ˆλ‹€. - -- μ‚¬μš©μž λΉ„λ°€λ²ˆν˜ΈλŠ” μ•”ν˜Έν™”ν•΄ μ €μž₯ν•©λ‹ˆλ‹€. -- ν”„λ‘œν•„ μ΄λ―Έμ§€λŠ” url or base64 ν˜•μ‹μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€. -- ν”„λ‘œν•„ μ΄λ―Έμ§€λŠ” 1MB μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€. - -```curl -curl https://fastcampus-chat.net/signup - \ -X 'POST' -``` - -μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: - -```ts -interface RequestBody { - id: string // μ‚¬μš©μž 아이디 (ν•„μˆ˜!, μ˜μ–΄μ™€ 숫자만) - password: string // μ‚¬μš©μž λΉ„λ°€λ²ˆν˜Έ, 5자 이상 (ν•„μˆ˜!) - name: string // μ‚¬μš©μž 이름, 20자 μ΄ν•˜ (ν•„μˆ˜!) - picture?: string // μ‚¬μš©μž 이미지(url or base64, under 1MB) -} -``` - -```json -{ - "id": "abcd", - "password": "********", - "name": "GyoHeon", - "picture": "https://avatars.githubusercontent.com/u/66263916?v=4" -} -``` - -응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: - -```ts -interface ResponseValue { - message: title -} -``` - -```json -{ - "message": "User created" -} -``` - -### 둜그인 - -- λ°œκΈ‰λœ `accessToken`은 7일 ν›„ λ§Œλ£Œλ©λ‹ˆλ‹€. - -```curl -curl https://fastcampus-chat.net/login - \ -X 'POST' -``` - -μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: - -```ts -interface RequestBody { - id: string // μ‚¬μš©μž 아이디 (ν•„μˆ˜!) - password: string // μ‚¬μš©μž λΉ„λ°€λ²ˆν˜Έ (ν•„μˆ˜!) -} -``` - -```json -{ - "id": "abcd", - "password": "********" -} -``` - -응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: - -```ts -interface ResponseValue { - accessToken: string // μ‚¬μš©μž μ ‘κ·Ό 토큰 - refreshToken: string // access token λ°œκΈ‰μš© 토큰 -} -``` +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh -```json -{ - "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjlQS3I...(μƒλž΅)", - "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjlQS3I...(μƒλž΅)" -} -``` - -### 토큰 μž¬λ°œκΈ‰ - -```curl -curl https://fastcampus-chat.net/refresh - \ -X 'POST' - \ -H 'Authorization: Bearer ' -``` - -μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: - -```ts -interface RequestBody { - refreshToken: string // access token λ°œκΈ‰μš© 토큰 -} -``` - -```json -{ - "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjlQS3I...(μƒλž΅)" -} -``` - -응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: - -```ts -interface ResponseValue { - accessToken: string // μ‚¬μš©μž μ ‘κ·Ό 토큰 -} -``` +## Expanding the ESLint configuration -```json -{ - "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjlQS3I...(μƒλž΅)", -} -``` - -### μ‚¬μš©μž 정보 μˆ˜μ • - -- ν”„λ‘œν•„ μ΄λ―Έμ§€λŠ” url or base64 ν˜•μ‹μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€. -- ν”„λ‘œν•„ μ΄λ―Έμ§€λŠ” 1MB μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€. - -```curl -curl https://fastcampus-chat.net/user - \ -X 'PATCH' - \ -H 'Authorization: Bearer ' -``` - -μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: -```ts -interface RequestBody { - name?: string // μƒˆλ‘œμš΄ ν‘œμ‹œ 이름 - picture?: string // μ‚¬μš©μž ν”„λ‘œν•„ 이미지(url or base64) -} -``` - -```json -{ - "name": "abcde", - "picture": "https://avatars.githubusercontent.com/u/42333366?v=4" -} -``` - -응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: - -```ts -interface ResponseValue { - messgae: string -} -``` +- Configure the top-level `parserOptions` property like this: -```json -{ - "message": "User updated" -} +```js + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, ``` -## μ±„νŒ… -### νŠΉμ • μœ μ € 쑰회 -- νŠΉμ • μœ μ €λ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€. -```curl -curl https://fastcampus-chat.net/user?userId=${userId} - \ -X 'GET' - \ -H 'Authorization: Bearer ' -``` -μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -- μ—†μŒ -- μ‘°νšŒν•˜κ³  싢은 idλŠ” query string으둜 μ‚¬μš©ν•©λ‹ˆλ‹€. - -응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -```ts -type ResponseValue = { - user: User; -} - -interface User { - id: string; - name: string; - picture: string; -} -``` - -```json -{ - "user": { - "id": "user1", - "name": "lgh", - "picture": "https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro" - } -} -``` - -### λͺ¨λ“  μœ μ € 쑰회 -- ν˜„μž¬ μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  μœ μ €λ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€. -```curl -curl https://fastcampus-chat.net/users - \ -X 'GET' - \ -H 'Authorization: Bearer ' -``` -μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -- μ—†μŒ - -응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -```ts -type ResponseValue = User[] - -interface User { - id: string; - name: string; - picture: string; -} -``` - -```json -[ - { - "id": "user1", - "name": "lgh", - "picture": "https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro" - }, - { - "id": "user2", - "name": "ldj", - "picture": "https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro" - } -] -``` - - -### μ±„νŒ… μƒμ„±ν•˜κΈ° - -```curl -curl https://fastcampus-chat.net/chat - \ -X 'POST' - \ -H 'Authorization: Bearer ' -``` - -μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -```ts -interface RequestBody{ - name: string, // chat 이름 - users: string[], // μ°Έκ°€μžλ“€ id(μžμ‹  미포함) - isPrivate?: boolean // 곡개 λΉ„κ³΅κ°œ -} -``` - -```json -{ - "name": "test chat", - "users": ["user1", "user2"] -} -``` - -응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -```ts -interface ResponseValue { - id: string, - name: string, - users: User[], // μžμ‹ μ„ ν¬ν•¨ν•œ μ°Έκ°€μžλ“€ 정보 - isPrivate: boolean, - updatedAt: Date -} - -interface User { - id: string; - name: string; - picture: string; -} -``` - -```json -{ - "id": "fasgadsfdsghssdlsdafasd", - "name": "test chat", - "users": [ - { - "id": "user1", - "name": "lgh", - "picture": "https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro" - }, - { - "id": "user2", - "name": "ldj", - "picture": "https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro" - } - ], - "isPrivate": false, - "updatedAt": "2023-11-01T08:23:39.850Z" -} -``` - -### λͺ¨λ“  μ±„νŒ… 쑰회 -- ν˜„μž¬ μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  μ±„νŒ…μ„ μ‘°νšŒν•©λ‹ˆλ‹€. -- isPrivate: true인 μ±„νŒ…λ°©μ€ 보이지 μ•ŠμŠ΅λ‹ˆλ‹€. - -```curl -curl https://fastcampus-chat.net/chat/all - \ -X 'GET' - \ -H 'Authorization: Bearer ' -``` - -μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -- μ—†μŒ - -응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -```ts -type ResponseValue = Chat[] - -interface Chat { - id: string; - name: string; - users: User[]; // μ†ν•œ μœ μ € 정보 - isPrivate: boolean; - latestMessage: Message | null; - updatedAt: Date; -} - -interface User { - id: string; - name: string; - picture: string; -} - -interface Message { - id: string; - text: string; - userId: string; - createAt: Date; -} -``` - -```json -[ - { - "id": "f189ab25-5644-4d72-bd7c-0170ee9c8ede", - "name": "chat room 1", - "users": [ - { - "id": "user1", - "name": "lgh", - "picture": "https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro" - }, - { - "id": "user2", - "name": "ldj", - "picture": "https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro" - } - ], - "isPrivate": false, - "updatedAt": "2023-10-31T13:18:38.216Z", - "latestMessage": null - }, - { - "id": "f189ab25-5644-4d72-bd7c-0170ee9c8edj", - "name": "chat room 2", - "users": [ - { - "id": "user1", - "name": "lgh", - "picture": "https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro" - }, - { - "id": "user2", - "name": "ldj", - "picture": "https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro" - } - ], - "isPrivate": false, - "updatedAt": "2023-10-31T15:18:38.216Z", - "latestMessage": { - "id": "8f7f67bb-f1ab-4792-9678-0b8546adcb6f", - "text": "testtest444", - "userId": "test:test6", - "createdAt": "2023-11-06T11:15:50.588+00:00" - } - } -] -``` - -### λ‚˜μ˜ μ±„νŒ… 쑰회 -```curl -curl https://fastcampus-chat.net/chat - \ -X 'GET' - \ -H 'Authorization: Bearer ' -``` -- λ‚΄κ°€ μ†ν•œ λͺ¨λ“  μ±„νŒ…μ„ μ‘°νšŒν•©λ‹ˆλ‹€. -- isPrivate: true인 μ±„νŒ…λ°©λ„ λͺ¨λ‘ 보이게 λ©λ‹ˆλ‹€. - -μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -- μ—†μŒ - -응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -```ts -type ResponseValue = Chat[] - -interface Chat { - id: string; - name: string; - users: User[]; // μ†ν•œ μœ μ € id - isPrivate: boolean; - latestMessage: Message | null; - updatedAt: Date; -} - -interface User { - id: string; - name: string; - picture: string; -} - -interface Message { - id: string; - text: string; - userId: string; - createAt: Date; -} -``` - -```json -[ - { - "id": "f189ab25-5644-4d72-bd7c-0170ee9c8ede", - "name": "chat room 1", - "users": [ - { - "id": "user1", - "name": "lgh", - "picture": "https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro" - }, - { - "id": "user2", - "name": "ldj", - "picture": "https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro" - } - ], - "isPrivate": true, - "updatedAt": "2023-10-31T13:18:38.216Z", - "latestMessage": null - }, - { - "id": "f189ab25-5644-4d72-bd7c-0170ee9c8edj", - "name": "chat room 2", - "users": [ - { - "id": "user1", - "name": "lgh", - "picture": "https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro" - }, - { - "id": "user2", - "name": "ldj", - "picture": "https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro" - } - ], - "isPrivate": false, - "updatedAt": "2023-10-31T15:18:38.216Z", - "latestMessage": { - "id": "8f7f67bb-f1ab-4792-9678-0b8546adcb6f", - "text": "testtest444", - "userId": "test:test6", - "createdAt": "2023-11-06T11:15:50.588+00:00" - } - } -] -``` - -## μ±„νŒ… μ°Έμ—¬ν•˜κΈ° - -```curl -curl https://fastcampus-chat.net/chat/participate - \ -X 'PATCH' - \ -H 'Authorization: Bearer ' -``` - -μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -```ts -interface RequestBody { - chatId: string; -} -``` - -```json -{ - "chatId": "f189ab25-5644-4d72-bd7c-0170ee9c8ede" -} -``` - -응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -```ts -interface ResponseValue{ - id: string; - name: string; - users: User[]; // μ†ν•œ μœ μ € id - isPrivate: boolean; - updatedAt: Date; -} - -interface User { - id: string; - name: string; - picture: string; -} -``` - -```json -{ - "id": "f189ab25-5644-4d72-bd7c-0170ee9c8ede", - "name": "chat room 1", - "users": [ - { - "id": "user1", - "name": "lgh", - "picture": "https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro" - }, - { - "id": "user2", - "name": "ldj", - "picture": "https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro" - } - ], - "isPrivate": true, - "updatedAt": "2023-10-31T13:18:38.216Z" -} -``` - -## μ±„νŒ… λ‚˜κ°€κΈ° - -```curl -curl https://fastcampus-chat.net/chat/leave - \ -X 'PATCH' - \ -H 'Authorization: Bearer ' -``` - -μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -```ts -interface RequestBody { - chatId: string; -} -``` - -```json -{ - "chatId": "f189ab25-5644-4d72-bd7c-0170ee9c8ede" -} -``` - -응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -```ts -interface ResponseValue { - message: string; -} -``` - -```json -{ - "message": "Leave success" -} -``` - -## μ±„νŒ… μ΄ˆλŒ€ν•˜κΈ° - -```curl -curl https://fastcampus-chat.net/chat/invite - \ -X 'PATCH' - \ -H 'Authorization: Bearer ' -``` - -μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -```ts -interface RequestBody { - chatId: string; - users: string[]; // μ΄ˆλŒ€ν•  μœ μ € id -} -``` - -```json -{ - "chatId": "f189ab25-5644-4d72-bd7c-0170ee9c8ede", - "users": ["user1", "user2"] -} -``` - -응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ: -```ts -interface ResponseValue{ - id: string; - name: string; - users: User[]; // μ†ν•œ μœ μ € 정보 - isPrivate: boolean; - updatedAt: Date; -} - -interface User { - id: string; - name: string; - picture: string; -} -``` - -```json -{ - "id": "f189ab25-5644-4d72-bd7c-0170ee9c8ede", - "name": "chat room 1", - "users": [ - { - "id": "user1", - "name": "lgh", - "picture": "https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro" - }, - { - "id": "user2", - "name": "ldj", - "picture": "https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro" - } - ], - "isPrivate": true, - "updatedAt": "2023-10-31T13:18:38.216Z" -} -``` - -# Socket -- socket.io 의 μ‚¬μš©μ„ μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€. -- Socket μ—°κ²°μ‹œμ—λ„ headersλŠ” μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€. -## κΈ°λ³Έ μ—°κ²° -```ts -socket.on(`https://fastcampus-chat.net/chat?chatId=${chatId}`, - { - extraHeaders: { - Authorization: "Bearer ", - serverId: "test", - }, - }) -``` - -## emit Event(client -> server) -### example -```ts -socket.emit('message-to-server', text) -``` -### message-to-server -- 같은 방에 μžˆλŠ” μ‚¬λžŒλ“€μ—κ²Œ 메세지λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€. - -μš”μ²­ 데이터 -```ts -type RequestData: string; -``` -### fetch-messages -- 이전 λŒ€ν™” λͺ©λ‘μ„ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€. -- `messages-to-client`둜 데이터λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€. - -μš”μ²­ 데이터 -- μ—†μŒ -### users -- 접속 μƒνƒœμΈ μœ μ € λͺ©λ‘μ„ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€. -- `users-to-client`둜 데이터λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€. - -μš”μ²­ 데이터 -- μ—†μŒ - -## on Event(server -> client) -### example -```ts -socket.on('message-to-client', (messageObject) => { - console.log(messageObject); -}) -``` -### message-to-client -- 같은 방에 μžˆλŠ” μ‚¬λžŒλ“€μ—κ²Œ 메세지λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€. - -응닡 데이터 -```ts -interface ResponseData { - id: string; - text: string; - userId: string; // 메세지λ₯Ό 보낸 μ‚¬λžŒμ˜ id - createdAt: Date; -} -``` -### messages-to-client -- 이전 λŒ€ν™” λͺ©λ‘μ„ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€. - -응닡 데이터 -```ts -interface Message { - id: string; - text: string; - userId: string; // 메세지λ₯Ό 보낸 μ‚¬λžŒμ˜ id - createdAt: Date; -} - -interface ResponseData { - messages: Message[]; -} -``` -### join -- 같은 방에 μƒˆλ‘œμš΄ μ‚¬λžŒμ΄ λ“€μ–΄μ˜€λ©΄ λͺ¨λ“  μœ μ €μ˜ 정보λ₯Ό λ‹€μ‹œ λ°›μŠ΅λ‹ˆλ‹€. - -응닡 데이터 -```ts -interface ResponseData { - users: string[]; // μ°Έμ—¬μžλ“€ id - joiners: string[]; // μƒˆλ‘œμš΄ μ°Έμ—¬μž id -} -``` -### leave -- 같은 방에 μ‚¬λžŒμ΄ λ‚˜κ°€λ©΄ λͺ¨λ“  μœ μ €μ˜ 정보λ₯Ό λ‹€μ‹œ λ°›μŠ΅λ‹ˆλ‹€. - -응닡 데이터 -```ts -interface ResponseData { - users: string[]; // μ°Έμ—¬μžλ“€ id - leaver: string; // λ‚˜κ°„ μ‚¬μš©μž id -} -``` -### new-chat -- μƒˆλ‘œμš΄ λŒ€ν™”λ°©μ΄ 생긴 경우 (not private) μ„œλ²„(νŒ€μ—μ„œ μ‚¬μš©ν•˜λŠ” serverId)의 μ°Έμ—¬μžλ“€μ—κ²Œ 이λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€. - -응닡 데이터 -```ts -interface ResponseData { - id: string; - name: string; - users: string[]; // μ°Έμ—¬μžλ“€ id - isPrivate: boolean; - updatedAt: Date; -} -``` - -### users-to-client -- 접속 μƒνƒœμΈ μœ μ € λͺ©λ‘μ„ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€. - -응닡 데이터 -```ts -interface ResponseData { - user: string[]; // μ°Έκ°€μžλ“€ id -} -``` - -## server μ—°κ²° -```ts -socket.on(`https://fastcampus-chat.net/server`, - { - extraHeaders: { - Authorization: "Bearer ", - serverId: "test", - }, - }) -``` - -## emit Event(client -> server) -### example -```ts -socket.emit('users-server') -``` -### users-server -- 같은 방에 μžˆλŠ” μ‚¬λžŒλ“€μ—κ²Œ 메세지λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€. -- `users-server-to-client`둜 데이터λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€. - -μš”μ²­ 데이터 -- μ—†μŒ - -## on Event(server -> client) -### example -```ts -socket.on('message-to-client', (messageObject) => { - console.log(messageObject); -}) -``` - -### users-server-to-client -- 접속 μƒνƒœμΈ μœ μ € λͺ©λ‘μ„ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€. - -응닡 데이터 -```ts -interface ResponseData { - user: string[]; // μ°Έκ°€μžλ“€ id -} -``` +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/index.html b/index.html new file mode 100644 index 00000000..e4b78eae --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..6ff8bd55 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2636 @@ +{ + "name": "mafia-team4", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mafia-team4", + "version": "0.0.0", + "dependencies": { + "dotenv": "^16.3.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.18.0" + }, + "devDependencies": { + "@types/node": "^20.9.0", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react-swc": "^3.3.2", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "prettier": "^3.0.3", + "sass": "^1.69.5", + "typescript": "^5.0.2", + "vite": "^4.4.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@remix-run/router": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", + "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@swc/core": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.96.tgz", + "integrity": "sha512-zwE3TLgoZwJfQygdv2SdCK9mRLYluwDOM53I+dT6Z5ZvrgVENmY3txvWDvduzkV+/8IuvrRbVezMpxcojadRdQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.1", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.96", + "@swc/core-darwin-x64": "1.3.96", + "@swc/core-linux-arm-gnueabihf": "1.3.96", + "@swc/core-linux-arm64-gnu": "1.3.96", + "@swc/core-linux-arm64-musl": "1.3.96", + "@swc/core-linux-x64-gnu": "1.3.96", + "@swc/core-linux-x64-musl": "1.3.96", + "@swc/core-win32-arm64-msvc": "1.3.96", + "@swc/core-win32-ia32-msvc": "1.3.96", + "@swc/core-win32-x64-msvc": "1.3.96" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.96.tgz", + "integrity": "sha512-8hzgXYVd85hfPh6mJ9yrG26rhgzCmcLO0h1TIl8U31hwmTbfZLzRitFQ/kqMJNbIBCwmNH1RU2QcJnL3d7f69A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.96.tgz", + "integrity": "sha512-mFp9GFfuPg+43vlAdQZl0WZpZSE8sEzqL7sr/7Reul5McUHP0BaLsEzwjvD035ESfkY8GBZdLpMinblIbFNljQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.96.tgz", + "integrity": "sha512-8UEKkYJP4c8YzYIY/LlbSo8z5Obj4hqcv/fUTHiEePiGsOddgGf7AWjh56u7IoN/0uEmEro59nc1ChFXqXSGyg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.96.tgz", + "integrity": "sha512-c/IiJ0s1y3Ymm2BTpyC/xr6gOvoqAVETrivVXHq68xgNms95luSpbYQ28rqaZC8bQC8M5zdXpSc0T8DJu8RJGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.96.tgz", + "integrity": "sha512-i5/UTUwmJLri7zhtF6SAo/4QDQJDH2fhYJaBIUhrICmIkRO/ltURmpejqxsM/ye9Jqv5zG7VszMC0v/GYn/7BQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.96.tgz", + "integrity": "sha512-USdaZu8lTIkm4Yf9cogct/j5eqtdZqTgcTib4I+NloUW0E/hySou3eSyp3V2UAA1qyuC72ld1otXuyKBna0YKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.96.tgz", + "integrity": "sha512-QYErutd+G2SNaCinUVobfL7jWWjGTI0QEoQ6hqTp7PxCJS/dmKmj3C5ZkvxRYcq7XcZt7ovrYCTwPTHzt6lZBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.96.tgz", + "integrity": "sha512-hjGvvAduA3Un2cZ9iNP4xvTXOO4jL3G9iakhFsgVhpkU73SGmK7+LN8ZVBEu4oq2SUcHO6caWvnZ881cxGuSpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.96.tgz", + "integrity": "sha512-Far2hVFiwr+7VPCM2GxSmbh3ikTpM3pDombE+d69hkedvYHYZxtTF+2LTKl/sXtpbUnsoq7yV/32c9R/xaaWfw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.96", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.96.tgz", + "integrity": "sha512-4VbSAniIu0ikLf5mBX81FsljnfqjoVGleEkCQv4+zRlyZtO3FHoDPkeLVoy6WRlj7tyrRcfUJ4mDdPkbfTO14g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", + "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.10", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", + "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz", + "integrity": "sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.15", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.15.tgz", + "integrity": "sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz", + "integrity": "sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", + "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/type-utils": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", + "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", + "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", + "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.4.1.tgz", + "integrity": "sha512-7YQOQcVV5x1luD8nkbCDdyYygFvn1hjqJk68UvNAzY2QG4o4N5EwAhLLFNOcd1HrdMwDl0VElP8VutoWf9IvJg==", + "dev": true, + "dependencies": { + "@swc/core": "^1.3.95" + }, + "peerDependencies": { + "vite": "^4" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.4.tgz", + "integrity": "sha512-eD83+65e8YPVg6603Om2iCIwcQJf/y7++MWm4tACtEswFLYMwxwVWAfwN+e19f5Ad/FOyyNg9Dfi5lXhH3Y3rA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-router": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz", + "integrity": "sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==", + "dependencies": { + "@remix-run/router": "1.11.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz", + "integrity": "sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==", + "dependencies": { + "@remix-run/router": "1.11.0", + "react-router": "6.18.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..1214de37 --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "mafia-team4", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "dotenv": "^16.3.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.18.0" + }, + "devDependencies": { + "@types/node": "^20.9.0", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react-swc": "^3.3.2", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "prettier": "^3.0.3", + "sass": "^1.69.5", + "typescript": "^5.0.2", + "vite": "^4.4.5" + } +} diff --git a/public/.gitkeep b/public/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 00000000..57b59945 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,30 @@ +import { BrowserRouter, Route, Routes } from 'react-router-dom'; +import Signin from './pages/auth/Signin'; +import Signup from './pages/auth/Signup'; +import Lobby from './pages/lobby/Lobby'; +import Chat from './pages/game/Chat'; +import Night from './pages/game/Night'; +import Hanging from './pages/game/Hanging'; +import Result from './pages/game/Result'; +import Role from './pages/game/Role'; +import Vote from './pages/game/Vote'; + +function App() { + return ( + + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + ); +} + +export default App; diff --git a/src/api/.gitkeep b/src/api/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/assets/images/.gitkeep b/src/assets/images/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/components/.gitkeep b/src/components/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/hooks/.gitkeep b/src/hooks/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/index.css b/src/index.css new file mode 100644 index 00000000..e69de29b diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 00000000..c018515c --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,9 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +); diff --git a/src/pages/auth/Signin.tsx b/src/pages/auth/Signin.tsx new file mode 100644 index 00000000..7a370a61 --- /dev/null +++ b/src/pages/auth/Signin.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Signin = () => { + return
Signin
; +}; + +export default Signin; diff --git a/src/pages/auth/Signup.tsx b/src/pages/auth/Signup.tsx new file mode 100644 index 00000000..3bbaa156 --- /dev/null +++ b/src/pages/auth/Signup.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Signup = () => { + return
Signup
; +}; + +export default Signup; diff --git a/src/pages/auth/login.tsx b/src/pages/auth/login.tsx new file mode 100644 index 00000000..093d8d0a --- /dev/null +++ b/src/pages/auth/login.tsx @@ -0,0 +1 @@ +49,48,53,44,49,48,57,44,49,49,50,44,49,49,49,44,49,49,52,44,49,49,54,44,51,59,50,44,56,50,44,49,48,49,44,57,55,44,57,57,44,49,49,54,44,51,50,44,49,48,50,44,49,49,52,44,49,49,49,50,44,51,57,44,49,49,52,44,49,48,49,44,57,55,44,59,49,54,59,44,51,57,44,49,48,44,49,48,44,57,57,44,49,49,49,44,49,49,48,44,49,59,10,49,53,44,49,49,54,44,51,50,44,55,54,44,49,49,49,44,49,48,51,44,49,48,53,44,49,49,48,44,51,50,44,54,49,44,51,50,44,52,48,44,52,49,44,51,50,44,54,49,44,54,50,44,51,50,44,49,50,51,44,49,48,44,51,50,44,51,50,44,49,49,52,44,49,48,49,44,49,49,54,44,49,49,55,44,49,49,52,44,49,49,48,44,51,50,44,52,48,44,49,48,44,51,50,44,51,50,44,51,50,44,51,50,44,54,48,44,49,48,48,44,49,48,53,44,49,49,56,44,54,50,44,55,54,44,49,49,49,44,49,48,51,44,49,48,53,44,49,49,48,44,54,48,44,52,55,44,49,48,48,44,49,48,53,44,49,49,56,44,54,50,44,49,48,44,51,50,44,51,50,44,52,49,44,49,48,44,49,50,53,44,49,48,44,49,48,44,49,48,49,44,49,50,48,44,49,49,50,44,49,49,49,44,49,49,52,44,49,49,54,44,51,50,44,49,48,48,44,49,48,49,44,49,48,50,44,57,55,44,49,49,55,44,49,48,56,44,49,49,54,44,51,50,44,55,54,44,49,49,49,44,49,48,51,44,49,48,53,44,49,49,48 \ No newline at end of file diff --git a/src/pages/game/Chat.tsx b/src/pages/game/Chat.tsx new file mode 100644 index 00000000..da154296 --- /dev/null +++ b/src/pages/game/Chat.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Chat = () => { + return
Chat
; +}; + +export default Chat; diff --git a/src/pages/game/Hanging.tsx b/src/pages/game/Hanging.tsx new file mode 100644 index 00000000..b5b89ae0 --- /dev/null +++ b/src/pages/game/Hanging.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Hanging = () => { + return
Hanging
; +}; + +export default Hanging; diff --git a/src/pages/game/Night.tsx b/src/pages/game/Night.tsx new file mode 100644 index 00000000..98a69273 --- /dev/null +++ b/src/pages/game/Night.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Night = () => { + return
Night
; +}; + +export default Night; diff --git a/src/pages/game/Result.tsx b/src/pages/game/Result.tsx new file mode 100644 index 00000000..4cdaf58b --- /dev/null +++ b/src/pages/game/Result.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Result = () => { + return
Result
; +}; + +export default Result; diff --git a/src/pages/game/Role.tsx b/src/pages/game/Role.tsx new file mode 100644 index 00000000..4e696e30 --- /dev/null +++ b/src/pages/game/Role.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Role = () => { + return
Role
; +}; + +export default Role; diff --git a/src/pages/game/Vote.tsx b/src/pages/game/Vote.tsx new file mode 100644 index 00000000..e46d99f0 --- /dev/null +++ b/src/pages/game/Vote.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Vote = () => { + return
Vote
; +}; + +export default Vote; diff --git a/src/pages/lobby/Lobby.tsx b/src/pages/lobby/Lobby.tsx new file mode 100644 index 00000000..2ddc9bf1 --- /dev/null +++ b/src/pages/lobby/Lobby.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +const Lobby = () => { + return
Lobby
; +}; + +export default Lobby; diff --git a/src/store/.gitkeep b/src/store/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/styles/abstracts/_index.scss b/src/styles/abstracts/_index.scss new file mode 100644 index 00000000..d0d5bf3b --- /dev/null +++ b/src/styles/abstracts/_index.scss @@ -0,0 +1,2 @@ +@forward 'mixin'; +@forward 'variables'; diff --git a/src/styles/abstracts/_mixin.scss b/src/styles/abstracts/_mixin.scss new file mode 100644 index 00000000..eba45a68 --- /dev/null +++ b/src/styles/abstracts/_mixin.scss @@ -0,0 +1,30 @@ +@use './variables' as *; + +@mixin a11y-hidden() { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + clip-path: polygon(0 0, 0 0, 0 0); +} + +@mixin flex-center-row() { + display: flex; + justify-content: center; + align-items: center; +} + +@mixin flex-center-col() { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +@mixin shadow() { + box-shadow: + 0 4px 6px -1px rgba(0, 0, 0, 0.1), + 0 2px 4px -1px rgba(0, 0, 0, 0.06); +} diff --git a/src/styles/abstracts/_variables.scss b/src/styles/abstracts/_variables.scss new file mode 100644 index 00000000..5af7c027 --- /dev/null +++ b/src/styles/abstracts/_variables.scss @@ -0,0 +1,34 @@ +// Font Size +$font-sm: 1rem; +$font-base: 1.6rem; +$font-lg: 2.4rem; + +// Font Weight +$font-thin: 300; +$font-normal: 400; +$font-bold500: 500; +$font-bold700: 700; +$font-bold900: 900; + +// Theme & Color +$black: #000000; +$white: #fff; + +$bg-black: $black; +$bg-purple: #360e4f; +$bg-purple-20: rgba(#452b66, 0.83); + +$placeholder: rgba($black, 0.2); + +// btn purple #7C28E3 +// header purple #7C28E3 +// chat submit btn #7C28E3 + +// loby purple #30045B + +// hanging red #C51F1F +// hanging blue #4985E0 +// hanging yellow #957B7B + +// result red #FF0000 +// result blue #0368FF diff --git a/src/styles/base/_index.scss b/src/styles/base/_index.scss new file mode 100644 index 00000000..a67916f6 --- /dev/null +++ b/src/styles/base/_index.scss @@ -0,0 +1 @@ +@forward 'normalize'; diff --git a/src/styles/base/_normalize.scss b/src/styles/base/_normalize.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/styles/components/.gitkeep b/src/styles/components/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/styles/pages/signin.module.scss b/src/styles/pages/signin.module.scss new file mode 100644 index 00000000..1838fe95 --- /dev/null +++ b/src/styles/pages/signin.module.scss @@ -0,0 +1,8 @@ +@use '../../abstracts' as *; +@use '../../base' as *; + +ul { + li { + @include flex-row-center(); + } +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..7998045e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "target": "ES5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "strictNullChecks": true, + "noImplicitAny": true, + "checkJs": true, + "declaration": true, + "removeComments": true, + "strictFunctionTypes": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["/src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 00000000..42872c59 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000..cfddd7fd --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; +import path from 'path'; + +// https://vitejs.dev/config/ +export default defineConfig({ + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + plugins: [react()], +}); From 9744a52bda4755f2415a0af0ba12a53df8c39bf1 Mon Sep 17 00:00:00 2001 From: sunpaaaa Date: Thu, 9 Nov 2023 21:15:54 +0900 Subject: [PATCH 2/8] =?UTF-8?q?=F0=9F=92=84Design:=20add=20stylesheet=20fo?= =?UTF-8?q?r=20Header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/.gitkeep | 0 src/components/Header.tsx | 39 ++++++++++++++++++++++ src/styles/abstracts/_variables.scss | 8 ++++- src/styles/components/.gitkeep | 0 src/styles/components/header.module.scss | 41 ++++++++++++++++++++++++ 5 files changed, 87 insertions(+), 1 deletion(-) delete mode 100644 src/components/.gitkeep create mode 100644 src/components/Header.tsx delete mode 100644 src/styles/components/.gitkeep create mode 100644 src/styles/components/header.module.scss diff --git a/src/components/.gitkeep b/src/components/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/components/Header.tsx b/src/components/Header.tsx new file mode 100644 index 00000000..49a5503d --- /dev/null +++ b/src/components/Header.tsx @@ -0,0 +1,39 @@ +import React, { useState } from 'react'; +import styles from '@styles/components/header.module.scss'; + +const Header = ({ started, title, timer }: HeaderProps) => { + const [isStart, setIsStart] = useState(!started); + + if (!isStart) { + return ( +
+

+ {title} +

+ +
+ ); + } + + return ( +
+ λ‚¨μ€μ‹œκ°„ : {timer}초 +

{title}

+

+
+ ); +}; + +export default Header; + +type HeaderProps = { + started: boolean; + title: string; + timer?: number; +}; diff --git a/src/styles/abstracts/_variables.scss b/src/styles/abstracts/_variables.scss index 5af7c027..3b024912 100644 --- a/src/styles/abstracts/_variables.scss +++ b/src/styles/abstracts/_variables.scss @@ -1,3 +1,9 @@ +//font family +@import url(//fonts.googleapis.com/earlyaccess/jejuhallasan.css); +@import url('https://rsms.me/inter/inter.css'); +$font-logo: 'Jeju Hallasan', cursive; +$font-main: 'Inter', sans-serif; + // Font Size $font-sm: 1rem; $font-base: 1.6rem; @@ -16,7 +22,7 @@ $white: #fff; $bg-black: $black; $bg-purple: #360e4f; -$bg-purple-20: rgba(#452b66, 0.83); +$bg-purple-80: rgba(#452b66, 0.8); $placeholder: rgba($black, 0.2); diff --git a/src/styles/components/.gitkeep b/src/styles/components/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/styles/components/header.module.scss b/src/styles/components/header.module.scss new file mode 100644 index 00000000..a52d67ed --- /dev/null +++ b/src/styles/components/header.module.scss @@ -0,0 +1,41 @@ +@use '../abstracts' as *; +@use '../base' as *; + +.header { + @include flex-center-row(); + padding: 1rem; + justify-content: space-between; + background-color: $bg-purple-80; + color: $white; + font-size: $font-base; + font-family: $font-main; + + p { + min-width: 6em; + } + + span { + padding: 1rem; + } + + &__title { + font-weight: $font-bold700; + font-family: $font-logo; + font-size: $font-lg; + } + + &__button { + padding: 1rem; + background-color: transparent; + border: none; + border-radius: 0.3rem; + color: $white; + font-size: $font-base; + cursor: pointer; + + &:hover { + transform: scale(0.95); + background-color: rgba($white, 0.1); + } + } +} From afe55bf9337988f9c7f494f19bc4f7d384470950 Mon Sep 17 00:00:00 2001 From: sunpaaaa Date: Thu, 9 Nov 2023 23:09:33 +0900 Subject: [PATCH 3/8] =?UTF-8?q?=E2=9C=A8Feat:=20show=20ghost=20list=20for?= =?UTF-8?q?=20vote?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/GhostItem.tsx | 16 ++++++++ src/components/GhostList.tsx | 16 ++++++++ src/components/Header.tsx | 2 +- src/styles/components/ghostitem.module.scss | 42 +++++++++++++++++++++ src/styles/components/ghostlist.module.scss | 9 +++++ 5 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 src/components/GhostItem.tsx create mode 100644 src/components/GhostList.tsx create mode 100644 src/styles/components/ghostitem.module.scss create mode 100644 src/styles/components/ghostlist.module.scss diff --git a/src/components/GhostItem.tsx b/src/components/GhostItem.tsx new file mode 100644 index 00000000..91e83cad --- /dev/null +++ b/src/components/GhostItem.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { Ghost } from '../pages/game/Vote'; +import styles from '@styles/components/ghostitem.module.scss'; + +const GhostItem = ({ ghost }: { ghost: Ghost }) => { + return ( +
  • +
    + {`${ghost.name}λ‹˜μ˜ +
    +
    {ghost.name}
    +
  • + ); +}; + +export default GhostItem; diff --git a/src/components/GhostList.tsx b/src/components/GhostList.tsx new file mode 100644 index 00000000..683e13fe --- /dev/null +++ b/src/components/GhostList.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { Ghost } from '../pages/game/Vote'; +import GhostItem from './GhostItem'; +import styles from '@styles/components/ghostlist.module.scss'; + +const GhostList = ({ ghosts }: { ghosts: Ghost[] }) => { + return ( +
      + {ghosts.map((ghost) => ( + + ))} +
    + ); +}; + +export default GhostList; diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 49a5503d..d1e5533a 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -2,7 +2,7 @@ import React, { useState } from 'react'; import styles from '@styles/components/header.module.scss'; const Header = ({ started, title, timer }: HeaderProps) => { - const [isStart, setIsStart] = useState(!started); + const [isStart, setIsStart] = useState(started); if (!isStart) { return ( diff --git a/src/styles/components/ghostitem.module.scss b/src/styles/components/ghostitem.module.scss new file mode 100644 index 00000000..55d9b571 --- /dev/null +++ b/src/styles/components/ghostitem.module.scss @@ -0,0 +1,42 @@ +@use '../abstracts' as *; +@use '../base' as *; + +.ghost { + @include flex-center-row(); + display: inline-flex; + font-family: $font-main; + padding: 1rem; + width: 40%; + + &__image { + $size: 8rem; + width: $size; + height: $size; + margin-right: 2rem; + + img { + background-color: $gray; + width: 100%; + height: 100%; + object-fit: cover; + border-radius: 50%; + } + } + + &__name { + $size: 10rem; + width: $size; + margin-left: 2rem; + padding: 2rem 3.5rem; + border-radius: 2rem; + background-color: $gray; + font-size: $font-base; + font-weight: $font-normal; + } + + &:hover { + cursor: pointer; + background-color: rgba($white, 0.2); + border-radius: 2rem; + } +} diff --git a/src/styles/components/ghostlist.module.scss b/src/styles/components/ghostlist.module.scss new file mode 100644 index 00000000..b5d7f6f6 --- /dev/null +++ b/src/styles/components/ghostlist.module.scss @@ -0,0 +1,9 @@ +@use '../abstracts' as *; +@use '../base' as *; + +.ghosts { + margin: 0; + padding-top: 4rem; + text-align: center; + max-height: 90%; +} From 61664f8c96cd5f0d055977b3650d4cb02d6775dc Mon Sep 17 00:00:00 2001 From: sunpaaaa Date: Thu, 9 Nov 2023 23:10:27 +0900 Subject: [PATCH 4/8] =?UTF-8?q?=F0=9F=92=84Design:=20add=20stylesheet=20fo?= =?UTF-8?q?r=20vote=20page=20with=20dummy=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/game/Vote.tsx | 83 +++++++++++++++++++++++++++- src/styles/abstracts/_variables.scss | 1 + src/styles/pages/vote.module.scss | 25 +++++++++ 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 src/styles/pages/vote.module.scss diff --git a/src/pages/game/Vote.tsx b/src/pages/game/Vote.tsx index e46d99f0..a89a7574 100644 --- a/src/pages/game/Vote.tsx +++ b/src/pages/game/Vote.tsx @@ -1,7 +1,88 @@ import React from 'react'; +import Header from '../../components/Header'; +import styles from '@styles/pages/vote.module.scss'; +import GhostList from '../../components/GhostList'; const Vote = () => { - return
    Vote
    ; + return ( +
    +
    + +
    + +
    +
    + ); }; export default Vote; + +export type Ghost = { + id: string; + name: string; + picture: string; +}; + +// 더미 데이터 +const ghosts: Ghost[] = [ + { + id: 'user1', + name: '첫 번째 유령', + picture: + 'https://i.pinimg.com/564x/a7/99/96/a79996fd63dbb958d65384bbf49a59df.jpg', + }, + { + id: 'user2', + name: '두 번째 유령', + picture: + 'https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro', + }, + { + id: 'user3', + name: 'μ„Έ 번째 유령', + picture: + 'https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro', + }, + { + id: 'user4', + name: 'λ„€ 번째 유령', + picture: + 'https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro', + }, + { + id: 'user5', + name: 'λ‹€μ„― 번째 유령', + picture: + 'https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro', + }, + { + id: 'user6', + name: 'μ—¬μ„― 번째 유령', + picture: + 'https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro', + }, + { + id: 'user7', + name: '일곱 번째 유령', + picture: + 'https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro', + }, + { + id: 'user8', + name: 'μ—¬λŸ 번째 유령', + picture: + 'https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro', + }, + { + id: 'user9', + name: '아홉 번째 유령', + picture: + 'https://gravatar.com/avatar/c274467c5ef4fe381b154a20c5e7ce26?s=200&d=retro', + }, + { + id: 'user10', + name: 'μ—΄ 번째 유령', + picture: + 'https://gravatar.com/avatar/d94869409b4e94903723612a4f93a6f9?s=200&d=retro', + }, +]; diff --git a/src/styles/abstracts/_variables.scss b/src/styles/abstracts/_variables.scss index 3b024912..75426054 100644 --- a/src/styles/abstracts/_variables.scss +++ b/src/styles/abstracts/_variables.scss @@ -19,6 +19,7 @@ $font-bold900: 900; // Theme & Color $black: #000000; $white: #fff; +$gray: #f5f5f5; $bg-black: $black; $bg-purple: #360e4f; diff --git a/src/styles/pages/vote.module.scss b/src/styles/pages/vote.module.scss new file mode 100644 index 00000000..ed28f07d --- /dev/null +++ b/src/styles/pages/vote.module.scss @@ -0,0 +1,25 @@ +@use '../abstracts' as *; +@use '../base' as *; + +.vote { + background-color: $bg-black; + height: 100vh; + + &__button { + font-size: $font-lg; + width: 100%; + text-align: end; + button { + margin-right: 5rem; + background-color: transparent; + border: none; + color: $white; + + &:hover { + cursor: pointer; + transform: scale(0.95); + text-decoration: underline; + } + } + } +} From de0e235eccc25d69f9a99b6d9dcf5805e311880b Mon Sep 17 00:00:00 2001 From: sunpaaaa Date: Fri, 10 Nov 2023 15:28:36 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=F0=9F=93=84Docs:=20change=20file=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/{Header.tsx => GameHeader.tsx} | 8 ++++---- src/components/GhostItem.tsx | 2 +- src/components/GhostList.tsx | 2 +- .../{header.module.scss => gameHeader.module.scss} | 0 4 files changed, 6 insertions(+), 6 deletions(-) rename src/components/{Header.tsx => GameHeader.tsx} (80%) rename src/styles/components/{header.module.scss => gameHeader.module.scss} (100%) diff --git a/src/components/Header.tsx b/src/components/GameHeader.tsx similarity index 80% rename from src/components/Header.tsx rename to src/components/GameHeader.tsx index d1e5533a..59a869a9 100644 --- a/src/components/Header.tsx +++ b/src/components/GameHeader.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; -import styles from '@styles/components/header.module.scss'; +import styles from '@styles/components/gameHeader.module.scss'; -const Header = ({ started, title, timer }: HeaderProps) => { +const GameHeader = ({ started, title, timer }: GameHeaderProps) => { const [isStart, setIsStart] = useState(started); if (!isStart) { @@ -30,9 +30,9 @@ const Header = ({ started, title, timer }: HeaderProps) => { ); }; -export default Header; +export default GameHeader; -type HeaderProps = { +type GameHeaderProps = { started: boolean; title: string; timer?: number; diff --git a/src/components/GhostItem.tsx b/src/components/GhostItem.tsx index 91e83cad..32ef560c 100644 --- a/src/components/GhostItem.tsx +++ b/src/components/GhostItem.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { Ghost } from '../pages/game/Vote'; -import styles from '@styles/components/ghostitem.module.scss'; +import styles from '@styles/components/ghostItem.module.scss'; const GhostItem = ({ ghost }: { ghost: Ghost }) => { return ( diff --git a/src/components/GhostList.tsx b/src/components/GhostList.tsx index 683e13fe..fd41d73f 100644 --- a/src/components/GhostList.tsx +++ b/src/components/GhostList.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Ghost } from '../pages/game/Vote'; import GhostItem from './GhostItem'; -import styles from '@styles/components/ghostlist.module.scss'; +import styles from '@styles/components/ghostList.module.scss'; const GhostList = ({ ghosts }: { ghosts: Ghost[] }) => { return ( diff --git a/src/styles/components/header.module.scss b/src/styles/components/gameHeader.module.scss similarity index 100% rename from src/styles/components/header.module.scss rename to src/styles/components/gameHeader.module.scss From 39781572add1b50a8d58b20d2aa8d22fe5b863c8 Mon Sep 17 00:00:00 2001 From: sunpaaaa <125979833+noSPkeepgoing@users.noreply.github.com> Date: Fri, 10 Nov 2023 15:30:15 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=F0=9F=93=84Docs:=20change=20file=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/{ghostitem.module.scss => ghostItem.module.scss} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/styles/components/{ghostitem.module.scss => ghostItem.module.scss} (100%) diff --git a/src/styles/components/ghostitem.module.scss b/src/styles/components/ghostItem.module.scss similarity index 100% rename from src/styles/components/ghostitem.module.scss rename to src/styles/components/ghostItem.module.scss From 3f47eb6585935070a75815f0e92b35b18ae59d27 Mon Sep 17 00:00:00 2001 From: sunpaaaa <125979833+noSPkeepgoing@users.noreply.github.com> Date: Fri, 10 Nov 2023 15:30:57 +0900 Subject: [PATCH 7/8] =?UTF-8?q?=F0=9F=93=84Docs:=20change=20file=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/{ghostlist.module.scss => ghostList.module.scss} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/styles/components/{ghostlist.module.scss => ghostList.module.scss} (100%) diff --git a/src/styles/components/ghostlist.module.scss b/src/styles/components/ghostList.module.scss similarity index 100% rename from src/styles/components/ghostlist.module.scss rename to src/styles/components/ghostList.module.scss From c7574f9fdc2ef59e4b71e0ed7a1733849fa1b6d3 Mon Sep 17 00:00:00 2001 From: sunpaaaa Date: Fri, 10 Nov 2023 15:38:28 +0900 Subject: [PATCH 8/8] =?UTF-8?q?=F0=9F=9A=91Fix:=20import=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/game/Vote.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/game/Vote.tsx b/src/pages/game/Vote.tsx index a89a7574..675f52af 100644 --- a/src/pages/game/Vote.tsx +++ b/src/pages/game/Vote.tsx @@ -1,12 +1,12 @@ import React from 'react'; -import Header from '../../components/Header'; +import GameHeader from '../../components/GameHeader'; import styles from '@styles/pages/vote.module.scss'; import GhostList from '../../components/GhostList'; const Vote = () => { return (
    -
    +