From 0680fa96a08485b901ee1f21060a168a0585dcea Mon Sep 17 00:00:00 2001 From: DreamChaserDeekay <110885981+DreamChaserDeekay@users.noreply.github.com> Date: Mon, 2 Jan 2023 17:19:18 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20stack=20overflow=20=ED=81=B4?= =?UTF-8?q?=EB=A1=A0=20=EC=BD=94=EB=94=A9=20(#67)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Font 전역변수 설정 * update: Header 외관 구현완료 * update: Not found, Footer, SideBar, 기본 틀 수정 * update: link 연결 완료 * design : Footer 완료 * design : footer 완료 * feat: Question 기능 구현 (#19) * feat: Question CRUD 기능 구현 * feat: Question Vote 기능 구현 * feat: QuestionVote endpoint 변경 * refactor: QuestionVote controller, mapper, service 분리 * refactor: Auditing 컬럼을 Auditable mapped superclass로 분리, view 테이블 분리 * feat: 트랜잭션 적용 * feat: AuditorAware bean 구현 * refactor: 패키지 구조 변경 * feat: 빈 문자열 검색 제한 * feat : Authorization, Authentication 구현 (OAuth2 제외) (#20) * feat : 기본 아이디 + 비밀번호 로그인 인증 구현 (MySQL 연동 테스트 완료) (추후 희성님 MemberRepository 연동 필요) 연동 테스트에 필요한 다음 파일들은 따로 커밋하지 않았습니다. 1) application.yml 2) schema.sql 3) Member 관련 클래스 * feat : Jwt 인가 구현 (MySQL 연동 테스트 완료) 로컬에서는 잘 되지만, 실제 DB나 프론트엔드와 연동했을 때에도 잘 되는지는 추후 테스트 필요. * comment : jwt key, accessTokenExpiration, refreshTokenExpiration 주석 추가 * feat : Jwt Verification Filter (Jwt 토큰의 유효성 검사 필터) 추가 에러 핸들러 추가 * feat : Access Token 재발급 via Refresh Token 기능 구현 refactor : AuthController, AuthService 구현하여 코드 가독성 향상 * refactor : Access Token 재발급 로직 리팩토링 * feat : Logout 로직 구현 (refresh token 데이터 삭제) * feat : logout 기능 @AuthenticationPrincipal 활용하여 인증정보 유무 확인 기능 추가 * delete : 추상 클래스 DataTable 삭제 rename : JwtTokenizer provider 패키지로 이동 * Feat: Answer 기능 구현 (#21) * feat : Answer CRUD 기본 구현 * feat : createAnswer 검증 기능 추가 * comment : 엔티티, 서비스 주석 추가 Co-authored-by: [subimm] <[subimm630@gmail.com]> Co-authored-by: DreamChaserDeekay <110885981+DreamChaserDeekay@users.noreply.github.com> * Feat/member (#22) * feat: member 관련 DTO, service, Controller, Mapper 등 추가 외 의존성 추가 * refactor : 코드 리팩토링 Co-authored-by: DreamChaserDeekay Co-authored-by: DreamChaserDeekay <110885981+DreamChaserDeekay@users.noreply.github.com> * Feat/allquestions (#23) * Questions 페이지1차 구현, Edit Question 페이지 1차 구현 * questions 페이지네이션 구현 * 회원가입 페이지 틀만 구현 * design: header 로그인시 나오는 ui 구현완료 * feat 로그인, 질문글 작성, 답변 수정 기능 추가 로그인, 질문글 작성, 답변 수정 기능 추가 * remove node-modules etc remove node-modules etc * refactor : 백엔드 코드 통합 및 정리 * refactor : spring security 설정 변경 (h2 console 확인 가능하게) import.sql member_id 칼럼 추가 * refactor : lombok, mapstruct 의존성 추가 순서 변경 * refactor : Member 엔티티 id Generate Strategy AUTO -> IDENTITY 변경 * refactor : AuthController 엔드포인트 및 import 구문 수정 * feat : createMember() 비밀번호 encode 로직 추가(passwordEncoder) * fix: ElementCollection FetchType 변경 및 password length 변경 (#25) * refactor : answer CRUD 리팩토링 (#26) Co-authored-by: [subimm] <[subimm630@gmail.com]> * Feat/authorize requests (#27) * refactor : api 명세서 수정에 따른 SecurityConfig 권한 부여 url 수정 comment : AuthService 주석 수정 * feat : refresh token 쿠키 생성 로직 초안 작성 * Feat/회원가입 (#28) * 소셜로그인 미정, 로그인 틀 1차 정리 * feat: 회원가입 비밀번호,이메일 유효성검사 추가 * fix: 질문글 수정페이지 입력부분 수정 * fix: 회원가입페이지 레이아웃정리 * feat 로그인, 답변 수정, 질문글 작성 페이지 서버 연결 코드 작성 로그인, 답변 수정, 질문글 작성 페이지 서버 연결 코드 추가 작성 * feat: Answer, Member와 연동 (#30) feat: AuditorAware 구현 feat: 질문 수정, 삭제시 인가 처리 refactor: Mapper 수정 * refactor: utils 정리 (#32) MultiResponseDto, AuditingConfig utils로 이동 페이지네이션된 응답은 MultiResponseDto로 통일 PageInfo를 static nested class로 변경 SingleResponseDto 제거 * feat : answer vote 기능 추가 (#33) Co-authored-by: [subimm] <[subimm630@gmail.com]> * Feat/data connect (#35) * fix: 회원가입페이지레이아웃 정리, axios 적용 시도 * fix: 질문수정페이지 axios 수정 * design 로그아웃, 질문상세페이지 * feat 로그인 및 세부 기능 수정 로그인 및 세부 기능 수정 * design 질문 목록, 회원가입, 질문 상세 페이지 수정 질문 목록, 회원가입, 질문 상세 페이지 수정 * feat: axios * feat Deletebutton * feat 단일 질문글 데이터 get 요청 구현 단일 질문글 데이터 get 요청 구현 * feat: 질문 정렬 API 구현 (#34) * refactor: answerCount, voteCount 집계 로직 변경 feat: 질문 정렬 API 구현 chore: local, server 프로파일 분리 fix: validateToken 로그 방식 변경 * feat: page, size 기본값 추가 및 검증 적용 format: 불필요한 코드 제거 * feat: sort 기본값 추가 fix: viewCount 매핑 수정 refactor: 검색 여부 판단에 Optional 사용 * refactor: QuestionResponse 구현 복수의 질문을 조회할 때 발생하는 N+1 문제 해결을 위해 응답 형태에 맞는 SQL 쿼리문을 사용하여 QuestionResponse entity를 만들고 DTO를 대체하였다. QuestionRepository에서 복수의 질문을 조회하던 기능을 QuestionResponseRepository로 옮겼다. 단일 질문을 조회, 수정하는 경우에는 Question entity에 접근이 필요하므로 QuestionResponse를 DTO로만 사용하게 했다. feat: 질문 제목, 내용 글자수 제한 추가 fix: 질문 내용 데이터 타입 text로 지정 * format: 줄바꿈 조정 * format: 들여쓰기, 컬럼명 등 수정 * fix: MySQL에서 동작하기 위해 SQL문 수정 fix: CORS 설정 chore: server profile 설정파일 수정 * feat 질문글 상세 페이지 및 답변 수정 페이지 axios 수정 및 구현 질문글 상세 페이지 및 답변 수정 페이지 axios 수정 및 구현 * all questions 페이지서버연결 1차 * feat : getAnswers 정렬 기능 추가 (#37) * feat : getanswers 정렬 기능 추가 * refactor : sort 메서드 삭제 Co-authored-by: [subimm] <[subimm630@gmail.com]> * feat 페이지네이션 * feat 질문글 상세 페이지 서버 연결 코드 구현 및 수정 질문글 상세 페이지 서버 연결 코드 구현 및 수정 * style 질문글 상세 페이지 CSS 수정 질문글 상세 페이지 CSS 수정 * 게시글 id값 동기화 * feat: 예외 처리 ControllerAdvice 구현 (#38) * feat: 예외 처리 ControllerAdvice 구현 rename: ErrorResponse 패키지 변경 * feat: DuplicateKeyException 처리 구현 * feat : reissue 기능 구현 및 auths 파트 리팩토링 (#40) * refactor : api 명세서 수정에 따른 SecurityConfig 권한 부여 url 수정 comment : AuthService 주석 수정 * feat : refresh token 쿠키 생성 로직 초안 작성 * refactor : 1. Access Token 및 Refresh Token 리턴 방식 수정 (기존 : response body에 포함 / 수정 후 : Cookie 및 Header에 포함) 2. api 파라미터 변경 (기존 : request body / 수정 후 : Cookie 및 Header) * refactor : password length, fetchType EAGER * feat : 1. logout 실패 시 에러 메시지 반환 로직 추가 2. accessToken 만료 시 백엔드 자체적으로 reissue로 다이렉트 하는 로직 추가 (보완 필요) * feat : accessToken 만료 시, 자동 reissue 기능 추가 (리팩토링 예정) * refactor : auths 파트 리팩토링 1. 토큰 만료 시 자동 reissue 메소드 명 변경 (postReissue -> autoReissue) 2. autoReissue 메소드 위치 변경 (JwtTokenizer -> JwtAuthenticationFilter) 3. TokenRequestDto 클래스 삭제 (token을 header로 받아서 필요 없음) 4. JwtTokenizer - verifySignature 메소드 삭제 (usage 없음) 5. HeaderMapRequestWrapper 클래스 수정 (필요없는 메소드 삭제) 6. JwtAuthenticationFilter - shouldNotFilter 메소드 수정 (필터링 필요 없는 URL 설정) * refactor : auths 파트 리팩토링 1. redis 를 이용한 refreshToken 관리 기능 추가 - RedisConfig.java, RedisDao.java 생성 2. autoReissue 메소드 삭제 (AuthService 의 reissue 메소드 호출하여 사용) 3. AuthController.java - reissue 메소드 삭제 (엔드포인트 없이 내부적으로 바로 처리) 4. RefreshToken.java, RefreshTokenRepository.java 삭제 (redis 로 대체) 5. JwtTokenizer.java - generateRefreshToken 권한 정보 포함하여 생성 6. JwtAuthenticationFilter.java - doFilter 로직 리팩토링 * Redis가 추가되어서, 로컬에서 테스트 해보시려면 redis를 설치하셔야 합니다. 참고 부탁드립니다! * fix slice 오류 정정 및 CSS 재보완 slice 오류 정정 및 CSS 재보완 * refactor : memberService 메소드 리팩토링 (#42) refactor : patchMember 에 passwordEncoder 적용 feat : deleteMember 시 redis에서 refreshToken 삭제 * feat 최대 글자수 제한 기능 추가 최대 글자수 제한 기능 추가 * fix 질문글 작성 글자수 제한 정정 및 오류 처리 정정 질문글 작성 글자수 제한 정정 및 오류 처리 정정 * feat pagination * chore: compose.yml 등 배포 관련 설정 파일 작성 (#43) * chore: compose.yml 등 배포 관련 설정 파일 작성 refactor: RedisProperty 사용 * chore: compose.yml 수정 MariaDB, Redis 포트 개방 컨테이너 restart 설정 * chore: test task를 위한 application.yml 추가 JWT 관련 속성 test에서 설정 test task, build task 정상화 * Refactor/member (#44) * refactor : patchMember 에 passwordEncoder 적용 feat : deleteMember 시 redis에서 refreshToken 삭제 * refactor : RedisConfig.java 수정 * fix:get,patch 작동수정, css 일부수정 (#46) * fix:editquestion 버튼 css 수정 (#48) * fix 파라미터 일부 수정 파라미터 일부 수정 * Fix/authorization (#49) * fix : JwtAuthenticationFilter.java - shouldNotFilter 필터링 조건 추가 (Request Method) * refactor : JwtAuthenticationFilter.java - import 구문 정리 * fix 답변 수정 기능 서버 연결 코드 수정 답변 수정 기능 서버 연결 코드 수정 * feat : answer Response에 memberName 추가 (#50) Co-authored-by: [subimm] <[subimm630@gmail.com]> * chore: Redis 비밀번호 인증 적용 (#51) * fix:페이지네이션 (#52) * chore: compose.yml Redis healthcheck 변경 (#53) * refactor: 예외 처리 (#54) * refactor: 예외 메시지 명시 및 예외 처리 핸들러 추가 * refactor: 예외 클래스 변경 및 메시지 추가 불필요한 코드 제거 * refactor: ErrorResponse null 필드는 안 보이게 변경 * refactor : auths 단 refactoring (#56) 1. JwtExceptionHandlerFilter.java 추가 - JwtAuthenticationFilter.java 와 역할 분리 2. AuthService.java 단 예외 처리 구체화 - JwtExceptionAdvice.java 에서 처리 3. JwtAuthenticationFilter.java - shouldNotFilter 조건 추가 - 로컬에서 h2 console 을 이용하여 테스트 시, accessToken null 예외가 발생해서 필터링 되지 않도록 처리 4. 로그 추가 * refactor: 예외 처리, 인가 리팩토링 (#57) refactor: ExceptionMessage enum으로 예외 메시지 정리 refactor: 인가 처리 추가 구현 질문 수정 및 삭제 작성자만 가능하게 인가 처리 회원 정보 본인만 확인 가능하게 인가 처리 사용하지 않는 파일 정리 * fix: 질문 투표 점수 예외 메시지 수정 (#58) * remove: server/package-lock.json 삭제 * fix : 답변 예외처리 메세지 수정 (#59) Co-authored-by: [subimm] <[subimm630@gmail.com]> * fix: CORS 필터 추가 (#60) * fix : corsconfiguration 을 통한 cors 설정 / 에러 메시지 반환 -> 에러 로그 기록 (#61) * refactor : auths 단 refactoring 1. JwtExceptionHandlerFilter.java 추가 - JwtAuthenticationFilter.java 와 역할 분리 2. AuthService.java 단 예외 처리 구체화 - JwtExceptionAdvice.java 에서 처리 3. JwtAuthenticationFilter.java - shouldNotFilter 조건 추가 - 로컬에서 h2 console 을 이용하여 테스트 시, accessToken null 예외가 발생해서 필터링 되지 않도록 처리 4. 로그 추가 * fix : Cors Configuration 추가 * refactor : pull 하기 위한 기록용 commit * refactor : REFRESH_TOKEN_NOT_FOUND 에러 메시지 로그로만 처리 (프론트 단으로 RETURN X) * feat 페이지네이션 구현 완료 * fix: 페이지네이션 오류 수정 (#62) * feat : AOP 를 이용한 Logging 구현 (아래 패키지 내 클래스의 모든 메소드에 적용) (#63) 1. answers - service 2. members - service 3. questions - service 4. security - auth - service * 빌드파일 AOP dependency 추가 * service 단의 메소드 명, parameter type / value, return type / value 를 로깅 * parameter 및 return value는 json 형태로 가독성 좋게 로깅하려 했으나, 특정 메소드 (createQuestion) 에서의 stackoverflowerror 발생 및 LocalDateTime을 toJson 하려면 커스텀 설정이 추가로 필요해서 일단 Object 자체로 기록. * JwtAuthenticationFilter.java의 shouldNotFilter 메소드는 Protected 형식이기 때문에 AOP가 적용 불가하여 자체 로깅 그대로 남겨놓음. * fix : SimpleLoggingAop NPE 처리 로직 추가 (#64) * feat : AOP 를 이용한 Logging 구현 (아래 패키지 내 클래스의 모든 메소드에 적용) 1. answers - service 2. members - service 3. questions - service 4. security - auth - service * 빌드파일 AOP dependency 추가 * service 단의 메소드 명, parameter type / value, return type / value 를 로깅 * parameter 및 return value는 json 형태로 가독성 좋게 로깅하려 했으나, 특정 메소드 (createQuestion) 에서의 stackoverflowerror 발생 및 LocalDateTime을 toJson 하려면 커스텀 설정이 추가로 필요해서 일단 Object 자체로 기록. * JwtAuthenticationFilter.java의 shouldNotFilter 메소드는 Protected 형식이기 때문에 AOP가 적용 불가하여 자체 로깅 그대로 남겨놓음. * fix : SimpleLoggingAop.java parameter, return object가 null 일 경우 처리 로직 추가 * fix : NPE 처리 로직 인자 수정 (#65) * feat : AOP 를 이용한 Logging 구현 (아래 패키지 내 클래스의 모든 메소드에 적용) 1. answers - service 2. members - service 3. questions - service 4. security - auth - service * 빌드파일 AOP dependency 추가 * service 단의 메소드 명, parameter type / value, return type / value 를 로깅 * parameter 및 return value는 json 형태로 가독성 좋게 로깅하려 했으나, 특정 메소드 (createQuestion) 에서의 stackoverflowerror 발생 및 LocalDateTime을 toJson 하려면 커스텀 설정이 추가로 필요해서 일단 Object 자체로 기록. * JwtAuthenticationFilter.java의 shouldNotFilter 메소드는 Protected 형식이기 때문에 AOP가 적용 불가하여 자체 로깅 그대로 남겨놓음. * fix : SimpleLoggingAop.java parameter, return object가 null 일 경우 처리 로직 추가 * fix : SimpleLoggingAop.java if (args == null) -> if (arg == null) 수정 * fix : arg, returnObj가 null 인 경우 로그 메시지만 출력하도록 수정 * fix 페이지네이션 및 투표 기능 오류 수정 페이지네이션 및 투표 기능 오류 수정 * style 질문 수정 페이지 CSS 수정 질문 수정 페이지 CSS 수정 * fix : SecurityConfig.java cors 추가 설정 - 배포 서버 주소 추가 * fix: nginx proxy Host 헤더 추가 요청을 어떤 서버에 보내고 있는지 Host 헤더에 명시하여 백엔드 서버 내에서도 확인할 수 있게 고쳤다. CORS 관련 처리시 same origin 판단에 사용된다. * fix markdown viewer 적용 markdown viewer 적용 * feat npmrc 파일 추가 npmrc 파일 추가 * remove npmrc remove npmrc * refactor : backend 클래스 리팩토링 (#66) * refactor : backend 클래스 리팩토링 1. unused import 구문 정리 2. MemberLoginDto.java 삭제 (LoginDto.java 사용) - LoginDto.java validation annotation 설정 3. JwtTokenizer.java TODO 삭제 4. SimpleLoggingAop.java 로그 메시지 수정 (null 인 경우 {} 삭제) * refactor : cors filter 설정 수정 (allowed origin -> *) * fix vote 기능 보수 vote 기능 보수 Co-authored-by: 2Zerozero Co-authored-by: Jimin Kim <88694161+jmkim0@users.noreply.github.com> Co-authored-by: subimm <110973410+subimm@users.noreply.github.com> Co-authored-by: [subimm] <[subimm630@gmail.com]> Co-authored-by: imaginebk <111116987+imaginebk@users.noreply.github.com> Co-authored-by: jannyshim <110325183+jannyshim@users.noreply.github.com> Co-authored-by: h1em0n1m Co-authored-by: jannyshim <29jannyy@gmail.com> Co-authored-by: Jimin Kim --- .gitignore | 24 + client/.env | 1 + client/.gitignore | 23 + client/package-lock.json | 1182 +++++++++++++++-- client/package.json | 9 + client/public/favicon.ico | Bin 3870 -> 0 bytes client/public/heart.ico | Bin 0 -> 33061 bytes client/public/index.html | 4 +- client/public/logo192.png | Bin 5347 -> 0 bytes client/public/logo512.png | Bin 9664 -> 0 bytes client/public/manifest.json | 14 +- client/src/App.js | 56 +- client/src/Main.js | 55 + client/src/api/axios.js | 12 + client/src/assets/AskImg.png | Bin 0 -> 9442 bytes client/src/assets/arrow.png | Bin 0 -> 4241 bytes client/src/assets/bookmark.png | Bin 0 -> 4248 bytes client/src/assets/earth.svg | 1 + client/src/assets/facebook-icon.svg | 10 + client/src/assets/faviconSprite.png | Bin 0 -> 273982 bytes client/src/assets/github-icon.svg | 10 + client/src/assets/google-icon.svg | 6 + client/src/assets/home.jpg | Bin 0 -> 200673 bytes client/src/assets/homeicon.png | Bin 0 -> 557843 bytes client/src/assets/quesiton.png | Bin 0 -> 4193 bytes .../assets/teams-illo-free-sidebar-promo.svg | 1 + client/src/assets/trophy.png | Bin 0 -> 4310 bytes client/src/components/Ask/AskView.js | 294 ++++ .../EditAnswer.js/EditAnswerView.js | 192 +++ client/src/components/Footer.js | 280 ++++ client/src/components/Header.js | 292 ++++ client/src/components/LeftSideBar.js | 64 + client/src/components/Login/LoginContainer.js | 150 +++ client/src/components/Login/LoginForm.js | 103 ++ client/src/components/Login/LoginView.js | 57 + client/src/components/PaginationA.js | 70 + client/src/components/PaginationQ.js | 55 + client/src/components/Question/AnswerForm.js | 101 ++ .../src/components/Question/AnswerVoteForm.js | 116 ++ client/src/components/StackHeader.js | 82 -- client/src/index.js | 16 +- client/src/logo.svg | 1 - client/src/pages/Ask.js | 22 + client/src/pages/EditAnswer.js | 18 + client/src/pages/EditQuestion.js | 171 +++ client/src/pages/Home.js | 83 ++ client/src/pages/Login.js | 22 + client/src/pages/Logout.js | 210 +++ client/src/pages/NotFound.js | 71 + client/src/pages/Question.js | 549 ++++++++ client/src/pages/Questions.js | 166 +++ client/src/pages/Signup.js | 344 +++++ compose.yml | 72 + nginx/nginx.conf | 16 + server/build.gradle | 16 +- .../answers/controller/AnswerController.java | 94 ++ .../controller/AnswerVoteController.java | 66 + .../answers/dto/AnswerDto.java | 52 + .../answers/dto/AnswerVoteCountDto.java | 11 + .../answers/dto/AnswerVoteRequestDto.java | 16 + .../answers/dto/AnswerVoteResponseDto.java | 14 + .../answers/entity/Answer.java | 39 + .../answers/entity/AnswerVote.java | 20 + .../answers/mapper/AnswerMapper.java | 19 + .../answers/mapper/AnswerVoteMapper.java | 25 + .../answers/repository/AnswerRepository.java | 11 + .../repository/AnswerVoteRepository.java | 13 + .../answers/service/AnswerService.java | 89 ++ .../answers/service/AnswerVoteService.java | 52 + .../java/seb4141preproject/members/README.md | 6 + .../members/controller/MemberController.java | 80 ++ .../members/dto/MemberGetDto.java | 17 + .../members/dto/MemberPatchDto.java | 18 + .../members/dto/MemberPostDto.java | 36 + .../members/dto/MemberResponseDto.java | 23 + .../members/entity/Member.java | 51 + .../members/mapper/MemberMapper.java | 59 + .../members/repository/MemberRepository.java | 12 + .../members/service/MemberService.java | 87 ++ .../controller/QuestionController.java | 78 ++ .../controller/QuestionVoteController.java | 78 ++ .../questions/dto/QuestionRequestDto.java | 18 + .../questions/dto/QuestionVoteCountDto.java | 13 + .../questions/dto/QuestionVoteRequestDto.java | 13 + .../dto/QuestionVoteResponseDto.java | 18 + .../questions/entity/Question.java | 36 + .../questions/entity/QuestionResponse.java | 59 + .../questions/entity/QuestionView.java | 26 + .../questions/entity/QuestionVote.java | 21 + .../questions/mapper/QuestionMapper.java | 20 + .../questions/mapper/QuestionVoteMapper.java | 26 + .../repository/QuestionRepository.java | 8 + .../QuestionResponseRepository.java | 13 + .../repository/QuestionVoteRepository.java | 14 + .../questions/service/QuestionService.java | 75 ++ .../service/QuestionVoteService.java | 53 + .../auth/advice/JwtExceptionAdvice.java | 48 + .../config/CustomFilterConfiguration.java | 24 + .../security/auth/config/SecurityConfig.java | 100 ++ .../auth/controller/AuthController.java | 47 + .../security/auth/dto/LoginDto.java | 31 + .../security/auth/dto/TokenDto.java | 13 + .../auth/filter/JwtAuthenticationFilter.java | 62 + .../filter/JwtExceptionHandlerFilter.java | 91 ++ .../handler/CustomAccessDeniedHandler.java | 24 + .../CustomAuthenticationEntryPoint.java | 31 + .../security/auth/provider/JwtTokenizer.java | 134 ++ .../security/auth/redis/RedisConfig.java | 40 + .../security/auth/redis/RedisDao.java | 29 + .../security/auth/service/AuthService.java | 84 ++ .../userdetails/CustomUserDetailsService.java | 72 + .../auth/utils/CustomAuthorityUtils.java | 27 + .../security/auth/utils/ErrorResponder.java | 30 + .../auth/utils/HeaderMapRequestWrapper.java | 31 + .../seb4141preproject/utils/Auditable.java | 31 + .../utils/AuditingConfig.java | 29 + .../utils/ErrorResponse.java | 80 ++ .../utils/ExceptionAdvice.java | 92 ++ .../utils/ExceptionMessage.java | 19 + .../utils/MultiResponseDto.java | 33 + .../utils/SimpleLoggingAop.java | 68 + .../java/seb4141preproject/utils/Vote.java | 22 + .../src/main/resources/application-local.yml | 27 + .../src/main/resources/application-server.yml | 5 + .../src/main/resources/application.properties | 1 - server/src/main/resources/application.yml | 3 + server/src/main/resources/db/schema.sql | 7 + server/src/test/resources/application.yml | 4 + 128 files changed, 7662 insertions(+), 197 deletions(-) create mode 100644 .gitignore create mode 100644 client/.env create mode 100644 client/.gitignore delete mode 100644 client/public/favicon.ico create mode 100755 client/public/heart.ico mode change 100644 => 100755 client/public/index.html delete mode 100644 client/public/logo192.png delete mode 100644 client/public/logo512.png mode change 100644 => 100755 client/public/manifest.json mode change 100644 => 100755 client/src/App.js create mode 100755 client/src/Main.js create mode 100755 client/src/api/axios.js create mode 100644 client/src/assets/AskImg.png create mode 100644 client/src/assets/arrow.png create mode 100644 client/src/assets/bookmark.png create mode 100644 client/src/assets/earth.svg create mode 100644 client/src/assets/facebook-icon.svg create mode 100644 client/src/assets/faviconSprite.png create mode 100644 client/src/assets/github-icon.svg create mode 100644 client/src/assets/google-icon.svg create mode 100755 client/src/assets/home.jpg create mode 100755 client/src/assets/homeicon.png create mode 100644 client/src/assets/quesiton.png create mode 100644 client/src/assets/teams-illo-free-sidebar-promo.svg create mode 100644 client/src/assets/trophy.png create mode 100755 client/src/components/Ask/AskView.js create mode 100644 client/src/components/EditAnswer.js/EditAnswerView.js create mode 100755 client/src/components/Footer.js create mode 100755 client/src/components/Header.js create mode 100755 client/src/components/LeftSideBar.js create mode 100644 client/src/components/Login/LoginContainer.js create mode 100755 client/src/components/Login/LoginForm.js create mode 100644 client/src/components/Login/LoginView.js create mode 100755 client/src/components/PaginationA.js create mode 100755 client/src/components/PaginationQ.js create mode 100755 client/src/components/Question/AnswerForm.js create mode 100755 client/src/components/Question/AnswerVoteForm.js delete mode 100644 client/src/components/StackHeader.js mode change 100644 => 100755 client/src/index.js delete mode 100644 client/src/logo.svg create mode 100755 client/src/pages/Ask.js create mode 100644 client/src/pages/EditAnswer.js create mode 100755 client/src/pages/EditQuestion.js create mode 100755 client/src/pages/Home.js create mode 100644 client/src/pages/Login.js create mode 100644 client/src/pages/Logout.js create mode 100755 client/src/pages/NotFound.js create mode 100755 client/src/pages/Question.js create mode 100755 client/src/pages/Questions.js create mode 100644 client/src/pages/Signup.js create mode 100644 compose.yml create mode 100644 nginx/nginx.conf create mode 100644 server/src/main/java/seb4141preproject/answers/controller/AnswerController.java create mode 100644 server/src/main/java/seb4141preproject/answers/controller/AnswerVoteController.java create mode 100644 server/src/main/java/seb4141preproject/answers/dto/AnswerDto.java create mode 100644 server/src/main/java/seb4141preproject/answers/dto/AnswerVoteCountDto.java create mode 100644 server/src/main/java/seb4141preproject/answers/dto/AnswerVoteRequestDto.java create mode 100644 server/src/main/java/seb4141preproject/answers/dto/AnswerVoteResponseDto.java create mode 100644 server/src/main/java/seb4141preproject/answers/entity/Answer.java create mode 100644 server/src/main/java/seb4141preproject/answers/entity/AnswerVote.java create mode 100644 server/src/main/java/seb4141preproject/answers/mapper/AnswerMapper.java create mode 100644 server/src/main/java/seb4141preproject/answers/mapper/AnswerVoteMapper.java create mode 100644 server/src/main/java/seb4141preproject/answers/repository/AnswerRepository.java create mode 100644 server/src/main/java/seb4141preproject/answers/repository/AnswerVoteRepository.java create mode 100644 server/src/main/java/seb4141preproject/answers/service/AnswerService.java create mode 100644 server/src/main/java/seb4141preproject/answers/service/AnswerVoteService.java create mode 100644 server/src/main/java/seb4141preproject/members/README.md create mode 100644 server/src/main/java/seb4141preproject/members/controller/MemberController.java create mode 100644 server/src/main/java/seb4141preproject/members/dto/MemberGetDto.java create mode 100644 server/src/main/java/seb4141preproject/members/dto/MemberPatchDto.java create mode 100644 server/src/main/java/seb4141preproject/members/dto/MemberPostDto.java create mode 100644 server/src/main/java/seb4141preproject/members/dto/MemberResponseDto.java create mode 100644 server/src/main/java/seb4141preproject/members/entity/Member.java create mode 100644 server/src/main/java/seb4141preproject/members/mapper/MemberMapper.java create mode 100644 server/src/main/java/seb4141preproject/members/repository/MemberRepository.java create mode 100644 server/src/main/java/seb4141preproject/members/service/MemberService.java create mode 100644 server/src/main/java/seb4141preproject/questions/controller/QuestionController.java create mode 100644 server/src/main/java/seb4141preproject/questions/controller/QuestionVoteController.java create mode 100644 server/src/main/java/seb4141preproject/questions/dto/QuestionRequestDto.java create mode 100644 server/src/main/java/seb4141preproject/questions/dto/QuestionVoteCountDto.java create mode 100644 server/src/main/java/seb4141preproject/questions/dto/QuestionVoteRequestDto.java create mode 100644 server/src/main/java/seb4141preproject/questions/dto/QuestionVoteResponseDto.java create mode 100644 server/src/main/java/seb4141preproject/questions/entity/Question.java create mode 100644 server/src/main/java/seb4141preproject/questions/entity/QuestionResponse.java create mode 100644 server/src/main/java/seb4141preproject/questions/entity/QuestionView.java create mode 100644 server/src/main/java/seb4141preproject/questions/entity/QuestionVote.java create mode 100644 server/src/main/java/seb4141preproject/questions/mapper/QuestionMapper.java create mode 100644 server/src/main/java/seb4141preproject/questions/mapper/QuestionVoteMapper.java create mode 100644 server/src/main/java/seb4141preproject/questions/repository/QuestionRepository.java create mode 100644 server/src/main/java/seb4141preproject/questions/repository/QuestionResponseRepository.java create mode 100644 server/src/main/java/seb4141preproject/questions/repository/QuestionVoteRepository.java create mode 100644 server/src/main/java/seb4141preproject/questions/service/QuestionService.java create mode 100644 server/src/main/java/seb4141preproject/questions/service/QuestionVoteService.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/advice/JwtExceptionAdvice.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/config/CustomFilterConfiguration.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/config/SecurityConfig.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/controller/AuthController.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/dto/LoginDto.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/dto/TokenDto.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/filter/JwtAuthenticationFilter.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/filter/JwtExceptionHandlerFilter.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/handler/CustomAccessDeniedHandler.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/handler/CustomAuthenticationEntryPoint.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/provider/JwtTokenizer.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/redis/RedisConfig.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/redis/RedisDao.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/service/AuthService.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/userdetails/CustomUserDetailsService.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/utils/CustomAuthorityUtils.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/utils/ErrorResponder.java create mode 100644 server/src/main/java/seb4141preproject/security/auth/utils/HeaderMapRequestWrapper.java create mode 100644 server/src/main/java/seb4141preproject/utils/Auditable.java create mode 100644 server/src/main/java/seb4141preproject/utils/AuditingConfig.java create mode 100644 server/src/main/java/seb4141preproject/utils/ErrorResponse.java create mode 100644 server/src/main/java/seb4141preproject/utils/ExceptionAdvice.java create mode 100644 server/src/main/java/seb4141preproject/utils/ExceptionMessage.java create mode 100644 server/src/main/java/seb4141preproject/utils/MultiResponseDto.java create mode 100644 server/src/main/java/seb4141preproject/utils/SimpleLoggingAop.java create mode 100644 server/src/main/java/seb4141preproject/utils/Vote.java create mode 100644 server/src/main/resources/application-local.yml create mode 100644 server/src/main/resources/application-server.yml delete mode 100644 server/src/main/resources/application.properties create mode 100644 server/src/main/resources/application.yml create mode 100644 server/src/main/resources/db/schema.sql create mode 100644 server/src/test/resources/application.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8c1cf68 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build +/secrets + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/client/.env b/client/.env new file mode 100644 index 0000000..1b2c278 --- /dev/null +++ b/client/.env @@ -0,0 +1 @@ +REACT_APP_API_URL=http://ec2-43-201-110-117.ap-northeast-2.compute.amazonaws.com \ No newline at end of file diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 0000000..24cdedf --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json index 0e5ff99..17e11bf 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8,12 +8,21 @@ "name": "client", "version": "0.1.0", "dependencies": { + "@reduxjs/toolkit": "^1.9.1", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "@toast-ui/editor": "^3.2.1", + "@toast-ui/react-editor": "^3.2.2", + "http-proxy-middleware": "^2.0.6", "react": "^18.2.0", + "react-axios": "^2.0.6", + "react-cookie": "^4.1.1", "react-dom": "^18.2.0", + "react-js-pagination": "^3.0.3", + "react-router-dom": "^6.5.0", "react-scripts": "5.0.1", + "react-social-login": "^3.4.16", "styled-components": "^5.3.6", "web-vitals": "^2.1.4" } @@ -2133,6 +2142,14 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@emotion/is-prop-valid": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", @@ -3109,6 +3126,37 @@ } } }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.1.tgz", + "integrity": "sha512-HikrdY+IDgRfRYlCTGUQaiCxxDDgM1mQrRbZ6S1HFZX5ZYuJ4o8EstNmhTwHdPl2rTmLxzwSu0b3AyeyTlR+RA==", + "dependencies": { + "immer": "^9.0.16", + "redux": "^4.2.0", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.7" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.1.0.tgz", + "integrity": "sha512-rGl+jH/7x1KBCQScz9p54p0dtPLNeKGb3e0wD2H5/oZj41bwQUnXdzbj2TbUAFhvD7cp9EyEQA4dEgpUFa1O7Q==", + "engines": { + "node": ">=14" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -3639,6 +3687,32 @@ "@testing-library/dom": ">=7.21.4" } }, + "node_modules/@toast-ui/editor": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@toast-ui/editor/-/editor-3.2.1.tgz", + "integrity": "sha512-05nKfqK2n/6Mq8WpO1E7OnOjlhiFfxr1G2i/DpG/pFjKlY3E7uOtSAyuz7rybKWHgUzXRzRGv7MqDL6lXfqnWg==", + "dependencies": { + "dompurify": "^2.3.3", + "prosemirror-commands": "^1.1.9", + "prosemirror-history": "^1.1.3", + "prosemirror-inputrules": "^1.1.3", + "prosemirror-keymap": "^1.1.4", + "prosemirror-model": "^1.14.1", + "prosemirror-state": "^1.3.4", + "prosemirror-view": "^1.18.7" + } + }, + "node_modules/@toast-ui/react-editor": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@toast-ui/react-editor/-/react-editor-3.2.2.tgz", + "integrity": "sha512-lbqRUcSJ9f3HO/MG7cjXmDmoBJpBQGErwKIWsNj1byC76G4yhHJ5gVKFn3zZ47hEQj7aQRFTEtbWCEMTF2bixQ==", + "dependencies": { + "@toast-ui/editor": "^3.2.1" + }, + "peerDependencies": { + "react": "^17.0.1" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -3731,6 +3805,11 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", + "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" + }, "node_modules/@types/eslint": { "version": "8.4.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", @@ -3783,6 +3862,15 @@ "@types/node": "*" } }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -4551,6 +4639,39 @@ "@xtuc/long": "4.2.2" } }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5344,6 +5465,17 @@ "node": ">=8" } }, + "node_modules/block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==", + "dependencies": { + "inherits": "~2.0.0" + }, + "engines": { + "node": "0.4 || >=0.5.8" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -5678,6 +5810,11 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "node_modules/clean-css": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", @@ -5707,6 +5844,19 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -6713,6 +6863,11 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", + "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==" + }, "node_modules/domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", @@ -6829,6 +6984,17 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -7878,6 +8044,14 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "engines": { + "node": ">= 4.9.1" + } + }, "node_modules/fastq": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", @@ -7905,6 +8079,11 @@ "bser": "2.1.1" } }, + "node_modules/fetch-jsonp": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fetch-jsonp/-/fetch-jsonp-1.1.3.tgz", + "integrity": "sha512-2ed7S0QTDAgXJMbdyTlQfVL+od+9KREieXOlE71lJpWCoxGBHyxyCVAn9VqRbl0HkJ6lhmzCi08MM+NDBuJINg==" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -8319,6 +8498,31 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -9008,6 +9212,14 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -9231,6 +9443,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -9400,6 +9623,14 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -12367,6 +12598,11 @@ "node": ">= 0.8.0" } }, + "node_modules/orderedmap": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.0.tgz", + "integrity": "sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA==" + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -12415,6 +12651,11 @@ "node": ">=6" } }, + "node_modules/paginator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/paginator/-/paginator-1.0.0.tgz", + "integrity": "sha512-j2Y5AtF/NrXOEU9VVOQBGHnj81NveRQ/cDzySywqsWrAj+cxivMpMCkYJOds3ulQiDU4rQBWc0WoyyXMXOmuMA==" + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -13938,6 +14179,80 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/prosemirror-commands": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.0.tgz", + "integrity": "sha512-zL0Fxbj3fh71GPNHn5YdYgYGX2aU2XLecZYk2ekEF0oOD259HcXtM+96VjPVi5o3h4sGUdDfEEhGiREXW6U+4A==", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.0.tgz", + "integrity": "sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA==", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.2.0.tgz", + "integrity": "sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ==", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz", + "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.18.3.tgz", + "integrity": "sha512-yUVejauEY3F1r7PDy4UJKEGeIU+KFc71JQl5sNvG66CLVdKXRjhWpBW6KMeduGsmGOsw85f6EGrs6QxIKOVILA==", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.2.tgz", + "integrity": "sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ==", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.7.0.tgz", + "integrity": "sha512-O4T697Cqilw06Zvc3Wm+e237R6eZtJL/xGMliCi+Uo8VL6qHk6afz1qq0zNjT3eZMuYwnP8ZS0+YxX/tfcE9TQ==", + "dependencies": { + "prosemirror-model": "^1.0.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.29.1.tgz", + "integrity": "sha512-OhujVZSDsh0l0PyHNdfaBj6DBkbhYaCfbaxmTeFrMKd/eWS+G6IC+OAbmR9IsLC8Se1HSbphMaXnsXjupHL3UQ==", + "dependencies": { + "prosemirror-model": "^1.16.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -14113,6 +14428,29 @@ "node": ">=14" } }, + "node_modules/react-axios": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/react-axios/-/react-axios-2.0.6.tgz", + "integrity": "sha512-srQnLZXaW9LDJyC4/qvQ7aPi/rUpsggd3RIM5Q/vFLlQZ4l5bvPtqP/2+UeRXhJH75NfxbcPD3FkjiKONn5V8Q==", + "peerDependencies": { + "axios": "^0.27.2", + "prop-types": "^15.8.1", + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-cookie": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-4.1.1.tgz", + "integrity": "sha512-ffn7Y7G4bXiFbnE+dKhHhbP+b8I34mH9jqnm8Llhj89zF4nPxPutxHT1suUqMeCEhLDBI7InYwf1tpaSoK5w8A==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.0.1", + "hoist-non-react-statics": "^3.0.0", + "universal-cookie": "^4.0.0" + }, + "peerDependencies": { + "react": ">= 16.3.0" + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -14252,6 +14590,32 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-js-pagination": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/react-js-pagination/-/react-js-pagination-3.0.3.tgz", + "integrity": "sha512-podyA6Rd0uxc8uQakXWXxnonoOPI6NnFOROXfc6qPKNYm44s+Bgpn0JkyflcfbHf/GFKahnL8JN8rxBHZiBskg==", + "dependencies": { + "classnames": "^2.2.5", + "fstream": "1.0.12", + "paginator": "^1.0.0", + "prop-types": "15.x.x - 16.x.x", + "react": "15.x.x - 16.x.x", + "tar": "2.2.2" + } + }, + "node_modules/react-js-pagination/node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -14260,6 +14624,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.5.0.tgz", + "integrity": "sha512-fqqUSU0NC0tSX0sZbyuxzuAzvGqbjiZItBQnyicWlOUmzhAU8YuLgRbaCL2hf3sJdtRy4LP/WBrWtARkMvdGPQ==", + "dependencies": { + "@remix-run/router": "1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.5.0.tgz", + "integrity": "sha512-/XzRc5fq80gW1ctiIGilyKFZC/j4kfe75uivMsTChFbkvrK4ZrF3P3cGIc1f/SSkQ4JiJozPrf+AwUHHWVehVg==", + "dependencies": { + "@remix-run/router": "1.1.0", + "react-router": "6.5.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -14332,6 +14726,66 @@ } } }, + "node_modules/react-social-login": { + "version": "3.4.16", + "resolved": "https://registry.npmjs.org/react-social-login/-/react-social-login-3.4.16.tgz", + "integrity": "sha512-hhhMS/RTBr2R2ZKfX4U6nhJqOceVD4Vmh/9uxAoVGoY+FxieVTCyADmJK+TkMgHfVrat/hdZGsUCNYGbekjrqQ==", + "dependencies": { + "fetch-jsonp": "1.1.3", + "prop-types": "15.7.2", + "react": "^16 || ^17", + "uuid": "3.1.0", + "webpack-cli": "^4.10.0", + "whatwg-fetch": "2.0.3" + }, + "engines": { + "node": ">=6.9.4" + }, + "peerDependencies": { + "react": "^16 || ^17" + } + }, + "node_modules/react-social-login/node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/react-social-login/node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-social-login/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-social-login/node_modules/uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/react-social-login/node_modules/whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha512-SA2KdOXATOroD3EBUYvcdugsusXS5YiQFqwskSbsp5b1gK8HpNi/YP0jcy/BDpdllp305HMnrsVf9K7Be9GiEQ==" + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -14364,6 +14818,17 @@ "node": ">=8.10.0" } }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", @@ -14387,6 +14852,22 @@ "node": ">=8" } }, + "node_modules/redux": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", + "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -14529,6 +15010,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, + "node_modules/reselect": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", + "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -14728,6 +15214,11 @@ "node": ">=8" } }, + "node_modules/rope-sequence": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.3.tgz", + "integrity": "sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -15038,6 +15529,17 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -15659,6 +16161,17 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.", + "dependencies": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -15967,19 +16480,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -16041,9 +16541,26 @@ "node": ">=8" } }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "node_modules/universal-cookie": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz", + "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==", + "dependencies": { + "@types/cookie": "^0.3.3", + "cookie": "^0.4.0" + } + }, + "node_modules/universal-cookie/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { "node": ">= 10.0.0" @@ -16183,6 +16700,11 @@ "browser-process-hrtime": "^1.0.0" } }, + "node_modules/w3c-keyname": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", + "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" + }, "node_modules/w3c-xmlserializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", @@ -16281,6 +16803,60 @@ } } }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, "node_modules/webpack-dev-middleware": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", @@ -16510,6 +17086,18 @@ "node": ">=10.13.0" } }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -16668,6 +17256,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -18487,14 +19080,17 @@ "@csstools/postcss-unset-value": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "requires": {} + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==" }, "@csstools/selector-specificity": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "requires": {} + "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==" + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" }, "@emotion/is-prop-valid": { "version": "1.2.0", @@ -19207,6 +19803,22 @@ "source-map": "^0.7.3" } }, + "@reduxjs/toolkit": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.1.tgz", + "integrity": "sha512-HikrdY+IDgRfRYlCTGUQaiCxxDDgM1mQrRbZ6S1HFZX5ZYuJ4o8EstNmhTwHdPl2rTmLxzwSu0b3AyeyTlR+RA==", + "requires": { + "immer": "^9.0.16", + "redux": "^4.2.0", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.7" + } + }, + "@remix-run/router": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.1.0.tgz", + "integrity": "sha512-rGl+jH/7x1KBCQScz9p54p0dtPLNeKGb3e0wD2H5/oZj41bwQUnXdzbj2TbUAFhvD7cp9EyEQA4dEgpUFa1O7Q==" + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -19556,6 +20168,29 @@ "@babel/runtime": "^7.12.5" } }, + "@toast-ui/editor": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@toast-ui/editor/-/editor-3.2.1.tgz", + "integrity": "sha512-05nKfqK2n/6Mq8WpO1E7OnOjlhiFfxr1G2i/DpG/pFjKlY3E7uOtSAyuz7rybKWHgUzXRzRGv7MqDL6lXfqnWg==", + "requires": { + "dompurify": "^2.3.3", + "prosemirror-commands": "^1.1.9", + "prosemirror-history": "^1.1.3", + "prosemirror-inputrules": "^1.1.3", + "prosemirror-keymap": "^1.1.4", + "prosemirror-model": "^1.14.1", + "prosemirror-state": "^1.3.4", + "prosemirror-view": "^1.18.7" + } + }, + "@toast-ui/react-editor": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@toast-ui/react-editor/-/react-editor-3.2.2.tgz", + "integrity": "sha512-lbqRUcSJ9f3HO/MG7cjXmDmoBJpBQGErwKIWsNj1byC76G4yhHJ5gVKFn3zZ47hEQj7aQRFTEtbWCEMTF2bixQ==", + "requires": { + "@toast-ui/editor": "^3.2.1" + } + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -19642,6 +20277,11 @@ "@types/node": "*" } }, + "@types/cookie": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", + "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" + }, "@types/eslint": { "version": "8.4.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", @@ -19694,6 +20334,15 @@ "@types/node": "*" } }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -20306,6 +20955,24 @@ "@xtuc/long": "4.2.2" } }, + "@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==" + }, + "@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==" + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -20354,14 +21021,12 @@ "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "requires": {} + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" }, "acorn-node": { "version": "1.8.2", @@ -20447,8 +21112,7 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "ansi-escapes": { "version": "4.3.2", @@ -20747,8 +21411,7 @@ "babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "requires": {} + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" }, "babel-plugin-polyfill-corejs2": { "version": "0.3.3", @@ -20888,6 +21551,14 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==", + "requires": { + "inherits": "~2.0.0" + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -21131,6 +21802,11 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "clean-css": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", @@ -21156,6 +21832,16 @@ "wrap-ansi": "^7.0.0" } }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -21378,8 +22064,7 @@ "css-declaration-sorter": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", - "requires": {} + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==" }, "css-has-pseudo": { "version": "3.0.4", @@ -21462,8 +22147,7 @@ "css-prefers-color-scheme": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "requires": {} + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==" }, "css-select": { "version": "4.3.0", @@ -21577,8 +22261,7 @@ "cssnano-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "requires": {} + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" }, "csso": { "version": "4.2.0", @@ -21887,6 +22570,11 @@ "domelementtype": "^2.2.0" } }, + "dompurify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", + "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==" + }, "domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", @@ -21973,6 +22661,11 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -22458,8 +23151,7 @@ "eslint-plugin-react-hooks": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "requires": {} + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==" }, "eslint-plugin-testing-library": { "version": "5.9.1", @@ -22758,6 +23450,11 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==" + }, "fastq": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", @@ -22782,6 +23479,11 @@ "bser": "2.1.1" } }, + "fetch-jsonp": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fetch-jsonp/-/fetch-jsonp-1.1.3.tgz", + "integrity": "sha512-2ed7S0QTDAgXJMbdyTlQfVL+od+9KREieXOlE71lJpWCoxGBHyxyCVAn9VqRbl0HkJ6lhmzCi08MM+NDBuJINg==" + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -23067,6 +23769,27 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -23478,8 +24201,7 @@ "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" }, "idb": { "version": "7.1.1", @@ -23568,6 +24290,11 @@ "side-channel": "^1.0.4" } }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" + }, "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -23704,6 +24431,14 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, "is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -23819,6 +24554,11 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -24561,8 +25301,7 @@ "jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "requires": {} + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==" }, "jest-regex-util": { "version": "27.5.1", @@ -25984,6 +26723,11 @@ "word-wrap": "^1.2.3" } }, + "orderedmap": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.0.tgz", + "integrity": "sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA==" + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -26014,6 +26758,11 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "paginator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/paginator/-/paginator-1.0.0.tgz", + "integrity": "sha512-j2Y5AtF/NrXOEU9VVOQBGHnj81NveRQ/cDzySywqsWrAj+cxivMpMCkYJOds3ulQiDU4rQBWc0WoyyXMXOmuMA==" + }, "param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -26228,8 +26977,7 @@ "postcss-browser-comments": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "requires": {} + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" }, "postcss-calc": { "version": "8.2.4", @@ -26327,26 +27075,22 @@ "postcss-discard-comments": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "requires": {} + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==" }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "requires": {} + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "requires": {} + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "requires": {} + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" }, "postcss-double-position-gradients": { "version": "3.1.2", @@ -26368,8 +27112,7 @@ "postcss-flexbugs-fixes": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "requires": {} + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" }, "postcss-focus-visible": { "version": "6.0.4", @@ -26390,14 +27133,12 @@ "postcss-font-variant": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "requires": {} + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" }, "postcss-gap-properties": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "requires": {} + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==" }, "postcss-image-set-function": { "version": "4.0.7", @@ -26420,8 +27161,7 @@ "postcss-initial": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "requires": {} + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" }, "postcss-js": { "version": "4.0.0", @@ -26462,14 +27202,12 @@ "postcss-logical": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "requires": {} + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==" }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "requires": {} + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" }, "postcss-merge-longhand": { "version": "5.1.7", @@ -26530,8 +27268,7 @@ "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "requires": {} + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -26589,8 +27326,7 @@ "postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "requires": {} + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -26661,8 +27397,7 @@ "postcss-opacity-percentage": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", - "requires": {} + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==" }, "postcss-ordered-values": { "version": "5.1.3", @@ -26684,8 +27419,7 @@ "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "requires": {} + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" }, "postcss-place": { "version": "7.0.5", @@ -26779,8 +27513,7 @@ "postcss-replace-overflow-wrap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "requires": {} + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" }, "postcss-selector-not": { "version": "6.0.1", @@ -26936,6 +27669,80 @@ } } }, + "prosemirror-commands": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.0.tgz", + "integrity": "sha512-zL0Fxbj3fh71GPNHn5YdYgYGX2aU2XLecZYk2ekEF0oOD259HcXtM+96VjPVi5o3h4sGUdDfEEhGiREXW6U+4A==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-history": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.0.tgz", + "integrity": "sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA==", + "requires": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "rope-sequence": "^1.3.0" + } + }, + "prosemirror-inputrules": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.2.0.tgz", + "integrity": "sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ==", + "requires": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-keymap": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz", + "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==", + "requires": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "prosemirror-model": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.18.3.tgz", + "integrity": "sha512-yUVejauEY3F1r7PDy4UJKEGeIU+KFc71JQl5sNvG66CLVdKXRjhWpBW6KMeduGsmGOsw85f6EGrs6QxIKOVILA==", + "requires": { + "orderedmap": "^2.0.0" + } + }, + "prosemirror-state": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.2.tgz", + "integrity": "sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "prosemirror-transform": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.7.0.tgz", + "integrity": "sha512-O4T697Cqilw06Zvc3Wm+e237R6eZtJL/xGMliCi+Uo8VL6qHk6afz1qq0zNjT3eZMuYwnP8ZS0+YxX/tfcE9TQ==", + "requires": { + "prosemirror-model": "^1.0.0" + } + }, + "prosemirror-view": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.29.1.tgz", + "integrity": "sha512-OhujVZSDsh0l0PyHNdfaBj6DBkbhYaCfbaxmTeFrMKd/eWS+G6IC+OAbmR9IsLC8Se1HSbphMaXnsXjupHL3UQ==", + "requires": { + "prosemirror-model": "^1.16.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -27058,6 +27865,21 @@ "whatwg-fetch": "^3.6.2" } }, + "react-axios": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/react-axios/-/react-axios-2.0.6.tgz", + "integrity": "sha512-srQnLZXaW9LDJyC4/qvQ7aPi/rUpsggd3RIM5Q/vFLlQZ4l5bvPtqP/2+UeRXhJH75NfxbcPD3FkjiKONn5V8Q==" + }, + "react-cookie": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-4.1.1.tgz", + "integrity": "sha512-ffn7Y7G4bXiFbnE+dKhHhbP+b8I34mH9jqnm8Llhj89zF4nPxPutxHT1suUqMeCEhLDBI7InYwf1tpaSoK5w8A==", + "requires": { + "@types/hoist-non-react-statics": "^3.0.1", + "hoist-non-react-statics": "^3.0.0", + "universal-cookie": "^4.0.0" + } + }, "react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -27163,11 +27985,53 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "react-js-pagination": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/react-js-pagination/-/react-js-pagination-3.0.3.tgz", + "integrity": "sha512-podyA6Rd0uxc8uQakXWXxnonoOPI6NnFOROXfc6qPKNYm44s+Bgpn0JkyflcfbHf/GFKahnL8JN8rxBHZiBskg==", + "requires": { + "classnames": "^2.2.5", + "fstream": "1.0.12", + "paginator": "^1.0.0", + "prop-types": "15.x.x - 16.x.x", + "react": "15.x.x - 16.x.x", + "tar": "2.2.2" + }, + "dependencies": { + "react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + } + } + }, "react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" }, + "react-router": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.5.0.tgz", + "integrity": "sha512-fqqUSU0NC0tSX0sZbyuxzuAzvGqbjiZItBQnyicWlOUmzhAU8YuLgRbaCL2hf3sJdtRy4LP/WBrWtARkMvdGPQ==", + "requires": { + "@remix-run/router": "1.1.0" + } + }, + "react-router-dom": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.5.0.tgz", + "integrity": "sha512-/XzRc5fq80gW1ctiIGilyKFZC/j4kfe75uivMsTChFbkvrK4ZrF3P3cGIc1f/SSkQ4JiJozPrf+AwUHHWVehVg==", + "requires": { + "@remix-run/router": "1.1.0", + "react-router": "6.5.0" + } + }, "react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -27223,6 +28087,55 @@ "workbox-webpack-plugin": "^6.4.1" } }, + "react-social-login": { + "version": "3.4.16", + "resolved": "https://registry.npmjs.org/react-social-login/-/react-social-login-3.4.16.tgz", + "integrity": "sha512-hhhMS/RTBr2R2ZKfX4U6nhJqOceVD4Vmh/9uxAoVGoY+FxieVTCyADmJK+TkMgHfVrat/hdZGsUCNYGbekjrqQ==", + "requires": { + "fetch-jsonp": "1.1.3", + "prop-types": "15.7.2", + "react": "^16 || ^17", + "uuid": "3.1.0", + "webpack-cli": "^4.10.0", + "whatwg-fetch": "2.0.3" + }, + "dependencies": { + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha512-SA2KdOXATOroD3EBUYvcdugsusXS5YiQFqwskSbsp5b1gK8HpNi/YP0jcy/BDpdllp305HMnrsVf9K7Be9GiEQ==" + } + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -27249,6 +28162,14 @@ "picomatch": "^2.2.1" } }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "requires": { + "resolve": "^1.9.0" + } + }, "recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", @@ -27266,6 +28187,19 @@ "strip-indent": "^3.0.0" } }, + "redux": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", + "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==" + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -27377,6 +28311,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, + "reselect": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", + "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -27508,6 +28447,11 @@ } } }, + "rope-sequence": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.3.tgz", + "integrity": "sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==" + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -27728,6 +28672,14 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, "shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -28015,8 +28967,7 @@ "style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "requires": {} + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==" }, "styled-components": { "version": "5.3.6", @@ -28204,6 +29155,16 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -28426,12 +29387,6 @@ "is-typedarray": "^1.0.0" } }, - "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "peer": true - }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -28475,6 +29430,22 @@ "crypto-random-string": "^2.0.0" } }, + "universal-cookie": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz", + "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==", + "requires": { + "@types/cookie": "^0.3.3", + "cookie": "^0.4.0" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + } + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -28575,6 +29546,11 @@ "browser-process-hrtime": "^1.0.0" } }, + "w3c-keyname": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", + "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" + }, "w3c-xmlserializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", @@ -28670,6 +29646,32 @@ } } }, + "webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + } + } + }, "webpack-dev-middleware": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", @@ -28793,8 +29795,7 @@ "ws": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "requires": {} + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==" } } }, @@ -28823,6 +29824,15 @@ } } }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, "webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -28925,6 +29935,11 @@ "is-typed-array": "^1.1.10" } }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -29252,8 +30267,7 @@ "ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "requires": {} + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==" }, "xml-name-validator": { "version": "3.0.0", diff --git a/client/package.json b/client/package.json index a0e9245..11f3226 100644 --- a/client/package.json +++ b/client/package.json @@ -3,12 +3,21 @@ "version": "0.1.0", "private": true, "dependencies": { + "@reduxjs/toolkit": "^1.9.1", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "@toast-ui/editor": "^3.2.1", + "@toast-ui/react-editor": "^3.2.2", + "http-proxy-middleware": "^2.0.6", "react": "^18.2.0", + "react-axios": "^2.0.6", + "react-cookie": "^4.1.1", "react-dom": "^18.2.0", + "react-js-pagination": "^3.0.3", + "react-router-dom": "^6.5.0", "react-scripts": "5.0.1", + "react-social-login": "^3.4.16", "styled-components": "^5.3.6", "web-vitals": "^2.1.4" }, diff --git a/client/public/favicon.ico b/client/public/favicon.ico deleted file mode 100644 index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 zcma);c{J4h9>;%nil|2-o+rCuEF-(I%-F}ijC~o(k~HKAkr0)!FCj~d>`RtpD?8b; zXOC1OD!V*IsqUwzbMF1)-gEDD=A573Z-&G7^LoAC9|WO7Xc0Cx1g^Zu0u_SjAPB3vGa^W|sj)80f#V0@M_CAZTIO(t--xg= z!sii`1giyH7EKL_+Wi0ab<)&E_0KD!3Rp2^HNB*K2@PHCs4PWSA32*-^7d{9nH2_E zmC{C*N*)(vEF1_aMamw2A{ZH5aIDqiabnFdJ|y0%aS|64E$`s2ccV~3lR!u<){eS` z#^Mx6o(iP1Ix%4dv`t@!&Za-K@mTm#vadc{0aWDV*_%EiGK7qMC_(`exc>-$Gb9~W!w_^{*pYRm~G zBN{nA;cm^w$VWg1O^^<6vY`1XCD|s_zv*g*5&V#wv&s#h$xlUilPe4U@I&UXZbL z0)%9Uj&@yd03n;!7do+bfixH^FeZ-Ema}s;DQX2gY+7g0s(9;`8GyvPY1*vxiF&|w z>!vA~GA<~JUqH}d;DfBSi^IT*#lrzXl$fNpq0_T1tA+`A$1?(gLb?e#0>UELvljtQ zK+*74m0jn&)5yk8mLBv;=@}c{t0ztT<v;Avck$S6D`Z)^c0(jiwKhQsn|LDRY&w(Fmi91I7H6S;b0XM{e zXp0~(T@k_r-!jkLwd1_Vre^v$G4|kh4}=Gi?$AaJ)3I+^m|Zyj#*?Kp@w(lQdJZf4 z#|IJW5z+S^e9@(6hW6N~{pj8|NO*>1)E=%?nNUAkmv~OY&ZV;m-%?pQ_11)hAr0oAwILrlsGawpxx4D43J&K=n+p3WLnlDsQ$b(9+4 z?mO^hmV^F8MV{4Lx>(Q=aHhQ1){0d*(e&s%G=i5rq3;t{JC zmgbn5Nkl)t@fPH$v;af26lyhH!k+#}_&aBK4baYPbZy$5aFx4}ka&qxl z$=Rh$W;U)>-=S-0=?7FH9dUAd2(q#4TCAHky!$^~;Dz^j|8_wuKc*YzfdAht@Q&ror?91Dm!N03=4=O!a)I*0q~p0g$Fm$pmr$ zb;wD;STDIi$@M%y1>p&_>%?UP($15gou_ue1u0!4(%81;qcIW8NyxFEvXpiJ|H4wz z*mFT(qVx1FKufG11hByuX%lPk4t#WZ{>8ka2efjY`~;AL6vWyQKpJun2nRiZYDij$ zP>4jQXPaP$UC$yIVgGa)jDV;F0l^n(V=HMRB5)20V7&r$jmk{UUIe zVjKroK}JAbD>B`2cwNQ&GDLx8{pg`7hbA~grk|W6LgiZ`8y`{Iq0i>t!3p2}MS6S+ zO_ruKyAElt)rdS>CtF7j{&6rP-#c=7evGMt7B6`7HG|-(WL`bDUAjyn+k$mx$CH;q2Dz4x;cPP$hW=`pFfLO)!jaCL@V2+F)So3}vg|%O*^T1j>C2lx zsURO-zIJC$^$g2byVbRIo^w>UxK}74^TqUiRR#7s_X$e)$6iYG1(PcW7un-va-S&u zHk9-6Zn&>T==A)lM^D~bk{&rFzCi35>UR!ZjQkdSiNX*-;l4z9j*7|q`TBl~Au`5& z+c)*8?#-tgUR$Zd%Q3bs96w6k7q@#tUn`5rj+r@_sAVVLqco|6O{ILX&U-&-cbVa3 zY?ngHR@%l{;`ri%H*0EhBWrGjv!LE4db?HEWb5mu*t@{kv|XwK8?npOshmzf=vZA@ zVSN9sL~!sn?r(AK)Q7Jk2(|M67Uy3I{eRy z_l&Y@A>;vjkWN5I2xvFFTLX0i+`{qz7C_@bo`ZUzDugfq4+>a3?1v%)O+YTd6@Ul7 zAfLfm=nhZ`)P~&v90$&UcF+yXm9sq!qCx3^9gzIcO|Y(js^Fj)Rvq>nQAHI92ap=P z10A4@prk+AGWCb`2)dQYFuR$|H6iDE8p}9a?#nV2}LBCoCf(Xi2@szia7#gY>b|l!-U`c}@ zLdhvQjc!BdLJvYvzzzngnw51yRYCqh4}$oRCy-z|v3Hc*d|?^Wj=l~18*E~*cR_kU z{XsxM1i{V*4GujHQ3DBpl2w4FgFR48Nma@HPgnyKoIEY-MqmMeY=I<%oG~l!f<+FN z1ZY^;10j4M4#HYXP zw5eJpA_y(>uLQ~OucgxDLuf}fVs272FaMxhn4xnDGIyLXnw>Xsd^J8XhcWIwIoQ9} z%FoSJTAGW(SRGwJwb=@pY7r$uQRK3Zd~XbxU)ts!4XsJrCycrWSI?e!IqwqIR8+Jh zlRjZ`UO1I!BtJR_2~7AbkbSm%XQqxEPkz6BTGWx8e}nQ=w7bZ|eVP4?*Tb!$(R)iC z9)&%bS*u(lXqzitAN)Oo=&Ytn>%Hzjc<5liuPi>zC_nw;Z0AE3Y$Jao_Q90R-gl~5 z_xAb2J%eArrC1CN4G$}-zVvCqF1;H;abAu6G*+PDHSYFx@Tdbfox*uEd3}BUyYY-l zTfEsOqsi#f9^FoLO;ChK<554qkri&Av~SIM*{fEYRE?vH7pTAOmu2pz3X?Wn*!ROX ztd54huAk&mFBemMooL33RV-*1f0Q3_(7hl$<#*|WF9P!;r;4_+X~k~uKEqdzZ$5Al zV63XN@)j$FN#cCD;ek1R#l zv%pGrhB~KWgoCj%GT?%{@@o(AJGt*PG#l3i>lhmb_twKH^EYvacVY-6bsCl5*^~L0 zonm@lk2UvvTKr2RS%}T>^~EYqdL1q4nD%0n&Xqr^cK^`J5W;lRRB^R-O8b&HENO||mo0xaD+S=I8RTlIfVgqN@SXDr2&-)we--K7w= zJVU8?Z+7k9dy;s;^gDkQa`0nz6N{T?(A&Iz)2!DEecLyRa&FI!id#5Z7B*O2=PsR0 zEvc|8{NS^)!d)MDX(97Xw}m&kEO@5jqRaDZ!+%`wYOI<23q|&js`&o4xvjP7D_xv@ z5hEwpsp{HezI9!~6O{~)lLR@oF7?J7i>1|5a~UuoN=q&6N}EJPV_GD`&M*v8Y`^2j zKII*d_@Fi$+i*YEW+Hbzn{iQk~yP z>7N{S4)r*!NwQ`(qcN#8SRQsNK6>{)X12nbF`*7#ecO7I)Q$uZsV+xS4E7aUn+U(K baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/client/public/heart.ico b/client/public/heart.ico new file mode 100755 index 0000000000000000000000000000000000000000..779fe1b8b97d6b148a5b6c23e1db78779d6f6945 GIT binary patch literal 33061 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 literal 0 HcmV?d00001 diff --git a/client/public/index.html b/client/public/index.html old mode 100644 new mode 100755 index aa069f2..9e48fd6 --- a/client/public/index.html +++ b/client/public/index.html @@ -2,7 +2,7 @@ - + - React App + Stack Overflow diff --git a/client/public/logo192.png b/client/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/client/public/manifest.json b/client/public/manifest.json old mode 100644 new mode 100755 index 080d6c7..201f5da --- a/client/public/manifest.json +++ b/client/public/manifest.json @@ -1,21 +1,11 @@ { - "short_name": "React App", - "name": "Create React App Sample", + "short_name": "Stack Overflow", + "name": "Stack Overflow Clone Coding", "icons": [ { "src": "favicon.ico", "sizes": "64x64 32x32 24x24 16x16", "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" } ], "start_url": ".", diff --git a/client/src/App.js b/client/src/App.js old mode 100644 new mode 100755 index 3185a93..23e626c --- a/client/src/App.js +++ b/client/src/App.js @@ -1,6 +1,15 @@ -import React from 'react'; -import { createGlobalStyle } from 'styled-components'; -import StackHeader from './components/StackHeader'; +import { useState, useEffect } from "react"; +import styled from "styled-components"; +import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; +import { createGlobalStyle } from "styled-components"; +import Header from "./components/Header"; +import Main from "./Main"; +import Signup from "./pages/Signup"; +import Login from "./pages/Login"; +import Logout from "./pages/Logout"; +import Ask from "./pages/Ask"; +import Home from "./pages/Home"; +import NotFound from "./pages/NotFound"; // CSS 초기화 const GlobalStyle = createGlobalStyle` @@ -10,14 +19,49 @@ const GlobalStyle = createGlobalStyle` box-sizing: border-box; list-style: none; text-decoration: none; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } -` +`; +const SectionWrap = styled.div` + width: 100%; + padding-top: 53px; +`; function App() { + const [isLogin, setIsLogin] = useState(false); + + useEffect(() => { + !!sessionStorage.getItem("accessToken") + ? setIsLogin(true) + : setIsLogin(false); + }, []); + return ( <> - - + + +
+ + + } + /> + : } + /> + : } /> + : } + /> + : } /> + } /> + } /> + + + ); } diff --git a/client/src/Main.js b/client/src/Main.js new file mode 100755 index 0000000..7268308 --- /dev/null +++ b/client/src/Main.js @@ -0,0 +1,55 @@ +import React from "react"; +import styled from "styled-components"; +import { Routes, Route } from "react-router-dom"; +import Question from "./pages/Question"; +import Questions from "./pages/Questions"; +import EditAnswer from "./pages/EditAnswer"; +import EditQuestion from "./pages/EditQuestion"; +import Footer from "./components/Footer"; +import LeftSideBar from "./components/LeftSideBar"; +import NotFound from "./pages/NotFound"; + +const SectionWrap = styled.div` + display: flex; + justify-content: center; + width: 100%; +`; + +const SectionContainer = styled.div` + display: flex; + width: 1264px; + min-width: 1264px; + min-height: 950px; + overflow: auto; +`; + +const Main = ({ isLogin }) => { + return ( + <> + + + + + } /> + } + /> + : } + /> + : } + /> + } /> + + + +