From c4878a08012096eaa33fa9718d77f54426a871e9 Mon Sep 17 00:00:00 2001 From: Gamgyul Date: Mon, 19 May 2025 22:35:55 +0900 Subject: [PATCH 1/2] feat : Create Week8 Mission1, 2 --- Week8/wantkdd/mission1/.gitignore | 26 + Week8/wantkdd/mission1/README.md | 54 + Week8/wantkdd/mission1/eslint.config.js | 28 + Week8/wantkdd/mission1/index.html | 13 + Week8/wantkdd/mission1/package.json | 44 + Week8/wantkdd/mission1/pnpm-lock.yaml | 2535 +++++++++++++++++ Week8/wantkdd/mission1/public/vite.svg | 1 + Week8/wantkdd/mission1/src/App.css | 0 Week8/wantkdd/mission1/src/App.tsx | 73 + Week8/wantkdd/mission1/src/apis/addLp.ts | 30 + Week8/wantkdd/mission1/src/apis/auth.ts | 48 + Week8/wantkdd/mission1/src/apis/axios.ts | 105 + Week8/wantkdd/mission1/src/apis/like.ts | 11 + Week8/wantkdd/mission1/src/apis/lp-detail.ts | 72 + Week8/wantkdd/mission1/src/apis/lp.ts | 17 + Week8/wantkdd/mission1/src/assets/default.png | Bin 0 -> 13544 bytes .../mission1/src/assets/googleLogo.svg | 16 + Week8/wantkdd/mission1/src/assets/react.svg | 1 + .../src/components/add-lp/addButton.tsx | 20 + .../mission1/src/components/add-lp/addLp.tsx | 188 ++ .../mission1/src/components/footer.tsx | 20 + .../mission1/src/components/googleLogin.tsx | 19 + .../src/components/loading-spinner.tsx | 10 + .../mission1/src/components/login-form.tsx | 111 + .../src/components/lp-detail/DeleteModal.tsx | 33 + .../src/components/lp-detail/LpComments.tsx | 131 + .../src/components/lp-detail/LpEdit.tsx | 266 ++ .../src/components/lp-detail/LpInfo.tsx | 110 + .../components/lp-detail/comment-skeleton.tsx | 14 + .../src/components/lp-detail/comment.tsx | 135 + .../lp-detail/lp-card-skeleton-list.tsx | 18 + .../components/lp-detail/lp-card-skeleton.tsx | 21 + .../src/components/lp-detail/lp-card.tsx | 71 + .../mission1/src/components/navbar.tsx | 81 + .../mission1/src/components/sidebar.tsx | 117 + Week8/wantkdd/mission1/src/constants/key.ts | 9 + .../mission1/src/context/AuthContext.tsx | 138 + Week8/wantkdd/mission1/src/enums/commons.ts | 4 + .../src/hooks/custom/useCustomFetch.ts | 59 + .../mission1/src/hooks/custom/useDebounce.ts | 21 + .../mission1/src/hooks/custom/useForm.ts | 53 + .../src/hooks/custom/useLocalStorage.ts | 39 + .../src/hooks/custom/useLpComments.ts | 82 + .../mission1/src/hooks/custom/useLpDetail.ts | 48 + .../mutations/comments/useDeleteComment.ts | 14 + .../mutations/comments/usePostComment.ts | 15 + .../mutations/comments/useUpdateComment.ts | 20 + .../hooks/mutations/like/useDeleteLikte.ts | 52 + .../src/hooks/mutations/like/usePostLike.ts | 50 + .../src/hooks/mutations/lp/useDeleteLp.ts | 20 + .../src/hooks/mutations/lp/usePostLp.ts | 20 + .../src/hooks/mutations/lp/useUpdateLp.ts | 23 + .../src/hooks/mutations/user/useDeleteUser.ts | 20 + .../src/hooks/mutations/user/useLogin.ts | 21 + .../src/hooks/mutations/user/useLogout.ts | 13 + .../hooks/mutations/user/useUpdateMyInfo.ts | 57 + .../hooks/queries/useGetInfiniteLpDetail.ts | 29 + .../src/hooks/queries/useGetInfiniteLpList.ts | 23 + .../src/hooks/queries/useGetLpDetail.ts | 12 + .../src/hooks/queries/useGetLpList.ts | 23 + .../src/hooks/queries/useGetMyInfo.ts | 14 + .../mission1/src/hooks/queries/useSearchLp.ts | 5 + Week8/wantkdd/mission1/src/index.css | 11 + .../mission1/src/layout/ProtectedLayout.tsx | 18 + .../mission1/src/layout/root-layout.tsx | 32 + Week8/wantkdd/mission1/src/main.tsx | 10 + .../mission1/src/pages/detail-page.tsx | 115 + .../src/pages/googleLoginRedirect-page.tsx | 27 + .../wantkdd/mission1/src/pages/home-page.tsx | 92 + .../wantkdd/mission1/src/pages/login-page.tsx | 43 + Week8/wantkdd/mission1/src/pages/my-page.tsx | 188 ++ .../mission1/src/pages/search-page.tsx | 90 + .../mission1/src/pages/signup-page.tsx | 125 + .../mission1/src/pages/signup/email-step.tsx | 40 + .../mission1/src/pages/signup/name-step.tsx | 58 + .../src/pages/signup/password-step.tsx | 99 + Week8/wantkdd/mission1/src/types/auth.ts | 46 + Week8/wantkdd/mission1/src/types/common.ts | 20 + Week8/wantkdd/mission1/src/types/lp-detail.ts | 54 + Week8/wantkdd/mission1/src/types/lp.ts | 34 + Week8/wantkdd/mission1/src/utils/validate.ts | 33 + Week8/wantkdd/mission1/src/vite-env.d.ts | 8 + Week8/wantkdd/mission1/tsconfig.app.json | 26 + Week8/wantkdd/mission1/tsconfig.json | 7 + Week8/wantkdd/mission1/tsconfig.node.json | 24 + Week8/wantkdd/mission1/vite.config.ts | 8 + Week8/wantkdd/mission2/.gitignore | 26 + Week8/wantkdd/mission2/README.md | 54 + Week8/wantkdd/mission2/eslint.config.js | 28 + Week8/wantkdd/mission2/index.html | 13 + Week8/wantkdd/mission2/package.json | 44 + Week8/wantkdd/mission2/pnpm-lock.yaml | 2535 +++++++++++++++++ Week8/wantkdd/mission2/public/vite.svg | 1 + Week8/wantkdd/mission2/src/App.css | 0 Week8/wantkdd/mission2/src/App.tsx | 73 + Week8/wantkdd/mission2/src/apis/addLp.ts | 30 + Week8/wantkdd/mission2/src/apis/auth.ts | 48 + Week8/wantkdd/mission2/src/apis/axios.ts | 105 + Week8/wantkdd/mission2/src/apis/like.ts | 11 + Week8/wantkdd/mission2/src/apis/lp-detail.ts | 72 + Week8/wantkdd/mission2/src/apis/lp.ts | 17 + Week8/wantkdd/mission2/src/assets/default.png | Bin 0 -> 13544 bytes .../mission2/src/assets/googleLogo.svg | 16 + Week8/wantkdd/mission2/src/assets/react.svg | 1 + .../src/components/add-lp/addButton.tsx | 20 + .../mission2/src/components/add-lp/addLp.tsx | 188 ++ .../mission2/src/components/footer.tsx | 20 + .../mission2/src/components/googleLogin.tsx | 19 + .../src/components/loading-spinner.tsx | 10 + .../mission2/src/components/login-form.tsx | 111 + .../src/components/lp-detail/DeleteModal.tsx | 33 + .../src/components/lp-detail/LpComments.tsx | 131 + .../src/components/lp-detail/LpEdit.tsx | 266 ++ .../src/components/lp-detail/LpInfo.tsx | 110 + .../components/lp-detail/comment-skeleton.tsx | 14 + .../src/components/lp-detail/comment.tsx | 135 + .../lp-detail/lp-card-skeleton-list.tsx | 18 + .../components/lp-detail/lp-card-skeleton.tsx | 21 + .../src/components/lp-detail/lp-card.tsx | 71 + .../mission2/src/components/navbar.tsx | 81 + .../mission2/src/components/sidebar.tsx | 117 + Week8/wantkdd/mission2/src/constants/key.ts | 9 + .../mission2/src/context/AuthContext.tsx | 138 + Week8/wantkdd/mission2/src/enums/commons.ts | 4 + .../src/hooks/custom/useCustomFetch.ts | 59 + .../mission2/src/hooks/custom/useDebounce.ts | 21 + .../mission2/src/hooks/custom/useForm.ts | 53 + .../src/hooks/custom/useLocalStorage.ts | 39 + .../src/hooks/custom/useLpComments.ts | 82 + .../mission2/src/hooks/custom/useLpDetail.ts | 48 + .../mission2/src/hooks/custom/useThrottle.ts | 25 + .../mutations/comments/useDeleteComment.ts | 14 + .../mutations/comments/usePostComment.ts | 15 + .../mutations/comments/useUpdateComment.ts | 20 + .../hooks/mutations/like/useDeleteLikte.ts | 52 + .../src/hooks/mutations/like/usePostLike.ts | 50 + .../src/hooks/mutations/lp/useDeleteLp.ts | 20 + .../src/hooks/mutations/lp/usePostLp.ts | 20 + .../src/hooks/mutations/lp/useUpdateLp.ts | 23 + .../src/hooks/mutations/user/useDeleteUser.ts | 20 + .../src/hooks/mutations/user/useLogin.ts | 21 + .../src/hooks/mutations/user/useLogout.ts | 13 + .../hooks/mutations/user/useUpdateMyInfo.ts | 57 + .../hooks/queries/useGetInfiniteLpDetail.ts | 29 + .../src/hooks/queries/useGetInfiniteLpList.ts | 23 + .../src/hooks/queries/useGetLpDetail.ts | 12 + .../src/hooks/queries/useGetLpList.ts | 23 + .../src/hooks/queries/useGetMyInfo.ts | 14 + .../mission2/src/hooks/queries/useSearchLp.ts | 5 + Week8/wantkdd/mission2/src/index.css | 11 + .../mission2/src/layout/ProtectedLayout.tsx | 18 + .../mission2/src/layout/root-layout.tsx | 32 + Week8/wantkdd/mission2/src/main.tsx | 10 + .../mission2/src/pages/detail-page.tsx | 115 + .../src/pages/googleLoginRedirect-page.tsx | 27 + .../wantkdd/mission2/src/pages/home-page.tsx | 95 + .../wantkdd/mission2/src/pages/login-page.tsx | 43 + Week8/wantkdd/mission2/src/pages/my-page.tsx | 188 ++ .../mission2/src/pages/search-page.tsx | 93 + .../mission2/src/pages/signup-page.tsx | 125 + .../mission2/src/pages/signup/email-step.tsx | 40 + .../mission2/src/pages/signup/name-step.tsx | 58 + .../src/pages/signup/password-step.tsx | 99 + Week8/wantkdd/mission2/src/types/auth.ts | 46 + Week8/wantkdd/mission2/src/types/common.ts | 20 + Week8/wantkdd/mission2/src/types/lp-detail.ts | 54 + Week8/wantkdd/mission2/src/types/lp.ts | 34 + Week8/wantkdd/mission2/src/utils/validate.ts | 33 + Week8/wantkdd/mission2/src/vite-env.d.ts | 8 + Week8/wantkdd/mission2/tsconfig.app.json | 26 + Week8/wantkdd/mission2/tsconfig.json | 7 + Week8/wantkdd/mission2/tsconfig.node.json | 24 + Week8/wantkdd/mission2/vite.config.ts | 8 + 173 files changed, 13093 insertions(+) create mode 100644 Week8/wantkdd/mission1/.gitignore create mode 100644 Week8/wantkdd/mission1/README.md create mode 100644 Week8/wantkdd/mission1/eslint.config.js create mode 100644 Week8/wantkdd/mission1/index.html create mode 100644 Week8/wantkdd/mission1/package.json create mode 100644 Week8/wantkdd/mission1/pnpm-lock.yaml create mode 100644 Week8/wantkdd/mission1/public/vite.svg create mode 100644 Week8/wantkdd/mission1/src/App.css create mode 100644 Week8/wantkdd/mission1/src/App.tsx create mode 100644 Week8/wantkdd/mission1/src/apis/addLp.ts create mode 100644 Week8/wantkdd/mission1/src/apis/auth.ts create mode 100644 Week8/wantkdd/mission1/src/apis/axios.ts create mode 100644 Week8/wantkdd/mission1/src/apis/like.ts create mode 100644 Week8/wantkdd/mission1/src/apis/lp-detail.ts create mode 100644 Week8/wantkdd/mission1/src/apis/lp.ts create mode 100644 Week8/wantkdd/mission1/src/assets/default.png create mode 100644 Week8/wantkdd/mission1/src/assets/googleLogo.svg create mode 100644 Week8/wantkdd/mission1/src/assets/react.svg create mode 100644 Week8/wantkdd/mission1/src/components/add-lp/addButton.tsx create mode 100644 Week8/wantkdd/mission1/src/components/add-lp/addLp.tsx create mode 100644 Week8/wantkdd/mission1/src/components/footer.tsx create mode 100644 Week8/wantkdd/mission1/src/components/googleLogin.tsx create mode 100644 Week8/wantkdd/mission1/src/components/loading-spinner.tsx create mode 100644 Week8/wantkdd/mission1/src/components/login-form.tsx create mode 100644 Week8/wantkdd/mission1/src/components/lp-detail/DeleteModal.tsx create mode 100644 Week8/wantkdd/mission1/src/components/lp-detail/LpComments.tsx create mode 100644 Week8/wantkdd/mission1/src/components/lp-detail/LpEdit.tsx create mode 100644 Week8/wantkdd/mission1/src/components/lp-detail/LpInfo.tsx create mode 100644 Week8/wantkdd/mission1/src/components/lp-detail/comment-skeleton.tsx create mode 100644 Week8/wantkdd/mission1/src/components/lp-detail/comment.tsx create mode 100644 Week8/wantkdd/mission1/src/components/lp-detail/lp-card-skeleton-list.tsx create mode 100644 Week8/wantkdd/mission1/src/components/lp-detail/lp-card-skeleton.tsx create mode 100644 Week8/wantkdd/mission1/src/components/lp-detail/lp-card.tsx create mode 100644 Week8/wantkdd/mission1/src/components/navbar.tsx create mode 100644 Week8/wantkdd/mission1/src/components/sidebar.tsx create mode 100644 Week8/wantkdd/mission1/src/constants/key.ts create mode 100644 Week8/wantkdd/mission1/src/context/AuthContext.tsx create mode 100644 Week8/wantkdd/mission1/src/enums/commons.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/custom/useCustomFetch.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/custom/useDebounce.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/custom/useForm.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/custom/useLocalStorage.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/custom/useLpComments.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/custom/useLpDetail.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/mutations/comments/useDeleteComment.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/mutations/comments/usePostComment.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/mutations/comments/useUpdateComment.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/mutations/like/useDeleteLikte.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/mutations/like/usePostLike.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/mutations/lp/useDeleteLp.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/mutations/lp/usePostLp.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/mutations/lp/useUpdateLp.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/mutations/user/useDeleteUser.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/mutations/user/useLogin.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/mutations/user/useLogout.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/mutations/user/useUpdateMyInfo.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/queries/useGetInfiniteLpDetail.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/queries/useGetInfiniteLpList.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/queries/useGetLpDetail.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/queries/useGetLpList.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/queries/useGetMyInfo.ts create mode 100644 Week8/wantkdd/mission1/src/hooks/queries/useSearchLp.ts create mode 100644 Week8/wantkdd/mission1/src/index.css create mode 100644 Week8/wantkdd/mission1/src/layout/ProtectedLayout.tsx create mode 100644 Week8/wantkdd/mission1/src/layout/root-layout.tsx create mode 100644 Week8/wantkdd/mission1/src/main.tsx create mode 100644 Week8/wantkdd/mission1/src/pages/detail-page.tsx create mode 100644 Week8/wantkdd/mission1/src/pages/googleLoginRedirect-page.tsx create mode 100644 Week8/wantkdd/mission1/src/pages/home-page.tsx create mode 100644 Week8/wantkdd/mission1/src/pages/login-page.tsx create mode 100644 Week8/wantkdd/mission1/src/pages/my-page.tsx create mode 100644 Week8/wantkdd/mission1/src/pages/search-page.tsx create mode 100644 Week8/wantkdd/mission1/src/pages/signup-page.tsx create mode 100644 Week8/wantkdd/mission1/src/pages/signup/email-step.tsx create mode 100644 Week8/wantkdd/mission1/src/pages/signup/name-step.tsx create mode 100644 Week8/wantkdd/mission1/src/pages/signup/password-step.tsx create mode 100644 Week8/wantkdd/mission1/src/types/auth.ts create mode 100644 Week8/wantkdd/mission1/src/types/common.ts create mode 100644 Week8/wantkdd/mission1/src/types/lp-detail.ts create mode 100644 Week8/wantkdd/mission1/src/types/lp.ts create mode 100644 Week8/wantkdd/mission1/src/utils/validate.ts create mode 100644 Week8/wantkdd/mission1/src/vite-env.d.ts create mode 100644 Week8/wantkdd/mission1/tsconfig.app.json create mode 100644 Week8/wantkdd/mission1/tsconfig.json create mode 100644 Week8/wantkdd/mission1/tsconfig.node.json create mode 100644 Week8/wantkdd/mission1/vite.config.ts create mode 100644 Week8/wantkdd/mission2/.gitignore create mode 100644 Week8/wantkdd/mission2/README.md create mode 100644 Week8/wantkdd/mission2/eslint.config.js create mode 100644 Week8/wantkdd/mission2/index.html create mode 100644 Week8/wantkdd/mission2/package.json create mode 100644 Week8/wantkdd/mission2/pnpm-lock.yaml create mode 100644 Week8/wantkdd/mission2/public/vite.svg create mode 100644 Week8/wantkdd/mission2/src/App.css create mode 100644 Week8/wantkdd/mission2/src/App.tsx create mode 100644 Week8/wantkdd/mission2/src/apis/addLp.ts create mode 100644 Week8/wantkdd/mission2/src/apis/auth.ts create mode 100644 Week8/wantkdd/mission2/src/apis/axios.ts create mode 100644 Week8/wantkdd/mission2/src/apis/like.ts create mode 100644 Week8/wantkdd/mission2/src/apis/lp-detail.ts create mode 100644 Week8/wantkdd/mission2/src/apis/lp.ts create mode 100644 Week8/wantkdd/mission2/src/assets/default.png create mode 100644 Week8/wantkdd/mission2/src/assets/googleLogo.svg create mode 100644 Week8/wantkdd/mission2/src/assets/react.svg create mode 100644 Week8/wantkdd/mission2/src/components/add-lp/addButton.tsx create mode 100644 Week8/wantkdd/mission2/src/components/add-lp/addLp.tsx create mode 100644 Week8/wantkdd/mission2/src/components/footer.tsx create mode 100644 Week8/wantkdd/mission2/src/components/googleLogin.tsx create mode 100644 Week8/wantkdd/mission2/src/components/loading-spinner.tsx create mode 100644 Week8/wantkdd/mission2/src/components/login-form.tsx create mode 100644 Week8/wantkdd/mission2/src/components/lp-detail/DeleteModal.tsx create mode 100644 Week8/wantkdd/mission2/src/components/lp-detail/LpComments.tsx create mode 100644 Week8/wantkdd/mission2/src/components/lp-detail/LpEdit.tsx create mode 100644 Week8/wantkdd/mission2/src/components/lp-detail/LpInfo.tsx create mode 100644 Week8/wantkdd/mission2/src/components/lp-detail/comment-skeleton.tsx create mode 100644 Week8/wantkdd/mission2/src/components/lp-detail/comment.tsx create mode 100644 Week8/wantkdd/mission2/src/components/lp-detail/lp-card-skeleton-list.tsx create mode 100644 Week8/wantkdd/mission2/src/components/lp-detail/lp-card-skeleton.tsx create mode 100644 Week8/wantkdd/mission2/src/components/lp-detail/lp-card.tsx create mode 100644 Week8/wantkdd/mission2/src/components/navbar.tsx create mode 100644 Week8/wantkdd/mission2/src/components/sidebar.tsx create mode 100644 Week8/wantkdd/mission2/src/constants/key.ts create mode 100644 Week8/wantkdd/mission2/src/context/AuthContext.tsx create mode 100644 Week8/wantkdd/mission2/src/enums/commons.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/custom/useCustomFetch.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/custom/useDebounce.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/custom/useForm.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/custom/useLocalStorage.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/custom/useLpComments.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/custom/useLpDetail.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/custom/useThrottle.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/mutations/comments/useDeleteComment.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/mutations/comments/usePostComment.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/mutations/comments/useUpdateComment.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/mutations/like/useDeleteLikte.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/mutations/like/usePostLike.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/mutations/lp/useDeleteLp.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/mutations/lp/usePostLp.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/mutations/lp/useUpdateLp.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/mutations/user/useDeleteUser.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/mutations/user/useLogin.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/mutations/user/useLogout.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/mutations/user/useUpdateMyInfo.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/queries/useGetInfiniteLpDetail.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/queries/useGetInfiniteLpList.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/queries/useGetLpDetail.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/queries/useGetLpList.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/queries/useGetMyInfo.ts create mode 100644 Week8/wantkdd/mission2/src/hooks/queries/useSearchLp.ts create mode 100644 Week8/wantkdd/mission2/src/index.css create mode 100644 Week8/wantkdd/mission2/src/layout/ProtectedLayout.tsx create mode 100644 Week8/wantkdd/mission2/src/layout/root-layout.tsx create mode 100644 Week8/wantkdd/mission2/src/main.tsx create mode 100644 Week8/wantkdd/mission2/src/pages/detail-page.tsx create mode 100644 Week8/wantkdd/mission2/src/pages/googleLoginRedirect-page.tsx create mode 100644 Week8/wantkdd/mission2/src/pages/home-page.tsx create mode 100644 Week8/wantkdd/mission2/src/pages/login-page.tsx create mode 100644 Week8/wantkdd/mission2/src/pages/my-page.tsx create mode 100644 Week8/wantkdd/mission2/src/pages/search-page.tsx create mode 100644 Week8/wantkdd/mission2/src/pages/signup-page.tsx create mode 100644 Week8/wantkdd/mission2/src/pages/signup/email-step.tsx create mode 100644 Week8/wantkdd/mission2/src/pages/signup/name-step.tsx create mode 100644 Week8/wantkdd/mission2/src/pages/signup/password-step.tsx create mode 100644 Week8/wantkdd/mission2/src/types/auth.ts create mode 100644 Week8/wantkdd/mission2/src/types/common.ts create mode 100644 Week8/wantkdd/mission2/src/types/lp-detail.ts create mode 100644 Week8/wantkdd/mission2/src/types/lp.ts create mode 100644 Week8/wantkdd/mission2/src/utils/validate.ts create mode 100644 Week8/wantkdd/mission2/src/vite-env.d.ts create mode 100644 Week8/wantkdd/mission2/tsconfig.app.json create mode 100644 Week8/wantkdd/mission2/tsconfig.json create mode 100644 Week8/wantkdd/mission2/tsconfig.node.json create mode 100644 Week8/wantkdd/mission2/vite.config.ts diff --git a/Week8/wantkdd/mission1/.gitignore b/Week8/wantkdd/mission1/.gitignore new file mode 100644 index 00000000..3b0b4037 --- /dev/null +++ b/Week8/wantkdd/mission1/.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 + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +.env \ No newline at end of file diff --git a/Week8/wantkdd/mission1/README.md b/Week8/wantkdd/mission1/README.md new file mode 100644 index 00000000..40ede56e --- /dev/null +++ b/Week8/wantkdd/mission1/README.md @@ -0,0 +1,54 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@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 + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default tseslint.config({ + extends: [ + // Remove ...tseslint.configs.recommended and replace with this + ...tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + ...tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + ...tseslint.configs.stylisticTypeChecked, + ], + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default tseslint.config({ + plugins: { + // Add the react-x and react-dom plugins + 'react-x': reactX, + 'react-dom': reactDom, + }, + rules: { + // other rules... + // Enable its recommended typescript rules + ...reactX.configs['recommended-typescript'].rules, + ...reactDom.configs.recommended.rules, + }, +}) +``` diff --git a/Week8/wantkdd/mission1/eslint.config.js b/Week8/wantkdd/mission1/eslint.config.js new file mode 100644 index 00000000..092408a9 --- /dev/null +++ b/Week8/wantkdd/mission1/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/Week8/wantkdd/mission1/index.html b/Week8/wantkdd/mission1/index.html new file mode 100644 index 00000000..30d6aa6a --- /dev/null +++ b/Week8/wantkdd/mission1/index.html @@ -0,0 +1,13 @@ + + + + + + + WAN LP + + +
+ + + diff --git a/Week8/wantkdd/mission1/package.json b/Week8/wantkdd/mission1/package.json new file mode 100644 index 00000000..d6ebd5d0 --- /dev/null +++ b/Week8/wantkdd/mission1/package.json @@ -0,0 +1,44 @@ +{ + "name": "mission1", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@hookform/resolvers": "^5.0.1", + "@prisma/client": "^6.6.0", + "@tailwindcss/vite": "^4.1.3", + "@tanstack/react-query": "^5.75.0", + "@tanstack/react-query-devtools": "^5.75.1", + "axios": "^1.8.4", + "hook-form": "^0.0.1", + "js-cookie": "^3.0.5", + "prisma": "^6.6.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-hook-form": "^7.55.0", + "react-icons": "^5.5.0", + "react-intersection-observer": "^9.16.0", + "react-router-dom": "^7.5.0", + "tailwindcss": "^4.1.3", + "zod": "^3.24.2" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react-swc": "^3.8.0", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0" + } +} diff --git a/Week8/wantkdd/mission1/pnpm-lock.yaml b/Week8/wantkdd/mission1/pnpm-lock.yaml new file mode 100644 index 00000000..1fc76050 --- /dev/null +++ b/Week8/wantkdd/mission1/pnpm-lock.yaml @@ -0,0 +1,2535 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@hookform/resolvers': + specifier: ^5.0.1 + version: 5.0.1(react-hook-form@7.55.0(react@19.1.0)) + '@prisma/client': + specifier: ^6.6.0 + version: 6.6.0(prisma@6.6.0(typescript@5.7.3))(typescript@5.7.3) + '@tailwindcss/vite': + specifier: ^4.1.3 + version: 4.1.3(vite@6.2.5(jiti@2.4.2)(lightningcss@1.29.2)) + '@tanstack/react-query': + specifier: ^5.75.0 + version: 5.75.0(react@19.1.0) + '@tanstack/react-query-devtools': + specifier: ^5.75.1 + version: 5.75.1(@tanstack/react-query@5.75.0(react@19.1.0))(react@19.1.0) + axios: + specifier: ^1.8.4 + version: 1.8.4 + hook-form: + specifier: ^0.0.1 + version: 0.0.1(react@19.1.0) + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + prisma: + specifier: ^6.6.0 + version: 6.6.0(typescript@5.7.3) + react: + specifier: ^19.0.0 + version: 19.1.0 + react-dom: + specifier: ^19.0.0 + version: 19.1.0(react@19.1.0) + react-hook-form: + specifier: ^7.55.0 + version: 7.55.0(react@19.1.0) + react-icons: + specifier: ^5.5.0 + version: 5.5.0(react@19.1.0) + react-intersection-observer: + specifier: ^9.16.0 + version: 9.16.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-router-dom: + specifier: ^7.5.0 + version: 7.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + tailwindcss: + specifier: ^4.1.3 + version: 4.1.3 + zod: + specifier: ^3.24.2 + version: 3.24.2 + devDependencies: + '@eslint/js': + specifier: ^9.21.0 + version: 9.24.0 + '@types/react': + specifier: ^19.0.10 + version: 19.1.0 + '@types/react-dom': + specifier: ^19.0.4 + version: 19.1.1(@types/react@19.1.0) + '@vitejs/plugin-react-swc': + specifier: ^3.8.0 + version: 3.8.1(vite@6.2.5(jiti@2.4.2)(lightningcss@1.29.2)) + eslint: + specifier: ^9.21.0 + version: 9.24.0(jiti@2.4.2) + eslint-plugin-react-hooks: + specifier: ^5.1.0 + version: 5.2.0(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-react-refresh: + specifier: ^0.4.19 + version: 0.4.19(eslint@9.24.0(jiti@2.4.2)) + globals: + specifier: ^15.15.0 + version: 15.15.0 + typescript: + specifier: ~5.7.2 + version: 5.7.3 + typescript-eslint: + specifier: ^8.24.1 + version: 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + vite: + specifier: ^6.2.0 + version: 6.2.5(jiti@2.4.2)(lightningcss@1.29.2) + +packages: + + '@esbuild/aix-ppc64@0.25.2': + resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.2': + resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.2': + resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.2': + resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.2': + resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.2': + resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.2': + resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.2': + resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.2': + resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.2': + resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.2': + resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.2': + resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.2': + resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.2': + resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.2': + resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.2': + resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.2': + resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.2': + resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.2': + resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.2': + resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.2': + resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.2': + resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.2': + resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.2': + resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.2': + resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.5.1': + resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.1': + resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.24.0': + resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@hookform/resolvers@5.0.1': + resolution: {integrity: sha512-u/+Jp83luQNx9AdyW2fIPGY6Y7NG68eN2ZW8FOJYL+M0i4s49+refdJdOp/A9n9HFQtQs3HIDHQvX3ZET2o7YA==} + peerDependencies: + react-hook-form: ^7.55.0 + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@prisma/client@6.6.0': + resolution: {integrity: sha512-vfp73YT/BHsWWOAuthKQ/1lBgESSqYqAWZEYyTdGXyFAHpmewwWL2Iz6ErIzkj4aHbuc6/cGSsE6ZY+pBO04Cg==} + engines: {node: '>=18.18'} + peerDependencies: + prisma: '*' + typescript: '>=5.1.0' + peerDependenciesMeta: + prisma: + optional: true + typescript: + optional: true + + '@prisma/config@6.6.0': + resolution: {integrity: sha512-d8FlXRHsx72RbN8nA2QCRORNv5AcUnPXgtPvwhXmYkQSMF/j9cKaJg+9VcUzBRXGy9QBckNzEQDEJZdEOZ+ubA==} + + '@prisma/debug@6.6.0': + resolution: {integrity: sha512-DL6n4IKlW5k2LEXzpN60SQ1kP/F6fqaCgU/McgaYsxSf43GZ8lwtmXLke9efS+L1uGmrhtBUP4npV/QKF8s2ZQ==} + + '@prisma/engines-version@6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a': + resolution: {integrity: sha512-JzRaQ5Em1fuEcbR3nUsMNYaIYrOT1iMheenjCvzZblJcjv/3JIuxXN7RCNT5i6lRkLodW5ojCGhR7n5yvnNKrw==} + + '@prisma/engines@6.6.0': + resolution: {integrity: sha512-nC0IV4NHh7500cozD1fBoTwTD1ydJERndreIjpZr/S3mno3P6tm8qnXmIND5SwUkibNeSJMpgl4gAnlqJ/gVlg==} + + '@prisma/fetch-engine@6.6.0': + resolution: {integrity: sha512-Ohfo8gKp05LFLZaBlPUApM0M7k43a0jmo86YY35u1/4t+vuQH9mRGU7jGwVzGFY3v+9edeb/cowb1oG4buM1yw==} + + '@prisma/get-platform@6.6.0': + resolution: {integrity: sha512-3qCwmnT4Jh5WCGUrkWcc6VZaw0JY7eWN175/pcb5Z6FiLZZ3ygY93UX0WuV41bG51a6JN/oBH0uywJ90Y+V5eA==} + + '@rollup/rollup-android-arm-eabi@4.39.0': + resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.39.0': + resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.39.0': + resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.39.0': + resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.39.0': + resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.39.0': + resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.39.0': + resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.39.0': + resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.39.0': + resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.39.0': + resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.39.0': + resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': + resolution: {integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.39.0': + resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.39.0': + resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.39.0': + resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.39.0': + resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.39.0': + resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.39.0': + resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.39.0': + resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.39.0': + resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==} + cpu: [x64] + os: [win32] + + '@standard-schema/utils@0.3.0': + resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + + '@swc/core-darwin-arm64@1.11.16': + resolution: {integrity: sha512-l6uWMU+MUdfLHCl3dJgtVEdsUHPskoA4BSu0L1hh9SGBwPZ8xeOz8iLIqZM27lTuXxL4KsYH6GQR/OdQ/vhLtg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.11.16': + resolution: {integrity: sha512-TH0IW8Ao1WZ4ARFHIh29dAQHYBEl4YnP74n++rjppmlCjY+8v3s5nXMA7IqxO3b5LVHyggWtU4+46DXTyMJM7g==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.11.16': + resolution: {integrity: sha512-2IxD9t09oNZrbv37p4cJ9cTHMUAK6qNiShi9s2FJ9LcqSnZSN4iS4hvaaX6KZuG54d58vWnMU7yycjkdOTQcMg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.11.16': + resolution: {integrity: sha512-AYkN23DOiPh1bf3XBf/xzZQDKSsgZTxlbyTyUIhprLJpAAAT0ZCGAUcS5mHqydk0nWQ13ABUymodvHoroutNzw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.11.16': + resolution: {integrity: sha512-n/nWXDRCIhM51dDGELfBcTMNnCiFatE7LDvsbYxb7DJt1HGjaCNvHHCKURb/apJTh/YNtWfgFap9dbsTgw8yPA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.11.16': + resolution: {integrity: sha512-xr182YQrF47n7Awxj+/ruI21bYw+xO/B26KFVnb+i3ezF9NOhqoqTX+33RL1ZLA/uFTq8ksPZO/y+ZVS/odtQA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.11.16': + resolution: {integrity: sha512-k2JBfiwWfXCIKrBRjFO9/vEdLSYq0QLJ+iNSLdfrejZ/aENNkbEg8O7O2GKUSb30RBacn6k8HMfJrcPLFiEyCQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.11.16': + resolution: {integrity: sha512-taOb5U+abyEhQgex+hr6cI48BoqSvSdfmdirWcxprIEUBHCxa1dSriVwnJRAJOFI9T+5BEz88by6rgbB9MjbHA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.11.16': + resolution: {integrity: sha512-b7yYggM9LBDiMY+XUt5kYWvs5sn0U3PXSOGvF3CbLufD/N/YQiDcYON2N3lrWHYL8aYnwbuZl45ojmQHSQPcdA==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.11.16': + resolution: {integrity: sha512-/ibq/YDc3B5AROkpOKPGxVkSyCKOg+ml8k11RxrW7FAPy6a9y5y9KPcWIqV74Ahq4RuaMNslTQqHWAGSm0xJsQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.11.16': + resolution: {integrity: sha512-wgjrJqVUss8Lxqilg0vkiE0tkEKU3mZkoybQM1Ehy+PKWwwB6lFAwKi20cAEFlSSWo8jFR8hRo19ZELAoLDowg==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.21': + resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} + + '@tailwindcss/node@4.1.3': + resolution: {integrity: sha512-H/6r6IPFJkCfBJZ2dKZiPJ7Ueb2wbL592+9bQEl2r73qbX6yGnmQVIfiUvDRB2YI0a3PWDrzUwkvQx1XW1bNkA==} + + '@tailwindcss/oxide-android-arm64@4.1.3': + resolution: {integrity: sha512-cxklKjtNLwFl3mDYw4XpEfBY+G8ssSg9ADL4Wm6//5woi3XGqlxFsnV5Zb6v07dxw1NvEX2uoqsxO/zWQsgR+g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.3': + resolution: {integrity: sha512-mqkf2tLR5VCrjBvuRDwzKNShRu99gCAVMkVsaEOFvv6cCjlEKXRecPu9DEnxp6STk5z+Vlbh1M5zY3nQCXMXhw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.3': + resolution: {integrity: sha512-7sGraGaWzXvCLyxrc7d+CCpUN3fYnkkcso3rCzwUmo/LteAl2ZGCDlGvDD8Y/1D3ngxT8KgDj1DSwOnNewKhmg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.3': + resolution: {integrity: sha512-E2+PbcbzIReaAYZe997wb9rId246yDkCwAakllAWSGqe6VTg9hHle67hfH6ExjpV2LSK/siRzBUs5wVff3RW9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.3': + resolution: {integrity: sha512-GvfbJ8wjSSjbLFFE3UYz4Eh8i4L6GiEYqCtA8j2Zd2oXriPuom/Ah/64pg/szWycQpzRnbDiJozoxFU2oJZyfg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.3': + resolution: {integrity: sha512-35UkuCWQTeG9BHcBQXndDOrpsnt3Pj9NVIB4CgNiKmpG8GnCNXeMczkUpOoqcOhO6Cc/mM2W7kaQ/MTEENDDXg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.3': + resolution: {integrity: sha512-dm18aQiML5QCj9DQo7wMbt1Z2tl3Giht54uVR87a84X8qRtuXxUqnKQkRDK5B4bCOmcZ580lF9YcoMkbDYTXHQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.3': + resolution: {integrity: sha512-LMdTmGe/NPtGOaOfV2HuO7w07jI3cflPrVq5CXl+2O93DCewADK0uW1ORNAcfu2YxDUS035eY2W38TxrsqngxA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.3': + resolution: {integrity: sha512-aalNWwIi54bbFEizwl1/XpmdDrOaCjRFQRgtbv9slWjmNPuJJTIKPHf5/XXDARc9CneW9FkSTqTbyvNecYAEGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.3': + resolution: {integrity: sha512-PEj7XR4OGTGoboTIAdXicKuWl4EQIjKHKuR+bFy9oYN7CFZo0eu74+70O4XuERX4yjqVZGAkCdglBODlgqcCXg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.3': + resolution: {integrity: sha512-T8gfxECWDBENotpw3HR9SmNiHC9AOJdxs+woasRZ8Q/J4VHN0OMs7F+4yVNZ9EVN26Wv6mZbK0jv7eHYuLJLwA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.3': + resolution: {integrity: sha512-t16lpHCU7LBxDe/8dCj9ntyNpXaSTAgxWm1u2XQP5NiIu4KGSyrDJJRlK9hJ4U9yJxx0UKCVI67MJWFNll5mOQ==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.3': + resolution: {integrity: sha512-lUI/QaDxLtlV52Lho6pu07CG9pSnRYLOPmKGIQjyHdTBagemc6HmgZxyjGAQ/5HMPrNeWBfTVIpQl0/jLXvWHQ==} + peerDependencies: + vite: ^5.2.0 || ^6 + + '@tanstack/query-core@5.75.0': + resolution: {integrity: sha512-rk8KQuCdhoRkzjRVF3QxLgAfFUyS0k7+GCQjlGEpEGco+qazJ0eMH6aO1DjDjibH7/ik383nnztua3BG+lOnwg==} + + '@tanstack/query-devtools@5.74.7': + resolution: {integrity: sha512-nSNlfuGdnHf4yB0S+BoNYOE1o3oAH093weAYZolIHfS2stulyA/gWfSk/9H4ZFk5mAAHb5vNqAeJOmbdcGPEQw==} + + '@tanstack/react-query-devtools@5.75.1': + resolution: {integrity: sha512-6S71fJRBlb0adlG5z/OHRqZqtHoPYVCklf/KCnOoZ3vdx9O/K9BLvqeeDeMUkZ6Rak/IupbEbvBsFoUiMHwZiQ==} + peerDependencies: + '@tanstack/react-query': ^5.75.1 + react: ^18 || ^19 + + '@tanstack/react-query@5.75.0': + resolution: {integrity: sha512-H+TNgxmTbzH8qQ5MT5xsZEhQ8BG1tUYduDSfeAOzroVZgd/AEjg1rRYSP/9Tl9/hPobZ7iZzV401n77kStrbKw==} + peerDependencies: + react: ^18 || ^19 + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/react-dom@19.1.1': + resolution: {integrity: sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@19.1.0': + resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==} + + '@typescript-eslint/eslint-plugin@8.29.0': + resolution: {integrity: sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.29.0': + resolution: {integrity: sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.29.0': + resolution: {integrity: sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.29.0': + resolution: {integrity: sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.29.0': + resolution: {integrity: sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.29.0': + resolution: {integrity: sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.29.0': + resolution: {integrity: sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.29.0': + resolution: {integrity: sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-react-swc@3.8.1': + resolution: {integrity: sha512-aEUPCckHDcFyxpwFm0AIkbtv6PpUp3xTb9wYGFjtABynXjCYKkWoxX0AOK9NT9XCrdk6mBBUOeHQS+RKdcNO1A==} + peerDependencies: + vite: ^4 || ^5 || ^6 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.8.4: + resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.25.2: + resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-refresh@0.4.19: + resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==} + peerDependencies: + eslint: '>=8.40' + + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.24.0: + resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hook-form@0.0.1: + resolution: {integrity: sha512-jusNZfTsHBSqvIgrhG8a1iwdeN1UT3HenQwg3snzd5ArwpNgDQlN2O0XdPqEE2oPUdMr/k16WmCccO8jRgiRYA==} + peerDependencies: + react: '>=15.0.0 || ^16.0.0' + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-darwin-arm64@1.29.2: + resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.2: + resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.2: + resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.2: + resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.2: + resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.29.2: + resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.29.2: + resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.29.2: + resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.29.2: + resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.2: + resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.2: + resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} + engines: {node: '>= 12.0.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prisma@6.6.0: + resolution: {integrity: sha512-SYCUykz+1cnl6Ugd8VUvtTQq5+j1Q7C0CtzKPjQ8JyA2ALh0EEJkMCS+KgdnvKW1lrxjtjCyJSHOOT236mENYg==} + engines: {node: '>=18.18'} + hasBin: true + peerDependencies: + typescript: '>=5.1.0' + peerDependenciesMeta: + typescript: + optional: true + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + + react-hook-form@7.55.0: + resolution: {integrity: sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-icons@5.5.0: + resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} + peerDependencies: + react: '*' + + react-intersection-observer@9.16.0: + resolution: {integrity: sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react-dom: + optional: true + + react-router-dom@7.5.0: + resolution: {integrity: sha512-fFhGFCULy4vIseTtH5PNcY/VvDJK5gvOWcwJVHQp8JQcWVr85ENhJ3UpuF/zP1tQOIFYNRJHzXtyhU1Bdgw0RA==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react-router@7.5.0: + resolution: {integrity: sha512-estOHrRlDMKdlQa6Mj32gIks4J+AxNsYoE0DbTTxiMy2mPzZuWSDU+N85/r1IlNR7kGfznF3VCUlvc5IUO+B9g==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.39.0: + resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tailwindcss@4.1.3: + resolution: {integrity: sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + turbo-stream@2.4.0: + resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript-eslint@8.29.0: + resolution: {integrity: sha512-ep9rVd9B4kQsZ7ZnWCVxUE/xDLUUUsRzE0poAeNu+4CkFErLfuvPt/qtm2EpnSyfvsR0S6QzDFSrPCFBwf64fg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vite@6.2.5: + resolution: {integrity: sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + +snapshots: + + '@esbuild/aix-ppc64@0.25.2': + optional: true + + '@esbuild/android-arm64@0.25.2': + optional: true + + '@esbuild/android-arm@0.25.2': + optional: true + + '@esbuild/android-x64@0.25.2': + optional: true + + '@esbuild/darwin-arm64@0.25.2': + optional: true + + '@esbuild/darwin-x64@0.25.2': + optional: true + + '@esbuild/freebsd-arm64@0.25.2': + optional: true + + '@esbuild/freebsd-x64@0.25.2': + optional: true + + '@esbuild/linux-arm64@0.25.2': + optional: true + + '@esbuild/linux-arm@0.25.2': + optional: true + + '@esbuild/linux-ia32@0.25.2': + optional: true + + '@esbuild/linux-loong64@0.25.2': + optional: true + + '@esbuild/linux-mips64el@0.25.2': + optional: true + + '@esbuild/linux-ppc64@0.25.2': + optional: true + + '@esbuild/linux-riscv64@0.25.2': + optional: true + + '@esbuild/linux-s390x@0.25.2': + optional: true + + '@esbuild/linux-x64@0.25.2': + optional: true + + '@esbuild/netbsd-arm64@0.25.2': + optional: true + + '@esbuild/netbsd-x64@0.25.2': + optional: true + + '@esbuild/openbsd-arm64@0.25.2': + optional: true + + '@esbuild/openbsd-x64@0.25.2': + optional: true + + '@esbuild/sunos-x64@0.25.2': + optional: true + + '@esbuild/win32-arm64@0.25.2': + optional: true + + '@esbuild/win32-ia32@0.25.2': + optional: true + + '@esbuild/win32-x64@0.25.2': + optional: true + + '@eslint-community/eslint-utils@4.5.1(eslint@9.24.0(jiti@2.4.2))': + dependencies: + eslint: 9.24.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.20.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.1': {} + + '@eslint/core@0.12.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.13.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.24.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.8': + dependencies: + '@eslint/core': 0.13.0 + levn: 0.4.1 + + '@hookform/resolvers@5.0.1(react-hook-form@7.55.0(react@19.1.0))': + dependencies: + '@standard-schema/utils': 0.3.0 + react-hook-form: 7.55.0(react@19.1.0) + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.2': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@prisma/client@6.6.0(prisma@6.6.0(typescript@5.7.3))(typescript@5.7.3)': + optionalDependencies: + prisma: 6.6.0(typescript@5.7.3) + typescript: 5.7.3 + + '@prisma/config@6.6.0': + dependencies: + esbuild: 0.25.2 + esbuild-register: 3.6.0(esbuild@0.25.2) + transitivePeerDependencies: + - supports-color + + '@prisma/debug@6.6.0': {} + + '@prisma/engines-version@6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a': {} + + '@prisma/engines@6.6.0': + dependencies: + '@prisma/debug': 6.6.0 + '@prisma/engines-version': 6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a + '@prisma/fetch-engine': 6.6.0 + '@prisma/get-platform': 6.6.0 + + '@prisma/fetch-engine@6.6.0': + dependencies: + '@prisma/debug': 6.6.0 + '@prisma/engines-version': 6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a + '@prisma/get-platform': 6.6.0 + + '@prisma/get-platform@6.6.0': + dependencies: + '@prisma/debug': 6.6.0 + + '@rollup/rollup-android-arm-eabi@4.39.0': + optional: true + + '@rollup/rollup-android-arm64@4.39.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.39.0': + optional: true + + '@rollup/rollup-darwin-x64@4.39.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.39.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.39.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.39.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.39.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.39.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.39.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.39.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.39.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.39.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.39.0': + optional: true + + '@standard-schema/utils@0.3.0': {} + + '@swc/core-darwin-arm64@1.11.16': + optional: true + + '@swc/core-darwin-x64@1.11.16': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.11.16': + optional: true + + '@swc/core-linux-arm64-gnu@1.11.16': + optional: true + + '@swc/core-linux-arm64-musl@1.11.16': + optional: true + + '@swc/core-linux-x64-gnu@1.11.16': + optional: true + + '@swc/core-linux-x64-musl@1.11.16': + optional: true + + '@swc/core-win32-arm64-msvc@1.11.16': + optional: true + + '@swc/core-win32-ia32-msvc@1.11.16': + optional: true + + '@swc/core-win32-x64-msvc@1.11.16': + optional: true + + '@swc/core@1.11.16': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.21 + optionalDependencies: + '@swc/core-darwin-arm64': 1.11.16 + '@swc/core-darwin-x64': 1.11.16 + '@swc/core-linux-arm-gnueabihf': 1.11.16 + '@swc/core-linux-arm64-gnu': 1.11.16 + '@swc/core-linux-arm64-musl': 1.11.16 + '@swc/core-linux-x64-gnu': 1.11.16 + '@swc/core-linux-x64-musl': 1.11.16 + '@swc/core-win32-arm64-msvc': 1.11.16 + '@swc/core-win32-ia32-msvc': 1.11.16 + '@swc/core-win32-x64-msvc': 1.11.16 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.21': + dependencies: + '@swc/counter': 0.1.3 + + '@tailwindcss/node@4.1.3': + dependencies: + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + lightningcss: 1.29.2 + tailwindcss: 4.1.3 + + '@tailwindcss/oxide-android-arm64@4.1.3': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.3': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.3': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.3': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.3': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.3': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.3': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.3': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.3': + optional: true + + '@tailwindcss/oxide@4.1.3': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.3 + '@tailwindcss/oxide-darwin-arm64': 4.1.3 + '@tailwindcss/oxide-darwin-x64': 4.1.3 + '@tailwindcss/oxide-freebsd-x64': 4.1.3 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.3 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.3 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.3 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.3 + '@tailwindcss/oxide-linux-x64-musl': 4.1.3 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.3 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.3 + + '@tailwindcss/vite@4.1.3(vite@6.2.5(jiti@2.4.2)(lightningcss@1.29.2))': + dependencies: + '@tailwindcss/node': 4.1.3 + '@tailwindcss/oxide': 4.1.3 + tailwindcss: 4.1.3 + vite: 6.2.5(jiti@2.4.2)(lightningcss@1.29.2) + + '@tanstack/query-core@5.75.0': {} + + '@tanstack/query-devtools@5.74.7': {} + + '@tanstack/react-query-devtools@5.75.1(@tanstack/react-query@5.75.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/query-devtools': 5.74.7 + '@tanstack/react-query': 5.75.0(react@19.1.0) + react: 19.1.0 + + '@tanstack/react-query@5.75.0(react@19.1.0)': + dependencies: + '@tanstack/query-core': 5.75.0 + react: 19.1.0 + + '@types/cookie@0.6.0': {} + + '@types/estree@1.0.7': {} + + '@types/json-schema@7.0.15': {} + + '@types/react-dom@19.1.1(@types/react@19.1.0)': + dependencies: + '@types/react': 19.1.0 + + '@types/react@19.1.0': + dependencies: + csstype: 3.1.3 + + '@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.29.0 + '@typescript-eslint/type-utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.29.0 + eslint: 9.24.0(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.29.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.29.0 + debug: 4.4.0 + eslint: 9.24.0(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.29.0': + dependencies: + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/visitor-keys': 8.29.0 + + '@typescript-eslint/type-utils@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + debug: 4.4.0 + eslint: 9.24.0(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.29.0': {} + + '@typescript-eslint/typescript-estree@8.29.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/visitor-keys': 8.29.0 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.1.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.29.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.7.3) + eslint: 9.24.0(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.29.0': + dependencies: + '@typescript-eslint/types': 8.29.0 + eslint-visitor-keys: 4.2.0 + + '@vitejs/plugin-react-swc@3.8.1(vite@6.2.5(jiti@2.4.2)(lightningcss@1.29.2))': + dependencies: + '@swc/core': 1.11.16 + vite: 6.2.5(jiti@2.4.2)(lightningcss@1.29.2) + transitivePeerDependencies: + - '@swc/helpers' + + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + asynckit@0.4.0: {} + + axios@1.8.4: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsites@3.1.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + concat-map@0.0.1: {} + + cookie@1.0.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + detect-libc@2.0.3: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild-register@3.6.0(esbuild@0.25.2): + dependencies: + debug: 4.4.0 + esbuild: 0.25.2 + transitivePeerDependencies: + - supports-color + + esbuild@0.25.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.2 + '@esbuild/android-arm': 0.25.2 + '@esbuild/android-arm64': 0.25.2 + '@esbuild/android-x64': 0.25.2 + '@esbuild/darwin-arm64': 0.25.2 + '@esbuild/darwin-x64': 0.25.2 + '@esbuild/freebsd-arm64': 0.25.2 + '@esbuild/freebsd-x64': 0.25.2 + '@esbuild/linux-arm': 0.25.2 + '@esbuild/linux-arm64': 0.25.2 + '@esbuild/linux-ia32': 0.25.2 + '@esbuild/linux-loong64': 0.25.2 + '@esbuild/linux-mips64el': 0.25.2 + '@esbuild/linux-ppc64': 0.25.2 + '@esbuild/linux-riscv64': 0.25.2 + '@esbuild/linux-s390x': 0.25.2 + '@esbuild/linux-x64': 0.25.2 + '@esbuild/netbsd-arm64': 0.25.2 + '@esbuild/netbsd-x64': 0.25.2 + '@esbuild/openbsd-arm64': 0.25.2 + '@esbuild/openbsd-x64': 0.25.2 + '@esbuild/sunos-x64': 0.25.2 + '@esbuild/win32-arm64': 0.25.2 + '@esbuild/win32-ia32': 0.25.2 + '@esbuild/win32-x64': 0.25.2 + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@5.2.0(eslint@9.24.0(jiti@2.4.2)): + dependencies: + eslint: 9.24.0(jiti@2.4.2) + + eslint-plugin-react-refresh@0.4.19(eslint@9.24.0(jiti@2.4.2)): + dependencies: + eslint: 9.24.0(jiti@2.4.2) + + eslint-scope@8.3.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.24.0(jiti@2.4.2): + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.1 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.24.0 + '@eslint/plugin-kit': 0.2.8 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 4.2.0 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + follow-redirects@1.15.9: {} + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@14.0.0: {} + + globals@15.15.0: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hook-form@0.0.1(react@19.1.0): + dependencies: + react: 19.1.0 + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + isexe@2.0.0: {} + + jiti@2.4.2: {} + + js-cookie@3.0.5: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-darwin-arm64@1.29.2: + optional: true + + lightningcss-darwin-x64@1.29.2: + optional: true + + lightningcss-freebsd-x64@1.29.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.2: + optional: true + + lightningcss-linux-arm64-gnu@1.29.2: + optional: true + + lightningcss-linux-arm64-musl@1.29.2: + optional: true + + lightningcss-linux-x64-gnu@1.29.2: + optional: true + + lightningcss-linux-x64-musl@1.29.2: + optional: true + + lightningcss-win32-arm64-msvc@1.29.2: + optional: true + + lightningcss-win32-x64-msvc@1.29.2: + optional: true + + lightningcss@1.29.2: + dependencies: + detect-libc: 2.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.2 + lightningcss-darwin-x64: 1.29.2 + lightningcss-freebsd-x64: 1.29.2 + lightningcss-linux-arm-gnueabihf: 1.29.2 + lightningcss-linux-arm64-gnu: 1.29.2 + lightningcss-linux-arm64-musl: 1.29.2 + lightningcss-linux-x64-gnu: 1.29.2 + lightningcss-linux-x64-musl: 1.29.2 + lightningcss-win32-arm64-msvc: 1.29.2 + lightningcss-win32-x64-msvc: 1.29.2 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + math-intrinsics@1.1.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prisma@6.6.0(typescript@5.7.3): + dependencies: + '@prisma/config': 6.6.0 + '@prisma/engines': 6.6.0 + optionalDependencies: + fsevents: 2.3.3 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + + react-hook-form@7.55.0(react@19.1.0): + dependencies: + react: 19.1.0 + + react-icons@5.5.0(react@19.1.0): + dependencies: + react: 19.1.0 + + react-intersection-observer@9.16.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + optionalDependencies: + react-dom: 19.1.0(react@19.1.0) + + react-router-dom@7.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-router: 7.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + + react-router@7.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@types/cookie': 0.6.0 + cookie: 1.0.2 + react: 19.1.0 + set-cookie-parser: 2.7.1 + turbo-stream: 2.4.0 + optionalDependencies: + react-dom: 19.1.0(react@19.1.0) + + react@19.1.0: {} + + resolve-from@4.0.0: {} + + reusify@1.1.0: {} + + rollup@4.39.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.39.0 + '@rollup/rollup-android-arm64': 4.39.0 + '@rollup/rollup-darwin-arm64': 4.39.0 + '@rollup/rollup-darwin-x64': 4.39.0 + '@rollup/rollup-freebsd-arm64': 4.39.0 + '@rollup/rollup-freebsd-x64': 4.39.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.39.0 + '@rollup/rollup-linux-arm-musleabihf': 4.39.0 + '@rollup/rollup-linux-arm64-gnu': 4.39.0 + '@rollup/rollup-linux-arm64-musl': 4.39.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.39.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.39.0 + '@rollup/rollup-linux-riscv64-gnu': 4.39.0 + '@rollup/rollup-linux-riscv64-musl': 4.39.0 + '@rollup/rollup-linux-s390x-gnu': 4.39.0 + '@rollup/rollup-linux-x64-gnu': 4.39.0 + '@rollup/rollup-linux-x64-musl': 4.39.0 + '@rollup/rollup-win32-arm64-msvc': 4.39.0 + '@rollup/rollup-win32-ia32-msvc': 4.39.0 + '@rollup/rollup-win32-x64-msvc': 4.39.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + scheduler@0.26.0: {} + + semver@7.7.1: {} + + set-cookie-parser@2.7.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + source-map-js@1.2.1: {} + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tailwindcss@4.1.3: {} + + tapable@2.2.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@2.1.0(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + + turbo-stream@2.4.0: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript-eslint@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.24.0(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + typescript@5.7.3: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vite@6.2.5(jiti@2.4.2)(lightningcss@1.29.2): + dependencies: + esbuild: 0.25.2 + postcss: 8.5.3 + rollup: 4.39.0 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yocto-queue@0.1.0: {} + + zod@3.24.2: {} diff --git a/Week8/wantkdd/mission1/public/vite.svg b/Week8/wantkdd/mission1/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/Week8/wantkdd/mission1/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Week8/wantkdd/mission1/src/App.css b/Week8/wantkdd/mission1/src/App.css new file mode 100644 index 00000000..e69de29b diff --git a/Week8/wantkdd/mission1/src/App.tsx b/Week8/wantkdd/mission1/src/App.tsx new file mode 100644 index 00000000..75662b2b --- /dev/null +++ b/Week8/wantkdd/mission1/src/App.tsx @@ -0,0 +1,73 @@ +import './App.css'; +import { + createBrowserRouter, + RouteObject, + RouterProvider, +} from 'react-router-dom'; +import RootLayout from './layout/root-layout'; +import HomePage from './pages/home-page'; +import LoginPage from './pages/login-page'; +import SignupPage from './pages/signup-page'; +import { AuthProvider } from './context/AuthContext'; +import MyPage from './pages/my-page'; +import ProtectedLayout from './layout/ProtectedLayout'; +import GoogleLoginRedirectPage from './pages/googleLoginRedirect-page'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; +import LpDetailPage from './pages/detail-page'; +import SearchPage from './pages/search-page'; + +const publicRoutes: RouteObject[] = [ + { + path: '/', + element: , + children: [ + { + index: true, + element: , + }, + { + path: '/search-page', + element: , + }, + { + path: '/login-page', + element: , + }, + { + path: '/signup-page', + element: , + }, + { path: 'v1/auth/google/callback', element: }, + ], + }, +]; + +const protectedRoutes: RouteObject[] = [ + { + element: , + children: [ + { path: '/my-page', element: }, + { path: '/lp/:id', element: }, + ], + }, +]; + +const router = createBrowserRouter([...publicRoutes, ...protectedRoutes]); + +export const queryClient = new QueryClient(); + +function App() { + return ( + <> + + + + + {import.meta.env.DEV && } + + + ); +} + +export default App; diff --git a/Week8/wantkdd/mission1/src/apis/addLp.ts b/Week8/wantkdd/mission1/src/apis/addLp.ts new file mode 100644 index 00000000..cae52948 --- /dev/null +++ b/Week8/wantkdd/mission1/src/apis/addLp.ts @@ -0,0 +1,30 @@ +import { CreateLpDto, Tag } from '../types/lp'; +import { axiosInstance } from './axios'; + +export async function postLp(lpData: CreateLpDto) { + const preparedData = { + ...lpData, + tags: lpData.tags.map((tag: Tag) => tag.name), + }; + + // console.log('전송 데이터:', preparedData); + const response = await axiosInstance.post('/v1/lps', preparedData, { + headers: { + 'Content-Type': 'application/json', + }, + }); + return response.data; +} + +export async function uploadImage(file: File): Promise { + const formData = new FormData(); + formData.append('file', file); + + const response = await axiosInstance.post('/v1/uploads', formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + + return response.data.data.imageUrl; +} diff --git a/Week8/wantkdd/mission1/src/apis/auth.ts b/Week8/wantkdd/mission1/src/apis/auth.ts new file mode 100644 index 00000000..338026df --- /dev/null +++ b/Week8/wantkdd/mission1/src/apis/auth.ts @@ -0,0 +1,48 @@ +import { LOCAL_STORAGE_KEY } from '../constants/key'; +import { + PatchUserInfoDto, + RequestSigninDto, + RequestSignupDto, + ResponseMyInfoDto, + ResponseSigninDto, +} from '../types/auth'; +import { axiosInstance } from './axios'; + +export const postSignup = async ( + body: RequestSignupDto +): Promise => { + const { data } = await axiosInstance.post('/v1/auth/signup', body); + + return data; +}; + +export const postSignin = async ( + body: RequestSigninDto +): Promise => { + const { data } = await axiosInstance.post('/v1/auth/signin', body); + + return data; +}; + +export const getMyInfo = async (): Promise => { + const { data } = await axiosInstance.get('/v1/users/me'); + return data; +}; + +export const postLogout = async () => { + const refreshToken = localStorage.getItem(LOCAL_STORAGE_KEY.refreshToken); + + const { data } = await axiosInstance.post('/v1/auth/signout', { + refreshToken, + }); + return data; +}; + +export const patchUserInfo = async (body: PatchUserInfoDto) => { + const { data } = await axiosInstance.patch('/v1/users', body); + return data; +}; + +export const deleteUser = async () => { + return await axiosInstance.delete('/v1/users/'); +}; diff --git a/Week8/wantkdd/mission1/src/apis/axios.ts b/Week8/wantkdd/mission1/src/apis/axios.ts new file mode 100644 index 00000000..b3fab508 --- /dev/null +++ b/Week8/wantkdd/mission1/src/apis/axios.ts @@ -0,0 +1,105 @@ +import axios, { InternalAxiosRequestConfig } from 'axios'; +import { LOCAL_STORAGE_KEY } from '../constants/key'; + +interface CustomInternalAxiosRequestConfig extends InternalAxiosRequestConfig { + _retry?: boolean; +} + +let refreshPromise: Promise | null = null; + +export const axiosInstance = axios.create({ + baseURL: import.meta.env.VITE_SERVER_API_URL, + headers: { + accept: 'application/json', + }, +}); + +axiosInstance.interceptors.request.use( + (config) => { + const token = localStorage.getItem('accessToken'); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; + }, + (error) => { + return Promise.reject(error); + } +); + +axiosInstance.interceptors.response.use( + (response) => response, + async (error) => { + const originalRequest: CustomInternalAxiosRequestConfig = error.config; + + if (originalRequest.url === '/v1/auth/signin') { + return Promise.reject(error); + } + if ( + error.response && + error.response.status === 401 && + !originalRequest._retry + ) { + if (originalRequest.url === '/v1/auth/refresh') { + localStorage.removeItem(LOCAL_STORAGE_KEY.accessToken); + localStorage.removeItem(LOCAL_STORAGE_KEY.refreshToken); + window.location.href = '/login-page'; + return Promise.reject(error); + } + + originalRequest._retry = true; + + if (!refreshPromise) { + refreshPromise = (async () => { + try { + const refreshToken = localStorage.getItem( + LOCAL_STORAGE_KEY.refreshToken + ); + + if (!refreshToken) { + throw new Error('리프레시 토큰이 없습니다'); + } + + const { data } = await axiosInstance.post('/v1/auth/refresh', { + refresh: refreshToken, + }); + + localStorage.setItem( + LOCAL_STORAGE_KEY.accessToken, + data.data.accessToken + ); + localStorage.setItem( + LOCAL_STORAGE_KEY.refreshToken, + data.data.refreshToken + ); + + return data.data.accessToken; + } catch (refreshError) { + localStorage.removeItem(LOCAL_STORAGE_KEY.accessToken); + localStorage.removeItem(LOCAL_STORAGE_KEY.refreshToken); + + window.location.href = '/login-page'; + throw refreshError; + } finally { + refreshPromise = null; + } + })(); + } + + try { + const newAccessToken = await refreshPromise; + if (newAccessToken) { + axiosInstance.defaults.headers.common[ + 'Authorization' + ] = `Bearer ${newAccessToken}`; + originalRequest.headers['Authorization'] = `Bearer ${newAccessToken}`; + return axiosInstance(originalRequest); + } + return Promise.reject(error); + } catch (e) { + return Promise.reject(e); + } + } + return Promise.reject(error); + } +); diff --git a/Week8/wantkdd/mission1/src/apis/like.ts b/Week8/wantkdd/mission1/src/apis/like.ts new file mode 100644 index 00000000..1c6eef10 --- /dev/null +++ b/Week8/wantkdd/mission1/src/apis/like.ts @@ -0,0 +1,11 @@ +import { ResponseLikeLpDto } from '../types/lp-detail'; +import { axiosInstance } from './axios'; + +export const postLike = async (lpId: number): Promise => { + const { data } = await axiosInstance.post(`/v1/lps/${lpId}/likes`); + return data; +}; +export const deleteLike = async (lpId: number): Promise => { + const { data } = await axiosInstance.delete(`/v1/lps/${lpId}/likes`); + return data; +}; diff --git a/Week8/wantkdd/mission1/src/apis/lp-detail.ts b/Week8/wantkdd/mission1/src/apis/lp-detail.ts new file mode 100644 index 00000000..c9925f68 --- /dev/null +++ b/Week8/wantkdd/mission1/src/apis/lp-detail.ts @@ -0,0 +1,72 @@ +import { axiosInstance } from './axios'; +import { + LpDetailResponse, + CommentsResponse, + LpDetailData, + UpdateLpRequest, +} from '../types/lp-detail'; +import { PaginationDto } from '../types/common'; + +export const getLpDetail = async (id: number): Promise => { + const { data } = await axiosInstance.get(`/v1/lps/${id}`); + return data.data; +}; + +export const getComments = async ({ + lpId, + cursor, + limit, + order, +}: { + lpId: number; +} & PaginationDto): Promise => { + const { data } = await axiosInstance.get( + `/v1/lps/${lpId}/comments`, + { + params: { cursor, limit, order }, + } + ); + return data; +}; + +export const createComment = async ( + lpId: string, + content: string +): Promise => { + const { data } = await axiosInstance.post(`/v1/lps/${lpId}/comments`, { + content, + }); + return data.data; +}; + +export const updateComment = async ( + lpId: number, + commentId: number, + content: string +) => { + const { data } = await axiosInstance.patch( + `/v1/lps/${lpId}/comments/${commentId}`, + { + content, + } + ); + return data.data; +}; + +export const deleteComment = async (lpId: number, commentId: number) => { + const { data } = await axiosInstance.delete( + `/v1/lps/${lpId}/comments/${commentId}` + ); + return data.data; +}; + +export const updateLp = async ({ + lpId, + payload, +}: { + lpId: number; + payload: UpdateLpRequest; +}): Promise => { + const { data } = await axiosInstance.patch(`/v1/lps/${lpId}`, payload); + return data.data; +}; diff --git a/Week8/wantkdd/mission1/src/apis/lp.ts b/Week8/wantkdd/mission1/src/apis/lp.ts new file mode 100644 index 00000000..5d47c46a --- /dev/null +++ b/Week8/wantkdd/mission1/src/apis/lp.ts @@ -0,0 +1,17 @@ +import { PaginationDto } from '../types/common'; +import { ResponseLpListDto } from '../types/lp'; +import { axiosInstance } from './axios'; + +export const getLpList = async ( + paginationDto: PaginationDto +): Promise => { + const { data } = await axiosInstance.get('/v1/lps', { + params: paginationDto, + }); + return data; +}; + +export const deleteLp = async (lpId: number): Promise => { + const { data } = await axiosInstance.delete(`/v1/lps/${lpId}`); + return data.data; +}; diff --git a/Week8/wantkdd/mission1/src/assets/default.png b/Week8/wantkdd/mission1/src/assets/default.png new file mode 100644 index 0000000000000000000000000000000000000000..aa05129062195257d848ea667a7dc264bc15694b GIT binary patch literal 13544 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 literal 0 HcmV?d00001 diff --git a/Week8/wantkdd/mission1/src/assets/googleLogo.svg b/Week8/wantkdd/mission1/src/assets/googleLogo.svg new file mode 100644 index 00000000..eb339320 --- /dev/null +++ b/Week8/wantkdd/mission1/src/assets/googleLogo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/Week8/wantkdd/mission1/src/assets/react.svg b/Week8/wantkdd/mission1/src/assets/react.svg new file mode 100644 index 00000000..6c87de9b --- /dev/null +++ b/Week8/wantkdd/mission1/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Week8/wantkdd/mission1/src/components/add-lp/addButton.tsx b/Week8/wantkdd/mission1/src/components/add-lp/addButton.tsx new file mode 100644 index 00000000..1a72ef1a --- /dev/null +++ b/Week8/wantkdd/mission1/src/components/add-lp/addButton.tsx @@ -0,0 +1,20 @@ +import { useState } from 'react'; +import AddLpModal from './addLp'; + +const AddButton = () => { + const [open, setOpen] = useState(false); + + return ( + <> + + {open && setOpen(false)} />} + + ); +}; + +export default AddButton; diff --git a/Week8/wantkdd/mission1/src/components/add-lp/addLp.tsx b/Week8/wantkdd/mission1/src/components/add-lp/addLp.tsx new file mode 100644 index 00000000..28cdea54 --- /dev/null +++ b/Week8/wantkdd/mission1/src/components/add-lp/addLp.tsx @@ -0,0 +1,188 @@ +import React, { useState, useRef } from 'react'; +import { CreateLpDto, Tag } from '../../types/lp'; +import usePostLp from '../../hooks/mutations/lp/usePostLp'; +import { uploadImage } from '../../apis/addLp'; + +const AddLp = ({ onClose }: { onClose: () => void }) => { + const modalRef = useRef(null); + const [title, setTitle] = useState(''); + const [content, setContent] = useState(''); + const [thumbnail, setThumbnail] = useState(''); + const [tags, setTags] = useState([]); + const [currentTag, setCurrentTag] = useState(''); + + const { mutate: createLp, isPending } = usePostLp(); + + const handleBackdropClick = (e: React.MouseEvent) => { + if (e.target === modalRef.current) { + onClose(); + } + }; + + const handleAddTag = () => { + const trimmed = currentTag.trim(); + if (trimmed) { + const exists = tags.some( + (tag) => tag.name.toLowerCase() === trimmed.toLowerCase() + ); + if (!exists) { + const newTag: Tag = { + id: tags.length > 0 ? Math.max(...tags.map((t) => t.id)) + 1 : 1, + name: trimmed, + }; + setTags((prev) => [...prev, newTag]); + setCurrentTag(''); + } + } + }; + + const handleRemoveTag = (tagToRemove: Tag) => { + setTags((prev) => prev.filter((tag) => tag.id !== tagToRemove.id)); + }; + + const handleFileChange = async (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + + try { + const uploadedUrl = await uploadImage(file); + setThumbnail(uploadedUrl); + } catch (error) { + console.error('이미지 업로드 실패:', error); + alert('이미지 업로드 중 오류가 발생했습니다.'); + } + }; + + const handleCreateLp = () => { + if (!title.trim() || !content.trim()) { + alert('제목과 내용을 입력해주세요.'); + return; + } + + const lpData: CreateLpDto = { + title, + content, + thumbnail, + published: true, + tags, + }; + + createLp(lpData, { + onSuccess: () => { + onClose(); + }, + onError: (error) => { + console.error('LP 생성 실패:', error); + alert('LP 생성 중 오류가 발생했습니다.'); + }, + }); + }; + + return ( +
+
+ +
e.preventDefault()}> +
+ + + {thumbnail && ( +
+ 썸네일 미리보기 +
+ )} +
+
+ + setTitle(e.target.value)} + /> +
+
+ +