From b2610aa02eb7e44e810a81ac09404e86993c86f2 Mon Sep 17 00:00:00 2001 From: chamysj Date: Sun, 9 Nov 2025 04:03:27 +0900 Subject: [PATCH 01/17] =?UTF-8?q?Revert=20"=EC=B5=9C=EB=AF=BC=EC=88=98=20s?= =?UTF-8?q?print3"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 9 - .github/PULL_REQUEST_TEMPLATE.md | 100 +- ...0-17 \354\230\244\355\233\204 1.34.51.png" | Bin 190610 -> 0 bytes ...0-17 \354\230\244\355\233\204 1.35.25.png" | Bin 49215 -> 0 bytes ...17 \354\230\244\355\233\204 1.36.25-1.png" | Bin 325336 -> 0 bytes ...0-17 \354\230\244\355\233\204 1.36.25.png" | Bin 325336 -> 0 bytes .gitignore | 3 - .prettierrc | 9 - mission2/.gitignore | 4 - mission2/.prettierrc | 6 - mission2/Article.js | 23 - mission2/ArticleService.js | 92 - mission2/ElectronicProduct.js | 17 - mission2/ProductService.js | 119 -- mission2/main.js | 141 -- mission2/package-lock.json | 318 ---- mission2/package.json | 46 - mission2/product.js | 25 - mission2/readMe.md | 12 - mission3/.DS_Store | Bin 6148 -> 0 bytes mission3/.env.example | 8 - mission3/.gitignore | 4 - mission3/.prettierrc | 9 - mission3/package-lock.json | 1509 ----------------- mission3/package.json | 33 - mission3/src/.DS_Store | Bin 8196 -> 0 bytes mission3/src/controllers/articleController.js | 129 -- mission3/src/controllers/commentController.js | 67 - mission3/src/controllers/errorController.js | 14 - mission3/src/controllers/imageController.js | 5 - mission3/src/controllers/productController.js | 121 -- mission3/src/lib/asyncHandler.js | 9 - mission3/src/lib/constants.js | 7 - mission3/src/main.js | 29 - .../20251027092554_base_schema/migration.sql | 26 - .../20251028062500_alter_schema/migration.sql | 14 - .../migration.sql | 48 - .../migration.sql | 5 - .../src/prisma/migrations/migration_lock.toml | 3 - mission3/src/prisma/mock.js | 358 ---- mission3/src/prisma/schema.prisma | 72 - mission3/src/prisma/seed.js | 26 - mission3/src/routers/articleRouter.js | 22 - mission3/src/routers/commentRouter.js | 10 - mission3/src/routers/imageRouter.js | 11 - mission3/src/routers/productRouter.js | 22 - mission3/src/structs/articleStructs.js | 8 - mission3/src/structs/commentStructs.js | 17 - mission3/src/structs/productStructs.js | 17 - package-lock.json | 1499 ---------------- package.json | 32 - src/controllers/articleController.js | 18 - src/controllers/productController.js | 21 - src/lib/asyncHandler.js | 9 - src/lib/constants.js | 0 src/lib/prismaClient.js | 0 src/main.js | 43 - .../20251027092554_base_schema/migration.sql | 26 - .../20251028062500_alter_schema/migration.sql | 14 - .../migrations/migration_lock.toml | 3 - src/models_Schema/mock.js | 358 ---- src/models_Schema/schema.prisma | 42 - src/models_Schema/seed.js | 28 - src/structs/articleStructs.js | 9 - src/structs/productStructs.js | 14 - 65 files changed, 12 insertions(+), 5631 deletions(-) delete mode 100644 .env delete mode 100644 ".github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.34.51.png" delete mode 100644 ".github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.35.25.png" delete mode 100644 ".github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.36.25-1.png" delete mode 100644 ".github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.36.25.png" delete mode 100644 .gitignore delete mode 100644 .prettierrc delete mode 100644 mission2/.gitignore delete mode 100644 mission2/.prettierrc delete mode 100644 mission2/Article.js delete mode 100644 mission2/ArticleService.js delete mode 100644 mission2/ElectronicProduct.js delete mode 100644 mission2/ProductService.js delete mode 100644 mission2/main.js delete mode 100644 mission2/package-lock.json delete mode 100644 mission2/package.json delete mode 100644 mission2/product.js delete mode 100644 mission2/readMe.md delete mode 100644 mission3/.DS_Store delete mode 100644 mission3/.env.example delete mode 100644 mission3/.gitignore delete mode 100644 mission3/.prettierrc delete mode 100644 mission3/package-lock.json delete mode 100644 mission3/package.json delete mode 100644 mission3/src/.DS_Store delete mode 100644 mission3/src/controllers/articleController.js delete mode 100644 mission3/src/controllers/commentController.js delete mode 100644 mission3/src/controllers/errorController.js delete mode 100644 mission3/src/controllers/imageController.js delete mode 100644 mission3/src/controllers/productController.js delete mode 100644 mission3/src/lib/asyncHandler.js delete mode 100644 mission3/src/lib/constants.js delete mode 100644 mission3/src/main.js delete mode 100644 mission3/src/prisma/migrations/20251027092554_base_schema/migration.sql delete mode 100644 mission3/src/prisma/migrations/20251028062500_alter_schema/migration.sql delete mode 100644 mission3/src/prisma/migrations/20251031044353_add_model_nickname_and_comments/migration.sql delete mode 100644 mission3/src/prisma/migrations/20251031080723_add_nickname_text/migration.sql delete mode 100644 mission3/src/prisma/migrations/migration_lock.toml delete mode 100644 mission3/src/prisma/mock.js delete mode 100644 mission3/src/prisma/schema.prisma delete mode 100644 mission3/src/prisma/seed.js delete mode 100644 mission3/src/routers/articleRouter.js delete mode 100644 mission3/src/routers/commentRouter.js delete mode 100644 mission3/src/routers/imageRouter.js delete mode 100644 mission3/src/routers/productRouter.js delete mode 100644 mission3/src/structs/articleStructs.js delete mode 100644 mission3/src/structs/commentStructs.js delete mode 100644 mission3/src/structs/productStructs.js delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 src/controllers/articleController.js delete mode 100644 src/controllers/productController.js delete mode 100644 src/lib/asyncHandler.js delete mode 100644 src/lib/constants.js delete mode 100644 src/lib/prismaClient.js delete mode 100644 src/main.js delete mode 100644 src/models_Schema/migrations/20251027092554_base_schema/migration.sql delete mode 100644 src/models_Schema/migrations/20251028062500_alter_schema/migration.sql delete mode 100644 src/models_Schema/migrations/migration_lock.toml delete mode 100644 src/models_Schema/mock.js delete mode 100644 src/models_Schema/schema.prisma delete mode 100644 src/models_Schema/seed.js delete mode 100644 src/structs/articleStructs.js delete mode 100644 src/structs/productStructs.js diff --git a/.env b/.env deleted file mode 100644 index 1905fc829..000000000 --- a/.env +++ /dev/null @@ -1,9 +0,0 @@ -# Environment variables declared in this file are automatically made available to Prisma. -# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema - -# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. -# See the documentation for all the connection string options: https://pris.ly/d/connection-strings - -DATABASE_URL="postgresql://apple:password@localhost:5432/mission?schema=public" - -PORT=3000 \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4ed8a24dc..ec85f6f1a 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,97 +1,21 @@ -# 요구사항 -### 클래스 구현하기 +## 요구사항 -- [x] class 키워드를 이용해서 Product 클래스와 ElectronicProduct 클래스를 만들어 주세요. - - [x] Product 클래스는 name(상품명) description(상품 설명), price(판매 가격), tags(해시태그 배열), images(이미지 배열), - favoriteCount (찜하기 수)프로퍼티를 가집니다. - - [x] Product 클래스는 favorite 메소드를 가집니다. favorite 메소드가 호출될 경우 찜하기 수가 1 증가합니다. - - [x] ElectronicProduct 클래스는 Product를 상속하며, 추가로 manufacturer(제조사) 프로퍼티를 가집니다. -- [x] class 키워드를 이용해서 Article 클래스를 만들어 주세요. - - [x] Article 클래스는 title(제목), content(내용), writer(작성자), likeCount(좋아요 수) 프로퍼티를 가집니다. - - [x] Article 클래스는 like 메소드를 가집니다. like 메소드가 호출될 경우 좋아요 수가 1 증가합니다. - - [x] 각 클래스 마다 constructor를 작성해 주세요. - - [x] 추상화/캡슐화/상속/다형성을 고려하여 코드를 작성해 주세요. +### 기본 +- [x] 기본 항목 1 +- [ ] 기본 항목 2 -### Article 요청 함수 구현하기 - -- [x] https://panda-market-api-crud.vercel.app/docs 의 Article API를 이용하여 아래 함수들을 구현해 주세요. - - [x] getArticleList() : GET 메소드를 사용해 주세요. - - [x] page, pageSize, keyword 쿼리 파라미터를 이용해 주세요. - - [x] getArticle() : GET 메소드를 사용해 주세요. - - [x] createArticle() : POST 메소드를 사용해 주세요. - - [x] request body에 title, content, image 를 포함해 주세요. - - [x] patchArticle() : PATCH 메소드를 사용해 주세요. - - [x] deleteArticle() : DELETE 메소드를 사용해 주세요. -- [x] fetch 혹은 axios를 이용해 주세요. - - [x] 응답의 상태 코드가 2XX가 아닐 경우, 에러 메시지를 콘솔에 출력해 주세요. -- [x] .then() 메소드를 이용하여 비동기 처리를 해주세요. -- [x] .catch() 를 이용하여 오류 처리를 해주세요. - -### Product 요청 함수 구현하기 - -- [x] https://panda-market-api-crud.vercel.app/docs 의 Product API를 이용하여 아래 함수들을 구현해 주세요. - - [x] getProductList() : GET 메소드를 사용해 주세요. - - [x] page, pageSize, keyword 쿼리 파라미터를 이용해 주세요. - - [x] getProduct() : GET 메소드를 사용해 주세요. - - [x] createProduct() : POST 메소드를 사용해 주세요. - - [x] request body에 name, description, price, tags, images 를 포함해 주세요. - - [x] patchProduct() : PATCH 메소드를 사용해 주세요. - - [x] deleteProduct() : DELETE 메소드를 사용해 주세요. -- [x] async/await 을 이용하여 비동기 처리를 해주세요. -- [x] try/catch 를 이용하여 오류 처리를 해주세요. -- [x] getProductList()를 통해서 받아온 상품 리스트를 각각 인스턴스로 만들어 products 배열에 저장해 주세요. - - [x] 해시태그에 "전자제품"이 포함되어 있는 상품들은 Product 클래스 대신 ElectronicProduct 클래스를 사용해 인스턴스를 생성해 주세요. - - [x] 나머지 상품들은 모두 Product 클래스를 사용해 인스턴스를 생성해 주세요. -- [x] 구현한 함수들을 아래와 같이 파일을 분리해 주세요. - - [x] export를 활용해 주세요. - - [x] ProductService.js 파일 Product API 관련 함수들을 작성해 주세요. - - [x] ArticleService.js 파일에 Article API 관련 함수들을 작성해 주세요. -- [x] 이외의 코드들은 모두 main.js 파일에 작성해 주세요. - - [x] import를 활용해 주세요. - - [x] 각 함수를 실행하는 코드를 작성하고, 제대로 동작하는지 확인해 주세요. - -### (심화)Article 요청 함수 구현하기 - -- [x] Article 클래스에 createdAt(생성일자) 프로퍼티를 만들어 주세요. - - [x] 새로운 객체가 생성되어 constructor가 호출될 시 createdAt에 현재 시간을 저장합니다 - ---- - -## Git과 Github 활용하기 - -- [x] README.md 파일을 작성해 주세요 - - [x] 마크다운 언어를 숙지하여 작성해 주세요. - - [x] 내용은 자유롭게 작성해 주세요. -- [x] 본인 브랜치(ex)홍길동)에 스프린트 미션을 업로드 해 주세요. -- [x] 적절한 커밋 메시지를 남겨 주세요. -- [x] N-Sprint-Mission 레포지토리를 fork 합니다. (e.g. 2기면 2-Sprint-Mission) -- [x] GitHub에 PR(Pull Request)을 생성해 upstream의 본인 브랜치(ex)홍길동)에 미션을 제출합니다. -- [x] PR 커멘트에 아래 내용들을 포함해 주세요. - - [x] 스프린트 미션 요구사항 체크리스트 - - [x] 체크리스트(- [ ]) 를 만듭니다. - - [x] 완료한 만큼 체크 표시 (- [x]) 를 해 주세요. - ---- +### 심화 +- [ ] 심화 항목 1 +- [ ] 심화 항목 2 ## 주요 변경사항 - -- Article 요청 함수는 axios를 활용해 만들었습니다. -- 코드를 작성하면서 잘 모르겠는 부분이나, 모범 답안을 참고하여 작성한 코드는 주석 처리하여 표기했습니다. -- 계속 코드를 수정하며 완료된 부분, 정돈된 부분들은 주석을 삭제하겠습니다. - ---- +- +- ## 스크린샷 - -### ![alt text](<스크린샷 2025-10-17 오후 1.34.51.png>) - -### ![alt text](<스크린샷 2025-10-17 오후 1.35.25.png>) - -### ![alt text](<스크린샷 2025-10-17 오후 1.36.25-1.png>) - ---- +![image](이미지url) ## 멘토에게 - -- 코드 작성하면서 잘 몰랐던 부분들이나 이해가 필요한 부분 등등, 특이사항은 주석처리하여 작성했습니다. 감사합니다. +- 셀프 코드 리뷰를 통해 질문 이어가겠습니다. +- diff --git "a/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.34.51.png" "b/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.34.51.png" deleted file mode 100644 index dbd19bdafbb4a775e7c53ed3913c82e2cb4ccda0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190610 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 z 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


y9k2=^?UT69Hc9ao>O9Ro(p3{bLBKJ)2OQOq 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
>#=H<6eEMxe$ke77d>~q=UOM@%U zATC~kCZ6Ufcx;DnL~U>dXtI1jez%TLft$HyBD7y@5A6}pUc0B}WKp-}&p$x97d+rU zHQv(A)2wd*6%co&C<=U|n;0j>Al6fXAAq3YLOrTQg(e)G!WNPB;qio}>-Q*kt0e_h zF9unz{q$`O7^wclNeE`1KbU7+Unu*y4odA0dn*CJMZt34iapxw_EiWEebOyb(MjY; zv*=5IB|^BnhK*v06*1~-3*`9nm()e=<6xlOi!CHkhhN0gXo|BA&D53#i$b*XPF>?{ zj@1qR&F3K{=>@d3T$J3bA>OFwy0!CPv4x|f{;_u}gT`y?`?bdUC7L_z7=OfWf6U&) zGUz7({f**dn0AH6D)e1Z|yM4WScJo)z{uO^227TEWvNZCjo)a|#Tpl06j) z)Sj{s|1?}L&rv3dajlvA^lVvj^)#gBJsl=WsvV`5WwfWBLz+PKw=E?y^K)S~ZTOqu9@Gn*-A3YB9?sMM(w6*5x`}7@{0RcD$ zg{j%r;b0MS;jA`W^*5IB-}(s@!D<<0mjg|6!ndX>9oI&p+ERI7*boQ-_^j>6uC}FF zolT?*#h?jaDxS5(SaW?s?$QvLlE_bYs?!d=}te~2kgQfOlYT_AyU&+&{E zKZPG-VM9_OG@CD?-Y?_|8H9<_tLJT*7q{=EG%aPP$oN~SF&Z^q~a zyt26QfJ^YHFsda-CguoAEGkC*2`MLZ8Bn%a&TB%^ZDcvxw{ts0eF$r8rNZz^>{oS= zcG>qR(!I8xRuoeuGLq{>a=B$yfI>-p^}EZ7rjI|!5hjB~9Cm`SlEOxn89~9%vkPBD z2y4vj=F#5+)JR#xzEOwkPlo3)@+{Jq6_EA`Be|S;=MJC%$YH{1Iom$Ju3hsF_-=+} zEE*}*Qz0qxP3CPMDBMNySw|JH24kDUii3Zf0q6{8>}VUaj`mzZ3n|bgoB_yNNu>ZP zcR)77f0E00(OL^Ur6rnbE)Ib1hU99^b0tRvD*<{ZHx1H>pAX*l#Qf4F7Qwl!P|mUl z(;Be~_qVQC5Ao<*(nYa!UfAz~m|qhQ|_HsXZ&bxna_|Lm|!u|9Ie zX(Ex!R*aYB%9Xqibiyw?++x|?{WIR#? zyFwhP6$4^J>b}McL}R_{ZA)V@#WDovB|Q80kcN2AI;KX(s%=(O->WEB=4c%(x!z~a z^Bv5%cu>gkg?x`_hQzA?P;4w~)*aX+jl6VV41+mMM489(AA0%2wdfXM3w$8okC1Oa zv9AKAY7#+@Gvv3t)<(LfcVZc1S+C9k|*;p@DuUpqjuCB%@mt;6-KnhGYg>nrk>ZgpQR=C!L{dpt#2sT z)MP>h#mZo+73U*!1S1??fh(R?(}}x*of+DIAVjLg?-N+XG78^lTRG_iZ2NXef994n zfw%E3GUdx{@!?BC6AX?*Q(hDOeyRcKpGLOt%%(e3;Vtg6F2dkG%q|o48BMe9?M&wz z%~$g@u7k#oiL;XjRl}+SFDFILtb#W%8G-|rFS}TQq`>_?bK$Jt6KYu_;;;o7{->*%+SpyBNB!eB*OLcRX%o3VF~P|8%0lu2 z1}@Khr}kP#9=#sjX&grd!MlawIOcOtYRQ0XC%ED+OCnW6t>aPG)^OQXFxS4>);>@K z&j9ktv8|{03G}e%NYwsI<(j%4lhk@ma&pldp#uP&G!*J)YFipfNHS#mmdz;^v=~XU zlKNDh%wijWv2t9fa6{BI+e;H$iM)=>?p_E4GVcI^IUB#-7j2zpn!1o4sIK7N-eqQM zt+(^};1JDD%|`MZRyBy3!*+z)U9yHI1lQ(=eF**B3#sseP6q^571FXH;QnQwm@e?U zjq<5dFQebg`5(z({b3;U0jS(!9m=PPY}Zv$FIAzZ;y@_GuWAGPw!APri_6}ViCXFk z-5QZUI?78@IK2Qic27FLOh+isJB=+Swp6NNOl~Q?KSZThR%7*U-Ts=bY*Od`=zVb?_NhVG|deZth2eq9uaTP2iVEAW4{~Pp3973Ty-Zs7k|XKhm7022OaEjuIj9Vq`YNMp<;$wkg%O3+BBMSMRfVDL|#aXO9tFP9vig_7-?OyhT3XV#<#hsVb-yImc&ly~puh~d3lnnG>|s|tKO>M$GMVb1#L z-P^QUUO*)tJdpTv9knnn{RY)S%ZT2-7^GX{NNr5sB(KBOkGfmoo?LFH&m61quszl5 zxHd)S=3edY4%^k~QP}l0q_*_qo+C1zsV$5x0>qZrR@OU^eKs2PXePifILWtb%~$XQ za6$OxM`-|lnlqU${dk|^Wx;_Lmig}1^ORv{mx$blDP;+vX49NjfDs)S>VaRgfJNb@ z2ev&4sb##d^gBBs4&EiOsV4yM&NG$fIRrOR=(FYAt}2Db0}`;H@v!rQq;|j7?gWkn#o6~sPKsxzH?sbS#-0fLMk<1E8!3l7%i!F)K#%c2UP1!UG^K8JB+9iUF@!yhkYEtRDfLw zh!|DZg3Y&Ev(LI=2oo55G}nF6v;try{h9KNGQoFET*=yIAAX_MQ9I{^;7f$)#yQf1 z2R87Bd6y4Z%J#z+kbwL5`Skj17gp{Wkjh@{Im^u^U@)+B-?97LV)CE{l5rlox3hY3_ET4nJq6hhc&>2x-41t0t7y?2IBIz>+GRw<>0(*chW1*B+> zZv-qvngpmS8}i(M+Jt@T2^M5SKNIMp;lh|uUCK<*Rx^5KW259uBc2YBy3aH#m44(r zXBo`ve+4|wwdF41DMJsdAt!&^%KlJu;_hP91^t1gwz|j+qh7%g%#uVlqyd0i*Or zdl|n9pGXiFDug$z¥M%~b>q|6wYx+w@-6U$P3HM2s7L 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 diff --git "a/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.35.25.png" "b/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.35.25.png" deleted file mode 100644 index 071c53457180116a6561b3a54b5c57a05cd443c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49215 zcmZTu1y~(Dv&NygAEY?N3kTQYTHM{?;O=h4y|`;}iWYY-?i6=-cev;K<^KP@-#$+^ z*<@ytolItTk~dsIP67py01*NL0!2zvR0#qCnh^p5k_Q0}TytRshXw(GEN3Aiq97$A zLaN|s2ePm>g@BL@Pf~~1Q2vdZt*t}`gCHvS^*|Oq9#ilu!snY9QaZ8^=wG8g2=&J> z{M=X)gBgkVsf4|ZIAkQE>td>S;!~5GUlDn1q`vkIqUD5sJ>xus_x*K$RA4`o_kNrR z;y~BClnpQkLn{BBDH7$*Ojb_LFy0dab`k>48X}%4PMUjaY7-)P^X`22mffFbc?9)q zrQhBALjEW0->?v*Q|QG=yMcURelQSrIFhE15a>VRICGMiRJUBvkB4%D&=+VNiVz#= z99j_dKh}rG?h3ykK-BW&FpaZH`i;M*#k}iYIpXv>Y4nz5e?kgZ9YDUm zqcIat#Vi+jQTtAe4_m_lLBoiPx+Dvj|yw^qUi#*uLp-$0m8Dw}YSaLYLO#UB`k zLN*?^BOZdbh;14cl*j?}GY{s<0ie|o_py_E7_7vNIV?u~+4QI~9cs!Xd!yCoI0#aD zuOp`pD3~6suM=$}^BJuH((`{XqU(c%-RhGJV<(MC-0urUSuDf_IZ%Y!m_%rpGT@?* zh<-QlOX63{CPRuKs;wGHKpTu9n!vm!554&DQt^PU`mMi#jh+82~xk-t99JZ6t z8)}RZ0R^R6vuzSjNha67?K$oJt}&;vB9~71#U%DQ(lIEh4ZrX5DzIs@2KLe3q3q@o z)56!eZCJjIC4+>Z@(O+(z6TNj1A(j1m5vJXwO}b#v%^O2$BT{C6JYi(=r7gH7w6oyQ z-g1(PaW2ApyqN9CFPqGH2^aqMNt0qt+`2lHguA9N2Z2vQB9BtDd>iE z{IW=rstze0_hN3MvU8qQ?}DpQ2yMcBB8mFO4XCS~H0bAHH2yGG;9CvG&|D5hc(FBY zg_uPW-B80HMd`8XXIHQ!I2L;r6Boypb$Cymc<+u3Wszl3V3~n->$vO((QDi>1Gc%6 z>k{hdA%I1Ph%xG zGBG%|f?&uuB^ka)6_TZe!6=em$9(bhrG<{1p6?1f)44`ZwsR2@ly3vExm5c zX{oZA(mHZ0GAq)2awnAhly?b|ls@0T{La7@+e)~S`cxQQxLRmjC|zhftzAp7`0Ydn zmAp9a(+;^KcXNz)qIdYqx0ir?shUD}rF#hf%*G?Lz&?xC$r}`&Hzryj{9D z+dqqF34P0Ui+Y=so}QkT9;y|Uu3;0e6}-g%tIqO%Zmra+e7V$VPI(UJhY%owVeCNiC@@1uO}l8l9dl zQU4-g0fuk~ji3XQfv!L~))tpAo_QX=EbAx7JU%T;EsQPUEp;yC&anrs%*;hN z34^1iKTU`Y^o%=5jM+k1#o0iMsUgfM18q};<@?3d)AV!8x|K6Q^S zF?3f9SywIUI+bxR^YwaXd1QFx1c!@#>*tH~jMPrXmToXj-h~@sO}4A3sQg}$ti`VR z<=1@Oo+dzRL3_O>Z}DMiw7#^V*+{zHbb0TOZ9}_x=u-2N>7weQZnebe>Pi1y#wqV0 z#(+muLR2}i+p5rNz_!AM!nyr={2|_%#?GIe2cx$Bhs4YB!5sYe#ou$Z3l^a>ryrKE zgsHJ*&C@Q5>$2*)nui~UMVI<=!;z>t7#&dD7Yw;X$uHVHOcW`B*{CSfWinGf37Jg=E7nA^@O&M@oPhnx^-``G5#cGQ+FSDQ_lUT-`t zV#jLNanEtiNRlj{K5@^l+fmfvy>7V<@4M$K+?nMo&()A=J#IUWgwbyi)h9STpsNvX>D>N;ntffU1z098%UyW{v$;N+GMrNksDWcnR zIQjO+qsD9t&tYc!XiIPKd9W&~Gs_?$SJGU%kh+L!o~lC%QBo^mmfhoJ=P_Y|nvgOw zAwyY`Hk_7M`KcI2PE+6q?;QIt%G)KC0q050j6wXO2JpA5wS58?2vLcVTT}R-*DOZLISqd}BA`IvI-zyBVt4bM$)=^!-eA zBDIa6&fnp~i%G0;8Huf&v6(5!ZW{TYf5&I08}b?7Mah-6*NZN(&p7QprTNqX7v;Fg zbLi~G7Xk#HP7w+FIU}B7`C(OI?aV%n^KfZfHJG?Qe{AI*+2f-{rh74DXFjHD9dam8a74JCi9tThMaQ>8ZS2WNg?S zNwa-5`LvMY`FZu}^IPS^a*QcfijB@)vx>%(begiJ$Kv2_;BKck=VoifIh>kF#ev3Q zgX0L@7TxbMt8yRpg^DRH<)*#OrLbSo#~R097hZq)K0P_@GVW?~Dsa+pIIDhBXS1vS z(`30lI9xGYuKK3x#ffjL)o?fl+T4@YeraH{W?#~3xP86fI=8b%TASCfQPu6pYHBxl z-X;p?9e?S1%X2O69?rHjsA;66tMd zA8j{%?&9z7FngZ4)8|EZ%{?W3Ht3B_7O>^%<5F1)V;i?Pu^P5KvXrwuWwNVyG__R#J%|{4OOir-{w3aH%W(OoVVRmbr_GUWPi641ddAET z_33d3e>~0DtbL*(`XS~Z!(Q*X73q1YNeM!A*dI|rXuv9!Quk97+$;h8^Rq@<> z^BB7Jef^j3`c2PXf2`lb>(m-&bJg>YlijYI5&gr?rQ4JdeVf;**L%JF_P2|oo65K4 zbhi^Xvo-2=zbnIeiRr-z`Gy=V{!pI|);LZe>F&rwP$v|g0P*mHAz%mw1^6rv09Xhs<_tOyeQ9C9)oOXBE4 z)AnMeltI*;UH>h>a#*wi~rPVCj{J3;1&6+Z!*l9FhhC`XBXB5D=jj5HSCukpt&{U2)*_7tcR)=>N!=IT(SAKyrRWQc_YrM-vc_lBoE<*uhU< z$jzOd?Rl7(+}zw4-B=mz9L<=Rxw*NSfGkWbET6#?pPf8xoekYT+d5JFQ^>#Nh?+VX zJ6hN~TiDr>{w3GY$j-(23px2;9sTe1&vBZ%Tl}XdTc>}$7Wf63{%T=jW&|?*uWT?Y z-(R&n3Ks6B)|#RgHej8B``~9~X5;$@{oh*t)8l_}YW#;H28SIhtBRCO|S6tS}b zcj?UkpXvHnxBuPvFGfD5zux@6H1SV0|DzVHXMRLJrvIHYenh+~4J+_8ezXvkR{`f> zBm2jd1-{dO(_c9_1+DGxvw_V_5JE~+NW~rUL>Jy0yC2|N{|#Fb>KlP1=?$@`Y8;hV zHCcob1I=Ab`#X+;AVU}_lo~oLOnl5u%*~pYECP%$%0-UdIQJfhmzUS?Pt9FkFGHu} za?5th-q*uBVKFfs;tWv`6kP~FsQ=C$n4!2+n;tIbHh(hzp9V0Qzo>sW(mKL_lmCNx z;~oL%aQQ6VM`Qwn2Py84Vep@fiqRYG|Mu{gpmmC_zW#G247a%dru_$JYLm%~S1zbr zV;Czgl7sP&#QucNXl)&hb}^S2_J<$s$FWo4(8WH}v6hVk3Tu=8&NEsoGmk zhr) z2YNaCd`(J$5v6M1Fk`cSWW9q{x#3`Ti;l)dCX+_g&BrQq`Md8xO}_k)!?K^a9nn=S z2#h_Quk(GJZ;x)fDi1y09K%AOM6M?1=+zIWAF*fdrW3-v=qVYh9`y9`k$$JpxDj9e zG}jE7JS!_*wo%uu7WG9O1_(+~k1Hzma4+vpe^>Mgn#gVu)W$uRm&Rc@nR1e>G!(JcWpXWp=VrzBk0KU!zY;hcI(#brd|r!vx(O0z6{Z21WXE$W zSz3wlk8H=!euuM{CL?WX@OI6e1UR%rLgmHhxw=*{3hlgf3eI!n^)A1Cmw%g#iY* z^xAO^46E|+969#fpav|=>=c4^=(Awb)tmooltpx6Umdvmfry3peQ8{ThekH*Ppen#(EA|u zaFLz;e(af3pI#-1zKar%_k#}!cXK|Lu$p0K#(OJx7aqxXMO$k2bvCi%fT%IUxw!W|c@cV{1u(IZ_lR&&1#R5U?=r4EN{Z%M>?L5wtkX)amZdt+oOID0*Dk zFm(ikfD;!`9jivKVEurNX^Dc0FS9YWAZ^M|1eRn;3AazfkhKnzHlaXlYTBf4v!6c?tXcY2SjLcorg(l zn1sCm2_`-~r`puA4k;}7z6!KjEMEnIRGSO)#^z%+(OT>$C~|ave`d3M$lZQo!tY$P zWghXyQ<%3W-CB`|Y^huWAG)(C`MsfDcBZGz6bwDM!G0tw78(d}}fosIup{wDw zw_KBzkrWLsH5%8K`EF1v3gCraM?}dlED}VCxVcJeMhR5SZ{s#xcxJxecVSEr!xz%A z^~*=yrAM#ev}&o;7isN-y%)8vG;&n>kRV8nMm^OLJt#{}d7>jQ6SF88MUxz>br)4Y zPpfXxV-{(hNUC&xdh68hWvY2}kJ!;kwkgzbG|eicY-lDd&SdP?s$mUTnl^c@Utm?r z_UxJ?fF3Pw^j+eE^U0GHs2Cq!e7k2CeNy*vsTFG0$Mqh6c0 zyW6@`-*S{pRcgjEX9PYdcj-E{kHq@qQWzob*> z;|zK00bY^cAd=~r+hs`ph6dxhD(eYAEg`}aNqMmOjgro~;)7BUpu6J-i2Ex~-*t6wlPWtF6P4hJ>4Xz)| zSn1!_sK$n}KG<^PzJ}s-c^LYzm<~B|HY-tUV*uEjGg=a@hHIsatRHjwyT(LyX1|qO z5^YDs_?J5xam1K=Z0t@kk7 z)d<5>#nLlCTr27QF$RGJMvq9=C$V=Tbp^w(yv=Dqjy?vzEp;Xj5Js9bn#9N#z)|+V_mT4sX|KGvImSqZ8T^2y~~opzY=D zow-(TcAzaI2lbq$(|3P7KT}U1x+fjQOIq}>-GtVDzH@A7LC{Y`>S_G+rO3#kawOt; z)UdY2ZkyR6IeI`{4r52`K~_sj95cly-)41X`VX3UW}^K5n6M7^CN!?=&sdDQinV*~ zt^5h|l7M0y4fpt@pNgXCC>{lt^<^_Bsf|Hcw_6R3#C+kYgIY{WL+ngw;8eVG;;ba zC8@UAyfv7#SFZ!a{ZTfVGeH%iVyp{IlA<2E3s%5ln{rC101&?9UC6W)H=u zEY_)Paz+rB)~y8COE+yiisSQnxeGAhcZR3CmQrPO`QwP{kA)B{i;?;_shLLqPJVt6 z{Dk1;>IO|cnnL@g`Jh`bE+C0{?&M|af zdK4+AlPteh_WiJ$wDm$jX&*wC1N7ihO8c>LWG?#akNz5`*Bj5aMYVMSzU#?~<#;V4 z2;^%cHv#~!%Yg@WTAkvrLh=?*;*plO2=fhtWS_#|2oBUWs7-eLjEcA(|Y6y)%>YVz~m@LwLc)$_A zS>4eSg%G!BQBso%;EgK`7X;!wwpOq<`Bth?Ivn2r~7KurPHA1 zP{trrk$VYs_-zmBFomgTGNjqdWQUz=P%GRM7yZOw|A<0ObC(&pCHJw0K#*oD-)fvs z?PMGI@Dt-Dyu5Oc&|oMgNwUZ?5ywthM%Xm;J9Mfsq|*koHdmlgZa)9UP^49WrdC}z zUYoiB{CRXPahn9#_XfAG@-Y8-JTBkmgmDOfZgv#Sz8~SSoGi^pLiV`Yi=T*K%DUDi zm~>5d#aL3jL{)gO4Bg>`7=IK`dm2MLgju`v7!-6FN3+s_8y%{$DtG9lt+WQA1C0Gn zPo5*13=B~8HS6rEvwSsn141Cv;Xb9F_;;l!hueNF#{vMhXhE-YJD--#ry!NS6w`?knVrAdaDLly@S z_Uk9C;(2=%5T|u2ERrR5jl83kaQ{51$@3asR9jYq?)#yvhu_d~N}m|Y9V9v@E>j_GZf(5$CvX`LGm?C`;B zr2GI#i<(;4Ou2%t+jV^2gO$T$va!pz-Y)#2WON;P?-Pg0+%YypI9Sp)`y#aPA$oZ9 z5;Q7wJpThKv!^a8lBis{Hjy#%aQtQEXP_4(a~0B|>c(lFxF- zRa_IveWa7@tM&GBU@o5JXrN~_OmKK)OvA0KXSj47e7UkoslCT*9yWxlV?!?Q;Q;kY+! z1QqhjNaj%IGvF^ADlYhLzkDGt`$J|@mv})=Hk&Vz`B9@4X*a@5z^`y$QW}H;w!UF% zrp+5nfH{Z35o|YsK-e_g7$T@w$bdA=2wIjhEH7fJzK*iDz^)Rrueo>Je}$vBQc!~?Yg7$Q^)Vf3s6Sh>Vh-hOwrN#Aoza_ zbc_gx2msXwQsM7Ogt?9rfN$bDKq_t8ft0U6p&(`*5YmgkgCTQ>u!&X}zJua1^yYKE z)m7B%+%Jy-gqnf2x3+V)K3HhuR6L;z@-A4`2v1E?BDAgn53j5`*{|DBG`j!GWF0vqA(gDJD5PAj14=2%6@8V8HI7aBR|538p zRu|i*o0yWyF2D3ry7QT>t{(L^&AP8Vdgc=p@VQ5_AVET%P*V;jX` zN`RpRuxAdG?)C4+Bj=PHrR*l5pa_%xX5ThINFs^_U4-z#KRuXNZDCDWcVK%B*(l1C)mWgtuYa`_ zlEgahO+*-LOG>&Z2Mim)gD{LUsJBovAv%xK?WsCx3L}U6{>`bY5G7kTQJclEu0pA^ zllhNgpy%8M^aTFem#^CeR~vx3!BhswH1+&!#jAKjS3V$WOfZPVwcyb z$GO62=GBbXQF2CienD)YMXpu;qPmlGq%V{WHlk-2bFH`Gi%_~U$z00lm< zT*PNT>5!yjaN(z35+$rw;?-7WlG;K=+ZmH-=8g(k%9O-Is*y0)m+?o?>9XuK=a$jQ zeZ8G}VJ#PM@A9_8b}8JAett(-kcPqmax=! zusb{cvzo8oFU;nB(ff>Lsl{JeGMaJ)nrf!ZL<^yokE1UMv*Pew8G%05u>h-ptQY~m zF?wj9g~6Mu`?aXTnW;jd!;9L@&YLV_&!+8lcyN2s=anZb@)L00Tv3-V?UnKvfR#GZ z1MvPJrimcBhY*5+dQ6%K142Xq6&o=g*9MXCEra_qJnv)8ozQdf(MSc)rMl^y$H6%< z*gIWq0_vQ(&{nS9K^S^C`)I6!=GqEBJ?m1B8*a9?OTuDW1FF*0RP0#G8!kr;y2AU7 z9c0O}$&Vk>n>P6AXxS(qK(sTmZBFwOtHuP~@`k2jIkL-=?l z9WF*r(dQ+@T|mJ?S`Wmdrg_(~_!TEmrA@+W7Q7S^-(((I_?SYymA}q}Q1|mG(9^)x zd(cmaR8S|szi9-^q5HN??7`qs82D4+c;S)Ip}SEf8vjz~C)T;pZO3(g^KvEh0$Mj+ z?rNZcPLKltiqJ3+s-tuWy1VZA{3c6jn+^-v&sl)KuKFP4#JBxey-&<66~VAkShTz5 zyMp0_Zk=g`g^urviM_(wr_7Ks(9epaUpz%{)M_51F^56$E+3f!c#M+NgUP~95M$rcQojhEg&_^Q`EKKCqR6}(1Qta0h>pq8 zCP0JtoX9}SUv?)CHlT~yT+cE$W(CP8*cgX(Fv)Ui@UoM-3K1qC^{U0O7#^fN$N|GJ zkh_&836uP37S0vJf4D;e2(#(+5wcy}?p|Gw)uDZP9|Q2`IkZ@vinX_(J|m4{`;fU; zl|Do6l=iZsZW)PVZb%0yoILsDVWqUEyFzy38qK=`C<4~~xjf3vS0fBLcbk-JHN6>nth`?Z#B9~M=4HiRbI@#nJUwtgVjR?2P z_A15>r02I2RX{s>2LoRqPABpX!$1anf`_W#XpM5dkxq*!{gr$Z@N*iKmOOp@ z?Dy7_*YEYP$W?{ej;?MwB4Bfsiue59q#!sd^~+v62$L2Xuq^xvUnMUFi`fHg3?di~&0cxyyjiqJhV5_|qnWSuL)( z){{SreRaJORhAN4n91IFxJ@D*glDQQRpNQ&J7wF`_7^N&R z@s$J#`6(Lw$xXC~nz9r3nN(cp3y9o33422SL&o@UK>8ht%>>9P$fd%5A(Hik*!w5c zgwi2^<7-+`Hwmm>zs9x){eR(+IYSe<|MmZIM%Io2ySUr;) zzmV%uG{$lLtj#%TTvIj|Jo3ejrg`dCmpTk57u7`Kx_?zT(pnu#@HM;4Gmtgb^)$?R z6c^fXC1W6*&0?V5>f3nANB%(4&Q$CG4PAkDZ>@$I*2&v}!TyM*10ma} zj(iJl>O@7DNo9`}vlLP1f$Kn0YNQ;p6+1ek)XT?SQG9P?A2RI}q?|$3m~c^c=EC|& z&(~^&$Nl18j=1Zn4pSpfjv3*RW^Bxmvu)ZaQaq}*ag*HS!nxG%HZm|JlYcC|3yy|j zI(!|-3pd&F0`H0tQK4^wd*6kXd>P5mh<2{cL; zVOC=n3Agey!VEct4H2Da9uPNt1Lgg-R*?4N;`?B4DKL@Xa9TD*!aDE-gxv$iup(od zGiv%}T0TY{CxzRL!qG(|>zRXUwM5&eW#?vZnMaOo()scF4N&V|fu$E}n6a5SmRCe; zxYriG;Llm~ffX=~J>nVd=-tLhNVOokgSqnxR)oj;55|(xqXgcy(M7v>s(IOS57^yW zb3Sb`8iYki8iOoNIE>E^+oE58Ex{YgRNZ~FlI}{xYueCcL4@p@8L01I=oEdp0V$6?m^AB(yTNll-oh9g4e?8NR-1QNx(( ziI$PHFjEnR1ZR!cWT;ChdU*}r(hD~G04*+R+Os1bks8;^K*g!l=Yz-!l5xg^UHbZf zBHUORR=^zF>eB`=Ooq$%x%?=M-#U`ULxhFb-}el=q~CUpf%sU6Ad9?J0aN#+Ap&QC zuwqc;py+WKd2W@8P-rA!9R5;5h&40GK(MfK71GotiaU>y+NXd-Ys6>3hM|Uw$0^KZ zvQf~Z2Q96eYZzQw+j`D<)uVzrA<$>7BtkqS?)MVXR3et*pGAF5&8Gm2?(Y94xQd2D zGh5#jzo!k;Mu1@1NAQ7xu!Y=)NjISGjIrpd>U{tEswR~1#hj+*lQ@45BKt6kof4% zMiEWl+#0i_H|2gwZ6u}3MmEy{4jqQYJ`-TvqQ5zIUYxUtzX)sU(y`OgiZ~rvxHd-1 zwE$hZLMOAjcChX-5R!`pAttRqA)XS#xX_VMxw#O|Fry1LM*$Z^w1JCA=mcU9f(Arn z^fly+WgqJkQguVmiC+d2*;Wh{aMKEMYSTvp51ics}APbG*fNX@UZ@d5WJCOgapx)t(yxC(W6UQN7 zh97};oG@KUA1MrDp6^op!uF@`a6d0*0`XrP zLzn~J4Xnh{_ z!ALA=0Is_gJIp^@vjxbW7e?qcF2M=?oGZ$liG@9W5|oCMMncE&*}~X{tavv4h-45o zgK=NN?(=F0gUmjxhk%^?uJ6% zII5$%Io{y#O`~~R0H><8Ax^JR*W(ewjM719Cyjn-W4J=#$G5|eTfem}bPyvEBpM?Y z+3A<9+HF^m-2YTFhB}<0?6-6VjPv(#0-iy}q2f#&2{$?V2T2gw~*NxKxqw%z>4^Js#Xdj?}yX2lJNm zwm*Tzf(9Sx1Gb$Un1>Xm^hdAC+)^9@#=wDi{f|+{Sqa@=XsnXAQ=tt5S<&soRr2IQ zK_7ZTt~B1E1It#O}8*?q}-8Fruk&-;quqs(6|!>c3bQpzj{s1hdWoFVQ9e~ zEWkG0phEsM1-B?2He$b#l98@zj;X%eeZAM45G&?lyN;Yu&E;?q7}88P4_zmsv%%s& zxz&;iD>)VG)mr)Nz1^~{We{Z?MHeDS;nLreH%TWP^+r#6=Ke11{Y5V^3Dix}Ny^w# zkUwV>jFQ?Ciz*2WkWEV$>*v8f&Vtrbjb-wi;nldl>;3uh%-e_J zhyY-Barw!iW`>bi?azg=xUe{P5Xn%42&333I$)HX6MKntJED^j=e02ik|>a}B<&u2 z;IpA!NPe1@m7z(HEiDOFmUoHxRow28X#dKu_mrQ2bqOf}OZDXwej-i_RIAywLh~>vo>{ zELPeJUrRW~a9dOdy>H9Ikf_8)anaeV;E%O6)5OWyShDp+LxT*GaTS4i!OU93f0}(k zK9Y9njeW2?`0LcH0d}|@w_)`r4c`K5kjYuo(j4)x7Z+0|!n|PXrEwmEJv2u`iHgF` z!Xk-{@ZV}L`jyr{wzG^rNMIu+DM~Y!!liw&{3TJTn=xp~`+H{APOWe{qP!*;AAfQg z90|zR)!7s|1PtJ9vtb-+#)XzU8leZd@L>VoBh3*7$W~48ZD<8l>N>VwVFN?MWf&BY z-$gCvQ^WQIa5d`V*$LKnd^`mN}j3Rk$&=SZP|P|yD|pp ziRCkoK)V#N#44f%Xz~|+&T8VG8|hz0YxQgf{}O5fLG9J6?Y84auKZyUA^3%(RE!`W z=AuP1Mw%et$S{1DM(A7z_~(mXgATi?)fMM4j?UPy_(Tr<2`e(4Rxt?c*ZJ6AYb1-! zIPN5x5<&KKC8wgG%0oG4_&9n%EUD(nMMCG|4GOY1F!uq$3)96;dlx$7;la2Fmx?9T zupe8Tpg5=phktYP&f(I z%t^Zaj~|^8P43F`jEbQ};CMsLF#1$S!0sue&0U^0!_&<)i5=$5jUF?=42lv3<7k6q z3+Zxq%j<|})24F;17IE})YJB%AwO^)Zww;ZXL{_51M(jcr@XNED+lG>iqS5x>u#>C zV^p;elF9wWPQh6A#m=u%roXKc>G3tXDK#qy-+_4~luGk&AJq4w75(_o8# z*xttYxx!4GYHcdmP+1y8NWsg<&?y-v11vldoazoz%03QAHo8_an(Z@BAz+dJ za%UbEl18#YU+YCMf?#D>IX?(u4kS8K>FbYJDQUR0+TG6IzXoN5kLXD^&E5~_R^yEH z_<94uI&68|Onq2TADKbMVdGHj(R|NTcz&dF3|qrDwaqL3;j(Nkm=}fwns%+?-KseP zpA4F2N6j{oe*B@iL)7ksbDWYG6XeRqNE3Q&tqw$I6-TVm#(k^>NBX0#)%Her!3L96 zp(3h5SgBE@Dn*=uG~8-(=>sj^LOL64h`%~G1M$Dsp;d6Y;9ZvqeSpINvRBh14cf5i zBFOki+7sOz7-S#y|C)XM%D3z0##bJWH2z%DB)5hzuNc@cqz-k;1`R}L|I$DmVpT8~ zsoBHMwm>+8e+WL>Y>!7Jhf?NYrwzHpAg|cuHutu}sd*6sR%Wy>H$Syp;RJUAWTG5$ zdJT#Bt6IWK2wFFn{li)01MNp9YgZ8n0Bu+-ON0GH*}z!155Y;01CeK<3qL)y3>I{W z-qN#w^!+eTL$F->k=_SaX26HXSx&RHb@~YYO}H##QtK1@9JMFwGZYz{R6Inl<^qNp zeH|Ak>%sh3&WzBFcs&3ap-QAS=w0bhV@cmWIJ-gl`PN|aY%D*fgOt(Yuz2oEYVwmp z(KZ;oa`C}#r1d)5{N4G>K0`65i;;rSp5(DC(NM-*U;pwOd1qCoxMep<-Q zVBMxxb2B{3u1(!E4k74pSb-8XM=wHKor zKm5gh=`@>`Zxx?xx{)JBJWz;nl#1ZCrk|sR7%$)Ya7X+ztp8h3J!vgfM>~+U4~BL$ znsi`;J)&tSNbjW?BPOOZ!OCyTB^@3ap%)MegMsgTOLoC5 zo~A@Z4%Hm#W;X{p3gOA>WTgs->E1_h&Cb?K9`KAgldCt)uwzI`d$!m3Oa{_)tK?1x zC5X0nYA_(9K3Dtc3%JGl4xKkJN2aK;B6%Y-H`UQ2*o3<<*~@qJ4gBm{#O{EzNKzi0 zh|rXJCTOp3NXT});Jmn76!x+Q&cPE}oI;-kc@hmvW3g69?;r&}A9m#ZXPJn3t}duy$i6{fPSnk4~)C(ou=i}S*) z9&=W))yAVatR_vIKpMGA)cQ6mOR2!T0x9Nwa`=EhVJN727-8_Zk`yAi(dti=74$Y3 zlW9~~vq+qZt6C<=+;NSYH0LwE9MkO)+58(D+@Y_y7 z|L{nC9k?@?zd?L8$iVUtiTDTpHU{4S2rNKn6Y|Q3{|n*;KUE8Z<>BynNBwOKFHn$F zjJ^)|O;~>e1{(x}<*H3_&3eC#5qT z(TVqS^f8UZL`7N0_J0pfumSug(hV&-hv(LB`C#awwGASzLZIUwCItoAv)Y?jF{+Kc z-|k{tNMfpu=_%dCmnhq_GtLO4ys6jxPY5K4ELYcs3CaGWucaT8 zXfi`FCv@_j?rrNvkB@^sMZ!*=OqohuPy;-6XGGXM#w}9V)(rnWQMPJeBUuqu@34F} zqbUO&tC+R9%p)wd8abBToFt>8V~Rs|8#?b!!}9n&H7%^7A$%xa)_YJ)UcQ?!U#fEs zTyS}C3W$qqQ>itjF}Qj{1g`RQR;%AV3ZD>NHkoW16Hb8JZah1u+|8gb-d@FqqV;V+xae4^B#`&7jfoWp5Z!Oo~uthJ|_DpZhK&) zNb?np(rpaWSDoB|7L1`x-*`K!Ef!M^hNRdJlr;25EA2_+l=^dd_N}k;31X##S+F~o z0Df*s<$bdlzu#>+BZ`+pe2EMQ$~sh-RE>fc|BHL?Lc;(r@=(AhiWZgUH#b_A22|Zv z&tT9^J3U4E&=t>&v`*~{3`-Ly&Y->BC;$gN-L{=d&Hd zlziq}Ud8OTJZHvB1R|~X*pZrJUhWd>nP)K0J5!joCMd>EpA1bbxl&~F6Wyek;`^Il zG3H&Qin%1P7i^<=M9VFSs6Vq@+6g$d?c*exU;2$`x!Ou9m=6EgF14P>x7ZJG?(t3% zCt5gH)xj$|RMG+|g)viBrQhs}jJJpOf}QXBe9g4-{%B#V)idbI$gzFNF;Y#B@C6j? zB!nIuB=?Uy=EeUg(bz58^3yCxAF z1lWqJjZ8nd^qB2hzX*jt9`-H-A-Frm{NCd4YBx!I5gQKkDh^@R)N{(rN!l4oi~Ks@ zl12Vittc)~G0}0e0>QC58r3dyKd`t=Yo6AxX&5Yqp+MMU8rs9mm4O_3^`Da|`YmgKBhnXH9yeP#cFR5` z85!ml=R=m$KMrwJ@_M3#oM(!QGJe|iC9*cl9JxKgy|h4}|9B?1L@3(e%xtN&#UhLP zb)Q=0k&!#s z>`aR<#&z^r({{n@z?cqQS2mfu)&epq%BmoO%TEYuUiM|QxysHUSNq2)7@yUVlzmd$ z4)WHQ^4GzfsfNaMJDyozq_c1yUznH~Ro|I66GyL>m*Wye>hzgj6qkABEj1dE*m+A% z>n&9}9?Tk?9SAOT*8dH13e%J98f}v~l5RMa<=wnR@GTQG-Pph{$T3}hsaO(46 zdp{nGn*05hzb<~clNsA^>~=2UagD=`E?_Bj|dre)#z(Adq4txl^!95euvj%8<} zvaU4Sl)UZT`oU(*G4I!JbIm(1Sh_d?fRzplf%(sze|~LAwJG9u`+oS|cNh({L}aQ8 zeD0Z`8syC<5=;Ca=FTxZlXYv*-5r}98y(y3*tTukw(X>2+qP{x>DYEMZ=dh%z0X`{ z{?0Y?H*c!ysZ~!c-D|A^l#HH-8I(0r7FMc zH~#!V;Q|_rkBH+4_YN!15+7C?aEZoj-|lBnR8s1-vF|a-%+k2zj8Jn5il!eE*k}?9 z7cQHsI2dH`obZi%YsqYLHNLzKyS}FkV<(&&Y%Oc})WxWWDb>cAcu}aNaxrrmEp~*d zjZ^QuCI*9JmhaNXLC)be{al%%)0IDOQQ#Azdjkrgh<5rb74I&W;S6!CC$GnAI_l+3 z7$UyKsg){mq-Idy$(YQOk6JoE2IYCcnqA+}$k_*b#^egvQst15!^`sv_4B=~LcD7- z%CXz_*n(fE0*iLv^9nGE?D|U9zX^lcCP5rO-CneDmFV=m)duYj5SIM>8vI~*ILYs@ z(|iBbQ*89R+w(p?HI;991m+|D{%E3nAqf%D%wokWDI=qZnUF$jtPkGpX%&w^h1x>w zKDDM;PKSFme6GKskdRD^oh&jImdKVDN2u55dn-!0dK0rkkrasP4^q;q`2Oq-Lg8J* z)|cA_Wh9fsNq@7YedqiBFl3CgBm03h7Wea`k3l5Cqn$SFfV&|c>DkYqR_)J$f*r<- z?5ZP%-zvR^W~+|E80Ncrf4Mi^k&%EG8kIFdo6|Wh%0dG##)mQJyXnvEOn(4kpf-=MKQ z1(dAT;=UB;=7Zje_>`>d?o7=lelmiYl&xY%p`QYo8-Z8&oZ?l>q_URYc7xSYr}$H0 z-iL*wK={9iS-Q!$qov@k9f(n8V2ca|v3%g3aL(~-WV5L-o{{;+>rW@Mc;mO;r(P0Q z9!g;sfbeTH(76J$@sjFkuq0?Q9dNO?So@Em^J5}m$tE;Tpr6N8I<>P2D++x!U@Aht z`y4>WRU1=Pyxnuv>^D0@C6tOe1{%R)1cw_-&#u$B5u_s%+RikXvtAlaMJ61040FEg zuRm5!`Ii%6d$-@)qB9<$>*6RWH9igD-kKaupJL<>58J#vA3EnVAKvUEpDbU)nDQ02 zg7pIR61mWCcz?Ph<6gF+j94};AQ~Kyo^PI;jh2iSk(4eMmL!r&S7JGQ>?)Sd%)Ack zI5WcK`Bo*zXr{LOhUU8E9Sn+Elw4D?;uMDKY*+5-?)vMoeId-o2fX5fr{blOCU|Nc z>{5leDqNY&lCOiQV0CK~S)aTYLzh~FV6Bt>ILz6hq_Q1>;|(UubG_cXFWvbPdG5s? zw>US;CtExytD*aotMfiM5M$mRT#EB0i&fGwY9J=)N*^y#by&=4oOJyqylQV7_S_60 zcBcJ$L+QL7>{EAu8g<*oNu1-^ydXHZ?CRb90w>EwRmlt_@K71OWwwV5EUN_5%)wlb6elweg<2{n?1c4-V>gADr;q+p~FQ zaFNuz#8drm1cM)fPtEPS5>0KfIJ>o;LWV2jIeW<^t}K@gsIr2$(>y#0@s4k8&sbbn zyIO4Pe|d5-XmnvH zRz6Gx+`~4Ft1~XST1hCQa{6^Be|#Z*F|#d|@k85M9#9u~(Wjezlp9-v zWpZ=9$32UwlW`#%pQcT7)y%P>YDFd4eCSxGqP)pi#7?Q{b6Gka-yB$E7R>#wp>pXKP+(v1kd*8!P7&1@I%_`5m&I>x8A31EpEF2(+pSBycmkB%9tU3VxXii`3DGl9a3G)u6V zk*E6Z6dF!2e&Hbt?^?+_HD!Rrfg1HacHS#-joo&I{9>wOjHJaO&*s@pq3m{zej?(j z#Xt(M%lieV%!^7ADViX=P=*Y?+_0FV2w%4EO>30iEcGK^L6F3ojHj&J9cDo()*f5C zg^Vp8CmOKs)g4yKRkXE}csDIV6Bj}^gZ2KJ`&f0a8+)TP#G#b{(VVA-0?vjsFB_l+(!9>sSq<#2 zRTY!(rZVfTjmw-JY>* z9@f^EMl7A>$LQ{b29X43t~-)$@ujR@zKE)(+?Be8gqP%5~^quY1X za}DyKG6MffM+~EY8<5%ZvhI+d|4RCKu1Oc#IQg;(Qm;Wku2Q!25n~F-c9Vax^Qj&! zIB|kM?GY$5IHvfT1(B!oWmRoHQX3wNb&SHE`l-G9ae&kmdpZwCy6$eU(WB#XB3tX( zqWXW@Hvu|QRlJn_^yLZxDNCT9yI~Tw#PHx!GVP8c@rT=stWG3_X|Jx zn}>qRZvfY-wi3VGgth0^zoU8AIJW=;J1i)aESt-8X8w*aAO?9WC0s%%jChn2jKzw6 zDhg+t`r%2L7z&x7$n0s;wuAwlDbmh;MJt(de9~udX72XrI9EeRLOoXjx582)ZoQ`Q z>u(WA{SiUQ;x!1l>^XDjQiSvcawi<1b(lY(&~1Y|*7R3MxE4GV|Ki0>r39bIMuA^K zO6W~XcMXg;jFS+^+S8+QArwtvaC5zjXu#C>*g7nOFNHFx=3^HV*_}#~ZRJHuB~ejzW| z@#C=x?zn$akzQH}DOniz{HJCcyTmO9tE{h1q2MH6ByOc;}jpoKX;y8uu;=(Y?=Q@ zVfm&b`%)59GhMhTR@TFwO%PZzxjDe^qf#{Ux8qa0iRjlIN!IdRgF(sa@rr5cC^6T4 zb`%~M0`yN9bT$>`WV7`?a))Y5q^gHW>Q5^Vs!jN0u?lxthYbz`)C0I<;w5z1cQUmS zx`p;vrj}FjT|Ys#vPN&EMf2~(u)n1%%JN?Fy%3@>bW8A?gDy~76rLly07|PDabNjO z4#-36uUPeRUwiqQnR zyk*r6K0RN^+)nK;B{~vHRC`O1&6W+@&YkAsZ9k^=i&YG8w0!8f@a$CoEjUb^KY~-~ z1A%>jPcg4ZzbbJ!3Sw}NRd&;}hGgV>=2;(0;*-AZqbA3o#i}PmAt9B_0b2 zW2nkN;%;1^m$y|ue}1<3j3?(63@ zHigN17EmS;b^cF?QvBRFP0sXf4Ie~92eOTA>eA`n9bBLr|ErZl=^mE8UruAxwj#yP*S;;fhw|ZQr}hnJO?|JL|$#B{fD9$fy}nJq^48(K-n~ zn)Q0~km37xW8(o(lz_99x(W$)PxjPJPiJ6!9wOt(42Ll)rhpPZ@Q|0oi!4 zfvm2N6JZV~to&HQqA>b4Lpu=>t=7xVH3M`a9m`~D%}u}e^9hbJGv5ks8!(zR9Iu8v_n5WIvrXeZqv){7)#1&sb&gy$y|4Og=o&f@V zfIUG?3y1GjnbCv*^;78r@#Ae|HzJ}IvV=gPYIobOW#AdrAN1^Dk#45E3vtkN=z`9t z!G4ZgGcf>c_2M>#bEh~3UG-3}D3LWzPZL0#k&C7Gp0Sm&^!5E)Pj5HYPS`-y`U4X{ zfQ(5PcSkg+V1nuJ@IT;H>tSpU;iL7Nv((z(%EVps`N#QC(>39QFXp`wR?%ZS6Xp?P zueRk2fFISQW;zk~zGa9^neF;U3Sd>MTz?)%!b@iw0bq(ELRZ9v=Fee=lU4PnhCRa+H^1c@w<^tVZNc zOpdBA%2$Mp`7|0g5St7wnnhza_g;2BxOy;~(O?aB=d_RK_H?btvBsMm8`N55Q|LG( z*x6p|EIYC?Ct7vfrRNES!|*+oPs5G=Db5Ggh5d=DqE5`yUcOj7GqE5)nGD}b*`#0CQpU5mx22g&Ubb8R>K-GvHS4X z;`Iu+uzNj>Hh2hzT|~`G*wXn@#OgxGMWq=KD4{{-7M_Lo;08CPw>Ks7-iXc} z9N!cKg$)*{ed&v}Y?j0L^S5Vy0miCIWK?A-_|Pv!d7R`dgw!IJo9|9;S3OE{ufCp| zlbJ{uB)X#@1UX|%+Fc_1W62J2sPAZ_9=8)&jFzkPTx<)>zsv&+L0usbU_Y+HWp_iH zfkA&~dy^>T`>eAa{VUR4sOxjzuXR11!Z$QPx>d?37}~1waxU(C+I4p5GBHC&B`7<2 ze&JTD{jq|&V2AyWD;4-BBn~t(F(BKSLZnbqO24<@!ObHck*}fv^edbD-B*sZB zo7Lttw+?C$83@wLKC}6@*`fn|uE9DeRd+lI#0RfbjunU;mJ20%O~AKMsj%Zew;{q# z@ug9BU{uU5)kTK^e^t#0Vs%oPRZUBM9m+WBya157q%U)&SslTDMOSLa(&V&{Lxi)! zZ+omnjeHVZ%oT)!?3GV~LJgx#r}vY}5J5iB5B`%I zNHX+ryi!G&eNshOMVs9Z5j#USXHQ?nwZf99Knh_=k?hXCsFtxb-DCf)u-vuugZOacQX#GP zGkD1~Pqp(Kn!jT!c|sd`L{tF(7e+3ikK~Xyu)uZ&QhAnIpLYh&;spGg0me5K);f>l zpX92PK9GTjxn#F-q}(%J{f!c*q%8e^V~4NbScq*~-YZ6^WeD-Q0k4L{e*AV^sPkXi z?eF9}-WYsyNhnmtM10ga3hXtI0onm&8{|6eUrYLX+>HvspQVWlJmLMc}vr~X>m-=l53g8!hiHllU>ze1qD$KcQs0C-yn_$9-C&C}V!k1^~o za5$btjNo#Ac)}+AKOB8U13)fMOZVHGe_!jbjqL*gSg6F$9isobnE!C)*!uEClSg)N>BU`fx$B%ae{qlx-QzuePC(m>&GgaMZGmbU_3 zc_3YKD`$1!bT%j7|8AWT%-42FO~S<#WBCBe_36FEdM;@1bi;7p;U94f8v&^5h!HCE z#{0`m6&WdQN+a&3(EI1vOI$Ivmp4iiFw24uq{6kYXc|{*y8I_^l|1p9o z<{iL|;$W(Bn)(YABNrXK_g?o?J8$~N5>hgbnvAjk4apuZi?WPnk7nc<%BuisG{36L zD;8k&Ojm@$QD{_frmVo~kZg}BM8sWrwWz^wt1pmRXA{kpIeRzoO7S~ZpI}n0eQ2rF z-E?Y(=rer(iXC)--*5rg^}{<-?!H<)kDAY4E~XJ{mCv4KQqplfn5%jYnW6fdpZUl zj|drtT0&4gF17p3+Mu@SdSOkY8%V`Qu@sMdXSYW^p)O_z_p74%KI`9^nQrhWmOn4z z>&sKVvxJ6R-*UMsR>!RroU6`68ur~N1;3mjBs6q34wqHYP9I4T`yd2*ba$R@N3rHJ zhXFs=4{i}-n#`JwBhBxZIl*SEm6!4IZZp@v^&7|Rg#OtgSJJ>%YP*Pvv|$)Y)*?@l z;8Z`8skQUpufa@~YBK8`*5q2r-*^-1%QxfrZiB+~+f4horzSgX3-(Ca>D5vUGIO8P z4@S)FWME4*YUvk3E5rl)AmvqT&@#E5!yYo1rPE<8kUv>U4&>g0fP-Y>#U$kma6`7F z)8VY75~Bi87Sv=qvpsH93J?>EEo$uSUbA5ANuTv<{{@e#X0^*aSZLv3C&ka#Scpt0 zAW@+6wzq$>dvV4(ow1748CB#{sXwr-DPaPV&jqE5W5XL)Hnx?LrDNw@?orc)lJ1Jk z&m2x?7VLIJJ;ah*rW>s|3uVf&dU|29CL-{}84|hor_M9dJQFt8$*$J})bly~{Hk}) zhh6!Rn9ipQ%bT6|i)r(Kd=j}bHDDU^4g3pq#l(2(h5wI$z`$w3Xona}iM0BdhYK$9 z$rg;9OGAC}>EnC@wORxJqg#nq@=ECaE?R$$d00Yur_SoA9|$@`h0+3<+$_JDo-piw?v_YKn^Jo5A^o1ia5ic1CU1` zYOq}U`9dWaaG1v*EdA!pg>`sPi8UMS`1A`hP+)db-u-AFeM;R>(y`p&BaX4T!apKP zjlr+b;?W}-32#4Q^nTpX_Df+zm>DOK z+Xs3^qt&7Ge7oM8&*n9BeG4Vw&dcP0D;R~krMUy6H=gXe8zJFo`HjwSz%|Ew#(KC^ zp&q*FUPZE#F+l`qG2U>$OWMFw;boJwGKN#-1>jJ@T9y^hUj*2Se^#^5pq|s^@0SsGnytoDZ z#}*q<{W1Bj=aWk%9@jSxJ2xP!-g>y$A2hQ{&wBeME?ULl|J=+I3?JWgH^(-|-!{u?d+)k6_1hU~Vatuk~7G(SAlp@IU zo7u~d)sp~`z=-%c)tltqUBkZ(| z$J35U1@n;6=Z7>qoyYH3uX^h(*5}+KtQ~7I@e0PFX5r>^Jl{W&bPfy>IgUu4Y4H!Vsn4s+;BZiFU%=2M=j&G-n^+C ze_R`+>+Ld(SbsQ}l6H>H+2+J|xUi#lOuzCO%9YUIkxFtA`uxpph7T7_+S7`3_uiG*=SM z$>=hASg-pD+OpALs;s(XrE66PB{9t1{K-!)n;jtG<@MX%;lZz=uD(m?JB12uSBl^z zB@;OwRjYu&Z$jt?gdQmTsLSR)1U88&e@jhseU{SYw#x^i6bs%)s|{(I_A6q|&J2Rb z>mrjGzq_tat{?9z354vR7kh)AM~Jd#05`tgZXYF$%RP~ZU=k7<^Ko-6;+MybR4U~8 z5W|$mg$10{Cx93ynbi4k!d83}iKI3%`10&9u2x@61$OuOR;PyYep=<_2fv?aq>0Vm zUZ_m+2St+t!EV1@v<&6!izgm;0cX~`5>R)8FMYpRv;NG#dGuul_4?WUQ&d4AKLqqK z32%w0@?P*{p{xrpkYqvE?YsdjP*p>-<@0|?7Y~4=3zgAVlsIn~|E8{|nr?NWcvpwX zuLZ&S5%>7EIHPa-gBk~a7y2)U^Jmh(yk?62nu8IRj-XM>+W_xT>09r7of@N2WxaFc z;Y;zsnY)I$eW&16XBmqbl~u|&d83Lf;<*be8@Pt51ud&boCjdd&bUObH215N(%^oJ-p3R6WG$stDQlbFF znh^$KX7kUv*@ja`N%+x}Q0`^#oxm!Sz97v>i>7rs{uDbd%106jm7n}U5;iytYt?}9 zAh+FV>~K8mOXaN!ra+*alD4){rxpi10oh>Q(#JFnI@7)D&RP6*xypbH{Oggg8Qcib zQ&acUfVykrCe(cSon`GZ|6bd)D}vmL*#BM>=vywlUHF6AFf1Vla)3h2`1!5pIq;%S zcNF-RY8bMH{Jr{fyf`5mQUqie#9$ezkIcDp9RL>D+z#A_&aN<>yF?AclM+AZR2T$N z=e6q`B*_(vkp&^a-gR`zK_QSVhmfhMnu4b=q{f_^*_FnCR&l*asPXY#2Yfn18RvS% z?tFW7u@DvM-`ST zarm6Z!`bU?CP!4Y(V|X;aZWcXg{p%qPxn$}n-%nxO_n)^1 z6*Z-ct`aPH>P=RtsXIXNbSV!#5#@$usF{WfgFuS7`R-*7v29aQ=aRuwSW3YbpAV%Q z=~gsrQU~5oQ^BOidU1xT0kTn{p|%GAm!f?dxg~9#4esVY%?tY<^FoFq8v(HPSl=ON z^dO$P+LUHkdUbJbJYG?Y-5ea*2_?q0(C#^X@7fDef44u_e#%OKHY;w95ps!Y| z_GR2JQOl>}SbbD$TyLhD)Ly@5T$+wF4*U?VBzb1A^)<>?9AlUAPCD&y+VHdPOJz9J zKpOZ3@bCG9g@8X{hKpt8j}NnqN6+iuc2RXv6aJ<5gH8`zLpaZ0oyIFbx9e8ZDAP1kQL3j>i?h^FZdYQ>b{CS4WA} zMp*6o`(u|hiByK&qHY77=gXI(u2@BG$8yQ^WX%x#*|o&epV5nUCipz6SNQMl28p9q zuaECWxUvldQKBL4Lyq+K1vQ%J#{Z0T^`!*tSVHQrEkGteqkSjAwTq@Q3oC*fXGa(y z5(uys@SW#vm;0(VJJNzAoKr&ZiEe--TSxb#VJ{^g!Q-owdX*3CMh%Z0cx<16)4E)_ zVZ5H8QjPmFE)7%+&wlpZSRFbS@N+%D{lG%jjd>Ik_6*RZPT-Ma|J++H_7i0#Z;&yF^%{}Yb)iywgRsV%}qj-}AmY2F<552S|}b+|j{ zPG+W$wPxG;9u!!vz4We6?6`cqKYGtqb+JpJXksv)EfZ63dECZ16bfG}RcOV*J_nUb zI4250@**ZgN0|!6x=5~*`h&hFg()zSuLNjW%?qQv>Yj_FwNo|VMzpajzFct#$@OgW z^=jNAZhQ`Pkf(a1|C7W>C$O1ANLHuV65B|>k4ZK^XidFa+pVEahV3^x+KVDp2h_5x zQh4H?k=*tkfApy1!hGR)F zo)%l1>u-}PO`5wm4{IAGuD5EnPe{_xBHt$_RH{}#PpdxYYtt0rK@*oYtY@b681p;$ z_1TOcDPN2VoLT!QZ=4es3$o#!YRu$QJZ-7_Zt$+&z(cS{Ou;8Xr*cq z)Yo)Q6CqL{SN-(7a2T%yENnhr7^^H}TxHFmtZm5Yc!BzzirW2>KzqDo>_VXgCJ0c;^0)jHpK3p=*- zq(*AsJSP1V06~GDW~e~q`bXk^@}wHRJ^&G{F8wS!)56B&dXfB- z>W8xB1z|9TjVn}DQ9;5_>PV~y^c({5pgy(vU=h%-&3Ex68o7eY0&?A1t0!TayWc)h zo?3pMnRF@ag_H&j>s@KLbevO^jCU(=OLujx-(v1hU<<76HO*q$W38e}8_r+z^~5rs zMP2S+^i%B}AKvp6^Cxvxbv$6;yLwB zzI<_$nVJd&@=9T(a6f4y(HxfhrQvGOPhWohZ3KK5kpyMULx{2!;@R#bx!&qht>t`- z2YewsrURamd^sWAHaHAq=gSF8z1zLh9Q(G170M1JfY6d4 z(aOtnld2RWcCtG4Q`>%h{sQ6KeFlZFR;ksIRtgayF62N<+&Z$IFB&dESXa`1LEC%H z9l4eLA`4ScqP%qd*uu$D+TOM`Sdca=4ufqz)_yyMS^wPs!&y~xb|@P6vetWw>#_Ol z7WO|P7VK{<*tR_w)MBqbOp5SKlphkDx;rA}3vwKdQMYDjp<|i%7Y;97cymj0odo4B zTlI4CCuCTciQR9|MkZp&H9a4cvD~KnMC{(j?HYJD4Q*Py z%_@=Su@|D@$E^%GGP1Ez&WAQt(o1g6j{1C;rtDm;4l9Q>@AoM_-}F?u@Q3dFc;Tnd zP3>%iu4Ld7I-J17dl6vte6hoztR$@V6A%g-YtXi8t7yFQMW^ldupKcAESr0sz+SDN zN`}oAd_^6;ar%HZ;Ytw`PRN-fzRH3D0)OR#Ol)aKkUnmh|Waw7yN0xMvI$Zk{}};vGvCbC^mm;v=Y4~ZF4OxR7NQJ4z6u7)&M2snORrMjYj9`v&8u6`U&cgR36| z#_RQ*LZMP4q3+!A)Cp1>Qy3n?IJfcoUYSO&V01<;>{T+RS+@_X6Mq;)axsPOlC4jL z5JmukNEAUAQ_0e#eUyTG@aR!t%Z=f*jQj_1{p!Y2Q~u* zDqPAr086+vQ6P9|I-6O0l(MV*GxmqYb02xzt%{WH#q;ZB7sq2w4+bhKt4r`-NyT9~ zU@P|BZ}oYQLJ+~vhs8RbeAL@nV%&nb(Vr@;JCBK{bw@ifu?VnTTU^hXj7V#^U0K{{ zkDYa#qsXund}PXUz&Wn#sg=wp5MXb?*6u0a?7&Kip4;B9m@z0A8N-&*`tVV~sYpEx zxb4aItiTW^-Qc`??`&j#!aJI-2bzUekN4hLLTdJs;bL=vm`Z>Weu*x&W!tof1 zIqJKWV%5lFyUX|TVyKpN|hFu zUvxNP`OeMVoOGGyhv8p96U~=W=uh|!dAkcD25u=rR$|C2Vvu5OnBR?6kucpU@STzu zkV7fT6m}AcloV=A{qES;PcD@rs!Nps*oVV{7z}l|w1RxEPaAEI;1$|kW3%(n_$f6p z#4qU?9$ErZ>;eGb&8UetcgDF5Ctqiz+A;`*Qoi2t8dKg!Y3(EpBxP&6AAmxY+;6fs zxFLl^>wE}Gg^V&>u0R$v`HPFB*8sPmLj5uIC~UHFl|Jw?@jzwI+V%3wkq>MucAp3?uokcC!g(;$)9DXEKt@2o zUt@FG{=)V7Em)?}HIx zH9yu3FaAEjX6{eJN@3e?k6ysSbOgTi7l&94AeM7z7_gp>b~4gL4kR3pA1B~x~OS^op< z{`Ygb2mzYHj3ZdV{_7V5IzZ~a_UW6=?LTY&_tD$v0MPJ@ZWrsnegU+y{6D!V6+(D) zxs+eU?+N3KHlp6_S$3P2zCpy8^5L@;M>?}!7#&XeYaSkd13ew!THHUkx5bp#XlqGE z!06|MwIWL4Tsa(M9OJ49z$9!773#5oBww-jr#5}nj>W8;h6dZ8#;4jQT+ch8Og8&T z60Sdh+-$j8th7}q>MdQVay^ZFgM4SA@KWY{*YQ|pmeO3>Qf&4Ycu@568>< zVy%AX$<0}nE%PrO3s?*KpS7%j@H=;T-I+r|LKmI~H_3kTyt;GxcXRqG&}!rVX%PDt zqjGj*4Ut5w+lyWhfP(e$(ydl&Jq&atb1 zcaE8wkLS*3u=!^SS823}S+2HIhWx(&>eygb!{~BVH_1sN{VQiObIbO^cwR^dA=zkR zx7cifzIF`+>Yzy7ssz6Ya5Ya5Q!<+2F%VsxMNdBER=e{sVNwhMrhH}0F8o^<_(DT* zILZf=AclY51)tA9-!u8Fk}bt?GMyJRk%62Am=BYS!IqLJOe8?w2hh!t-n{*CcmB#S z@vCFhwS@cQ$<}N-yVjnk4GHxyG$gXtFwbO}Hn?#Nb61YBo)pHEM?>lU-=xf~!Kx{T z7jxm*coa1y+KI>_Z^^jpgqa5SZ+%4MC#>x|gUHrtc#3Z8GquIB;XlG$oKdm<^0=xe~`aIWC#aaC9Ogp=ESt3MyV zzv)EUIivL^MyUc>+G>-vfDJ*H16g3B<(f1ggOxv5RFwq;09_DR*JTQ!_~Xr0>P_*3 zk*~p&4cfJ)5{p^CtkWkp}_jn>3s?Jg2h z;{C9zsuq#wTd+1_>Od%AnPloF(X5PbAUEFjl`qQ3`V+V93EK#hJ7XLVs{qt;m6iL z&f~bb4&GjrvPjaTb`il?aR}gGHW&d*u3S9hz(GPHsyNs$Cdb75+#8B^{y)K)#`8J_ z`4}i?#4Kd#_a6_AFMb}Y=kmwvUT=4FZhNS~=k0B^BDl-?@PWYrb35_D$C)+OW98c1 zFW-HAn&X+=7pJGuKaDRXw(UkYSwFG`)5QV>5Xd7vF%6UlJL8GhVrnDGV=XDYF*x+8 zYO7WTmjinu4A0ab`0x`joS{_Upo$NUA?)+RQm%0 zTH(COey|HQ$ZoOZZNCk8qWb@e>YQ~tesQOHVbgq-$LtGs_WL1OdOHR{P%xwhzxQVg zXwjH0cw3)fk28S4jQ9Z{as_VJ#^r_x1%tVq68pdr836|;Uh&=WRLRFyBK!Afruahe zcjRv=lI1$Q_6^%_-9NQSWpiy>pT#1#ywt()@r`F;@?-!w)PwK9bwIVG!Ee#R? z4rLok_<%#cAmDuy@BufV`C5TYO{gCIEw~ppCNAk4!p!5&Oq+x{>>{iTYuA-N^F9E? zYcTs56P@gxj8rhBB$iF>a-(McgzdqeSbCf&h&(Ztpa(N{_lFy@qOve6eCpTBab3uxq#*uS%>xdpa~M3<1Uc5s+ABwi1kWvRY+~RaKR6Rp#SE z3<&1=O)xSz7&hRrd}VC8;Z{%HQLWINpP$d$;r6{*aB$2V^lXbKd@74pmkkLL(-Wx7UcW6MF|LGBAmVc!KAeJ{83i zPbO=vneBOh{cyzgRi@2GYq(G{7@tRgu)7;U$C?IQw#6p)g5o;}Zk!@C$iif1*EO+BeZ47zS}PVR{`uOHKb3mam2o$3 ziH&NF9u1t5u#o)wQg;g7#xv(QW25J*LS(ODj~~89#E#nOVqi6;Nn6cmc(gRwMN)92 z{h<|o*|?srkLSmoJd;&HPgHfa@O0Cq!$L~3GR4tyO=l?;>K{I3aG^{5%*s8sJK$Y> zkgKE7=7i;~WUy9SkTv)iis}(&V_Rnpyr~Fw^FF=mr<5E`HMefWJM!kYP__0zDtoK1QmM+CbU`x`GdMT`DzPp1n5_4 zNS?HGWvj2mkcmF#l-$I>?Z9!Z)jO~Ots4{OnkaLGS8|BdU~rTBO2iSqrZal^4yIbD{;#sg%w~)VOi{*t*=?vOEwnw{*X+;D zB_#-Txe`5ARvX7N{KdCX&bWEP&hjlcIq9o2d8h?_r7uO`$q$p*Irge>ouGqFIvHa_ zN!q0_L2d(>S7V%wt^D-jB^k2#0Lfuv5dKkL0CC2=1J|oHFQe9j4fRTKs&HrNavQzE zzeP@aLXDX^k$ZM?u#nRUfe3{2bZD(t($VKy*kOUmn0fax9)-+a)`QefW z2H;I3!``-%YFvSN&J_~Q4;Em%Wbbu)`k7-7218@BYqO7^=Kg$&>jgnY2?TC6K3{VV zYf*RyIVvnv_}x1&H3dX#BuJ@0NP7zS05b*^;8Q%Rv^k7X(gSEo*L(i`V+vbn!F~|X z)gt=l0{HnvF8NEMfiP+fKO|2kmiU!BuC9b*UNxa(kCKcH46+dg+nh3e*zEnDJ)VaE zqMS5r<$J|lf0pYyyABeb!W~JTs6SU-!Nf?m7(Kjy=>tNPL!xg7t#AMk7WoNLDJdhX z&}c==(*N0{e=Nj`_)m(!@P-zqw^;*tWJZb<{C9g@V_gKOl%d@@3)+M_3b3iv@RjZF z+&;O+5*+wfI77mf_aM+G+D9$mHzx=CRwiHZzq0m=8@`TCmwC~6?RG2|9djJXz-Kh4 z)+FKs#7R??YG#X%w&#a}NGZn0k4!zwiXxd&J=K##YOjshpCh*pttK?hcT*4;KEH~$ ziQC#JD8wBI0@e8S2T2SHKsAK19(RQD@u$I}Gt^0@Trp@%UDOg^`0~CUp#<Z9m)W zi=kD8qm&#K*-nQJbPb2!v6t8!&lRzSC)*}UD_a2i=zxSGXR#>m$$AS+OAe;n;&cKt z+$<0?!r9B3n`XNM+~RXAcz2@V&;8ZOegw$0{(1@hxA}zkwGQ`Lgh1uO=1N)7Pa^MA z_K@RTcX0vwaQ}eTs`=?iNmUB|adp@?)z|Ck7mijaaG_BKg?ov51aqDuoU0)2xFd}~%@n@qr^^(mQlp5P z+?U0&HMC^1F2HZB6TYvbYcjIVq|H}Eb&J90}c)DBfk{#|)M z$*|ppdzf<_G|0^1uaMqsNsy?V?gL$A@G+6RkD8}0KHrhB#^AtureNG|&kSCvFO)&9 z^AtfV7*s%+?sr!Dsw>HY3d}~#wl{_`gS#+y=q;A{n9BTPWwlW12xt{vpgKr3Xt8Uf zr!F%>XTd;2tk+q6;V4>Ubd@Nf!aY<8H2Pop!ln9x6qj8Yn3~}cULP;G2Kp1OF2&<* z5DrDVm>^K0V}^dZQo286_^H+fFcmCC;%*_)QZb^Gd|9b8293_?VbEG_!X@blSW2wy zvsZ8LP`_pqyB0AECvyOp6*2=07^rjzlrjDt{OY5KR?O^Pr*_N@`ljZ~?fbTx9oo0< z?TErTG{DRHZ+!>^ZjxzpyipA|?@&IX9Z4c?Ny%k`$bk*T;b(1*|D;N;VIv`7>cMzN zI{%(iN!|#euX$752QFO;ZP47vcmPtBKI8f0w{ftB5Q#uvaYOIwGEI^cWjy*Xt7u|z zO6qa?`4T1L&d#IRK}_u@{xn5OQWKVPZQMAkU|eqpBhwg=M_kTq+YgWXzISe+=Iz~F z!5zTBnl~`_Rv1-&hs4q0T>_Zht>$ZZ027k$90zNnvjW*uuGSgVqbq*54+vMdB2&%H z=Y6uW;(zW*a)HxZHFD7JD>u9$=#V0J0d(cS-X1((9fQIB0`dNAxDn@Rjyz7I142h3 zPUe;juP|?dxH&=Vu1LY$b{47bG)XHenVOx3{H6wcopZj_)Vn%X#waO&ipge2gyiPd zj{7*}YYnK4%;UcjX?O0h+ZI$kWYbo{XoI9r&nc5DqP<*UMH%4D*&Xc7mj}K<{(Z{YL zP$^aMHOOoGn89lKS!&)o51pGGr0pL_xOW)1^Lqv3&Ept5s6kWA*(tB}1H(;ny78Ws zDuj3eHJv9A`2+-nI|Pv(Y_9akgHhi#S`?r>1&Fn|@i9@uZ-a`Y^;I*51-$ML!BI87 z#KY^*f0M{rk0^+flJqQTr5OLx=y-}8sXFxbzS8w*R`9HWj7!Sb?`PbG$J4G%DYxS% z;dJ?Hat=H1sK;SwmMf4VK)Rh~hFEHqrXqZb#*hGeN#W7)+8;N3e!Egjv(ZW7@iVgU zd6pY>ZI!k@C}v%EU6-dB1)CgOsoZ)aO-rK5d`Zfd8s;BkqMiIlRdV(T)^l&ClBY0H z9=Jkp_r$s=iSHv`GH{Iqil3TQC|=V%rJCmutr#IYvmqTC1=_^6wha6j?CtG!?6G9B zxo1Sq9E=`~(F8{a(ioY_#1a8+roRR7G%Pvu>x`#{3wKkwu$_xFPgpAUo^I6aI}pg`SAuq!IksQVBT7k~0>{<63G z@rGn8!IY$GXq49?v%ZeAE5Dol7=>eY$V8?o-76RheUJ1n&-4qzu-7*=5)IlQL#e5j z7-gEOFfTDR$SL3;Y?sn@)*qBEOxu&R+o2`E1N{=U&H8)8a@YXh6h9_ z-h4z`0v?yz&nueer%2qE&4SqhrhV_{ZYi?+Sp+}M|YgIwkqPnE!bCw>Eb{$a;Y35HX7U|L3d z-49od%u|XJ8VLj+QqVLOXEyXb?MbIgqgf|wJ`sA2^h~S6YodZ@dC}^FC+TSP12F0PLKAL1fSb%V}GIg`~^jFZvI6k z!g8~nO_N7eV|FJS^xulv*Md0Pu@}S?wT86!+X0wwV5lMclWnLiZD7m#lk@%IVV%ev z{+5nKM#&NT^R}50b*t9utTJR4uM!RZ2F(E~|onxm+a3_M_P})SbiT=T-l; zdbCxqkWmgo;QwmxtKy>EzV|^vKqLfVq(ee#5D<_?ltxexq>*kII)_w|Mrvq8KtxJl z=oq@YyE~<0VEDg!Jm+vO{+GYI@6BAipLcewcdfP8^X#?P4i%=d_cFvKeZcdqGTMNO zC&>-V-JFuYj|a^K=_uv@hA61;)3A0KE zi$a4q!bz%L&%Vij*ZA>n@I9SUsgSihp%l2_$OTCN3(x(WKlq+&a6jDNPGEna#=~$8 zsBQ}sS+CB>xF>!hXcVncU#$Oks95T0K&2>n6BnRQ)HN352{ zBS!8@TVvy=E|0ZLpezRZHDJC4NlQXE7gHvxY!S^WwmEcUjg0Yx#WTMq>08lJ(9?skNr*&SLgy z?rRE^`tFdp?~Rf6CfA5=5ZvsH}K?6^m~5liBs1=_);Q=?SJBoCrv}MFZSR?QY-j@OvOD{?Vvd{YmfWD5#;Kp~yl= z6ZQukquo8lxWS+;icYTcB_0h2)UEyPWRlsZp?P{bd3FtOif?ykYGzR{2C0bt_^du| z;C=Ykd(-7bIUWaIQ`1le<}8zCXE@(KVG%HCAJV(D^Is%66RBhV>FIaWwDcPIyZuID zI+E#65Cy#bE8f(6?(;5~w8qN)^*_PEUzk(n*JQG7!*&w?+mhK`bRw|kVbS`le-Og& zA&M(9iZ?K3)e2PF{Wv%wVE&U%&!dC$Y?y`fe z7~2C`nP(ZJDOIxb0=Hq-g1tT`N)wFeXyCaRHj=Ck{Ed46+${o(9Ju47ccMhLndvRy z<;&7{>f(j6#4Pi6FBkBsHl7WCSNyr9aYG@o6x>NYIy8hmQ|*S^o62lFPCeVuFf)@^ z*U>=<*2DLw5<;O!ZDjYTtzK-uRa`vt^z0}Mgoth=Eof85y|m?y=1`~JX`X(skA!k3 z$@~AK#&x62;tk82JXc#(phI1>Tjw7joBc21j$7dhql2TvSh&RUuE=A&=gm^af>$01 zKV0`7K_Cxro0}JWwp*Mhr{Q>$uRXVB*4au=pCYcT9Ms~r-*XF(^(n&3x^AlLzWs7f zbHHpZrt2O(4p^u1CXfaY01*8hoSpr^2^D>ExkDsgbR>lA zGEJE=;Ld8YD3t2r;s$q8)Zi@#fRBPh{Ic^01!g`U`2JWu&L@zd>J!Fh56z`z;v%nh zK0UV%7NGI+tvNC9>s4R(5CV^8+Q84^Gck zza}BIR;WoyQP{vfqOh>n1x+;A8mq)2#$V$7e&fkQ?TZWH@|>~vxMk&%EQ8*jw!l-Dfo0_bBLglm>(%Mr{hGMDs&#fITcc|_jI(M;UD9m-TY-??k(fB zH*sK`Y}$VQ%)aj>MaBCU#$5zm5+e~t@Rm3(P*Gz*Z)d=_(!aoN`oD~~Cj|yvt^8i$!yCMm7HD3H6srL+^K8Pq#5np&J9X`e z%=37`Sa*Xh1>QXBvFvJTnD4mkG$>neXBb_w`lh;f;W4Ew zc#L`Sd*}0P0kmAapGNl$ zY~{TM(x|gl?yaeKyD6V6Q`|>9wOs80_-<(TOj#R)G94Om>y_DQCy$k) zlU|>b5H;dEO;_^)20mPD_YH|CJ@2=KZKrXyG=~;OvEQ${OYR;% z+8iEAK_KyZh^G(-VD^kX(1cwH@kHFQx$b_iC&+ywNc#TQzRDQ60}rw5>B9u9>hzom zietrSxndLEv4gRO!K}g`Hq+=f<4;AwU}N>IKP1%@kS@*HQN>#dEIH`;`Kq6v2R3wR z8n%o|_pqsL$+oJxbL~v#>*zq7!MEP$am*veFphT~=xsghN(3#|S0yr%&hJqDx{v{qgeN%LMg@ z^fezzUVnEad@dk^mibU_^&_?9bIkBV-3)(6Y=%1i-m0D-@m7&|%~oyRJx<$-ZdqHl zKeZiJIikSy^b189b@#}~%zG*gTf@9BwhDwVf?j{jjhk}|PZFlTX-W`bXc`vJy(@;S zUFwRI$4`FpP$cVE0V3wnI7j+yDORDZtrl@CJNr%4{&rvVz6Itq)roM(m$U`APi z4eHq9T9fYE17%9MvY_Z5jVzwRLeMgBdM1+J);TaRFhYYa;ySVvH!$mm;qI8gUHTy%n?PzP$W**A{^oI|bbwQdbhjSZs;=uGvdKCZZo zQgWA1lc-ppsyN^_dl`MWJxQ-y(Fp^~=S?It%EvvHIBqN=B&M94qXK+Ov|9d{YSNZLeua|-)83WZB%SklXD3Y!11#^VB!5`ydu*4A761Vh-BJl;aPulqe&9+?iLdm2qoN z;wok-M)e+XpLRao3rl6Q1e@F0%9}#t{W9|c`e|j^%OB_UD-@Y_*c`J&7k^%Aj~(sW z6gVs!A8eK{`0mZAAPYCFcV+S}T;T?TTXehvd)4hwsp3&vAv_oRfz z{`?v8wJlp^b*TWMs7|mD&mbMfZa-J2H;_A?Xri?q>yV-MA9E}JwMVqw=dZQ$gDHt;9kZzAel9#_F84fqcZnSC269M zWAykKTT$F{q_$P|P@HW=h^)+qBWzk9v>VvkV!n^bv@K?JwG>l?7{zQg$ad3K)-6Jp z>-P!B=W*m)I+YT=Bdg?Je=02z@pkeul=2>j8oBtne2ykztsFkNAn_WjPTOzY5mOld z%A1g2Xf0MQ(o?(6kX+q=`hq2{@!<2YoidgH6;x1>?4+Sh?ExeEW8wa}g&HO6P2f&f zFPLHhbf7s~b|35@vI6LU=r`vd7Wg9tv*!58%u3Gv0Xuid20ELAVHq~lJ9eld+tgWn zaAhvRs%@=+hSzDm;kV7h`4Y{NtKzT{aZuib51(>o&?@KoU>0Z8-Xh}h=24p0#c94W z{2TMfO8;P%!;=8fB&CF*M)nu+MQ!eJs1^^0YBy-aNj^>`gl=Sr@bYj_FvnyCB;dBM zPz`l_KN78wGBqiD3e+Uioq)UbzI#*!Ioau6s>fnWZ0;4iQfmo`H?*~{-JUZj_!y+g zO3dVG%qcgL8=s+?BW=9aM`ogvF2%dt45Hyb&{XX7P_mvBWdaU2BQ%zEikEa+JZA8% zWidg!X!aXJ8s@WJKS;2{1p@{mhFiZgY84vfb){ZKX%w7nb#h|G)qO7!1FD9?V%SE7 zkgxMJ6=%FA4+8v~dc=TYpEv~VMi!dz7RCydcx~h5ZLC`f(5&E8Qrk`J5DPlFD+8wsO-4egghnmo4pN^?I@Jr6-=Ps5bdR{C(B;T9;W*o2LUSI$ylu0YDU~V%SSr`zi}rY)9Gt+3XmA>nr?Z>4zkIYRZmdwaD$?-9 z#G&=}1l2Je(S^;}PrZF0+rQhnX4m~{Itr@olyA)&aNtyY!_{;8Sed>5|GuG#nAKSiSQT+@b4q**9!t1pd zhPs~1m>qB=d(E5|hajuSVy2}fpS}Npo7_@D!MW}~*jaI4y1X2i@|979;y7~QEGSVE zFK_y1%Hb&qJ)6wD_It)MryfX7cAVmPt^=r@*nFjxvlP`)-FyHtD{g3&w!j8Y5IjwM z=cY8nOMweQvF{>it~ke?A^j^#6SMS%vNRna_MeZf2Woi=Y6a$pZwu`$=;mmF{`+90!WE%M@?{>u$obsm@S8V&qlfFZGWpu$3U_N}XbVII)QtV( z;q7rKa9-hn7wb;DP`R0dfHfa%=&`+#>7b)xr#bQCJoJ89%X**!!F1Qv@ubQ61n)YQ zqql!B)kEUjZ&xz%!$qM9oxtL#KVlKu(H><=^?Pz6FwNR zqs6%Eb){ClEt}UCCz`Hcy_8+3S!x&pB;rt0Gv!yk;9 zXy{kJ%%MG11W~;Y!D{yi&YG2$&_>uGC8e~0RGy7fGv*4B1!nc$>-7~WE^DAxD!mw7D>YgUzk)DuO;tKL3`twbdLq~W{F{n(KP%zZevHP zOn_B5Z{KQO2Yo?2vt&K=Rm*zk_kl{g8d(@e<>?vC?v^v0)Ip3-yuokiB8*7k1@FlB zf41utSytdFkc*KMg1W)8Cl|v{NVf~pqdu^6Z0;WRJ=0Nm@zKQ%5bdKPWTC6=3GeQ- zmF31zvs!U^!3(Zk@<(_aP=elVf}o6BroEmAqqGki^(I$_dl&b)$9_)f9ZHW~Hg$VTmV?U`A>{ zDg3(jQ>Cw>bpn8b#pkeG{Huzh6~5#vr^VJzrgm?B)M&K)+5~)rnLT)R93NTLr}}1O#>5mL zy4n%Fx#GBC;EXm4j|n@^fqd*8o=Yt_pZR#vY_&@;f5D5-j!hgcDi4Lq8C;(8RNZnUoV={Iyoo{#3%r zsF+hOwt8XiWsAF5wRR%OeHrlW$q2bs3;amf%nb`-rOO+H(*CC?zKqh#$Bm zV%!nkzfruvrLg8Zf)5s?EIPg^Yc+7U`OBB{MEVI|gdQSrFK80_1eHDa1=RONk}8K& zmdb%+hWDu+^eAO`Pk3mkZYXE;!A!|{al`Kh@F8=%hch1A$*+dsy9z5^^F2Nog76>s zesjG`N|64=F*=Sy#lxKgJhJ_uXimMZTs4}iuN^wz>}Bd<5BX(3mqY^&6aJV%5E0E* z1GKtjIiVw}jF&G5d6`v~D|8r8h28l_P7yb5n1jpV?w?DhR5qxeO}CIws9OqGXDMUK z$(G$p!IIdW`(nIB7YZxT0`uDDtRGtU*MjSxJ}qh>_f-hro?ewaL4H1?ZT}6r#<}Q%bo=s>t!3_F?@c}9w{{5Dq{m-(W@<2^$^MytycW6TzHV z&Z{2x(Jp(_c(T9X1!1|f?_-em#IOysOU%y;-s7Y7%jb#KZc5NRCLKw85LeDry(AKD zHcJXk4dz3hH*efb=M3H2AG1_0eW_u3DQFp8NT=s^ZolUH0ZwV*RM%^g5L5Fc4Vv`h z9ucL16#Jk{^_t@YKY7Vb<3vs^&gr4`MqAP7S(kjSgHdFoQ2FUb`WJ$pbF{pukuX;R z2P-{!d;j3tw_KJZkWSrPnBZ{)kLj1~XBtp(R@vT^-niu^zhIZyL=v_UjmATFzYh+y zqan37P3rw(>`#B%jgs~njOM?{h3UAXLfsHqO~~dbhgH-Ypn8f!Dsoe98#jG)DCR&{y%?2_Li|X^iI;Y?<>6*JkI!Bd% zyd_{%le0XHQSg9{W|~fK#gluZf6rt#{Eaum0iTBynf%YU`FPGM#oON2G5NuIPS!^? zW5D$RIjK>r1oWB0^4N9}pZ#jMi4nXw4z!P^<<|%9j(pRlN($Q# z#01q4R+&gyKKp>5NH+^TsX7qfu6=2}pIL%4aZeGcak1+?*_F6;^y28e=N?jry)u=r zbKp~nQ+S^E!d!~W)keGzjaj3huoNw1C#9{Xj^l^JAZfO9GG zyDO}}Zt;@BDX{=1gWA+v&eWTYwd>d@$t1uJD+Z_4-^yn!cO^ht=^+P|5Mb%Bq#vL~ zPY`>YyyzudDai?k;x;O?E=UD--(S*Yx<6sO^>!7i1RY)* zUp}fbX{s4W3(6{8%3ChzOt_g-!_WL=wqS)qSyWGQ^HLtP6t5AQj4nhpHNOiGhKCUy zF>FH3YWdpc?~hOYm7ZY6J^c-3(0q+>fhF;a#CvH;UWaMlio#x>St=z zmB26R%A>?;rcCxrE;+f-Sb4y+o=*Z5Yfx z&W{hq_+=~GcYEMdq1fQvnv-}O?)v(aPeX^o=V<3WLa7N8cXW<<$Lkr><|Coo=?~mO z$%i%Q9~`uf=W>b+1xycQ;xY?=8tX{LpzC;>!Zv3zYKCVg(Fw zx?s(`1dyZ(34G8-ohA+N>xX4#FZWFcJaQWOtFr8ugEXnGwBkj1cdXsLsP4U8Y|*jf zGw1n%x=aOa6KBqkikRcYjyRsV`)2F#J$b0kBzl}}gwst=fv?ql6?+8dXFN?7QlTc( zI(bkGJ^sMCG<$_)s4v>VTWkp}mKcpejw8IiH>r3WH(Z1YL;eCkCDp)EF;Z^l|%mGF;YNaPt;~&U!_)&;W-RTvGa6I&^Tii3u+X$Yp%| zAQV%>UvF#5O&oqU2EY%Z$?kErnxBYV{ZKugPEP2wB7V}$uGInW;CWc-J|wV`h{{7T zC3RAwr&V{Ib2+EF20ZqiBT*DuiG!%LnXQHHcd(_18atEK{vAM1U=BD!Dx5{b<~Ziq z%3WN5nvbQX4*zaB`Fk0Anho#dO@ry${Sm@x&k?M%teslhf(W!g*yK2-M zy_$hQ#G3+LwK};O857xL|Ls3v(A$!Tz>gpMbg{2af0Mu!ze(V!q@OL=gxWSCY|?mE zzBbd98r>7Z>22E+C2Wcxakki2H-0mSgfcoeFknMYh#Th?IAC*PPM|fAJthp!eny}9%-M_F6S(zfwfp_@)Jt@~PQ2yixj&Qp-SYph zQJKOy`)A%HSkiwviQlBCZ=xK~tje^a*PUza@@JvdFRxS=T(JI$Y<|HS8&;q%AS2_9 z>sn`1Nq{^O4{G;w{*upc{8OF{%!+?_d#Ux>v>*<*Gh89@!jB}rzs80gfWV#O4zMKz zBKZ@#AwioSGk7Lx;XnNm%9M%+VZq`XA7py2|9Aqb-GziqA-iIqY^wk6<-Ktf4X>Wwb=aN3(IcdBdy9W0#Jzc&wXxce!U?_I^O$lyadN}rN zR&SW7rs^Y&TP_S|6660Pp2w_&FY7Z6;vdC}vJXrJ6~2--YHJM`ShJoteemyR^zkVZ z7srHgH*e=+Q!DP_;`rv_I%~D2r zHJ)VA%YjM$u+_f>Y7_mdVXJt5<6%%{m+f@PuHTTC&1UHNG$rWzd&-}H_drfsVu+9o z0y$<_-WjWsb);eSM{bf!hXv(pgDB^^fez9ZEN$c9RDV!Ng=^lWQMdoOT-#t^mU%uPHO3Oz;hK3hkEOC-nYI16hn5sPrZN>y429Y9#-; zR6Os1%Ay3sZk9Fnnh<5GZlIHBQ-4d4Y&k>>Plfst<9B5AhJT$FYUI4GKj_l5pZz*d z%WikpxES++M!%ofoS|TYJ@2{wuM61x4Q;c({4D68{TXkOTq*lgB61?5ou>C=oyryS zOad+_<%t@e3;XNihhQiRmv>Q8vnfGuXm_H=mm(&d0vqkM<1=5C}W?`UDAG z0Yk5=V%ENUy`TRH@^7*IPmq600$9Xg;z5|OA3q+AX8u>vu}?{9%TJy4|Ax1}*HVlK zKv#WiZo&Mn>uN0~Hn>(tJ^1=FbOypl^}wdB1A0?K=CyU$N1XPTO|IKOIIgSgoC;t; zQOl_s<3;+4Zlzw%01>D@KU~|Bp7X`!FSEZA;my*%4=aC z0x;XZbIQreKm^b1y2;GPp>Mvt;r>~2W8lXzhy6IKYVkO!0EB_5f8Xkw;m?^6VaLq@ z)HBDgeZH6cph#{(Hh&-umn+7SZey+}dcqJ+zh(n+R7mlUPL z`{Tu!ok~1%vVu878+fM6>xx3e9KBN4T#^lwuMZB`ZQm$LHp>0}B#R1Z`%?QX2K>Me z)1QHXp#}(orGc{nNx7EYl++A}9MnVkut5z$0qG+_A-$oIt`@q z{eKn4cZfCOOZ_qm$tE{mBpIT!(nXf(el*#A5k`eHo~}$bnLzV|n!@!l;dqzVgat_7WUSdP$j;;yhQoJiCV}1glgZ?RP8Fx3#G>vz{7W$nDr8iGT=YY_lWCV!6|3n=r~O6( zu_v8f*R+#x?FI|EHju4K`{~o!B{%sK$ai+#YF0&!ZAze`B4^Nt+j@iNM?wH+@yhPT zN1c4>aMKLuZMkEE>Rn#T(m3cgp7q2KaNL~c2Z;C*wbxoQP_`>A+F9Ml0IQzh4j(`6 z?@HfCNn=4{<;{!-E5|dh*rB_JQknj_fsFQ>%7q4Yjl|>$Pl4o$w=3b)BId*Sl!1+W22JeamAp2oVe5ml5!w|+ z@%H`wAR}O(jEKVHl?|dM?p;7Y!qE=e7q$}Tm2Q5m_-z=cPOR7oHD4=m3C9!$i^$3@ z!WIB9RQerj(lM;YnX*xuJ^R*WBr%R7gnGZS0Ae{jl8yw6UH3S-ZD+#mM#gbdYia0I zJ50HQ+t+6ecJ)eKrQ&(Mf76&MU9A?La!;&bskil$_j_#hZ{RG$_)E~$p^-x0$B31t zEJIg@>nII2M{4%>JD)K!F^#ZiDbcW}dJarJMjs@h62j+CYq5fho*!AVOjIjm(LMVL zTt-pw=-@bjk8W_qaAJx*ZQTM{?#YuDcaL)mNA*OsO7fVha)6Q}&B3jJ0H0|55h7Q^ z=~O-UwPp3VM{%#4U$7FX+P{tjh=X5KXs`58(Z=%x#FNLiQg50Mdo}@O@-2q#fkJqB z-FbbY4}tyd@d}Oy($3BaFkV|!>DDwwnR6>kTwB-hE!b{WOmwxtKq5#s*1gR|Ebh6Y zCEq1i0sP$ujQ037dF4W{fn+2OST?YT>K}8W?ZZ^Ih5*ShapvEh_7)gb5{ZnQqRW`A z8!}ZY>{FOjJ@UT3?M_52YM4WvcV`r+J%1EwjF^}&wtAZjj!p9NDb_zX0Z7n`Cp8&M zm5en_nlFYrL_M9-{Vw^k;70hkkq)bzvS+Q4_+Wi~eKkB~(bZ8(A!mg!8YPrGPx8%2 z*8;&hG4=>nfUzx^@zTf?140%xHdIWoG?Xt{kUSW&S;YgS6-5XDv z&H2W=F*aP|W8dG}oGIgbXXT~fy(0X;q$%^khN6|_m{vud=&IDQ=&5Oz@P8Kv@$bYk zG4+}D%LCkyIow;wwok-G7OD#+_?nB{))SFW__N;DYpdzORx{N5Za82Fnpd?3uC+@39orMiDmnQ@r&6Yevxw0F*8 zzZL*xE7Pjp0zp?hw#HMw>h1I+B0WHUett_mLh>5C+{2m5nFC*_kWK?kW-14Z~+2HOc?Ie#}{zirz7LxaJ#hJn1Q|caQM*d_^P)Tb8E4%_B+_qu%p zomks`wTG3)duq^CN|GZ6hqzX5$hrRu-Pi2Vv}dik`a!cYa4UPho}{zbrM6GaTMN{o zUC1ZEu2`vcD%=`bd-C=9>TWrQ_LmR$xQti4y_E%Psa!s;K6feQbGA)fz?Ow!UIiiq~Pl;^J_NAoFh*OAML?*9T1{ zzBorQpG0ce9#yv$T8{Pug@|hdF!6C@cke_ct)XAdJb5cFRI!=QZIW%+N{|kNg_)4kIfn$9!XXdMH=IKh*wMdjM**Q?W|DX`G;w z)Y%_)mZw=_9~=LNApE8Nfac#|Do+w}>A?V5f6wH6Pbp~i!7V(dqpe_7pw)zbGw(&)4TR zI9W)H(P?vLaq#D~OBQe`7ouf+q;N56f6Q<=$%&lLQN}ROxG>=PNazkZ8C1X+NM%dD z1Z#gp^j@5?8TWlQ2QqNFs9d6>2}E7{YbMyQem2smwO$2^maTV0N=g{dlpCZJA(CTP z-FFm!khA{!G%GXLkZGP?r|J$Js)g^7b`EtQ`0YvpT9x zm`zva<8a0|@U)O^cfNtVTCCayTk--qVe@KkCmFn46ntBeWituv=e49B8^03qR90

$!rd>2J0)!88 zMeQ(Zl($~Yr#p1(O9fG&%#J7&f&Wyt3Ul_W^bb(CBG)|wG9l;O;;!qAk1rVDIhHkl zIA#>yCJ73zU0j~4H!Ol8b;m26Y`+9_rHW+%6<5@6lXh{e_DBL5qaMZpA=>=DC^JyHX1FfXdS!*T=oncc1Q1(F)1u8-0$M)RY!0! z^&b>oLu|g{MCImw^0aB^9vo3vQf(q6Jnii~piJe)Cd-$x8oM?uMm3Gb2R#SMWz&4# zO8UHsxP>$NJlz(8tJ!zY&o>M5U@nUL9^SYAT~lZYv4Jp4yd0PRC;9g`1%Rr!@R{~$ z#+q~|XzYHgaJ|{vmUa!-mZN~TH*LvZN{4*>2stkUE*w@=E6}BSIojHMEk>CO2QVZJ zW5=~eKH@>QfhagSHR@mOr1kL;`{ji$D%Ah`>cl5u9JQQR85BuN^z;x8ZSJ&bfbPVO! zK68;@E|Mt!SptDkT-*hqM*8!=H!^>R2{Nw$v>UYV@E_XYr!)W)!ilbjvf{Lo0Q_L- z=xx6?bn!YG06&Y#MPG9`{~P2r^g#H3B1sete=BjwM}Im$AgdZpR#NeKzQkL<{|DQ5 BmfHXT diff --git "a/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.36.25-1.png" "b/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.36.25-1.png" deleted file mode 100644 index 7658aff6a5130477dc2b9bfcdb3c26be2c4b629e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325336 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�eG>XrF$XWDk*Ihe3uNWAQA!&m@58+R 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 F>|f(|`ZE9k diff --git "a/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.36.25.png" "b/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.36.25.png" deleted file mode 100644 index 7658aff6a5130477dc2b9bfcdb3c26be2c4b629e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325336 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�eG>XrF$XWDk*Ihe3uNWAQA!&m@58+R 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 F>|f(|`ZE9k diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 770a09c9e..000000000 --- a/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules/ -__http__ -.env \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 503a5da40..000000000 --- a/.prettierrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all", - "semi": true, - "printWidth": 100, - "endOfLine": "auto", - "arrowParens": "always", - "tabWidth": 2 -} diff --git a/mission2/.gitignore b/mission2/.gitignore deleted file mode 100644 index 526162b76..000000000 --- a/mission2/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules/ - -### Mac Os ### -.DS_Store \ No newline at end of file diff --git a/mission2/.prettierrc b/mission2/.prettierrc deleted file mode 100644 index 92f97e756..000000000 --- a/mission2/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "semi": true, - "singleQuote": true, - "tabWidth": 2, - "trailingComma": "es5" -} diff --git a/mission2/Article.js b/mission2/Article.js deleted file mode 100644 index e9fcb3c1b..000000000 --- a/mission2/Article.js +++ /dev/null @@ -1,23 +0,0 @@ -export class Article { - //좋아요 수, 생성일자 캡슐화 - #likeCount = 0; - #createdAt; - - constructor({ title, content, writer, likeCount = 0 }) { - this.title = title; //제목 - this.content = content; //내용 - this.writer = writer; //작성자 - this.#likeCount = likeCount; //좋아요 수 - this.#createdAt = new Date(); //생성 일자 - } - //좋아요 수 증가 - like() { - this.#likeCount += 1; - } - getlikeCount() { - return this.#likeCount; - } - getcreatedAt() { - return this.#createdAt; - } -} diff --git a/mission2/ArticleService.js b/mission2/ArticleService.js deleted file mode 100644 index af2427331..000000000 --- a/mission2/ArticleService.js +++ /dev/null @@ -1,92 +0,0 @@ -import axios from 'axios'; -//미션 요구 사항에 fetch나 axios를 이용해 작성하라고 나와있어서 article service는 axios를 product service는 fetch를 이용했습니다. -const AtcService = { - getArticleList, - getArticle, - createArticle, - patchArticle, - deleteArticle, -}; -export default atcService; //article을 줄여서 atc로 표기해봤는데 생각해보니 나만 아는 표기법인 것 같아 '좀 더 직관적이게 작성해야 했나?' 생각됩니다. - -const instance = axios.create({ - baseURL: 'https://panda-market-api-crud.vercel.app', - timeout: 2000, -}); - -function getArticleList(queryParams = {}) { - if (queryParams == null) - return Promise.reject(new Error('쿼리 값을 입력하세요.')); //코드를 다시 확인하다보니, 에러 메세지에 쿼리 값을 입력하라는 게 적절한 표현인지 잘 모르겠습니다. - return instance - .get('/articles', { params: queryParams }) - .then((res) => res.data) - .catch((err) => { - console.error( - `getArticleList 실패, 상태 코드:`, //서버 응답이 있는지 없는지, 있는데 에러가 났다면 어떤 상태인지 알기 위해 상태코드를 따로 출력하도록 했습니다. - err.response?.status ?? err.message //옵셔널 체이닝과, 널 병합 연산자는 ai로 학습하면서 알게됐는데 ES2020에 추가된 문법이라고 하는데, 실무에서 많이 쓰이는지 궁금합니다. - ); - throw err; - }); -} - -/*저는 주로 ai와 lms강의 통해 학습했는데, id가 비어있는 상태일 때만 에러메세지가 나오도록 코드를 구성했습니다. ai는 id가 비어있을 때에만 리젝트하기에 비교적 약한 검증이다. -문자열인지 아닌지 등등 비교적 강한 검증?이 필요하다고 했습니다. 만약 실무라면 검증 단계에서 지금보다는 좀 더 빡빡한 검증을 필요로 하나요? 아직 경험이 없어서 그런지..에러가 날만한 -상황들을 생각하지 못했기에 생각이 '아 문자열이 아닌 걸 입력할 수 도 있겠구나'라는 단계까지 가지 못했습니다. 이런 에러가 날 변수들에 대해서는 미연에 방지할 수 있는 것들은 -최대한 방지하고 후에 디버깅하며 코드를 고쳐나가는 것이 문제 해결 능력을 기르는 데 최선인가요?, 아니면 당연한 것인데 아직 익숙치 않아서 그런 것인가요ㅠ*/ -function getArticle(id) { - if (id == null) return Promise.reject(new Error('조회할 id를 입력하세요.')); - return instance - .get(`/articles/${id}`) - .then((res) => res.data) - .catch((err) => { - console.error( - `getArticle(id) 실패, 상태 코드:`, - err.response?.status ?? err.message - ); - throw err; - }); -} - -function createArticle(articleData) { - return instance - .post('/articles', articleData) - .then((res) => res.data) - .catch((err) => { - console.log( - `createArticle 실패, 상태 코드:`, - err.response?.status ?? err.message - ); - throw err; - }); -} - -function patchArticle(id, patchData) { - if (id == null) return Promise.reject(new Error('수정할 id를 입력하세요.')); - return instance - .patch(`/articles/${id}`, patchData) - .then((res) => res.data) - .catch((err) => { - console.log( - `patchArticle 실패, 상태 코드:`, - err.response?.status ?? err.message - ); - throw err; - }); -} - -function deleteArticle(id) { - if (id == null) return Promise.reject(new Error('삭제할 id를 입력하세요.')); - return instance - .delete(`/articles/${id}`) - .then((res) => { - console.log('삭제 성공, 상태 코드:', res.status); - return res.data; - }) - .catch((err) => { - console.log( - `deleteArticle 실패, 상태 코드:`, - err.response?.status ?? err.message - ); - throw err; - }); -} diff --git a/mission2/ElectronicProduct.js b/mission2/ElectronicProduct.js deleted file mode 100644 index d3e2de776..000000000 --- a/mission2/ElectronicProduct.js +++ /dev/null @@ -1,17 +0,0 @@ -import { Product } from './product.js'; -/* 부모: Product - 자식: EletronicProduct */ -export class ElectronicProduct extends Product { - constructor( - name, - description, - price, - tags = [], - images = [], - favoriteCount = 0, - manufacturer = '' //제조사 - ) { - super(name, description, price, tags, images, favoriteCount); //부모 호출 - this.manufacturer = manufacturer; //제조사 상속 및 초기화 - } -} diff --git a/mission2/ProductService.js b/mission2/ProductService.js deleted file mode 100644 index a8de37348..000000000 --- a/mission2/ProductService.js +++ /dev/null @@ -1,119 +0,0 @@ -export async function getProductList(params = {}) { - try { - const url = new URL('https://panda-market-api-crud.vercel.app/products'); - Object.keys(params).forEach((key) => { - const value = params[key]; - if (value == null) return; - url.searchParams.append(key, params[key]); - }); - const res = await fetch(url); - if (!res.ok) { - const err = new Error(`서버 응답 오류, 상태 코드:${res.status}`); - err.status = res.status; - throw err; - } - const data = await res.json(); - return data; - } catch (error) { - console.error('getProductList 호출 실패', error); - throw error; - } -} - -export async function getProduct(id) { - try { - if (id == null) { - throw new Error(`조회할 id를 입력하세요.`); - } - const url = new URL( - `https://panda-market-api-crud.vercel.app/products/${id}` - ); - const res = await fetch(url); - if (!res.ok) { - const err = new Error(`서버 응답 오류, 상태 코드:${res.status}`); - err.status = res.status; - throw err; - } - const data = await res.json(); - return data; - } catch (error) { - console.error(`getProduct id 호출 실패`, error); - throw error; - } -} - -export async function createProduct(postData = {}) { - try { - const url = new URL(`https://panda-market-api-crud.vercel.app/products`); - const res = await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(postData), - }); - if (!res.ok) { - const err = new Error(`서버 응답 오류, 상태코드:${res.status}`); - err.status = res.status; - throw err; - } - const data = await res.json(); - return data; - } catch (error) { - console.error(`createProduct 호출 실패`, error); - throw error; - } -} - -export async function patchProduct(id, patchData = {}) { - try { - if (id == null) { - throw new Error(`수정할 id를 입력하세요`); - } - const url = new URL( - `https://panda-market-api-crud.vercel.app/products/${id}` - ); - const res = await fetch(url, { - method: 'PATCH', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(patchData), - }); - if (!res.ok) { - const err = new Error(`서버 응답 오류, 상태코드:${res.status}`); - err.status = res.status; - throw err; - } - const data = await res.json(); - return data; - } catch (error) { - console.error(`patchProduct 호출 실패`, error); - throw error; - } -} - -export async function deleteProduct(id) { - try { - if (id == null) { - throw new Error(`삭제할 id를 입력하세요.`); - } - const url = new URL( - `https://panda-market-api-crud.vercel.app/products/${id}` - ); - const res = await fetch(url, { - method: 'DELETE', - }); - if (!res.ok) { - const err = new Error(`서버 응답 오류, 상태코드:${res.status}`); - err.status = res.status; - throw err; - } - const data = await res.json(); - console.log('[삭제 성공]'); - return data; - } catch (error) { - console.error(`deleteProduct 호출 실패`, error); - throw error; - } -} diff --git a/mission2/main.js b/mission2/main.js deleted file mode 100644 index 64caed859..000000000 --- a/mission2/main.js +++ /dev/null @@ -1,141 +0,0 @@ -import AtcService from './ArticleService.js'; -import { Article } from './Article.js'; -import { ElectronicProduct } from './ElectronicProduct.js'; -import * as ProductService from './ProductService.js'; -import { Product } from './product.js'; - -/*vscode를 실행하고 articleService함수를 호출,제일 처음 node main.js를 터미널에 입력하면 -첫 회는 무조건 에러가 나고 그 다음 2회차부터 정상작동 되던데 왜 그런지 궁금합니다. 아래는 에러 내용 일부입니다. -axios 인스턴스로 url생성 타임아웃 2초가 너무 짧은은 상태에서 json을 파싱하지 못한 상태로 반환된 건가요? -왜 첫 회만 그렇고 2회차부터는 되는건지ㅠ... - -getArticleList 실패, 상태 코드: timeout of 2000ms exceeded - -node:internal/modules/run_main:123 - triggerUncaughtException( - ^ -AxiosError: timeout of 2000ms exceeded - at RedirectableRequest.handleRequestTimeout (file:///Users/apple/codeit-mission1/6-sprint-mission/SprintMission2/node_modules/axios/lib/adapters/http.js:675:16) - at RedirectableRequest.emit (node:events:519:28) - at Timeout. (/Users/apple/codeit-mission1/6-sprint-mission/SprintMission2/node_modules/follow-redirects/index.js:221:12) - at listOnTimeout (node:internal/timers:588:17) - at process.processTimers (node:internal/timers:523:7) - at Axios.request (file:///Users/apple/codeit-mission1/6-sprint-mission/SprintMission2/node_modules/axios/lib/core/Axios.js:45:41) - at async file:///Users/apple/codeit-mission1/6-sprint-mission/SprintMission2/main.js:6:17 { -*/ -async function atcService() { - console.log(`-------------GET/ArticleList-------------`); - const atcList = await AtcService.getArticleList({ - page: null, - pageSize: null, - keyword: null, - }); - console.log(atcList); - - console.log(`-------------GET/Article/id-------------`); - const atcId = await AtcService.getArticle(`4852`); - console.log(atcId); - - console.log(`-------------POST/ArticleData-------------`); - const atcData = { - title: `제 목`, - content: `내 용`, - image: 'https://ex.com', - }; - const postArticle = await AtcService.createArticle(atcData); - console.log(postArticle); - - console.log(`-------------PATCH/Article/id-------------`); - const atcPatch = await AtcService.patchArticle(4852, { - title: `제 목(수정)`, - }); - console.log(atcPatch); - - console.log(`-------------DELETE/Article/id-------------`); - const atcDeleteId = await AtcService.deleteArticle('5084'); - console.log(atcDeleteId); -} -/*저는 이번에 미션 진행하면서 크게 세 가지(클래스,클래스함수,호출부)의 성격을 가진 모듈들이 서로 어떤 관계성을 가지고 상호작용하는지 궁금했는데요. -클래스를 왜만들고 서비스함수를 만들어서 호출부에서 어떻게 다뤄야하는지 잘 이해가 안됐어요. 그래서 멘토링 때 말씀드렸던 -import/export해야할 상황이나 목적에 대해서 헷갈렸던 것 같습니다. - -모범답안을 보니 호출부에서 product클래스만 import해서 활용하고있는데 그 목적을 보면 상품의 종류를 나눠 다루기 위한 것으로 -이해됩니다. 반면 article함수 쪽을 확인하면 article 클래스를 활용하고 있지 않고있으면서 export하고있습니다. -이 article클래스가 어떻게 활용될 것인지 왜 export하고 있는지 궁금합니다. product 쪽도 마찬가지겠지만 상품의 -종류를 나누는 코드가 없었다면 article 클래스와 마찬가지로 그 모듈이 하는 역할에 대해 궁금했을 것입니다. - -단순히 코드만 보면 api를 통해 받아온 정보들을 class에 담아 검증, 캡슐화 등등 정리하고 배열하는 것 같은데 이해하는게 맞는지, -아니라면 어떻게 활용되는 것인지 궁금합니다. -(article 클래스는 이번 미션 단계에서 활용하지 않지만 다음 미션에서는 활용하기에 export 한 것인지 궁금합니다.)*/ - -/*prdtsModel 호출부는 학습하다 잘 모르겠는 도중에 모범답안이 나와, 확인 후에 코드 구동 원리를 이해하고자 했습니다. -호출하는 것까지는 어려움이 없었는데, 태그를 통한 상품 분류에서 많이 헤멘 것 같습니다. 상품을 배열로 놓고 순회하는 것, -for문에서 prdt는 단수형 prdts는 복수형같은 네이밍을 해야하는 것, 리터럴을 { list: prdts }로 지정해야하는 것, -이러한 부분들을 놓쳤던 것 같습니다. 이 부분들도 같이 설명해주시면 감사할 것 같습니다.*/ - -async function prdtsModel() { - console.log(`-------------GET/Products------------`); - const { list: prdts } = await ProductService.getProductList({ - page: null, - pageSize: null, - keyword: '', - }); - console.log(prdts); - const prdtList = []; - for (const prdt of prdts) { - let product; - if (prdt.tags.includes('전자제품')) { - product = new ElectronicProduct(prdt); - } else { - product = new Product(prdt); - } - prdtList.push(product); - } - console.log(prdtList); -} - -async function prdtService() { - console.log(`-------------GET/ProductList-------------`); - const prdtList = await ProductService.getProductList({ - page: null, - pageSize: null, - keyword: '', - }); - console.log(prdtList); - - console.log(`-------------GET/Product/id-------------`); - const prdtid = await ProductService.getProduct('2571'); - console.log(prdtid); - - console.log(`-------------POST/Product/Data-------------`); - const prdtPost = await ProductService.createProduct({ - name: '스피커', - description: '택배비 무료', - price: 40000, - tags: '전자제품', - images: 'https://example.com', - }); - console.log(prdtPost); - - console.log(`-------------PATCH/Product/Data-------------`); - const prdtPatch = await ProductService.patchProduct(2589, { - name: '스피커', - description: '택배비 유료', - price: 43000, - tags: '전자제품', - images: 'https://example.com', - }); - console.log(prdtPatch); - - console.log(`-------------DELETE/Product/Data-------------`); - const prdtDelete = await ProductService.deleteProduct(2622); - console.log(prdtDelete); -} -/* 모범 답안에서 호출부를 단순화하는 것 같아 보고 활용했습니다. */ -async function test() { - await atcService(); - await prdtsModel(); - await prdtService(); -} - -test(); diff --git a/mission2/package-lock.json b/mission2/package-lock.json deleted file mode 100644 index 439604311..000000000 --- a/mission2/package-lock.json +++ /dev/null @@ -1,318 +0,0 @@ -{ - "name": "6-sprint-mission", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "6-sprint-mission", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "asynckit": "^0.4.0", - "axios": "^1.12.2", - "call-bind-apply-helpers": "^1.0.2", - "combined-stream": "^1.0.8", - "delayed-stream": "^1.0.0", - "dunder-proto": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "follow-redirects": "^1.15.11", - "form-data": "^4.0.4", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0", - "mime-db": "^1.52.0", - "mime-types": "^2.1.35", - "proxy-from-env": "^1.1.0" - }, - "devDependencies": {} - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - } - } -} diff --git a/mission2/package.json b/mission2/package.json deleted file mode 100644 index 12104d51c..000000000 --- a/mission2/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "6-sprint-mission", - "version": "1.0.0", - "description": "", - "homepage": "https://github.com/chamysj/6-sprint-mission#readme", - "bugs": { - "url": "https://github.com/chamysj/6-sprint-mission/issues" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/chamysj/6-sprint-mission.git" - }, - "license": "ISC", - "author": "", - "type": "module", - "main": "main.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "dependencies": { - "asynckit": "^0.4.0", - "axios": "^1.12.2", - "call-bind-apply-helpers": "^1.0.2", - "combined-stream": "^1.0.8", - "delayed-stream": "^1.0.0", - "dunder-proto": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "follow-redirects": "^1.15.11", - "form-data": "^4.0.4", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0", - "mime-db": "^1.52.0", - "mime-types": "^2.1.35", - "proxy-from-env": "^1.1.0" - }, - "devDependencies": {} -} diff --git a/mission2/product.js b/mission2/product.js deleted file mode 100644 index 9c646b8c4..000000000 --- a/mission2/product.js +++ /dev/null @@ -1,25 +0,0 @@ -export class Product { - #favoriteCount; //캡슐화 - constructor( - name, - description, - price, - tags = [], - images = [], - favoriteCount = 0 - ) { - this.name = name; //상품명 - this.description = description; //상품 설명 - this.price = price; //판매 가격 - this.tags = tags; //해시태그 - this.images = images; //이미지 - this.#favoriteCount = favoriteCount; //찜하기 수 - } - //찜하기 수 (증가) - favorite() { - this.#favoriteCount += 1; - } - getfavoriteCount() { - return this.#favoriteCount; - } -} diff --git a/mission2/readMe.md b/mission2/readMe.md deleted file mode 100644 index a42e1d622..000000000 --- a/mission2/readMe.md +++ /dev/null @@ -1,12 +0,0 @@ -# Node.js 6기 스프린트미션2 - -api 함수 구현하기 -git과 github 활용하기 - ---- - -### 스프린터 - -이름 : 최민수 -E-mail : chamysj@naver.com -제출일자 : 2025.10.17. diff --git a/mission3/.DS_Store b/mission3/.DS_Store deleted file mode 100644 index 20471fd0d35c44723e0d7918689be85299285ac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKO>fgc5S>i|anvFO38Y>st;98yK&nU;7Zb{XD@JgDD%i1AOx@imPRJpO}XU5sLS+AFf#AuN|CF&AU05#a?pt(lOxX~?XcuyNB zY>hFUlctmwRBT1F<9}qptlcgtyJ{I-UB8UV*M*)Wg-#G-{va=)2fwYrBDzmgifKY; zXiq7l$5?f3`v>%eO4zDa;YY2)Zmq%%d1Ako*F^OhO*X5G@7G5q%W~>x@iUngc{%U* ze~Cu3b?0t7Xa_sNN%UDSqj@}El%sg|!Svp0T_l%woV?4k<+%IcrB?GeSJ})ag7l;R9f2H$PEOYpfm37tyY8KpeF~1!*x%tj-K^<@^CO*uRFoRM^B!=8J`vB zN`J#IhY0KVt> z7{aB)FMV9-v2y6rN%+f$@J|;0h9d0KQD53{5}`wGnE_^ClYyq|cFpgN0ZW)k<9 z0cPM=24.0.0", - "npm": ">=10" - } - }, - "node_modules/@prisma/client": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", - "integrity": "sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==", - "hasInstallScript": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.13" - }, - "peerDependencies": { - "prisma": "*" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } - } - }, - "node_modules/@prisma/debug": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz", - "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/engines": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.22.0.tgz", - "integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==", - "devOptional": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "5.22.0", - "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", - "@prisma/fetch-engine": "5.22.0", - "@prisma/get-platform": "5.22.0" - } - }, - "node_modules/@prisma/engines-version": { - "version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz", - "integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/fetch-engine": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz", - "integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "5.22.0", - "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", - "@prisma/get-platform": "5.22.0" - } - }, - "node_modules/@prisma/get-platform": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.22.0.tgz", - "integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "5.22.0" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "license": "MIT" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-list-endpoints": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/express-list-endpoints/-/express-list-endpoints-7.1.1.tgz", - "integrity": "sha512-SA6YHH1r6DrioJ4fFJNqiwu1FweGFqJZO9KBApMzwPosoSGPOX2AW0wiMepOXjojjEXDuP9whIvckomheErbJA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true, - "license": "ISC" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-uuid": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-uuid/-/is-uuid-1.0.2.tgz", - "integrity": "sha512-tCByphFcJgf2qmiMo5hMCgNAquNSagOetVetDvBXswGkNfoyEMvGH1yDlF8cbZbKnbVBr4Y5/rlpMz9umxyBkQ==", - "license": "MIT" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", - "license": "MIT", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.6.0", - "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">= 10.16.0" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nodemon": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", - "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prisma": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz", - "integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==", - "devOptional": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/engines": "5.22.0" - }, - "bin": { - "prisma": "build/index.js" - }, - "engines": { - "node": ">=16.13" - }, - "optionalDependencies": { - "fsevents": "2.3.3" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/superstruct": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", - "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "license": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - } - } -} diff --git a/mission3/package.json b/mission3/package.json deleted file mode 100644 index 7f36cb2ef..000000000 --- a/mission3/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "sprint-mission3", - "version": "1.0.0", - "description": "", - "keywords": [], - "license": "ISC", - "author": "", - "type": "module", - "main": "main.js", - "scripts": { - "dev": "nodemon src/main.js", - "start": "node src/main.js" - }, - "dependencies": { - "@faker-js/faker": "^10.1.0", - "@prisma/client": "^5.4.2", - "cors": "^2.8.5", - "dotenv": "^16.6.1", - "express": "^4.21.2", - "express-list-endpoints": "^7.1.1", - "is-uuid": "^1.0.2", - "multer": "^2.0.2", - "superstruct": "^1.0.3" - }, - "devDependencies": { - "nodemon": "^3.1.10", - "prisma": "^5.22.0" - }, - "prisma": { - "schema": "src/prisma/schema.prisma", - "seed": "node src/prisma/seed.js" - } -} diff --git a/mission3/src/.DS_Store b/mission3/src/.DS_Store deleted file mode 100644 index 729d5072745c4a6750692ae0ecd5e4bfe0835020..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeI1!H&}~5QfKX*`%sKJ%H2;QY5a`QZ`j3#3hvFz?C9601C;rVguQ@YEpWrD&-9C zz$AS*1Vvz1_V3y=aq`(tIw=u}@p5{Ls7FLDGHbVk;)2BeoVQZL zv|ND-_!AX0r;x%2sXW=TwhfkmC143y0+xU!@HY^^Gn)S_zzBlwon@!ujcH`!qhvDn=ER%25Rg*Bc9=fc*pO^1Y+ri|`WRayZ zdkG8nZh}=p@%N;}b@WvEI&?-6>@qr}S9Pv}N2^*N;GN3?);W9Cj{Lc1>!=x9V&*QG zu?C-I^~g2re`Ka=S5=!K2ON1_FR{jpI(xMf-dA>l1G_oqRARoSTh_b-eqgxcvsPV+A4}gJJf2mdPBK!Pj8a7!1`y7Pr zXdO?E#~4OGnzzT}SldH>fy{~RO0CKT1)FfY3df=6e;A_fnZCeisTDm)_J@GNU<*s& Hj}rI_f`&Hu diff --git a/mission3/src/controllers/articleController.js b/mission3/src/controllers/articleController.js deleted file mode 100644 index 17a5e4a62..000000000 --- a/mission3/src/controllers/articleController.js +++ /dev/null @@ -1,129 +0,0 @@ -import { CreateArticleStruct, PatchArticleStruct } from '../structs/articleStructs.js'; -import { create } from 'superstruct'; -import { PrismaClient } from '@prisma/client'; -import { IdParamsStruct } from '../structs/productStructs.js'; -import { CreateCommentStruct } from '../structs/commentStructs.js'; - -const prisma = new PrismaClient(); - -export async function validateCreateArticle(req, res) { - const data = create(req.body, CreateArticleStruct); - const article = await prisma.article.create({ data }); - return res.status(201).send(article); -} - -export async function validateGetArticle(req, res) { - const { id } = create(req.params, IdParamsStruct); - const article = await prisma.article.findUnique({ where: { id } }); - return res.send(article); -} - -export async function validatePatchArticle(req, res) { - const { id } = create(req.params, IdParamsStruct); - const data = create(req.body, PatchArticleStruct); - await prisma.article.findUnique({ where: { id } }); - const updateArticle = await prisma.article.update({ where: { id }, data }); - return res.json({ message: '수정에 성공했습니다.', data: updateArticle }); -} - -export async function validateDeleteArticle(req, res) { - const { id } = create(req.params, IdParamsStruct); - const article = await prisma.article.findUnique({ where: { id } }); - return res.json({ message: '삭제에 성공했습니다.', data: article }); -} - -export async function validateGetArticles(req, res) { - const { offset = 0, limit = 10, order = 'newest', includeWord = '' } = req.query; - let orderBy; - switch (order) { - case 'oldest': - orderBy = { createdAt: 'asc' }; - break; - case 'newest': - default: - orderBy = { createdAt: 'desc' }; - } - const findWord = String(includeWord || '').trim(); - const where = findWord - ? { - OR: [ - { title: { contains: findWord, mode: 'insensitive' } }, - { content: { contains: findWord, mode: 'insensitive' } }, - ], - } - : {}; - const articles = await prisma.article.findMany({ - where, - orderBy, - skip: parseInt(offset), - take: parseInt(limit), - }); - return res.send(articles); -} - -export async function validateCreateComment(req, res) { - const { id: articleId } = create(req.params, IdParamsStruct); //구조 분해 할당 - const { content, nickname } = create(req.body, CreateCommentStruct); - const nick = String(nickname ?? '').trim(); - if (!nick) { - return res - .status(400) //400은 요청이 잘못된 문법이거나, 유청값이 유효하지 않을 때 - .json({ message: 'nickname을 작성해주세요.' }); - } - const anon = await prisma.nickname.upsert({ - //nicknmae 컬럼에 @unique같은 제약이 있어야 upsert가 올바르게 작동함 - where: { nickname: nick }, // 스키마 필드명이 `nickname`일 때 - update: {}, - create: { nickname: nick }, - }); - const articleComment = await prisma.articleComment.create({ - data: { - content, - article: { connect: { id: articleId } }, // article 연결 , connect는 prisma의 관계 api임 - nickname: { connect: { id: anon.id } }, // nickname 연결 , connect는 의도를 명확히 함, 관계 대상의 레코드 존재여부를 명시적으로 체크하는 장점이 있음 - nicknameText: anon.nickname, //프리즈마 스튜디오에서 nickname확인하기 위함임 - }, - //select지정하지 않으면 기본 스칼라 필드 반환, include나 select는 관계를 포함함 - select: { - id: true, - content: true, - createdAt: true, - updatedAt: true, - nickname: true, - nicknameText: true, - }, - }); - return res.status(201).json({ message: '댓글 등록에 성공했습니다.', data: articleComment }); -} - -/*커서 페이지네이션이 무한 스크롤로 이해하고있습니다. 비유를 하자면 일종의 책갈피를 꽂아두고 이후에 생성된(desc니까 내림차순) -댓글을 불러오도록 하는 것으로 이해했습니다. 그런데 여기서 잘 이해가 되지 않는 것은 다음페이지를 불러오는 로직인데 hasmore로 -limit +1 해서, 있다면 불러오고 없다면 false를 반환하는 것, 다음 커서를 불러올 때 그 커서가 다시 레코드에 포함되니까 옵션으로 skip =1을 준것이 맞을까요 -그리고 마지막 커서는 자동으로 db를 통해 지정?되는 것으로 이해를 했는데요. 그것도 맞을까요? 이 기능이 prisma studio에서 showing에 해당하는 기능인가요? -ai로 학습하고 로직생각해보고 코드 수정 및 디벨롭 하다보니 가끔 이게 맞나 싶은 것들이 있어서 주석 남겨봅니다ㅠ -또 ai는 옵셔널체이닝, 널리시 코얼레싱?을 굉장이 많이 쓰더라구요. 실무에서도 많이 쓰이나요?*/ - -export async function getArticleComments(req, res) { - const { id: articleId } = create(req.params, IdParamsStruct); - const limit = Math.min(50, Math.max(1, parseInt(req.query.limit ?? '10', 10))); - const cursor = req.query.cursor ? String(req.query.cursor) : undefined; - const findOptions = { - where: { articleId }, - orderBy: [{ createdAt: 'desc' }, { id: 'desc' }], - take: limit + 1, // hasMore 판별용으로 하나 더 불러오기 - select: { - id: true, - content: true, - createdAt: true, - }, - }; - if (cursor) { - findOptions.cursor = { id: cursor }; - findOptions.skip = 1; // cursor로 지정된 레코드는 결과에서 제외 - } - const rows = await prisma.articleComment.findMany(findOptions); - const hasMore = rows.length > limit; - const results = hasMore ? rows.slice(0, limit) : rows; - const nextCursor = hasMore ? results[results.length - 1].id : null; - return res.json({ data: results, nextCursor, hasMore }); -} diff --git a/mission3/src/controllers/commentController.js b/mission3/src/controllers/commentController.js deleted file mode 100644 index 07cf62d1d..000000000 --- a/mission3/src/controllers/commentController.js +++ /dev/null @@ -1,67 +0,0 @@ -import { create } from 'superstruct'; -import { PrismaClient } from '@prisma/client'; -import { CommentIdStruct, PatchCommentStruct } from '../structs/commentStructs.js'; - -const prisma = new PrismaClient(); - -async function findCommentModel(id) { - const article = await prisma.articleComment.findUnique({ - where: { id }, - select: { id: true }, - }); - if (article) return 'article'; - - const product = await prisma.productComment.findUnique({ - where: { id }, - select: { id: true }, - }); - if (product) return 'product'; - - return null; -} - -export async function patchComment(req, res) { - const { id } = create(req.params, CommentIdStruct); - const { content } = create(req.body, PatchCommentStruct); - const trimmed = String(content ?? '').trim(); - const model = await findCommentModel(id); - const include = { nickname: { select: { nickname: true } } }; - const updated = - model === 'article' - ? await prisma.articleComment.update({ where: { id }, data: { content: trimmed }, include }) - : await prisma.productComment.update({ where: { id }, data: { content: trimmed }, include }); - const displayNickname = updated.nickname?.nickname ?? updated.nicknameText ?? null; - - return res.json({ - message: '수정됨', - data: { - id: updated.id, - content: updated.content, - nickname: displayNickname, - createdAt: updated.createdAt, - updatedAt: updated.updatedAt, - }, - }); -} - -export async function deleteComment(req, res) { - const { id } = create(req.params, CommentIdStruct); - const model = await findCommentModel(id); - const include = { nickname: { select: { nickname: true } } }; - const deleted = - model === 'article' - ? await prisma.articleComment.delete({ where: { id }, include }) - : await prisma.productComment.delete({ where: { id }, include }); - const displayNickname = deleted.nickname?.nickname ?? deleted.nicknameText ?? null; - - return res.json({ - message: '삭제됨', - data: { - id: deleted.id, - content: deleted.content, - nickname: displayNickname, - createdAt: deleted.createdAt, - updatedAt: deleted.updatedAt, - }, - }); -} diff --git a/mission3/src/controllers/errorController.js b/mission3/src/controllers/errorController.js deleted file mode 100644 index b6dc8a288..000000000 --- a/mission3/src/controllers/errorController.js +++ /dev/null @@ -1,14 +0,0 @@ -import { Prisma } from '@prisma/client'; -import { StructError } from 'superstruct'; - -export function errorHandler(err, req, res, next) { - if (err instanceof Prisma.PrismaClientKnownRequestError && err.code === 'P2025') { - return res.sendStatus(404); - } else if (err instanceof Prisma.PrismaClientKnownRequestError && err.code === 'P2002') { - return res.status(400).send({ message: err.message }); - } else if (err.name === 'StructError' || err instanceof StructError) { - return res.status(400).send({ message: err.message }); - } else { - return res.status(500).send({ message: err.message }); - } -} diff --git a/mission3/src/controllers/imageController.js b/mission3/src/controllers/imageController.js deleted file mode 100644 index 44f189380..000000000 --- a/mission3/src/controllers/imageController.js +++ /dev/null @@ -1,5 +0,0 @@ -export async function imageUpload(req, res) { - const { filename } = req.file; - const path = `files/${filename}`; - return res.status(201).json({ message: '업로드 성공', path }); -} diff --git a/mission3/src/controllers/productController.js b/mission3/src/controllers/productController.js deleted file mode 100644 index c693d8171..000000000 --- a/mission3/src/controllers/productController.js +++ /dev/null @@ -1,121 +0,0 @@ -import { create } from 'superstruct'; -import { - CreateProductStruct, - IdParamsStruct, - PatchProductStruct, -} from '../structs/productStructs.js'; -import { PrismaClient } from '@prisma/client'; -import { CreateCommentStruct } from '../structs/commentStructs.js'; - -const prisma = new PrismaClient(); - -export async function validateCreateProduct(req, res) { - const data = create(req.body, CreateProductStruct); - const product = await prisma.product.create({ data }); - return res.status(201).send(product); -} - -export async function validateGetProduct(req, res) { - const { id } = create(req.params, IdParamsStruct); - const product = await prisma.product.findUnique({ where: { id } }); - return res.send(product); -} - -export async function validatePatchProduct(req, res) { - const { id } = create(req.params, IdParamsStruct); - const data = create(req.body, PatchProductStruct); - await prisma.product.findUnique({ where: { id } }); - const updateProduct = await prisma.product.update({ where: { id }, data }); - return res.json({ message: '수정에 성공했습니다.', data: updateProduct }); -} - -export async function validateDeleteProduct(req, res) { - const { id } = create(req.params, IdParamsStruct); - const product = await prisma.product.findUnique({ where: { id } }); - return res.json({ message: '삭제에 성공했습니다.', data: product }); -} - -export async function validateGetProducts(req, res) { - const { offset = 0, limit = 10, order = 'newest', includeWord = '' } = req.query; - let orderBy; - switch (order) { - case 'oldest': - orderBy = { createdAt: 'asc' }; - break; - case 'newest': - default: - orderBy = { createdAt: 'desc' }; - } - const findWord = String(includeWord || '').trim(); - const where = findWord - ? { - OR: [ - { name: { contains: findWord, mode: 'insensitive' } }, - { description: { contains: findWord, mode: 'insensitive' } }, - ], - } - : {}; - const products = await prisma.product.findMany({ - where, - orderBy, - skip: parseInt(offset), - take: parseInt(limit), - }); - return res.send(products); -} - -export async function validateCreateComment(req, res) { - const { id: productId } = create(req.params, IdParamsStruct); - const { content, nickname } = create(req.body, CreateCommentStruct); - const nick = String(nickname ?? '').trim(); - if (!nick) { - return res.status(400).json({ message: 'nickname을 작성해주세요.' }); - } - const anon = await prisma.nickname.upsert({ - where: { nickname: nick }, - update: {}, - create: { nickname: nick }, - }); - const productComment = await prisma.productComment.create({ - data: { - content, - product: { connect: { id: productId } }, - nickname: { connect: { id: anon.id } }, - nicknameText: anon.nickname, - }, - select: { - id: true, - content: true, - createdAt: true, - updatedAt: true, - nickname: true, - nicknameText: true, - }, - }); - return res.status(201).json({ message: '댓글 등록에 성공했습니다.', data: productComment }); -} - -export async function getProductComments(req, res) { - const { id: productId } = create(req.params, IdParamsStruct); - const limit = Math.min(50, Math.max(1, parseInt(req.query.limit ?? '10', 10))); - const cursor = req.query.cursor ? String(req.query.cursor) : undefined; - const findOptions = { - where: { productId }, - orderBy: [{ createdAt: 'desc' }, { id: 'desc' }], - take: limit + 1, - select: { - id: true, - content: true, - createdAt: true, - }, - }; - if (cursor) { - findOptions.cursor = { id: cursor }; - findOptions.skip = 1; - } - const rows = await prisma.productComment.findMany(findOptions); - const hasMore = rows.length > limit; - const results = hasMore ? rows.slice(0, limit) : rows; - const nextCursor = hasMore ? results[results.length - 1].id : null; - return res.json({ data: results, nextCursor, hasMore }); -} diff --git a/mission3/src/lib/asyncHandler.js b/mission3/src/lib/asyncHandler.js deleted file mode 100644 index e3762d3b1..000000000 --- a/mission3/src/lib/asyncHandler.js +++ /dev/null @@ -1,9 +0,0 @@ -export function asyncHandler(handler) { - return async function (req, res, next) { - try { - await handler(req, res); - } catch (error) { - next(error); - } - }; -} diff --git a/mission3/src/lib/constants.js b/mission3/src/lib/constants.js deleted file mode 100644 index 76513a384..000000000 --- a/mission3/src/lib/constants.js +++ /dev/null @@ -1,7 +0,0 @@ -import dotenv from 'dotenv'; -dotenv.config(); - -export const DATABASE_URL = process.env.DATABASE_URL; -export const PORT = process.env.PORT || 3000; -export const PUBLIC_PATH = 'uploads'; -export const STATIC_PATH = '/uploads'; diff --git a/mission3/src/main.js b/mission3/src/main.js deleted file mode 100644 index 001cbc452..000000000 --- a/mission3/src/main.js +++ /dev/null @@ -1,29 +0,0 @@ -import express from 'express'; -import { PrismaClient } from '@prisma/client'; -import cors from 'cors'; -import commentRouter from './routers/commentRouter.js'; -import productRouter from './routers/productRouter.js'; -import articleRouter from './routers/articleRouter.js'; -import { imageRouter } from './routers/imageRouter.js'; -import { PUBLIC_PATH, STATIC_PATH } from './lib/constants.js'; -import path from 'path'; -import { errorHandler } from './controllers/errorController.js'; - -const PORT = 3000; -const app = express(); - -app.use(express.json()); -app.use(cors()); -app.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH))); - -const prisma = new PrismaClient(); - -app.use('/articles', articleRouter); -app.use('/comments', commentRouter); -app.use('/products', productRouter); -app.use('/images', imageRouter); -app.use(errorHandler); - -app.listen(PORT, () => { - console.log('Server Started'); -}); diff --git a/mission3/src/prisma/migrations/20251027092554_base_schema/migration.sql b/mission3/src/prisma/migrations/20251027092554_base_schema/migration.sql deleted file mode 100644 index 7e0ed1bab..000000000 --- a/mission3/src/prisma/migrations/20251027092554_base_schema/migration.sql +++ /dev/null @@ -1,26 +0,0 @@ --- CreateEnum -CREATE TYPE "Tag" AS ENUM ('SPORTS', 'BEAUTY', 'FURNITURE', 'FASHION', 'ELECTRONICS'); - --- CreateTable -CREATE TABLE "Product" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "description" TEXT, - "price" DOUBLE PRECISION NOT NULL, - "tags" "Tag" NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "Product_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Article" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "content" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "Article_pkey" PRIMARY KEY ("id") -); diff --git a/mission3/src/prisma/migrations/20251028062500_alter_schema/migration.sql b/mission3/src/prisma/migrations/20251028062500_alter_schema/migration.sql deleted file mode 100644 index 1526b1b5f..000000000 --- a/mission3/src/prisma/migrations/20251028062500_alter_schema/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* - Warnings: - - - The values [BEAUTY] on the enum `Tag` will be removed. If these variants are still used in the database, this will fail. - -*/ --- AlterEnum -BEGIN; -CREATE TYPE "Tag_new" AS ENUM ('SPORTS', 'INSTRUMENTS', 'FURNITURE', 'FASHION', 'ELECTRONICS'); -ALTER TABLE "Product" ALTER COLUMN "tags" TYPE "Tag_new" USING ("tags"::text::"Tag_new"); -ALTER TYPE "Tag" RENAME TO "Tag_old"; -ALTER TYPE "Tag_new" RENAME TO "Tag"; -DROP TYPE "Tag_old"; -COMMIT; diff --git a/mission3/src/prisma/migrations/20251031044353_add_model_nickname_and_comments/migration.sql b/mission3/src/prisma/migrations/20251031044353_add_model_nickname_and_comments/migration.sql deleted file mode 100644 index 996e9263e..000000000 --- a/mission3/src/prisma/migrations/20251031044353_add_model_nickname_and_comments/migration.sql +++ /dev/null @@ -1,48 +0,0 @@ --- CreateTable -CREATE TABLE "ProductComment" ( - "id" TEXT NOT NULL, - "content" TEXT NOT NULL, - "nicknameId" TEXT, - "productId" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "ProductComment_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "ArticleComment" ( - "id" TEXT NOT NULL, - "content" TEXT NOT NULL, - "nicknameId" TEXT, - "articleId" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "ArticleComment_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Nickname" ( - "id" TEXT NOT NULL, - "nickname" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "Nickname_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "Nickname_nickname_key" ON "Nickname"("nickname"); - --- AddForeignKey -ALTER TABLE "ProductComment" ADD CONSTRAINT "ProductComment_nicknameId_fkey" FOREIGN KEY ("nicknameId") REFERENCES "Nickname"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "ProductComment" ADD CONSTRAINT "ProductComment_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "ArticleComment" ADD CONSTRAINT "ArticleComment_nicknameId_fkey" FOREIGN KEY ("nicknameId") REFERENCES "Nickname"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "ArticleComment" ADD CONSTRAINT "ArticleComment_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/mission3/src/prisma/migrations/20251031080723_add_nickname_text/migration.sql b/mission3/src/prisma/migrations/20251031080723_add_nickname_text/migration.sql deleted file mode 100644 index 813667578..000000000 --- a/mission3/src/prisma/migrations/20251031080723_add_nickname_text/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- AlterTable -ALTER TABLE "ArticleComment" ADD COLUMN "nicknameText" TEXT; - --- AlterTable -ALTER TABLE "ProductComment" ADD COLUMN "nicknameText" TEXT; diff --git a/mission3/src/prisma/migrations/migration_lock.toml b/mission3/src/prisma/migrations/migration_lock.toml deleted file mode 100644 index fbffa92c2..000000000 --- a/mission3/src/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "postgresql" \ No newline at end of file diff --git a/mission3/src/prisma/mock.js b/mission3/src/prisma/mock.js deleted file mode 100644 index 3db055735..000000000 --- a/mission3/src/prisma/mock.js +++ /dev/null @@ -1,358 +0,0 @@ -export const PRODUCTS = [ - { - id: '6f435dde-97e7-4810-9199-69aaae5ae0a5', - name: '맥북 에어2', - description: '2025년 형', - price: 800000, - tags: 'ELECTRONICS', - createdAt: '2025-10-28T05:22:55.473Z', - updatedAt: '2025-10-28T05:22:55.473Z', - }, - { - id: '6b3d18c5-0e54-4ce8-860e-35fc9510a22f', - name: '래빗 체어', - description: '스테파노 지오반노니가 디자인한 제품', - price: 200000, - tags: 'FURNITURE', - createdAt: '2025-10-28T05:30:09.501Z', - updatedAt: '2025-10-28T05:30:09.501Z', - }, - { - id: 'd3f7e5ee-a1b7-45ff-9841-16f8a259ecf6', - name: '3단 수납 침대', - description: '템바보드의 고급스러움과 패브릭의 아늑함을 가득 담은 침대', - price: 220000, - tags: 'FURNITURE', - createdAt: '2025-10-28T05:38:43.363Z', - updatedAt: '2025-10-28T05:38:43.363Z', - }, - { - id: 'fe2b99ce-9cff-4068-a3fc-6c12506984a4', - name: '겟우드 침대 더블', - description: '튼튼한 철제프레임에 심할하고 내추럴한 나무 느낌을 더한 고급스러운 침대', - price: 140000, - tags: 'FURNITURE', - createdAt: '2025-10-28T05:40:57.994Z', - updatedAt: '2025-10-28T05:40:57.994Z', - }, - { - id: '626c8adf-90fa-4722-9dea-1578061235bb', - name: '시몬스 자스민 침대 매트리스', - description: '최상의 편안함과 여유로움', - price: 1720000, - tags: 'FURNITURE', - createdAt: '2025-10-28T05:44:22.667Z', - updatedAt: '2025-10-28T05:44:22.667Z', - }, - { - id: 'e717e3ab-3ab3-4312-a437-5ca9d9e900cf', - name: '누베스 아쿠아텍스 패브릭 2인용 소파', - description: '당신의 지친 몸과 마음을 포근히 감싸줄 침대 같은 편안함을 제공합니다.', - price: 230000, - tags: 'FURNITURE', - createdAt: '2025-10-28T05:46:24.848Z', - updatedAt: '2025-10-28T05:46:24.848Z', - }, - { - id: 'b2978e84-6622-4f3f-a2a5-a815be5a743a', - name: 'Whale chair', - description: '실내외용으로 사용 가능하며, 고래 꼬리를 잡고 쉽게 움직일 수 있는 의자입니다.', - price: 350000, - tags: 'FURNITURE', - createdAt: '2025-10-28T05:48:25.265Z', - updatedAt: '2025-10-28T05:48:25.265Z', - }, - { - id: '29d7cbdc-1942-4a88-a79b-471ced47a7aa', - name: '루아즈 가정용 턱걸이 바', - description: '무틀 손상없이 강력한 밀착력!', - price: 9000, - tags: 'SPORTS', - createdAt: '2025-10-28T05:54:00.424Z', - updatedAt: '2025-10-28T05:54:00.424Z', - }, - { - id: '49d41154-b217-411f-9a6b-e103526b2a72', - name: '코멧 스포츠 컴포트 폼롤러', - description: '탄탄한 쿠션감이 주는 편안한 자극!', - price: 12000, - tags: 'SPORTS', - createdAt: '2025-10-28T06:01:24.931Z', - updatedAt: '2025-10-28T06:01:24.931Z', - }, - { - id: '0ef28c73-4e93-495c-a272-1a06a1f35a3a', - name: '가정용 철봉 딥스바', - description: - '직접 조립하며 느낄 수 있는 즐거움과 견고함, 합리성을 느낄 수 있는 조립상품입니다.', - price: 140000, - tags: 'SPORTS', - createdAt: '2025-10-28T06:03:34.306Z', - updatedAt: '2025-10-28T06:03:34.306Z', - }, - { - id: 'ed210053-ae39-4202-86d1-5880423e5bd1', - name: '접이식 실내 자전거', - description: '핸들을 없애고, 코어근육을 사용해 기존 제품보다 빠르게 칼로리를 소모합니다.', - price: 400000, - tags: 'SPORTS', - createdAt: '2025-10-28T06:05:51.244Z', - updatedAt: '2025-10-28T06:05:51.244Z', - }, - { - id: '07bd8550-63ae-44b3-b6a0-bf128831f0a6', - name: '아디다스 축구화', - description: '남녀공용, 인조잔디에 적합한 아웃솔', - price: 64000, - tags: 'SPORTS', - createdAt: '2025-10-28T06:07:43.974Z', - updatedAt: '2025-10-28T06:07:43.974Z', - }, - { - id: '8d88ed1f-e49a-4481-8394-cdb54a1c604e', - name: '아이워너 ab코어 휠', - description: '밀고 당기는 간단한 동작으로 팔,어깨,복근 운동을 한번에 할 수 있습니다.', - price: 8000, - tags: 'SPORTS', - createdAt: '2025-10-28T06:09:44.963Z', - updatedAt: '2025-10-28T06:09:44.963Z', - }, - { - id: '85a474ea-a3f5-4f6d-ac4e-756c309395bb', - name: '바이올린 초보자 기본형', - description: '수제 제작 성인용 바이올린!', - price: 130000, - tags: 'INSTRUMENTS', - createdAt: '2025-10-28T06:25:42.708Z', - updatedAt: '2025-10-28T06:25:42.708Z', - }, - { - id: '11ca3bc8-f928-4dd6-a947-1890df68fbd6', - name: '시어몬 트럼본', - description: '전공용과 연주용으로 전혀 손색 없는 제품', - price: 8000000, - tags: 'INSTRUMENTS', - createdAt: '2025-10-28T06:27:24.872Z', - updatedAt: '2025-10-28T06:27:24.872Z', - }, - { - id: '87df3958-6a32-476e-a2e9-770b6454ba68', - name: '어쿠스틱 기타', - description: '연주와 관리에 필요한 모든 액세서리 증정', - price: 150000, - tags: 'INSTRUMENTS', - createdAt: '2025-10-28T06:29:44.725Z', - updatedAt: '2025-10-28T06:29:44.725Z', - }, - { - id: '424d4cac-1ab0-43d8-ba0c-e1ebe008893a', - name: '칸타빌 통기타', - description: '풀 패키지 구성품 증정', - price: 58000, - tags: 'INSTRUMENTS', - createdAt: '2025-10-28T06:31:03.952Z', - updatedAt: '2025-10-28T06:31:03.952Z', - }, - { - id: 'e056581c-9ac9-4d6d-b9e6-ab3731792cda', - name: '하모니카', - description: '삼익악기 24홀', - price: 38000, - tags: 'INSTRUMENTS', - createdAt: '2025-10-28T06:32:18.954Z', - updatedAt: '2025-10-28T06:32:18.954Z', - }, - { - id: '9f37be61-b631-4513-a7ed-2698aee50626', - name: '트럼펫', - description: '일본 야마하 트럼펫 입문용', - price: 138000, - tags: 'INSTRUMENTS', - createdAt: '2025-10-28T06:33:35.838Z', - updatedAt: '2025-10-28T06:33:35.838Z', - }, - { - id: '22e36934-2987-479e-9b35-fb497e2cbb26', - name: '양털 하이넥 패딩', - description: '기능성 방수, 방풍, 숏 잠바', - price: 23000, - tags: 'FASHION', - createdAt: '2025-10-28T06:35:13.550Z', - updatedAt: '2025-10-28T06:35:13.550Z', - }, - { - id: 'e92c1436-c5f4-4ca2-826e-0b2331123d19', - name: '롱패딩', - description: '가볍고 따뜻한 롱패딩!', - price: 55000, - tags: 'FASHION', - createdAt: '2025-10-28T06:37:00.483Z', - updatedAt: '2025-10-28T06:37:00.483Z', - }, - { - id: '495ca8e4-7639-4089-b4d1-0b7a93837179', - name: '긴팔 니트', - description: '가볍고 따뜻하며 맨살에 입어도 부드럽습니다.', - price: 55000, - tags: 'FASHION', - createdAt: '2025-10-28T06:38:40.449Z', - updatedAt: '2025-10-28T06:38:40.449Z', - }, - { - id: 'd6717179-e9d0-4970-9e03-749889ba6e54', - name: '빅사이즈 니트', - description: '빅사이즈 외출용 간절기 니트!', - price: 22000, - tags: 'FASHION', - createdAt: '2025-10-28T06:40:26.092Z', - updatedAt: '2025-10-28T06:40:26.092Z', - }, - { - id: '40d0556c-2f2d-471f-bcc8-a2d2cfab791e', - name: '패딩 바지', - description: '겨울용 방한 바지', - price: 90000, - tags: 'FASHION', - createdAt: '2025-10-28T06:41:14.576Z', - updatedAt: '2025-10-28T06:41:14.576Z', - }, - { - id: '9426b0e2-61ef-4728-8c86-ef6279c52d66', - name: '경량 패딩', - description: '남녀공용, 가볍고 따뜻합니다.', - price: 42000, - tags: 'FASHION', - createdAt: '2025-10-28T06:42:08.467Z', - updatedAt: '2025-10-28T06:42:08.467Z', - }, - { - id: '82980f81-c3d7-42cd-bec9-4cd2f09ca71b', - name: '런닝화', - description: '남성용, 가볍고 발편한 런닝화.', - price: 35000, - tags: 'FASHION', - createdAt: '2025-10-28T06:43:36.147Z', - updatedAt: '2025-10-28T06:43:36.147Z', - }, - { - id: '5c8c75e9-0195-48e4-80bf-5f6d7ed0c438', - name: '벙거지 모자', - description: '넓은 챙, 자외선 차단 벙거지 모자', - price: 15000, - tags: 'FASHION', - createdAt: '2025-10-28T06:45:20.211Z', - updatedAt: '2025-10-28T06:45:20.211Z', - }, - { - id: '58bdc83f-79da-4dd2-9c6a-18dad5503ccc', - name: '멀티 쿠커', - description: '밥솥, 전자렌지, 오븐, 에어프라이, 찜기, 그릴 기능이 지원됩니다.', - price: 310000, - tags: 'ELECTRONICS', - createdAt: '2025-10-28T06:47:37.831Z', - updatedAt: '2025-10-28T06:47:37.831Z', - }, - { - id: '548b4025-972e-49b7-8b42-95057d95f182', - name: '마사지기', - description: '가벼운 무선 목 어깨 마사지기', - price: 30000, - tags: 'ELECTRONICS', - createdAt: '2025-10-28T06:48:34.181Z', - updatedAt: '2025-10-28T06:48:34.181Z', - }, - { - id: '959cee34-ef5d-4289-8d84-c5e7f48d5c61', - name: '스팀다리미', - description: '작지만 스팀효과는 그대로, 빠르고 간편하게 사용가능합니다.', - price: 25000, - tags: 'ELECTRONICS', - createdAt: '2025-10-28T06:50:32.047Z', - updatedAt: '2025-10-28T06:50:32.047Z', - }, - { - id: 'ce9887e7-0dc5-4dee-a798-bf3e948cec01', - name: '즉석 라면 조리기', - description: '가정용, 한강 라면 끓이는 기계', - price: 190000, - tags: 'ELECTRONICS', - createdAt: '2025-10-28T06:52:07.348Z', - updatedAt: '2025-10-28T06:52:07.348Z', - }, - { - id: '64a3067e-668b-4dd9-8d9c-d55042789db8', - name: '무선 주전자', - description: '360도 회전판, 과열 방지 기능 탑재', - price: 17000, - tags: 'ELECTRONICS', - createdAt: '2025-10-28T06:54:45.455Z', - updatedAt: '2025-10-28T06:54:45.455Z', - }, -]; - -export const ARTICLES = [ - { - id: '23b7dc34-7a6f-48a0-80b6-9a3503a3dddf', - title: '피곤하당', - content: '오늘은 좀 일찍 자야겠다.', - createdAt: '2025-10-28T07:36:13.410Z', - updatedAt: '2025-10-28T07:36:13.410Z', - }, - { - id: '187e0caf-288f-42e8-9e72-2945abdcd42f', - title: '배고파', - content: '오늘 저녁은 뭐먹지???????', - createdAt: '2025-10-28T07:41:42.085Z', - updatedAt: '2025-10-28T07:41:42.085Z', - }, - { - id: '2ddae395-27a8-4291-9152-dd6aa23e2f10', - title: '저녁 메뉴 추천 좀', - content: '이미 치킨 시킴', - createdAt: '2025-10-28T07:42:27.872Z', - updatedAt: '2025-10-28T07:42:27.872Z', - }, - { - id: 'c467c8d1-a336-4f7c-b1e2-1cda7718093d', - title: '오운완', - content: '운동만이 살길', - createdAt: '2025-10-28T07:43:58.997Z', - updatedAt: '2025-10-28T07:43:58.997Z', - }, - { - id: 'd5b27e43-fe7e-41f4-a21f-7f243fb17b30', - title: '강아지 식이알러지', - content: '우리 똥강아지 식이알러지가 있어서 괜찮은 사료 브랜드 추천 좀', - createdAt: '2025-10-28T07:45:17.039Z', - updatedAt: '2025-10-28T07:45:17.039Z', - }, - { - id: 'b76a7983-e79a-4dfa-a17f-bfa7d52e9fe3', - title: '강아지 실외배변', - content: - '똥강아지가 실외배변만 하는데 실내에서도 뉘이고 싶어요ㅠ 저랑 같은 경험 있으신 분 조언 좀 해주세요.', - createdAt: '2025-10-28T07:46:49.332Z', - updatedAt: '2025-10-28T07:46:49.332Z', - }, - { - id: '1569c142-ccd9-48c5-bdee-958bdc06379e', - title: '아 사기꾼이네!', - content: '중고마켓에서 물건 샀는데 벽돌왔음. 신고가능?', - createdAt: '2025-10-28T07:47:54.099Z', - updatedAt: '2025-10-28T07:47:54.099Z', - }, - { - id: '7d1476dd-e6fb-439f-aae0-8da282a5be9f', - title: '헐...나도 사기당함', - content: '나도 며칠 전에 사기당함..같은 판매잔가????', - createdAt: '2025-10-28T07:48:40.353Z', - updatedAt: '2025-10-28T07:48:40.353Z', - }, - { - id: '2898a4a2-41db-4e51-b9a7-adfbd6d77040', - title: '님들 따뜻한 패딩 추천 좀', - content: '가격은 10만원 이내로 이쁜걸루다가!', - createdAt: '2025-10-28T07:49:11.660Z', - updatedAt: '2025-10-28T07:49:11.660Z', - }, -]; diff --git a/mission3/src/prisma/schema.prisma b/mission3/src/prisma/schema.prisma deleted file mode 100644 index 9e665549f..000000000 --- a/mission3/src/prisma/schema.prisma +++ /dev/null @@ -1,72 +0,0 @@ -generator client { - provider = "prisma-client-js" -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -model Product { - id String @id @default(uuid()) - name String - description String? //컬럼이 null을 허용 - price Float - tags Tag - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt //자동갱신되기 때문에 updatedat사용 default now 사용하면 생성은 되지만 이후 업데이트 시 수동으로 덮어써야 함 - comments ProductComment[] -} - -//updatedAt을 쓰면 디버깅에 대한 이점이 있음, 신경쓰지 않는다면 DateTime?을 써도 됨. 권장되지는 않는 듯. -model Article { - id String @id @default(uuid()) - title String //글자 제한? - content String //글자 제한? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - comments ArticleComment[] -} - -//닉네임이 공백을 허용했기 때문에 struct에서 변수 제한해야 됨 -model ProductComment { - id String @id @default(uuid()) - content String - nickname Nickname? @relation(fields: [nicknameId], references: [id], onDelete: SetNull) - nicknameId String? - nicknameText String? - product Product @relation(fields: [productId], references: [id], onDelete: Cascade) - productId String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt -} - -model ArticleComment { - id String @id @default(uuid()) - content String - nickname Nickname? @relation(fields: [nicknameId], references: [id], onDelete: SetNull) - nicknameId String? - nicknameText String? - article Article @relation(fields: [articleId], references: [id], onDelete: Cascade) - articleId String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt -} - -//닉네임을 고유로 가지며 중복 글 작성 가능 -model Nickname { - id String @id @default(uuid()) - nickname String @unique - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - productComments ProductComment[] - articleComments ArticleComment[] -} - -enum Tag { - SPORTS - INSTRUMENTS - FURNITURE - FASHION - ELECTRONICS -} diff --git a/mission3/src/prisma/seed.js b/mission3/src/prisma/seed.js deleted file mode 100644 index 53e4e9908..000000000 --- a/mission3/src/prisma/seed.js +++ /dev/null @@ -1,26 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import { ARTICLES, PRODUCTS } from './mock.js'; - -const prisma = new PrismaClient(); - -async function main() { - await prisma.article.deleteMany(); - await prisma.product.deleteMany(); - await prisma.article.createMany({ - data: ARTICLES, - skipDuplicates: true, - }); - await prisma.product.createMany({ - data: PRODUCTS, - skipDuplicates: true, - }); -} - -main() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - await prisma.$disconnect(); - process.exit(1); - }); diff --git a/mission3/src/routers/articleRouter.js b/mission3/src/routers/articleRouter.js deleted file mode 100644 index 72b3a40a4..000000000 --- a/mission3/src/routers/articleRouter.js +++ /dev/null @@ -1,22 +0,0 @@ -import express from 'express'; -import { asyncHandler } from '../lib/asyncHandler.js'; -import { - validateCreateArticle, - validateDeleteArticle, - validateGetArticle, - validateGetArticles, - validatePatchArticle, - validateCreateComment, - getArticleComments, -} from '../controllers/articleController.js'; - -const articleRouter = express.Router(); - -articleRouter.post('/', asyncHandler(validateCreateArticle)); -articleRouter.get('/:id', asyncHandler(validateGetArticle)); -articleRouter.patch('/:id', asyncHandler(validatePatchArticle)); -articleRouter.delete('/:id', asyncHandler(validateDeleteArticle)); -articleRouter.get('/', asyncHandler(validateGetArticles)); -articleRouter.post('/:id/comments', asyncHandler(validateCreateComment)); -articleRouter.get('/:id/comments', asyncHandler(getArticleComments)); -export default articleRouter; diff --git a/mission3/src/routers/commentRouter.js b/mission3/src/routers/commentRouter.js deleted file mode 100644 index 4a295033c..000000000 --- a/mission3/src/routers/commentRouter.js +++ /dev/null @@ -1,10 +0,0 @@ -import express from 'express'; -import { asyncHandler } from '../lib/asyncHandler.js'; -import { deleteComment, patchComment } from '../controllers/commentController.js'; - -const commentRouter = express.Router(); - -commentRouter.patch('/:id', asyncHandler(patchComment)); -commentRouter.delete('/:id', asyncHandler(deleteComment)); - -export default commentRouter; diff --git a/mission3/src/routers/imageRouter.js b/mission3/src/routers/imageRouter.js deleted file mode 100644 index 979ea7f29..000000000 --- a/mission3/src/routers/imageRouter.js +++ /dev/null @@ -1,11 +0,0 @@ -import express from 'express'; -import { asyncHandler } from '../lib/asyncHandler.js'; -import multer from 'multer'; -import { imageUpload } from '../controllers/imageController.js'; - -const imageRouter = express.Router(); -const upload = multer({ dest: 'uploads/' }); - -imageRouter.post('/', upload.single('attachment'), asyncHandler(imageUpload)); - -export { imageRouter }; diff --git a/mission3/src/routers/productRouter.js b/mission3/src/routers/productRouter.js deleted file mode 100644 index 09d015d6a..000000000 --- a/mission3/src/routers/productRouter.js +++ /dev/null @@ -1,22 +0,0 @@ -import express from 'express'; -import { asyncHandler } from '../lib/asyncHandler.js'; -import { - validateCreateProduct, - validateDeleteProduct, - validateGetProduct, - validateGetProducts, - validatePatchProduct, - validateCreateComment, - getProductComments, -} from '../controllers/productController.js'; - -const productRouter = express.Router(); - -productRouter.post('/', asyncHandler(validateCreateProduct)); -productRouter.get('/:id', asyncHandler(validateGetProduct)); -productRouter.patch('/:id', asyncHandler(validatePatchProduct)); -productRouter.delete('/:id', asyncHandler(validateDeleteProduct)); -productRouter.get('/', asyncHandler(validateGetProducts)); -productRouter.post('/:id/comments', asyncHandler(validateCreateComment)); -productRouter.get('/:id/comments', asyncHandler(getProductComments)); -export default productRouter; diff --git a/mission3/src/structs/articleStructs.js b/mission3/src/structs/articleStructs.js deleted file mode 100644 index 89aedff74..000000000 --- a/mission3/src/structs/articleStructs.js +++ /dev/null @@ -1,8 +0,0 @@ -import * as s from 'superstruct'; - -export const CreateArticleStruct = s.object({ - title: s.size(s.string(), 1, 100), - content: s.size(s.string(), 1, 1200), -}); - -export const PatchArticleStruct = s.partial(CreateArticleStruct); diff --git a/mission3/src/structs/commentStructs.js b/mission3/src/structs/commentStructs.js deleted file mode 100644 index acde524a6..000000000 --- a/mission3/src/structs/commentStructs.js +++ /dev/null @@ -1,17 +0,0 @@ -import * as s from 'superstruct'; -import isUuid from 'is-uuid'; - -export const CreateCommentStruct = s.object({ - nickname: s.size(s.string(), 2, 10), - content: s.size(s.string(), 1, 300), -}); - -export const PatchCommentStruct = s.partial(CreateCommentStruct); - -export const GetCommnetList = s.object({ - id: s.define('Uuid', (value) => isUuid.v4(value)), - nickname: s.size(s.string(), 2, 10), - content: s.size(s.string(), 1, 300), -}); - -export const CommentIdStruct = s.partial(GetCommnetList); diff --git a/mission3/src/structs/productStructs.js b/mission3/src/structs/productStructs.js deleted file mode 100644 index b849d3b42..000000000 --- a/mission3/src/structs/productStructs.js +++ /dev/null @@ -1,17 +0,0 @@ -import * as s from 'superstruct'; -import isUuid from 'is-uuid'; - -const TAGS = ['SPORTS', 'INSTRUMENTS', 'FURNITURE', 'FASHION', 'ELECTRONICS']; - -export const CreateProductStruct = s.object({ - name: s.size(s.string(), 1, 60), - description: s.size(s.string(), 1, 900), - price: s.min(s.number(), 0), - tags: s.enums(TAGS), -}); - -export const IdParamsStruct = s.object({ - id: s.define('Uuid', (value) => isUuid.v4(value)), //v4형식의 uuid 유효성 검증 -}); - -export const PatchProductStruct = s.partial(CreateProductStruct); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 4730fd029..000000000 --- a/package-lock.json +++ /dev/null @@ -1,1499 +0,0 @@ -{ - "name": "express-core-features", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "express-core-features", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@faker-js/faker": "^10.1.0", - "@prisma/client": "^5.4.2", - "cors": "^2.8.5", - "dotenv": "^16.3.1", - "express": "^4.21.2", - "is-email": "^1.0.2", - "is-uuid": "^1.0.2", - "multer": "^2.0.2", - "prisma": "^5.4.2", - "superstruct": "^1.0.3" - }, - "devDependencies": { - "nodemon": "^3.1.10" - } - }, - "node_modules/@faker-js/faker": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-10.1.0.tgz", - "integrity": "sha512-C3mrr3b5dRVlKPJdfrAXS8+dq+rq8Qm5SNRazca0JKgw1HQERFmrVb0towvMmw5uu8hHKNiQasMaR/tydf3Zsg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } - ], - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/@prisma/client": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", - "integrity": "sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==", - "hasInstallScript": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.13" - }, - "peerDependencies": { - "prisma": "*" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } - } - }, - "node_modules/@prisma/debug": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz", - "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", - "license": "Apache-2.0" - }, - "node_modules/@prisma/engines": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.22.0.tgz", - "integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "5.22.0", - "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", - "@prisma/fetch-engine": "5.22.0", - "@prisma/get-platform": "5.22.0" - } - }, - "node_modules/@prisma/engines-version": { - "version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz", - "integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==", - "license": "Apache-2.0" - }, - "node_modules/@prisma/fetch-engine": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz", - "integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==", - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "5.22.0", - "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", - "@prisma/get-platform": "5.22.0" - } - }, - "node_modules/@prisma/get-platform": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.22.0.tgz", - "integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==", - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "5.22.0" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "license": "MIT" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true, - "license": "ISC" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-email": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-email/-/is-email-1.0.2.tgz", - "integrity": "sha512-UojUgD2EhDTBQ2SGKwrK9edce5phRzgLsP+V5+Uu2Swi+uvjVXgH3zduM3HhT9iaC/9Kq19/TYUbP0jPoi6ioA==", - "license": "SEE LICENSE IN LICENSE" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-uuid": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-uuid/-/is-uuid-1.0.2.tgz", - "integrity": "sha512-tCByphFcJgf2qmiMo5hMCgNAquNSagOetVetDvBXswGkNfoyEMvGH1yDlF8cbZbKnbVBr4Y5/rlpMz9umxyBkQ==", - "license": "MIT" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", - "license": "MIT", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.6.0", - "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">= 10.16.0" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nodemon": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", - "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prisma": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz", - "integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/engines": "5.22.0" - }, - "bin": { - "prisma": "build/index.js" - }, - "engines": { - "node": ">=16.13" - }, - "optionalDependencies": { - "fsevents": "2.3.3" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/superstruct": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", - "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "license": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 88411dd43..000000000 --- a/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "express-core-features", - "version": "1.0.0", - "description": "", - "keywords": [], - "license": "ISC", - "author": "", - "type": "module", - "main": "main.js", - "scripts": { - "dev": "nodemon src/main.js", - "start": "node src/main.js" - }, - "dependencies": { - "@faker-js/faker": "^10.1.0", - "@prisma/client": "^5.4.2", - "cors": "^2.8.5", - "dotenv": "^16.3.1", - "express": "^4.21.2", - "is-email": "^1.0.2", - "is-uuid": "^1.0.2", - "multer": "^2.0.2", - "prisma": "^5.4.2", - "superstruct": "^1.0.3" - }, - "devDependencies": { - "nodemon": "^3.1.10" - }, - "prisma": { - "seed": "node prisma/seed.js" - } -} diff --git a/src/controllers/articleController.js b/src/controllers/articleController.js deleted file mode 100644 index 4f46674ab..000000000 --- a/src/controllers/articleController.js +++ /dev/null @@ -1,18 +0,0 @@ -import express from 'express'; -import { CreateArticle, PatchArticle } from '../structs/articleStructs.js'; -import { assert } from 'superstruct'; -import { Prisma, PrismaClient } from '@prisma/client'; - -const app = express(); -const prisma = new PrismaClient(); - -app.get('/articles', async (req, res) => {}); - -app.post('/articles', async (req, res) => { - const data = req.body; - assert(data, CreateArticle); - const article = await prisma.article.create({ - data, - }); - res.status(201).send(article); -}); diff --git a/src/controllers/productController.js b/src/controllers/productController.js deleted file mode 100644 index 0e7719f23..000000000 --- a/src/controllers/productController.js +++ /dev/null @@ -1,21 +0,0 @@ -import express from 'express'; -import { CreateProduct, PatchProduct } from '../structs/productStructs.js'; -import { Prisma, PrismaClient } from '@prisma/client'; -import { assert } from 'superstruct'; - -const app = express(); -const prisma = new PrismaClient(); - -app.post('/products', async (req, res) => { - const data = req.body; - assert(data, CreateProduct); - const product = await prisma.product.create({ - data, - }); - res.status(201).send(product); -}); - -app.get('/products/:id', async (req, res) => { - const data = req.body; - assert(data); -}); diff --git a/src/lib/asyncHandler.js b/src/lib/asyncHandler.js deleted file mode 100644 index 2416ee86a..000000000 --- a/src/lib/asyncHandler.js +++ /dev/null @@ -1,9 +0,0 @@ -export function asyncHandler(handler) { - return async function (req, res, next) { - try { - await handler(req, res); - } catch (e) { - next(e); - } - }; -} diff --git a/src/lib/constants.js b/src/lib/constants.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/lib/prismaClient.js b/src/lib/prismaClient.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main.js b/src/main.js deleted file mode 100644 index df08210f2..000000000 --- a/src/main.js +++ /dev/null @@ -1,43 +0,0 @@ -import express from 'express'; -import { CreateProduct } from './structs/productStructs.js'; -import { assert } from 'superstruct'; -import { Prisma, PrismaClient } from '@prisma/client'; -import cors from 'cors'; -import { CreateArticle } from './structs/articleStructs.js'; - -const PORT = 3000; -const app = express(); - -//컨트롤러로 이동 예정 -app.use(express.json()); -app.use(cors()); - -const prisma = new PrismaClient(); - -app.get('/products', (req, res) => { - res.send('Hello Express'); -}); - -app.post('/products', async (req, res) => { - const data = req.body; - assert(data, CreateProduct); - const product = await prisma.product.create({ - data, - }); - res.status(201).send(product); -}); - -app.post('/articles', async (req, res) => { - const data = req.body; - assert(data, CreateArticle); - const article = await prisma.article.create({ - data, - }); - res.status(201).send(article); -}); - -//------------------------------------------------ - -app.listen(PORT, () => { - console.log('Server Started'); -}); diff --git a/src/models_Schema/migrations/20251027092554_base_schema/migration.sql b/src/models_Schema/migrations/20251027092554_base_schema/migration.sql deleted file mode 100644 index 7e0ed1bab..000000000 --- a/src/models_Schema/migrations/20251027092554_base_schema/migration.sql +++ /dev/null @@ -1,26 +0,0 @@ --- CreateEnum -CREATE TYPE "Tag" AS ENUM ('SPORTS', 'BEAUTY', 'FURNITURE', 'FASHION', 'ELECTRONICS'); - --- CreateTable -CREATE TABLE "Product" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "description" TEXT, - "price" DOUBLE PRECISION NOT NULL, - "tags" "Tag" NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "Product_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Article" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "content" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "Article_pkey" PRIMARY KEY ("id") -); diff --git a/src/models_Schema/migrations/20251028062500_alter_schema/migration.sql b/src/models_Schema/migrations/20251028062500_alter_schema/migration.sql deleted file mode 100644 index 1526b1b5f..000000000 --- a/src/models_Schema/migrations/20251028062500_alter_schema/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* - Warnings: - - - The values [BEAUTY] on the enum `Tag` will be removed. If these variants are still used in the database, this will fail. - -*/ --- AlterEnum -BEGIN; -CREATE TYPE "Tag_new" AS ENUM ('SPORTS', 'INSTRUMENTS', 'FURNITURE', 'FASHION', 'ELECTRONICS'); -ALTER TABLE "Product" ALTER COLUMN "tags" TYPE "Tag_new" USING ("tags"::text::"Tag_new"); -ALTER TYPE "Tag" RENAME TO "Tag_old"; -ALTER TYPE "Tag_new" RENAME TO "Tag"; -DROP TYPE "Tag_old"; -COMMIT; diff --git a/src/models_Schema/migrations/migration_lock.toml b/src/models_Schema/migrations/migration_lock.toml deleted file mode 100644 index fbffa92c2..000000000 --- a/src/models_Schema/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "postgresql" \ No newline at end of file diff --git a/src/models_Schema/mock.js b/src/models_Schema/mock.js deleted file mode 100644 index 3db055735..000000000 --- a/src/models_Schema/mock.js +++ /dev/null @@ -1,358 +0,0 @@ -export const PRODUCTS = [ - { - id: '6f435dde-97e7-4810-9199-69aaae5ae0a5', - name: '맥북 에어2', - description: '2025년 형', - price: 800000, - tags: 'ELECTRONICS', - createdAt: '2025-10-28T05:22:55.473Z', - updatedAt: '2025-10-28T05:22:55.473Z', - }, - { - id: '6b3d18c5-0e54-4ce8-860e-35fc9510a22f', - name: '래빗 체어', - description: '스테파노 지오반노니가 디자인한 제품', - price: 200000, - tags: 'FURNITURE', - createdAt: '2025-10-28T05:30:09.501Z', - updatedAt: '2025-10-28T05:30:09.501Z', - }, - { - id: 'd3f7e5ee-a1b7-45ff-9841-16f8a259ecf6', - name: '3단 수납 침대', - description: '템바보드의 고급스러움과 패브릭의 아늑함을 가득 담은 침대', - price: 220000, - tags: 'FURNITURE', - createdAt: '2025-10-28T05:38:43.363Z', - updatedAt: '2025-10-28T05:38:43.363Z', - }, - { - id: 'fe2b99ce-9cff-4068-a3fc-6c12506984a4', - name: '겟우드 침대 더블', - description: '튼튼한 철제프레임에 심할하고 내추럴한 나무 느낌을 더한 고급스러운 침대', - price: 140000, - tags: 'FURNITURE', - createdAt: '2025-10-28T05:40:57.994Z', - updatedAt: '2025-10-28T05:40:57.994Z', - }, - { - id: '626c8adf-90fa-4722-9dea-1578061235bb', - name: '시몬스 자스민 침대 매트리스', - description: '최상의 편안함과 여유로움', - price: 1720000, - tags: 'FURNITURE', - createdAt: '2025-10-28T05:44:22.667Z', - updatedAt: '2025-10-28T05:44:22.667Z', - }, - { - id: 'e717e3ab-3ab3-4312-a437-5ca9d9e900cf', - name: '누베스 아쿠아텍스 패브릭 2인용 소파', - description: '당신의 지친 몸과 마음을 포근히 감싸줄 침대 같은 편안함을 제공합니다.', - price: 230000, - tags: 'FURNITURE', - createdAt: '2025-10-28T05:46:24.848Z', - updatedAt: '2025-10-28T05:46:24.848Z', - }, - { - id: 'b2978e84-6622-4f3f-a2a5-a815be5a743a', - name: 'Whale chair', - description: '실내외용으로 사용 가능하며, 고래 꼬리를 잡고 쉽게 움직일 수 있는 의자입니다.', - price: 350000, - tags: 'FURNITURE', - createdAt: '2025-10-28T05:48:25.265Z', - updatedAt: '2025-10-28T05:48:25.265Z', - }, - { - id: '29d7cbdc-1942-4a88-a79b-471ced47a7aa', - name: '루아즈 가정용 턱걸이 바', - description: '무틀 손상없이 강력한 밀착력!', - price: 9000, - tags: 'SPORTS', - createdAt: '2025-10-28T05:54:00.424Z', - updatedAt: '2025-10-28T05:54:00.424Z', - }, - { - id: '49d41154-b217-411f-9a6b-e103526b2a72', - name: '코멧 스포츠 컴포트 폼롤러', - description: '탄탄한 쿠션감이 주는 편안한 자극!', - price: 12000, - tags: 'SPORTS', - createdAt: '2025-10-28T06:01:24.931Z', - updatedAt: '2025-10-28T06:01:24.931Z', - }, - { - id: '0ef28c73-4e93-495c-a272-1a06a1f35a3a', - name: '가정용 철봉 딥스바', - description: - '직접 조립하며 느낄 수 있는 즐거움과 견고함, 합리성을 느낄 수 있는 조립상품입니다.', - price: 140000, - tags: 'SPORTS', - createdAt: '2025-10-28T06:03:34.306Z', - updatedAt: '2025-10-28T06:03:34.306Z', - }, - { - id: 'ed210053-ae39-4202-86d1-5880423e5bd1', - name: '접이식 실내 자전거', - description: '핸들을 없애고, 코어근육을 사용해 기존 제품보다 빠르게 칼로리를 소모합니다.', - price: 400000, - tags: 'SPORTS', - createdAt: '2025-10-28T06:05:51.244Z', - updatedAt: '2025-10-28T06:05:51.244Z', - }, - { - id: '07bd8550-63ae-44b3-b6a0-bf128831f0a6', - name: '아디다스 축구화', - description: '남녀공용, 인조잔디에 적합한 아웃솔', - price: 64000, - tags: 'SPORTS', - createdAt: '2025-10-28T06:07:43.974Z', - updatedAt: '2025-10-28T06:07:43.974Z', - }, - { - id: '8d88ed1f-e49a-4481-8394-cdb54a1c604e', - name: '아이워너 ab코어 휠', - description: '밀고 당기는 간단한 동작으로 팔,어깨,복근 운동을 한번에 할 수 있습니다.', - price: 8000, - tags: 'SPORTS', - createdAt: '2025-10-28T06:09:44.963Z', - updatedAt: '2025-10-28T06:09:44.963Z', - }, - { - id: '85a474ea-a3f5-4f6d-ac4e-756c309395bb', - name: '바이올린 초보자 기본형', - description: '수제 제작 성인용 바이올린!', - price: 130000, - tags: 'INSTRUMENTS', - createdAt: '2025-10-28T06:25:42.708Z', - updatedAt: '2025-10-28T06:25:42.708Z', - }, - { - id: '11ca3bc8-f928-4dd6-a947-1890df68fbd6', - name: '시어몬 트럼본', - description: '전공용과 연주용으로 전혀 손색 없는 제품', - price: 8000000, - tags: 'INSTRUMENTS', - createdAt: '2025-10-28T06:27:24.872Z', - updatedAt: '2025-10-28T06:27:24.872Z', - }, - { - id: '87df3958-6a32-476e-a2e9-770b6454ba68', - name: '어쿠스틱 기타', - description: '연주와 관리에 필요한 모든 액세서리 증정', - price: 150000, - tags: 'INSTRUMENTS', - createdAt: '2025-10-28T06:29:44.725Z', - updatedAt: '2025-10-28T06:29:44.725Z', - }, - { - id: '424d4cac-1ab0-43d8-ba0c-e1ebe008893a', - name: '칸타빌 통기타', - description: '풀 패키지 구성품 증정', - price: 58000, - tags: 'INSTRUMENTS', - createdAt: '2025-10-28T06:31:03.952Z', - updatedAt: '2025-10-28T06:31:03.952Z', - }, - { - id: 'e056581c-9ac9-4d6d-b9e6-ab3731792cda', - name: '하모니카', - description: '삼익악기 24홀', - price: 38000, - tags: 'INSTRUMENTS', - createdAt: '2025-10-28T06:32:18.954Z', - updatedAt: '2025-10-28T06:32:18.954Z', - }, - { - id: '9f37be61-b631-4513-a7ed-2698aee50626', - name: '트럼펫', - description: '일본 야마하 트럼펫 입문용', - price: 138000, - tags: 'INSTRUMENTS', - createdAt: '2025-10-28T06:33:35.838Z', - updatedAt: '2025-10-28T06:33:35.838Z', - }, - { - id: '22e36934-2987-479e-9b35-fb497e2cbb26', - name: '양털 하이넥 패딩', - description: '기능성 방수, 방풍, 숏 잠바', - price: 23000, - tags: 'FASHION', - createdAt: '2025-10-28T06:35:13.550Z', - updatedAt: '2025-10-28T06:35:13.550Z', - }, - { - id: 'e92c1436-c5f4-4ca2-826e-0b2331123d19', - name: '롱패딩', - description: '가볍고 따뜻한 롱패딩!', - price: 55000, - tags: 'FASHION', - createdAt: '2025-10-28T06:37:00.483Z', - updatedAt: '2025-10-28T06:37:00.483Z', - }, - { - id: '495ca8e4-7639-4089-b4d1-0b7a93837179', - name: '긴팔 니트', - description: '가볍고 따뜻하며 맨살에 입어도 부드럽습니다.', - price: 55000, - tags: 'FASHION', - createdAt: '2025-10-28T06:38:40.449Z', - updatedAt: '2025-10-28T06:38:40.449Z', - }, - { - id: 'd6717179-e9d0-4970-9e03-749889ba6e54', - name: '빅사이즈 니트', - description: '빅사이즈 외출용 간절기 니트!', - price: 22000, - tags: 'FASHION', - createdAt: '2025-10-28T06:40:26.092Z', - updatedAt: '2025-10-28T06:40:26.092Z', - }, - { - id: '40d0556c-2f2d-471f-bcc8-a2d2cfab791e', - name: '패딩 바지', - description: '겨울용 방한 바지', - price: 90000, - tags: 'FASHION', - createdAt: '2025-10-28T06:41:14.576Z', - updatedAt: '2025-10-28T06:41:14.576Z', - }, - { - id: '9426b0e2-61ef-4728-8c86-ef6279c52d66', - name: '경량 패딩', - description: '남녀공용, 가볍고 따뜻합니다.', - price: 42000, - tags: 'FASHION', - createdAt: '2025-10-28T06:42:08.467Z', - updatedAt: '2025-10-28T06:42:08.467Z', - }, - { - id: '82980f81-c3d7-42cd-bec9-4cd2f09ca71b', - name: '런닝화', - description: '남성용, 가볍고 발편한 런닝화.', - price: 35000, - tags: 'FASHION', - createdAt: '2025-10-28T06:43:36.147Z', - updatedAt: '2025-10-28T06:43:36.147Z', - }, - { - id: '5c8c75e9-0195-48e4-80bf-5f6d7ed0c438', - name: '벙거지 모자', - description: '넓은 챙, 자외선 차단 벙거지 모자', - price: 15000, - tags: 'FASHION', - createdAt: '2025-10-28T06:45:20.211Z', - updatedAt: '2025-10-28T06:45:20.211Z', - }, - { - id: '58bdc83f-79da-4dd2-9c6a-18dad5503ccc', - name: '멀티 쿠커', - description: '밥솥, 전자렌지, 오븐, 에어프라이, 찜기, 그릴 기능이 지원됩니다.', - price: 310000, - tags: 'ELECTRONICS', - createdAt: '2025-10-28T06:47:37.831Z', - updatedAt: '2025-10-28T06:47:37.831Z', - }, - { - id: '548b4025-972e-49b7-8b42-95057d95f182', - name: '마사지기', - description: '가벼운 무선 목 어깨 마사지기', - price: 30000, - tags: 'ELECTRONICS', - createdAt: '2025-10-28T06:48:34.181Z', - updatedAt: '2025-10-28T06:48:34.181Z', - }, - { - id: '959cee34-ef5d-4289-8d84-c5e7f48d5c61', - name: '스팀다리미', - description: '작지만 스팀효과는 그대로, 빠르고 간편하게 사용가능합니다.', - price: 25000, - tags: 'ELECTRONICS', - createdAt: '2025-10-28T06:50:32.047Z', - updatedAt: '2025-10-28T06:50:32.047Z', - }, - { - id: 'ce9887e7-0dc5-4dee-a798-bf3e948cec01', - name: '즉석 라면 조리기', - description: '가정용, 한강 라면 끓이는 기계', - price: 190000, - tags: 'ELECTRONICS', - createdAt: '2025-10-28T06:52:07.348Z', - updatedAt: '2025-10-28T06:52:07.348Z', - }, - { - id: '64a3067e-668b-4dd9-8d9c-d55042789db8', - name: '무선 주전자', - description: '360도 회전판, 과열 방지 기능 탑재', - price: 17000, - tags: 'ELECTRONICS', - createdAt: '2025-10-28T06:54:45.455Z', - updatedAt: '2025-10-28T06:54:45.455Z', - }, -]; - -export const ARTICLES = [ - { - id: '23b7dc34-7a6f-48a0-80b6-9a3503a3dddf', - title: '피곤하당', - content: '오늘은 좀 일찍 자야겠다.', - createdAt: '2025-10-28T07:36:13.410Z', - updatedAt: '2025-10-28T07:36:13.410Z', - }, - { - id: '187e0caf-288f-42e8-9e72-2945abdcd42f', - title: '배고파', - content: '오늘 저녁은 뭐먹지???????', - createdAt: '2025-10-28T07:41:42.085Z', - updatedAt: '2025-10-28T07:41:42.085Z', - }, - { - id: '2ddae395-27a8-4291-9152-dd6aa23e2f10', - title: '저녁 메뉴 추천 좀', - content: '이미 치킨 시킴', - createdAt: '2025-10-28T07:42:27.872Z', - updatedAt: '2025-10-28T07:42:27.872Z', - }, - { - id: 'c467c8d1-a336-4f7c-b1e2-1cda7718093d', - title: '오운완', - content: '운동만이 살길', - createdAt: '2025-10-28T07:43:58.997Z', - updatedAt: '2025-10-28T07:43:58.997Z', - }, - { - id: 'd5b27e43-fe7e-41f4-a21f-7f243fb17b30', - title: '강아지 식이알러지', - content: '우리 똥강아지 식이알러지가 있어서 괜찮은 사료 브랜드 추천 좀', - createdAt: '2025-10-28T07:45:17.039Z', - updatedAt: '2025-10-28T07:45:17.039Z', - }, - { - id: 'b76a7983-e79a-4dfa-a17f-bfa7d52e9fe3', - title: '강아지 실외배변', - content: - '똥강아지가 실외배변만 하는데 실내에서도 뉘이고 싶어요ㅠ 저랑 같은 경험 있으신 분 조언 좀 해주세요.', - createdAt: '2025-10-28T07:46:49.332Z', - updatedAt: '2025-10-28T07:46:49.332Z', - }, - { - id: '1569c142-ccd9-48c5-bdee-958bdc06379e', - title: '아 사기꾼이네!', - content: '중고마켓에서 물건 샀는데 벽돌왔음. 신고가능?', - createdAt: '2025-10-28T07:47:54.099Z', - updatedAt: '2025-10-28T07:47:54.099Z', - }, - { - id: '7d1476dd-e6fb-439f-aae0-8da282a5be9f', - title: '헐...나도 사기당함', - content: '나도 며칠 전에 사기당함..같은 판매잔가????', - createdAt: '2025-10-28T07:48:40.353Z', - updatedAt: '2025-10-28T07:48:40.353Z', - }, - { - id: '2898a4a2-41db-4e51-b9a7-adfbd6d77040', - title: '님들 따뜻한 패딩 추천 좀', - content: '가격은 10만원 이내로 이쁜걸루다가!', - createdAt: '2025-10-28T07:49:11.660Z', - updatedAt: '2025-10-28T07:49:11.660Z', - }, -]; diff --git a/src/models_Schema/schema.prisma b/src/models_Schema/schema.prisma deleted file mode 100644 index a4e6fc379..000000000 --- a/src/models_Schema/schema.prisma +++ /dev/null @@ -1,42 +0,0 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - -// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? -// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init - -generator client { - provider = "prisma-client-js" -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -model Product { - id String @id @default(uuid()) - name String - description String? //컬럼이 null을 허용 - price Float - tags Tag - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt //자동갱신되기 때문에 updatedat사용 defaul now 사용하면 생성은 되지만 이후 업데이트 시 수동으로 덮어써야 함 -} - -//updatedAt을 쓰면 디버깅에 대한 이점이 있음, 신경쓰지 않는다면 DateTime?을 써도 됨. 권장되지는 않는 듯. - -model Article { - id String @id @default(uuid()) - title String //글자 제한? - content String //글자 제한? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt -} - -enum Tag { - SPORTS - INSTRUMENTS - FURNITURE - FASHION - ELECTRONICS -} diff --git a/src/models_Schema/seed.js b/src/models_Schema/seed.js deleted file mode 100644 index c27466730..000000000 --- a/src/models_Schema/seed.js +++ /dev/null @@ -1,28 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import { ARTICLES, PRODUCTS } from './mock.js'; - -const prisma = new PrismaClient(); - -async function main() { - //기존 데이터 삭제 - await prisma.article.deleteMany(); - await prisma.product.deleteMany(); - //목 데이터 삽입 - await prisma.article.createMany({ - data: ARTICLES, - skipDuplicates: true, - }); - await prisma.product.createMany({ - data: PRODUCTS, - skipDuplicates: true, - }); -} - -main() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - await prisma.$disconnect(); - process.exit(1); - }); diff --git a/src/structs/articleStructs.js b/src/structs/articleStructs.js deleted file mode 100644 index 2680b3b48..000000000 --- a/src/structs/articleStructs.js +++ /dev/null @@ -1,9 +0,0 @@ -import * as s from 'superstruct'; -import isUuid from 'is-uuid'; - -export const CreateArticle = s.object({ - title: s.size(s.string(), 1, 100), - content: s.size(s.string(), 1, 1200), -}); - -export const PatchArticle = s.partial(CreateArticle); diff --git a/src/structs/productStructs.js b/src/structs/productStructs.js deleted file mode 100644 index 34dd8c9ac..000000000 --- a/src/structs/productStructs.js +++ /dev/null @@ -1,14 +0,0 @@ -import * as s from 'superstruct'; -import isEmail from 'is-email'; -import isUuid from 'is-uuid'; - -const TAGS = ['SPORTS', 'INSTRUMENTS', 'FURNITURE', 'FASHION', 'ELECTRONICS']; - -export const CreateProduct = s.object({ - name: s.size(s.string(), 1, 60), - description: s.size(s.string(), 1, 900), - price: s.min(s.number(), 0), - tags: s.enums(TAGS), -}); - -export const PatchProduct = s.partial(CreateProduct); From 68da1d7ea291c57aeacb0643fdad2312c2f5ccce Mon Sep 17 00:00:00 2001 From: Minsoo Choi Date: Mon, 2 Feb 2026 18:07:10 +0900 Subject: [PATCH 02/17] mission10 --- mission9-10/.env.example | 8 + mission9-10/.env.production.example | 11 + mission9-10/.env.test.example | 1 + mission9-10/.prettierrc | 9 + mission9-10/coverage/base.css | 224 + mission9-10/coverage/block-navigation.js | 87 + mission9-10/coverage/clover.xml | 6 + .../controllers/articlesController.ts.html | 376 + .../controllers/commentsController.ts.html | 172 + .../controllers/errorController.ts.html | 223 + .../controllers/imagesController.ts.html | 211 + mission9-10/coverage/controllers/index.html | 206 + .../notificationController.ts.html | 184 + .../controllers/productsController.ts.html | 394 + .../controllers/usersController.ts.html | 361 + mission9-10/coverage/coverage-final.json | 1 + mission9-10/coverage/favicon.png | Bin 0 -> 445 bytes mission9-10/coverage/index.html | 176 + mission9-10/coverage/lcov-report/base.css | 224 + .../coverage/lcov-report/block-navigation.js | 87 + mission9-10/coverage/lcov-report/favicon.png | Bin 0 -> 445 bytes mission9-10/coverage/lcov-report/index.html | 101 + mission9-10/coverage/lcov-report/prettify.css | 1 + mission9-10/coverage/lcov-report/prettify.js | 2 + .../lcov-report/sort-arrow-sprite.png | Bin 0 -> 138 bytes mission9-10/coverage/lcov-report/sorter.js | 210 + mission9-10/coverage/lcov.info | 0 mission9-10/coverage/lib/constants.ts.html | 163 + mission9-10/coverage/lib/cookies.ts.html | 169 + .../coverage/lib/errors/customErrors.ts.html | 223 + .../coverage/lib/errors/errorUtils.ts.html | 124 + mission9-10/coverage/lib/errors/index.html | 131 + mission9-10/coverage/lib/index.html | 176 + mission9-10/coverage/lib/prismaClient.ts.html | 94 + mission9-10/coverage/lib/token.ts.html | 151 + mission9-10/coverage/lib/withAsync.ts.html | 124 + .../coverage/middlewares/authenticate.ts.html | 175 + mission9-10/coverage/middlewares/index.html | 116 + mission9-10/coverage/prettify.css | 1 + mission9-10/coverage/prettify.js | 2 + .../repositories/articleRepository.ts.html | 256 + .../repositories/commentRepository.ts.html | 178 + mission9-10/coverage/repositories/index.html | 191 + .../repositories/likeRepository.ts.html | 193 + .../notificationRepository.ts.html | 163 + .../repositories/productRepository.ts.html | 280 + .../repositories/userRepository.ts.html | 142 + .../coverage/services/articleService.ts.html | 499 + .../coverage/services/commentService.ts.html | 151 + .../coverage/services/imageService.ts.html | 151 + mission9-10/coverage/services/index.html | 191 + .../services/notificationService.ts.html | 163 + .../coverage/services/productService.ts.html | 604 ++ .../coverage/services/userService.ts.html | 721 ++ mission9-10/coverage/sort-arrow-sprite.png | Bin 0 -> 138 bytes mission9-10/coverage/sorter.js | 210 + mission9-10/coverage/src/app.ts.html | 178 + .../controllers/articlesController.ts.html | 376 + .../controllers/commentsController.ts.html | 172 + .../src/controllers/errorController.ts.html | 223 + .../src/controllers/imagesController.ts.html | 211 + .../coverage/src/controllers/index.html | 176 + .../notificationController.ts.html | 184 + .../controllers/productsController.ts.html | 394 + .../src/controllers/usersController.ts.html | 361 + mission9-10/coverage/src/index.html | 116 + .../coverage/src/lib/constants.ts.html | 163 + mission9-10/coverage/src/lib/cookies.ts.html | 169 + .../src/lib/errors/customErrors.ts.html | 223 + .../src/lib/errors/errorUtils.ts.html | 124 + .../coverage/src/lib/errors/index.html | 131 + mission9-10/coverage/src/lib/index.html | 176 + .../coverage/src/lib/prismaClient.ts.html | 94 + mission9-10/coverage/src/lib/token.ts.html | 151 + .../coverage/src/lib/withAsync.ts.html | 124 + .../src/middlewares/authenticate.ts.html | 175 + .../coverage/src/middlewares/index.html | 116 + .../repositories/articleRepository.ts.html | 256 + .../repositories/commentRepository.ts.html | 178 + .../coverage/src/repositories/index.html | 191 + .../src/repositories/likeRepository.ts.html | 193 + .../notificationRepository.ts.html | 163 + .../repositories/productRepository.ts.html | 280 + .../src/repositories/userRepository.ts.html | 142 + .../src/routers/articlesRouter.ts.html | 169 + .../src/routers/commentsRouter.ts.html | 118 + .../coverage/src/routers/imagesRouter.ts.html | 112 + mission9-10/coverage/src/routers/index.html | 191 + .../src/routers/notificationRouter.ts.html | 133 + .../src/routers/productsRouter.ts.html | 178 + .../coverage/src/routers/usersRouter.ts.html | 157 + .../src/services/articleService.ts.html | 505 + .../src/services/commentService.ts.html | 151 + .../src/services/imageService.ts.html | 151 + mission9-10/coverage/src/services/index.html | 176 + .../src/services/notificationService.ts.html | 163 + .../src/services/productService.ts.html | 616 ++ .../coverage/src/services/userService.ts.html | 721 ++ mission9-10/coverage/src/socket.ts.html | 214 + .../src/structs/articlesStructs.ts.html | 121 + .../src/structs/commentsStruct.ts.html | 115 + .../src/structs/commonStructs.ts.html | 148 + mission9-10/coverage/src/structs/index.html | 176 + .../src/structs/productsStruct.ts.html | 163 + .../coverage/src/structs/usersStructs.ts.html | 229 + mission9-10/infra/test | 0 mission9-10/jest.config.js | 33 + mission9-10/package-lock.json | 9108 +++++++++++++++++ mission9-10/package.json | 60 + .../migration.sql | 114 + .../prisma/migrations/migration_lock.toml | 3 + mission9-10/prisma/schema.prisma | 93 + mission9-10/public/.gitkeep | 0 .../4f3edda9-25e4-462b-b18b-a45bb5f789ca.png | Bin 0 -> 6066 bytes mission9-10/public/socket-client-test.html | 37 + mission9-10/readme.md | 163 + mission9-10/src/app.ts | 30 + .../src/controllers/articlesController.ts | 97 + .../src/controllers/commentsController.ts | 29 + .../src/controllers/errorController.ts | 46 + .../src/controllers/imagesController.ts | 7 + .../src/controllers/notificationController.ts | 33 + .../src/controllers/productsController.ts | 103 + .../src/controllers/usersController.ts | 92 + mission9-10/src/lib/constants.ts | 26 + mission9-10/src/lib/cookies.ts | 28 + mission9-10/src/lib/errors/customErrors.ts | 46 + mission9-10/src/lib/errors/errorUtils.ts | 13 + mission9-10/src/lib/prismaClient.ts | 3 + mission9-10/src/lib/setupStatic.ts | 8 + mission9-10/src/lib/token.ts | 22 + mission9-10/src/lib/withAsync.ts | 13 + mission9-10/src/main.ts | 12 + mission9-10/src/middlewares/authenticate.ts | 30 + mission9-10/src/middlewares/upload.ts | 44 + .../src/repositories/articleRepository.ts | 57 + .../src/repositories/commentRepository.ts | 31 + .../src/repositories/likeRepository.ts | 36 + .../repositories/notificationRepository.ts | 26 + .../src/repositories/productRepository.ts | 65 + .../src/repositories/userRepository.ts | 19 + mission9-10/src/routers/articlesRouter.ts | 28 + mission9-10/src/routers/commentsRouter.ts | 11 + mission9-10/src/routers/imagesRouter.ts | 10 + mission9-10/src/routers/notificationRouter.ts | 16 + mission9-10/src/routers/productsRouter.ts | 31 + mission9-10/src/routers/usersRouter.ts | 24 + mission9-10/src/services/articleService.ts | 140 + mission9-10/src/services/commentService.ts | 22 + mission9-10/src/services/imageService.ts | 82 + .../src/services/notificationService.ts | 26 + mission9-10/src/services/productService.ts | 177 + mission9-10/src/services/userService.ts | 212 + mission9-10/src/socket.ts | 43 + mission9-10/src/structs/articlesStructs.ts | 12 + mission9-10/src/structs/commentsStruct.ts | 10 + mission9-10/src/structs/commonStructs.ts | 21 + mission9-10/src/structs/productsStruct.ts | 26 + mission9-10/src/structs/usersStructs.ts | 48 + mission9-10/tests/articles.auth.test.ts | 170 + mission9-10/tests/articles.public.test.ts | 188 + mission9-10/tests/auth.test.ts | 103 + .../tests/product.service.unit.test.ts | 175 + mission9-10/tests/products.auth.test.ts | 254 + mission9-10/tests/products.public.test.ts | 275 + mission9-10/tests/test.http | 210 + mission9-10/tests/test.js | 68 + mission9-10/tests/test.png | Bin 0 -> 6066 bytes mission9-10/tests/utils.ts/cleanDb.ts | 17 + mission9-10/tests/utils.ts/createUser.ts | 12 + mission9-10/tsconfig.build.json | 11 + mission9-10/tsconfig.json | 24 + mission9-10/tsconfig.test.json | 8 + mission9-10/types/article.d.ts | 34 + mission9-10/types/cursorPaginated.d.ts | 4 + mission9-10/types/express.d.ts | 17 + mission9-10/types/image.d.ts | 3 + mission9-10/types/like.d.ts | 1 + mission9-10/types/multer.ts | 10 + mission9-10/types/product.d.ts | 28 + mission9-10/types/user.d.ts | 11 + 181 files changed, 32253 insertions(+) create mode 100644 mission9-10/.env.example create mode 100644 mission9-10/.env.production.example create mode 100644 mission9-10/.env.test.example create mode 100644 mission9-10/.prettierrc create mode 100644 mission9-10/coverage/base.css create mode 100644 mission9-10/coverage/block-navigation.js create mode 100644 mission9-10/coverage/clover.xml create mode 100644 mission9-10/coverage/controllers/articlesController.ts.html create mode 100644 mission9-10/coverage/controllers/commentsController.ts.html create mode 100644 mission9-10/coverage/controllers/errorController.ts.html create mode 100644 mission9-10/coverage/controllers/imagesController.ts.html create mode 100644 mission9-10/coverage/controllers/index.html create mode 100644 mission9-10/coverage/controllers/notificationController.ts.html create mode 100644 mission9-10/coverage/controllers/productsController.ts.html create mode 100644 mission9-10/coverage/controllers/usersController.ts.html create mode 100644 mission9-10/coverage/coverage-final.json create mode 100644 mission9-10/coverage/favicon.png create mode 100644 mission9-10/coverage/index.html create mode 100644 mission9-10/coverage/lcov-report/base.css create mode 100644 mission9-10/coverage/lcov-report/block-navigation.js create mode 100644 mission9-10/coverage/lcov-report/favicon.png create mode 100644 mission9-10/coverage/lcov-report/index.html create mode 100644 mission9-10/coverage/lcov-report/prettify.css create mode 100644 mission9-10/coverage/lcov-report/prettify.js create mode 100644 mission9-10/coverage/lcov-report/sort-arrow-sprite.png create mode 100644 mission9-10/coverage/lcov-report/sorter.js create mode 100644 mission9-10/coverage/lcov.info create mode 100644 mission9-10/coverage/lib/constants.ts.html create mode 100644 mission9-10/coverage/lib/cookies.ts.html create mode 100644 mission9-10/coverage/lib/errors/customErrors.ts.html create mode 100644 mission9-10/coverage/lib/errors/errorUtils.ts.html create mode 100644 mission9-10/coverage/lib/errors/index.html create mode 100644 mission9-10/coverage/lib/index.html create mode 100644 mission9-10/coverage/lib/prismaClient.ts.html create mode 100644 mission9-10/coverage/lib/token.ts.html create mode 100644 mission9-10/coverage/lib/withAsync.ts.html create mode 100644 mission9-10/coverage/middlewares/authenticate.ts.html create mode 100644 mission9-10/coverage/middlewares/index.html create mode 100644 mission9-10/coverage/prettify.css create mode 100644 mission9-10/coverage/prettify.js create mode 100644 mission9-10/coverage/repositories/articleRepository.ts.html create mode 100644 mission9-10/coverage/repositories/commentRepository.ts.html create mode 100644 mission9-10/coverage/repositories/index.html create mode 100644 mission9-10/coverage/repositories/likeRepository.ts.html create mode 100644 mission9-10/coverage/repositories/notificationRepository.ts.html create mode 100644 mission9-10/coverage/repositories/productRepository.ts.html create mode 100644 mission9-10/coverage/repositories/userRepository.ts.html create mode 100644 mission9-10/coverage/services/articleService.ts.html create mode 100644 mission9-10/coverage/services/commentService.ts.html create mode 100644 mission9-10/coverage/services/imageService.ts.html create mode 100644 mission9-10/coverage/services/index.html create mode 100644 mission9-10/coverage/services/notificationService.ts.html create mode 100644 mission9-10/coverage/services/productService.ts.html create mode 100644 mission9-10/coverage/services/userService.ts.html create mode 100644 mission9-10/coverage/sort-arrow-sprite.png create mode 100644 mission9-10/coverage/sorter.js create mode 100644 mission9-10/coverage/src/app.ts.html create mode 100644 mission9-10/coverage/src/controllers/articlesController.ts.html create mode 100644 mission9-10/coverage/src/controllers/commentsController.ts.html create mode 100644 mission9-10/coverage/src/controllers/errorController.ts.html create mode 100644 mission9-10/coverage/src/controllers/imagesController.ts.html create mode 100644 mission9-10/coverage/src/controllers/index.html create mode 100644 mission9-10/coverage/src/controllers/notificationController.ts.html create mode 100644 mission9-10/coverage/src/controllers/productsController.ts.html create mode 100644 mission9-10/coverage/src/controllers/usersController.ts.html create mode 100644 mission9-10/coverage/src/index.html create mode 100644 mission9-10/coverage/src/lib/constants.ts.html create mode 100644 mission9-10/coverage/src/lib/cookies.ts.html create mode 100644 mission9-10/coverage/src/lib/errors/customErrors.ts.html create mode 100644 mission9-10/coverage/src/lib/errors/errorUtils.ts.html create mode 100644 mission9-10/coverage/src/lib/errors/index.html create mode 100644 mission9-10/coverage/src/lib/index.html create mode 100644 mission9-10/coverage/src/lib/prismaClient.ts.html create mode 100644 mission9-10/coverage/src/lib/token.ts.html create mode 100644 mission9-10/coverage/src/lib/withAsync.ts.html create mode 100644 mission9-10/coverage/src/middlewares/authenticate.ts.html create mode 100644 mission9-10/coverage/src/middlewares/index.html create mode 100644 mission9-10/coverage/src/repositories/articleRepository.ts.html create mode 100644 mission9-10/coverage/src/repositories/commentRepository.ts.html create mode 100644 mission9-10/coverage/src/repositories/index.html create mode 100644 mission9-10/coverage/src/repositories/likeRepository.ts.html create mode 100644 mission9-10/coverage/src/repositories/notificationRepository.ts.html create mode 100644 mission9-10/coverage/src/repositories/productRepository.ts.html create mode 100644 mission9-10/coverage/src/repositories/userRepository.ts.html create mode 100644 mission9-10/coverage/src/routers/articlesRouter.ts.html create mode 100644 mission9-10/coverage/src/routers/commentsRouter.ts.html create mode 100644 mission9-10/coverage/src/routers/imagesRouter.ts.html create mode 100644 mission9-10/coverage/src/routers/index.html create mode 100644 mission9-10/coverage/src/routers/notificationRouter.ts.html create mode 100644 mission9-10/coverage/src/routers/productsRouter.ts.html create mode 100644 mission9-10/coverage/src/routers/usersRouter.ts.html create mode 100644 mission9-10/coverage/src/services/articleService.ts.html create mode 100644 mission9-10/coverage/src/services/commentService.ts.html create mode 100644 mission9-10/coverage/src/services/imageService.ts.html create mode 100644 mission9-10/coverage/src/services/index.html create mode 100644 mission9-10/coverage/src/services/notificationService.ts.html create mode 100644 mission9-10/coverage/src/services/productService.ts.html create mode 100644 mission9-10/coverage/src/services/userService.ts.html create mode 100644 mission9-10/coverage/src/socket.ts.html create mode 100644 mission9-10/coverage/src/structs/articlesStructs.ts.html create mode 100644 mission9-10/coverage/src/structs/commentsStruct.ts.html create mode 100644 mission9-10/coverage/src/structs/commonStructs.ts.html create mode 100644 mission9-10/coverage/src/structs/index.html create mode 100644 mission9-10/coverage/src/structs/productsStruct.ts.html create mode 100644 mission9-10/coverage/src/structs/usersStructs.ts.html create mode 100644 mission9-10/infra/test create mode 100644 mission9-10/jest.config.js create mode 100644 mission9-10/package-lock.json create mode 100644 mission9-10/package.json create mode 100644 mission9-10/prisma/migrations/20260119073239_add_notification/migration.sql create mode 100644 mission9-10/prisma/migrations/migration_lock.toml create mode 100644 mission9-10/prisma/schema.prisma create mode 100644 mission9-10/public/.gitkeep create mode 100644 mission9-10/public/4f3edda9-25e4-462b-b18b-a45bb5f789ca.png create mode 100644 mission9-10/public/socket-client-test.html create mode 100644 mission9-10/readme.md create mode 100644 mission9-10/src/app.ts create mode 100644 mission9-10/src/controllers/articlesController.ts create mode 100644 mission9-10/src/controllers/commentsController.ts create mode 100644 mission9-10/src/controllers/errorController.ts create mode 100644 mission9-10/src/controllers/imagesController.ts create mode 100644 mission9-10/src/controllers/notificationController.ts create mode 100644 mission9-10/src/controllers/productsController.ts create mode 100644 mission9-10/src/controllers/usersController.ts create mode 100644 mission9-10/src/lib/constants.ts create mode 100644 mission9-10/src/lib/cookies.ts create mode 100644 mission9-10/src/lib/errors/customErrors.ts create mode 100644 mission9-10/src/lib/errors/errorUtils.ts create mode 100644 mission9-10/src/lib/prismaClient.ts create mode 100644 mission9-10/src/lib/setupStatic.ts create mode 100644 mission9-10/src/lib/token.ts create mode 100644 mission9-10/src/lib/withAsync.ts create mode 100644 mission9-10/src/main.ts create mode 100644 mission9-10/src/middlewares/authenticate.ts create mode 100644 mission9-10/src/middlewares/upload.ts create mode 100644 mission9-10/src/repositories/articleRepository.ts create mode 100644 mission9-10/src/repositories/commentRepository.ts create mode 100644 mission9-10/src/repositories/likeRepository.ts create mode 100644 mission9-10/src/repositories/notificationRepository.ts create mode 100644 mission9-10/src/repositories/productRepository.ts create mode 100644 mission9-10/src/repositories/userRepository.ts create mode 100644 mission9-10/src/routers/articlesRouter.ts create mode 100644 mission9-10/src/routers/commentsRouter.ts create mode 100644 mission9-10/src/routers/imagesRouter.ts create mode 100644 mission9-10/src/routers/notificationRouter.ts create mode 100644 mission9-10/src/routers/productsRouter.ts create mode 100644 mission9-10/src/routers/usersRouter.ts create mode 100644 mission9-10/src/services/articleService.ts create mode 100644 mission9-10/src/services/commentService.ts create mode 100644 mission9-10/src/services/imageService.ts create mode 100644 mission9-10/src/services/notificationService.ts create mode 100644 mission9-10/src/services/productService.ts create mode 100644 mission9-10/src/services/userService.ts create mode 100644 mission9-10/src/socket.ts create mode 100644 mission9-10/src/structs/articlesStructs.ts create mode 100644 mission9-10/src/structs/commentsStruct.ts create mode 100644 mission9-10/src/structs/commonStructs.ts create mode 100644 mission9-10/src/structs/productsStruct.ts create mode 100644 mission9-10/src/structs/usersStructs.ts create mode 100644 mission9-10/tests/articles.auth.test.ts create mode 100644 mission9-10/tests/articles.public.test.ts create mode 100644 mission9-10/tests/auth.test.ts create mode 100644 mission9-10/tests/product.service.unit.test.ts create mode 100644 mission9-10/tests/products.auth.test.ts create mode 100644 mission9-10/tests/products.public.test.ts create mode 100644 mission9-10/tests/test.http create mode 100644 mission9-10/tests/test.js create mode 100644 mission9-10/tests/test.png create mode 100644 mission9-10/tests/utils.ts/cleanDb.ts create mode 100644 mission9-10/tests/utils.ts/createUser.ts create mode 100644 mission9-10/tsconfig.build.json create mode 100644 mission9-10/tsconfig.json create mode 100644 mission9-10/tsconfig.test.json create mode 100644 mission9-10/types/article.d.ts create mode 100644 mission9-10/types/cursorPaginated.d.ts create mode 100644 mission9-10/types/express.d.ts create mode 100644 mission9-10/types/image.d.ts create mode 100644 mission9-10/types/like.d.ts create mode 100644 mission9-10/types/multer.ts create mode 100644 mission9-10/types/product.d.ts create mode 100644 mission9-10/types/user.d.ts diff --git a/mission9-10/.env.example b/mission9-10/.env.example new file mode 100644 index 000000000..9a38c69ce --- /dev/null +++ b/mission9-10/.env.example @@ -0,0 +1,8 @@ +DATABASE_URL="postgresql://user:password@localhost:5432/dbname?schema=public" +NODE_ENV=development +PORT=3000 +JWT_ACCESS_TOKEN_SECRET=your_access_token_secret_key +JWT_REFRESH_TOKEN_SECRET=your_refresh_token_secret_key +AWS_ACCESS_KEY_ID=your_aws_access_key_id +AWS_SECRET_ACCESS_KEY=your_aws_secret_access_key +UPLOAD_PROVIDER=local \ No newline at end of file diff --git a/mission9-10/.env.production.example b/mission9-10/.env.production.example new file mode 100644 index 000000000..eb36d25b5 --- /dev/null +++ b/mission9-10/.env.production.example @@ -0,0 +1,11 @@ +NODE_ENV=production +UPLOAD_PROVIDER=s3 +AWS_REGION=your_aws_region +AWS_S3_BUCKET=your_s3_bucket_name +AWS_ACCESS_KEY_ID=your_aws_access_key_id +AWS_SECRET_ACCESS_KEY=your_aws_secret_access_key +DATABASE_URL="postgresql://user:password@localhost:5432/dbname?schema=public" +//데이터 베이스 유알엘은 rds로 바꾸기 +PORT=3000 +JWT_ACCESS_TOKEN_SECRET=your_access_token_secret_key +JWT_REFRESH_TOKEN_SECRET=your_refresh_token_secret_key diff --git a/mission9-10/.env.test.example b/mission9-10/.env.test.example new file mode 100644 index 000000000..0a64cea78 --- /dev/null +++ b/mission9-10/.env.test.example @@ -0,0 +1 @@ +DATABASE_URL="postgresql://user:password@localhost:5432/dbname?_test" diff --git a/mission9-10/.prettierrc b/mission9-10/.prettierrc new file mode 100644 index 000000000..503a5da40 --- /dev/null +++ b/mission9-10/.prettierrc @@ -0,0 +1,9 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "semi": true, + "printWidth": 100, + "endOfLine": "auto", + "arrowParens": "always", + "tabWidth": 2 +} diff --git a/mission9-10/coverage/base.css b/mission9-10/coverage/base.css new file mode 100644 index 000000000..f418035b4 --- /dev/null +++ b/mission9-10/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/mission9-10/coverage/block-navigation.js b/mission9-10/coverage/block-navigation.js new file mode 100644 index 000000000..530d1ed2b --- /dev/null +++ b/mission9-10/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/mission9-10/coverage/clover.xml b/mission9-10/coverage/clover.xml new file mode 100644 index 000000000..e9a8bd4b5 --- /dev/null +++ b/mission9-10/coverage/clover.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/mission9-10/coverage/controllers/articlesController.ts.html b/mission9-10/coverage/controllers/articlesController.ts.html new file mode 100644 index 000000000..4b10f4f60 --- /dev/null +++ b/mission9-10/coverage/controllers/articlesController.ts.html @@ -0,0 +1,376 @@ + + + + + + Code coverage report for controllers/articlesController.ts + + + + + + + + + +

+
+

All files / controllers articlesController.ts

+
+ +
+ 23.07% + Statements + 15/65 +
+ + +
+ 0% + Branches + 0/20 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 23.07% + Lines + 15/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +981x +1x +1x +1x +  +  +  +  +1x +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  + 
import { create } from 'superstruct';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { IdParamsStruct } from '../structs/commonStructs';
+import {
+  CreateArticleBodyStruct,
+  UpdateArticleBodyStruct,
+  GetArticleListParamsStruct,
+} from '../structs/articlesStructs';
+import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
+import { Request, Response } from 'express';
+import { articleService } from '../services/articleService';
+ 
+//게시물 생성
+export async function createArticle(req: Request, res: Response) {
+  const { title, content, image } = create(req.body, CreateArticleBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const article = await articleService.createArticle(user.id, title, content, image);
+  return res.status(201).send(article);
+}
+// 게시글 조회(좋아요 포함)
+export async function getArticle(req: Request, res: Response) {
+  const { id } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  const article = await articleService.getArticle(id, user?.id);
+  return res.send(article);
+}
+//게시물 수정
+export async function updateArticle(req: Request, res: Response) {
+  const { id } = create(req.params, IdParamsStruct);
+  const data = create(req.body, UpdateArticleBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const updated = await articleService.updateArticle(id, user.id, data);
+  return res.send(updated);
+}
+//게시물 삭제
+export async function deleteArticle(req: Request, res: Response) {
+  const { id } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  await articleService.deleteArticle(id, user.id);
+  return res.status(204).send();
+}
+ 
+//게시글 목록 조회(좋아요 포함)
+export async function getArticleList(req: Request, res: Response) {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct);
+  const user = req.user;
+  const articles = await articleService.getArticleList(page, pageSize, orderBy, keyword, user?.id);
+  return res.send(articles);
+}
+//댓글 등록
+export async function createComment(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, CreateCommentBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const comment = await articleService.createComment(user.id, articleId, content);
+  return res.status(201).send(comment);
+}
+//댓글 목록 조회
+export async function getCommentList(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
+  const commnetsList = await articleService.getCommentList(articleId, limit, cursor);
+  return res.send(commnetsList);
+}
+//게시글 좋아요 등록
+export async function likeArticle(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const articleLike = await articleService.likeArticle(user.id, articleId);
+  return res.status(200).send(articleLike);
+}
+ 
+//게시글 좋아요 취소
+export async function unlikeArticle(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const articleUnlike = await articleService.unlikeArticle(user.id, articleId);
+  return res.status(200).send(articleUnlike);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/controllers/commentsController.ts.html b/mission9-10/coverage/controllers/commentsController.ts.html new file mode 100644 index 000000000..fbea65de5 --- /dev/null +++ b/mission9-10/coverage/controllers/commentsController.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for controllers/commentsController.ts + + + + + + + + + +
+
+

All files / controllers commentsController.ts

+
+ +
+ 35% + Statements + 7/20 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 35% + Lines + 7/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +301x +1x +1x +1x +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  + 
import { create } from 'superstruct';
+import { UpdateCommentBodyStruct } from '../structs/commentsStruct';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { IdParamsStruct } from '../structs/commonStructs';
+import { Request, Response } from 'express';
+import { commnetService } from '../services/commentService';
+ 
+//댓글 수정
+export async function updateComment(req: Request, res: Response) {
+  const { id: commentId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, UpdateCommentBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const updatedComment = await commnetService.updateComment(commentId, user.id, content);
+  return res.send(updatedComment);
+}
+ 
+//댓글 삭제
+export async function deleteComment(req: Request, res: Response) {
+  const { id: commentId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  await commnetService.deleteComment(commentId, user.id);
+  return res.status(204).send();
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/controllers/errorController.ts.html b/mission9-10/coverage/controllers/errorController.ts.html new file mode 100644 index 000000000..6e37e6a71 --- /dev/null +++ b/mission9-10/coverage/controllers/errorController.ts.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for controllers/errorController.ts + + + + + + + + + +
+
+

All files / controllers errorController.ts

+
+ +
+ 24% + Statements + 6/25 +
+ + +
+ 0% + Branches + 0/18 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 24% + Lines + 6/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +1x +  +  +  +  +  +1x +  +1x +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { StructError } from 'superstruct';
+import {
+  NotFoundError,
+  BadRequestError,
+  ForbiddenError,
+  UnauthorizedError,
+} from '../lib/errors/customErrors';
+import { Prisma } from '@prisma/client';
+import { Request, Response, NextFunction } from 'express';
+import { isSyntaxJsonError } from '../lib/errors/errorUtils';
+ 
+//404 처리 미들웨어
+export function defaultNotFoundHandler(req: Request, res: Response, next: NextFunction) {
+  return res.status(404).send({ message: '존재하지 않습니다' });
+}
+//전역 에러 처리 미들웨어(400,401,403,404,500)
+export function globalErrorHandler(err: unknown, req: Request, res: Response, next: NextFunction) {
+  if (err instanceof StructError || err instanceof BadRequestError) {
+    return res.status(400).send({ message: '잘못된 요청입니다' });
+  }
+  if (isSyntaxJsonError(err)) {
+    return res.status(400).send({ message: '잘못된 요청입니다' });
+  }
+  if (err instanceof UnauthorizedError) {
+    return res.status(401).json({ message: err.message });
+  }
+  if (err instanceof ForbiddenError) {
+    return res.status(403).json({ message: err.message });
+  }
+  if (err instanceof NotFoundError) {
+    return res.status(404).send({ message: err.message });
+  }
+  //프리즈마 코드 에러, 그 외 known 에러 500처리
+  if (err instanceof Prisma.PrismaClientKnownRequestError) {
+    if (err.code === 'P2025') {
+      return res.status(404).json({ message: '존재하지 않습니다' });
+    }
+    if (err.code === 'P2002') {
+      return res.status(400).json({ message: '잘못된 요청입니다' });
+    }
+    return res.status(500).json({ message: '데이터 처리 중 오류가 발생했습니다' });
+  }
+ 
+  console.error(err);
+  return res.status(500).send({ message: '데이터 처리 중 오류가 발생했습니다' });
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/controllers/imagesController.ts.html b/mission9-10/coverage/controllers/imagesController.ts.html new file mode 100644 index 000000000..220f752e1 --- /dev/null +++ b/mission9-10/coverage/controllers/imagesController.ts.html @@ -0,0 +1,211 @@ + + + + + + Code coverage report for controllers/imagesController.ts + + + + + + + + + +
+
+

All files / controllers imagesController.ts

+
+ +
+ 50% + Statements + 10/20 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 50% + Lines + 10/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +431x +1x +1x +1x +1x +  +1x +  +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  + 
import multer from 'multer';
+import path from 'path';
+import { v4 as uuidv4 } from 'uuid';
+import { PUBLIC_PATH } from '../lib/constants';
+import { BadRequestError } from '../lib/errors/customErrors';
+import { Request, Response } from 'express';
+import { imageService } from '../services/imageService';
+ 
+const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];
+const FILE_SIZE_LIMIT = 5 * 1024 * 1024;
+ 
+//이미지 업로드 설정
+export const upload = multer({
+  storage: multer.diskStorage({
+    destination(req, file, cb) {
+      cb(null, PUBLIC_PATH);
+    },
+    filename(req, file, cb) {
+      const ext = path.extname(file.originalname);
+      const filename = `${uuidv4()}${ext}`;
+      cb(null, filename);
+    },
+  }),
+ 
+  limits: {
+    fileSize: FILE_SIZE_LIMIT,
+  },
+ 
+  fileFilter: function (req, file, cb) {
+    if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) {
+      const err = new BadRequestError('Only png, jpeg, and jpg are allowed');
+      return cb(err);
+    }
+ 
+    cb(null, true);
+  },
+});
+//이미지 업로드 핸들러
+export async function uploadImage(req: Request, res: Response) {
+  const response = imageService.buildImageUrl(req);
+  return res.send(response);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/controllers/index.html b/mission9-10/coverage/controllers/index.html new file mode 100644 index 000000000..f4c6a8fdb --- /dev/null +++ b/mission9-10/coverage/controllers/index.html @@ -0,0 +1,206 @@ + + + + + + Code coverage report for controllers + + + + + + + + + +
+
+

All files controllers

+
+ +
+ 28.51% + Statements + 79/277 +
+ + +
+ 3.65% + Branches + 3/82 +
+ + +
+ 2.63% + Functions + 1/38 +
+ + +
+ 28.51% + Lines + 79/277 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesController.ts +
+
23.07%15/650%0/200%0/923.07%15/65
commentsController.ts +
+
35%7/200%0/40%0/235%7/20
errorController.ts +
+
24%6/250%0/180%0/224%6/25
imagesController.ts +
+
50%10/200%0/20%0/450%10/20
notificationController.ts +
+
30.43%7/230%0/60%0/330.43%7/23
productsController.ts +
+
29.23%19/6515%3/2011.11%1/929.23%19/65
usersController.ts +
+
25.42%15/590%0/120%0/925.42%15/59
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/controllers/notificationController.ts.html b/mission9-10/coverage/controllers/notificationController.ts.html new file mode 100644 index 000000000..b2919224a --- /dev/null +++ b/mission9-10/coverage/controllers/notificationController.ts.html @@ -0,0 +1,184 @@ + + + + + + Code coverage report for controllers/notificationController.ts + + + + + + + + + +
+
+

All files / controllers notificationController.ts

+
+ +
+ 30.43% + Statements + 7/23 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 30.43% + Lines + 7/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34  +1x +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  + 
import { Request, Response } from 'express';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { notificationService } from '../services/notificationService';
+import { IdParamsStruct } from '../structs/commonStructs';
+import { create } from 'superstruct';
+ 
+export async function getNotifications(req: Request, res: Response) {
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const notifications = await notificationService.getNotifications(user.id);
+  return res.send(notifications);
+}
+ 
+export async function getUnreadCount(req: Request, res: Response) {
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const count = await notificationService.getUnreadCount(user.id);
+  return res.send({ count });
+}
+ 
+export async function markAsRead(req: Request, res: Response) {
+  const { id: notificationId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const notification = await notificationService.markAsRead(notificationId, user.id);
+  return res.send(notification);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/controllers/productsController.ts.html b/mission9-10/coverage/controllers/productsController.ts.html new file mode 100644 index 000000000..698f62d91 --- /dev/null +++ b/mission9-10/coverage/controllers/productsController.ts.html @@ -0,0 +1,394 @@ + + + + + + Code coverage report for controllers/productsController.ts + + + + + + + + + +
+
+

All files / controllers productsController.ts

+
+ +
+ 29.23% + Statements + 19/65 +
+ + +
+ 15% + Branches + 3/20 +
+ + +
+ 11.11% + Functions + 1/9 +
+ + +
+ 29.23% + Lines + 19/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +1041x +1x +1x +  +  +  +  +1x +1x +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +2x +2x +2x +2x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  + 
import { create } from 'superstruct';
+import { IdParamsStruct } from '../structs/commonStructs';
+import {
+  CreateProductBodyStruct,
+  GetProductListParamsStruct,
+  UpdateProductBodyStruct,
+} from '../structs/productsStruct';
+import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { Request, Response } from 'express';
+import { productService } from '../services/productService';
+ 
+//상품 등록
+export async function createProduct(req: Request, res: Response) {
+  const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const product = await productService.createProduct({
+    name,
+    description,
+    price,
+    tags,
+    images,
+    userId: user.id,
+  });
+  return res.status(201).send(product);
+}
+//특정 상품 조회(좋아요 포함)
+export async function getProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  const product = await productService.getProduct(productId, user?.id);
+  return res.send(product);
+}
+//상품 수정
+export async function updateProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const data = create(req.body, UpdateProductBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const updatedProduct = await productService.updateProduct(productId, user.id, data);
+  return res.send(updatedProduct);
+}
+//상품 삭제
+export async function deleteProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  await productService.deleteProduct(productId, user.id);
+  return res.status(204).send();
+}
+//상품 목록 조회(좋아요 포함)
+export async function getProductList(req: Request, res: Response) {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct);
+  const user = req.user;
+  const products = await productService.getProductList(page, pageSize, orderBy, keyword, user?.id);
+  return res.send(products);
+}
+ 
+//댓글 등록
+export async function createComment(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, CreateCommentBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const comment = await productService.createComment(user.id, productId, content);
+  return res.status(201).send(comment);
+}
+//상품 댓글 목록 조회
+export async function getCommentList(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
+  const commentList = await productService.getCommentList(productId, limit, cursor);
+  return res.send(commentList);
+}
+//상품 좋아요 등록
+export async function likeProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const productLike = await productService.likeProduct(user.id, productId);
+  return res.status(200).send(productLike);
+}
+//상품 좋아요 취소
+export async function unlikeProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const productUnliked = await productService.unlikeProduct(user.id, productId);
+  return res.send(productUnliked);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/controllers/usersController.ts.html b/mission9-10/coverage/controllers/usersController.ts.html new file mode 100644 index 000000000..64d2b0e41 --- /dev/null +++ b/mission9-10/coverage/controllers/usersController.ts.html @@ -0,0 +1,361 @@ + + + + + + Code coverage report for controllers/usersController.ts + + + + + + + + + +
+
+

All files / controllers usersController.ts

+
+ +
+ 25.42% + Statements + 15/59 +
+ + +
+ 0% + Branches + 0/12 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 25.42% + Lines + 15/59 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +931x +  +  +  +  +  +  +  +1x +1x +1x +  +1x +1x +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  + 
import {
+  CreateUserBodyStruct,
+  UpdateUserBodyStruct,
+  LoginBodyStruct,
+  ChangePasswordBodyStruct,
+  GetMyProductListParamsStruct,
+  GetMyLikedProductListParamsStruct,
+} from '../structs/usersStructs';
+import { create } from 'superstruct';
+import { clearTokenCookies, setTokenCookies } from '../lib/cookies';
+import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants';
+import { Request, Response } from 'express';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { userService } from '../services/userService';
+ 
+//회원가입
+export async function register(req: Request, res: Response) {
+  const { nickname, email, password, image } = create(req.body, CreateUserBodyStruct);
+  const user = await userService.register(nickname, email, password, image);
+  return res.status(201).send(user);
+}
+//로그인
+export async function login(req: Request, res: Response) {
+  const { email, password } = create(req.body, LoginBodyStruct);
+  const result = await userService.login(email, password);
+  setTokenCookies(res, result.tokens.accessToken, result.tokens.refreshToken);
+  return res.status(200).send({ message: result.message });
+}
+//로그아웃
+export async function logout(req: Request, res: Response) {
+  clearTokenCookies(res);
+  return res.status(200).send({ message: '로그아웃에 성공했습니다.' });
+}
+//내 프로필 조회 (최근 등록한 상품 5개, 최근 좋아요한 상품 5개 포함)
+export async function getProfile(req: Request, res: Response) {
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const profile = await userService.getProfile(user.id);
+  return res.send(profile);
+}
+//내 프로필 수정
+export async function updateProfile(req: Request, res: Response) {
+  const { nickname, email, image } = create(req.body, UpdateUserBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const update = await userService.updateProfile(user.id, nickname, email, image);
+  return res.send(update);
+}
+//내 비밀번호 변경
+export async function patchPassword(req: Request, res: Response) {
+  const { currentPassword, newPassword } = create(req.body, ChangePasswordBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  await userService.patchPassword(user.id, currentPassword, newPassword);
+  return res.status(200).send({ message: '비밀번호가 성공적으로 변경되었습니다.' });
+}
+//내가 등록한 상품 목록 조회 (상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능)
+export async function getMyProductList(req: Request, res: Response) {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetMyProductListParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const myProducts = await userService.getMyProductList(user.id, page, pageSize, orderBy, keyword);
+  return res.send(myProducts);
+}
+//토큰 갱신(리프레시)
+export async function refreshToken(req: Request, res: Response) {
+  const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME];
+  if (!refreshToken) {
+    throw new UnauthorizedError('리프레시 토큰이 없습니다.');
+  }
+  const tokens = await userService.refreshToken(refreshToken);
+  setTokenCookies(res, tokens.accessToken, tokens.refreshToken);
+  return res.status(200).send({ message: '토큰이 성공적으로 갱신되었습니다.' });
+}
+//내가 좋아요한 상품 목록 조회(상품이 꽤 많이 있을 경우 페이징 처리)
+export async function getMyLikedProducts(req: Request, res: Response) {
+  const { page, pageSize, orderBy } = create(req.query, GetMyLikedProductListParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const myLikedProducts = await userService.getMyLikedProducts(user.id, page, pageSize, orderBy);
+  return res.send(myLikedProducts);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/coverage-final.json b/mission9-10/coverage/coverage-final.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/mission9-10/coverage/coverage-final.json @@ -0,0 +1 @@ +{} diff --git a/mission9-10/coverage/favicon.png b/mission9-10/coverage/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 74.06% + Statements + 454/613 +
+ + +
+ 46.55% + Branches + 108/232 +
+ + +
+ 66.99% + Functions + 69/103 +
+ + +
+ 74.87% + Lines + 447/597 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src +
+
100%26/26100%0/0100%0/0100%26/26
src/controllers +
+
70.68%164/23241.93%26/6268.75%22/3270.68%164/232
src/repositories +
+
73.07%38/5269.23%18/2663.63%21/3373.07%38/52
src/routers +
+
100%69/69100%0/0100%0/0100%69/69
src/services +
+
67.09%157/23444.44%64/14468.42%26/3868.8%150/218
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/lcov-report/base.css b/mission9-10/coverage/lcov-report/base.css new file mode 100644 index 000000000..f418035b4 --- /dev/null +++ b/mission9-10/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/mission9-10/coverage/lcov-report/block-navigation.js b/mission9-10/coverage/lcov-report/block-navigation.js new file mode 100644 index 000000000..530d1ed2b --- /dev/null +++ b/mission9-10/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/mission9-10/coverage/lcov-report/favicon.png b/mission9-10/coverage/lcov-report/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ Unknown% + Statements + 0/0 +
+ + +
+ Unknown% + Branches + 0/0 +
+ + +
+ Unknown% + Functions + 0/0 +
+ + +
+ Unknown% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/lcov-report/prettify.css b/mission9-10/coverage/lcov-report/prettify.css new file mode 100644 index 000000000..b317a7cda --- /dev/null +++ b/mission9-10/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/mission9-10/coverage/lcov-report/prettify.js b/mission9-10/coverage/lcov-report/prettify.js new file mode 100644 index 000000000..b3225238f --- /dev/null +++ b/mission9-10/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/mission9-10/coverage/lcov-report/sort-arrow-sprite.png b/mission9-10/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/mission9-10/coverage/lcov-report/sorter.js b/mission9-10/coverage/lcov-report/sorter.js new file mode 100644 index 000000000..4ed70ae5a --- /dev/null +++ b/mission9-10/coverage/lcov-report/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/mission9-10/coverage/lcov.info b/mission9-10/coverage/lcov.info new file mode 100644 index 000000000..e69de29bb diff --git a/mission9-10/coverage/lib/constants.ts.html b/mission9-10/coverage/lib/constants.ts.html new file mode 100644 index 000000000..9e18f9c6b --- /dev/null +++ b/mission9-10/coverage/lib/constants.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for lib/constants.ts + + + + + + + + + +
+
+

All files / lib constants.ts

+
+ +
+ 100% + Statements + 20/20 +
+ + +
+ 50% + Branches + 4/8 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +1x +  +1x +1x +1x +1x +1x +  +1x +  +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  + 
import dotenv from 'dotenv';
+dotenv.config();
+ 
+const DATABASE_URL = process.env.DATABASE_URL;
+const NODE_ENV = process.env.NODE_ENV || 'development';
+const PORT = process.env.PORT || 3000;
+const PUBLIC_PATH = 'public';
+const STATIC_PATH = '/public';
+const JWT_ACCESS_TOKEN_SECRET =
+  process.env.JWT_ACCESS_TOKEN_SECRET || 'your_jwt_access_token_secret';
+const JWT_REFRESH_TOKEN_SECRET =
+  process.env.JWT_REFRESH_TOKEN_SECRET || 'your_jwt_refresh_token_secret';
+const ACCESS_TOKEN_COOKIE_NAME = 'access-token';
+const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token';
+ 
+export {
+  DATABASE_URL,
+  NODE_ENV,
+  PORT,
+  PUBLIC_PATH,
+  STATIC_PATH,
+  JWT_ACCESS_TOKEN_SECRET,
+  JWT_REFRESH_TOKEN_SECRET,
+  ACCESS_TOKEN_COOKIE_NAME,
+  REFRESH_TOKEN_COOKIE_NAME,
+};
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/lib/cookies.ts.html b/mission9-10/coverage/lib/cookies.ts.html new file mode 100644 index 000000000..7c2e7eaed --- /dev/null +++ b/mission9-10/coverage/lib/cookies.ts.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for lib/cookies.ts + + + + + + + + + +
+
+

All files / lib cookies.ts

+
+ +
+ 42.85% + Statements + 3/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 42.85% + Lines + 3/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +291x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  + 
import { NODE_ENV, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from './constants';
+import { Response } from 'express';
+ 
+export function setTokenCookies(res: Response, accessToken: string, refreshToken: string) {
+  res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+    maxAge: 1 * 60 * 60 * 1000, // 1시간
+  });
+  res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+    maxAge: 7 * 24 * 60 * 60 * 1000, // 7일
+    path: '/users/refresh',
+  });
+}
+ 
+export function clearTokenCookies(res: Response) {
+  res.clearCookie(ACCESS_TOKEN_COOKIE_NAME, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+  });
+  res.clearCookie(REFRESH_TOKEN_COOKIE_NAME, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+    path: '/users/refresh',
+  });
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/lib/errors/customErrors.ts.html b/mission9-10/coverage/lib/errors/customErrors.ts.html new file mode 100644 index 000000000..98442b49b --- /dev/null +++ b/mission9-10/coverage/lib/errors/customErrors.ts.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for lib/errors/customErrors.ts + + + + + + + + + +
+
+

All files / lib/errors customErrors.ts

+
+ +
+ 38.88% + Statements + 7/18 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 38.88% + Lines + 7/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  + 
export class BaseError extends Error {
+  statusCode: number;
+  constructor(message: string, statusCode: number) {
+    super(message);
+    this.name = new.target.name;
+    this.statusCode = statusCode;
+  }
+}
+ 
+export class NotFoundError extends BaseError {
+  constructor(message = '존재하지 않습니다') {
+    super(message, 404);
+  }
+}
+ 
+export class UnauthorizedError extends BaseError {
+  constructor(message = '인증이 필요합니다') {
+    super(message, 401);
+  }
+}
+ 
+export class BadRequestError extends BaseError {
+  constructor(message = '잘못된 요청입니다') {
+    super(message, 400);
+  }
+}
+ 
+export class ForbiddenError extends BaseError {
+  constructor(message = '비밀번호가 틀렸습니다') {
+    super(message, 403);
+  }
+}
+ 
+export class AlreadyLikeError extends ForbiddenError {
+  constructor(message = '이미 좋아요를 눌렀습니다.') {
+    super(message);
+    this.name = new.target.name;
+  }
+}
+ 
+export class AlreadyUnlikeError extends ForbiddenError {
+  constructor(message = '좋아요가 존재하지 않습니다.') {
+    super(message);
+    this.name = new.target.name;
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/lib/errors/errorUtils.ts.html b/mission9-10/coverage/lib/errors/errorUtils.ts.html new file mode 100644 index 000000000..2087af67c --- /dev/null +++ b/mission9-10/coverage/lib/errors/errorUtils.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for lib/errors/errorUtils.ts + + + + + + + + + +
+
+

All files / lib/errors errorUtils.ts

+
+ +
+ 20% + Statements + 1/5 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 25% + Lines + 1/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14  +  +  +  +  +1x +  +  +  +  +  +  +  + 
interface SyntaxJsonError extends SyntaxError {
+  status?: number;
+  body?: unknown;
+}
+ 
+export function isSyntaxJsonError(err: unknown): err is SyntaxJsonError {
+  if (!(err instanceof SyntaxError)) return false;
+  const e = err as Partial<SyntaxJsonError>;
+  return typeof e.status === 'number' && 'body' in e;
+}
+// Partial<SyntaxJsonError>;
+// 얘는 SyntaxJsonError의 일부 프로퍼티만 가지고 있을 수도 있어”
+// 라고 TS에게 알려서 e.status, e.body 같은 속성 접근을 가능하게 해주는 장치
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/lib/errors/index.html b/mission9-10/coverage/lib/errors/index.html new file mode 100644 index 000000000..cd59b19a2 --- /dev/null +++ b/mission9-10/coverage/lib/errors/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for lib/errors + + + + + + + + + +
+
+

All files lib/errors

+
+ +
+ 34.78% + Statements + 8/23 +
+ + +
+ 0% + Branches + 0/10 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 36.36% + Lines + 8/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
customErrors.ts +
+
38.88%7/180%0/60%0/738.88%7/18
errorUtils.ts +
+
20%1/50%0/40%0/125%1/4
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/lib/index.html b/mission9-10/coverage/lib/index.html new file mode 100644 index 000000000..ecde2e77e --- /dev/null +++ b/mission9-10/coverage/lib/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for lib + + + + + + + + + +
+
+

All files lib

+
+ +
+ 74.46% + Statements + 35/47 +
+ + +
+ 50% + Branches + 4/8 +
+ + +
+ 37.5% + Functions + 3/8 +
+ + +
+ 73.91% + Lines + 34/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
constants.ts +
+
100%20/2050%4/8100%0/0100%20/20
cookies.ts +
+
42.85%3/7100%0/00%0/242.85%3/7
prismaClient.ts +
+
100%2/2100%0/0100%0/0100%2/2
token.ts +
+
41.66%5/12100%0/00%0/341.66%5/12
withAsync.ts +
+
83.33%5/6100%0/0100%3/380%4/5
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/lib/prismaClient.ts.html b/mission9-10/coverage/lib/prismaClient.ts.html new file mode 100644 index 000000000..2e8063c3d --- /dev/null +++ b/mission9-10/coverage/lib/prismaClient.ts.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for lib/prismaClient.ts + + + + + + + + + +
+
+

All files / lib prismaClient.ts

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +  +1x + 
import { PrismaClient } from '@prisma/client';
+ 
+export const prisma = new PrismaClient();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/lib/token.ts.html b/mission9-10/coverage/lib/token.ts.html new file mode 100644 index 000000000..372192f34 --- /dev/null +++ b/mission9-10/coverage/lib/token.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for lib/token.ts + + + + + + + + + +
+
+

All files / lib token.ts

+
+ +
+ 41.66% + Statements + 5/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 41.66% + Lines + 5/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  + 
import jwt, { JwtPayload } from 'jsonwebtoken';
+import { JWT_ACCESS_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET } from './constants';
+ 
+interface TokenPayload extends JwtPayload {
+  id: number;
+}
+ 
+export function generateToken(userId: number) {
+  const accessToken = jwt.sign({ id: userId }, JWT_ACCESS_TOKEN_SECRET, { expiresIn: '1h' });
+  const refreshToken = jwt.sign({ id: userId }, JWT_REFRESH_TOKEN_SECRET, { expiresIn: '1d' });
+  return { accessToken, refreshToken };
+}
+ 
+export function verifyAccessToken(token: string) {
+  const decoded = jwt.verify(token, JWT_ACCESS_TOKEN_SECRET) as TokenPayload;
+  return { userId: decoded.id };
+}
+ 
+export function verifyRefreshToken(token: string) {
+  const decoded = jwt.verify(token, JWT_REFRESH_TOKEN_SECRET) as TokenPayload;
+  return { userId: decoded.id };
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/lib/withAsync.ts.html b/mission9-10/coverage/lib/withAsync.ts.html new file mode 100644 index 000000000..2e7a603fd --- /dev/null +++ b/mission9-10/coverage/lib/withAsync.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for lib/withAsync.ts + + + + + + + + + +
+
+

All files / lib withAsync.ts

+
+ +
+ 83.33% + Statements + 5/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 80% + Lines + 4/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14  +  +1x +  +  +33x +2x +2x +  +  +  +  +  + 
import type { Request, Response, NextFunction, RequestHandler } from 'express';
+ 
+export function withAsync<T = unknown>(
+  handler: (req: Request, res: Response, next: NextFunction) => Promise<T>,
+): RequestHandler {
+  return async (req, res, next) => {
+    try {
+      await handler(req, res, next);
+    } catch (e) {
+      next(e);
+    }
+  };
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/middlewares/authenticate.ts.html b/mission9-10/coverage/middlewares/authenticate.ts.html new file mode 100644 index 000000000..56eeaf857 --- /dev/null +++ b/mission9-10/coverage/middlewares/authenticate.ts.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for middlewares/authenticate.ts + + + + + + + + + +
+
+

All files / middlewares authenticate.ts

+
+ +
+ 55% + Statements + 11/20 +
+ + +
+ 42.85% + Branches + 3/7 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 52.63% + Lines + 10/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +311x +1x +1x +1x +  +  +  +26x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { prisma } from '../lib/prismaClient';
+import { verifyAccessToken } from '../lib/token';
+import { ACCESS_TOKEN_COOKIE_NAME } from '../lib/constants';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { NextFunction, Request, Response } from 'express';
+ 
+function authenticate(options = { optional: false }) {
+  return async (req: Request, res: Response, next: NextFunction) => {
+    const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME];
+    Eif (!accessToken) {
+      Eif (options.optional) {
+        return next();
+      }
+      return next(new UnauthorizedError());
+    }
+    try {
+      const { userId } = verifyAccessToken(accessToken); //디코딩 된 토큰에서 user id 추출
+      const user = await prisma.user.findUniqueOrThrow({ where: { id: userId } });
+      req.user = user;
+    } catch (error) {
+      if (options.optional) {
+        return next();
+      }
+      return next(new UnauthorizedError());
+    }
+    next();
+  };
+}
+ 
+export default authenticate;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/middlewares/index.html b/mission9-10/coverage/middlewares/index.html new file mode 100644 index 000000000..73cd09812 --- /dev/null +++ b/mission9-10/coverage/middlewares/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for middlewares + + + + + + + + + +
+
+

All files middlewares

+
+ +
+ 55% + Statements + 11/20 +
+ + +
+ 42.85% + Branches + 3/7 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 52.63% + Lines + 10/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
authenticate.ts +
+
55%11/2042.85%3/7100%3/352.63%10/19
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/prettify.css b/mission9-10/coverage/prettify.css new file mode 100644 index 000000000..b317a7cda --- /dev/null +++ b/mission9-10/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/mission9-10/coverage/prettify.js b/mission9-10/coverage/prettify.js new file mode 100644 index 000000000..b3225238f --- /dev/null +++ b/mission9-10/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/mission9-10/coverage/repositories/articleRepository.ts.html b/mission9-10/coverage/repositories/articleRepository.ts.html new file mode 100644 index 000000000..d1defbc06 --- /dev/null +++ b/mission9-10/coverage/repositories/articleRepository.ts.html @@ -0,0 +1,256 @@ + + + + + + Code coverage report for repositories/articleRepository.ts + + + + + + + + + +
+
+

All files / repositories articleRepository.ts

+
+ +
+ 30% + Statements + 3/10 +
+ + +
+ 0% + Branches + 0/8 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 30% + Lines + 3/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { Prisma } from '@prisma/client';
+import { prisma } from '../lib/prismaClient';
+import { ArticleLikesAndCount } from '../../types/article';
+ 
+export class ArticleRepository {
+  async create(data: Prisma.ArticleCreateInput) {
+    return prisma.article.create({ data });
+  }
+  async findById(id: number) {
+    return prisma.article.findUniqueOrThrow({ where: { id } });
+  }
+  async findByIdWithLikes(id: number, userId?: number): Promise<ArticleLikesAndCount> {
+    return prisma.article.findUniqueOrThrow({
+      where: { id },
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          //비로그인 시 -1을 줘서 []을 뱉도록
+          where: { userId: userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async findArticleListWithLikes(params: {
+    skip: number;
+    take: number;
+    orderBy: Prisma.ArticleOrderByWithRelationInput;
+    where: Prisma.ArticleWhereInput;
+    userId?: number;
+  }): Promise<ArticleLikesAndCount[]> {
+    return prisma.article.findMany({
+      skip: params.skip,
+      take: params.take,
+      orderBy: params.orderBy,
+      where: params.where,
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          where: { userId: params.userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async count(where: Prisma.ArticleWhereInput) {
+    return prisma.article.count({ where });
+  }
+  async update(id: number, data: Prisma.ArticleUpdateInput) {
+    return prisma.article.update({ where: { id }, data });
+  }
+  async delete(id: number) {
+    return prisma.article.delete({ where: { id } });
+  }
+}
+ 
+export const articleRepo = new ArticleRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/repositories/commentRepository.ts.html b/mission9-10/coverage/repositories/commentRepository.ts.html new file mode 100644 index 000000000..9d84f7d08 --- /dev/null +++ b/mission9-10/coverage/repositories/commentRepository.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for repositories/commentRepository.ts + + + + + + + + + +
+
+

All files / repositories commentRepository.ts

+
+ +
+ 37.5% + Statements + 3/8 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 37.5% + Lines + 3/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { Prisma } from '@prisma/client';
+import { prisma } from '../lib/prismaClient';
+ 
+export class CommentRepository {
+  async create(data: Prisma.CommentCreateInput) {
+    return prisma.comment.create({ data });
+  }
+  async findCommentListQuery(
+    whereCondition: { articleId: number } | { productId: number },
+    limit: number,
+    cursor?: number,
+  ) {
+    return prisma.comment.findMany({
+      cursor: cursor ? { id: cursor } : undefined,
+      take: limit + 1,
+      where: whereCondition,
+      orderBy: { createdAt: 'desc' },
+    });
+  }
+  async findById(id: number) {
+    return prisma.comment.findUniqueOrThrow({ where: { id } });
+  }
+  async update(id: number, content?: string) {
+    return prisma.comment.update({ where: { id }, data: { content } });
+  }
+  async delete(id: number) {
+    return prisma.comment.delete({ where: { id } });
+  }
+}
+ 
+export const commentRepo = new CommentRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/repositories/index.html b/mission9-10/coverage/repositories/index.html new file mode 100644 index 000000000..0e2a502ec --- /dev/null +++ b/mission9-10/coverage/repositories/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for repositories + + + + + + + + + +
+
+

All files repositories

+
+ +
+ 32.69% + Statements + 17/52 +
+ + +
+ 11.53% + Branches + 3/26 +
+ + +
+ 6.06% + Functions + 2/33 +
+ + +
+ 32.69% + Lines + 17/52 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articleRepository.ts +
+
30%3/100%0/80%0/730%3/10
commentRepository.ts +
+
37.5%3/80%0/20%0/537.5%3/8
likeRepository.ts +
+
22.22%2/90%0/60%0/422.22%2/9
notificationRepository.ts +
+
37.5%3/8100%0/00%0/537.5%3/8
productRepository.ts +
+
36.36%4/1130%3/1025%2/836.36%4/11
userRepository.ts +
+
33.33%2/6100%0/00%0/433.33%2/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/repositories/likeRepository.ts.html b/mission9-10/coverage/repositories/likeRepository.ts.html new file mode 100644 index 000000000..426f98a4e --- /dev/null +++ b/mission9-10/coverage/repositories/likeRepository.ts.html @@ -0,0 +1,193 @@ + + + + + + Code coverage report for repositories/likeRepository.ts + + + + + + + + + +
+
+

All files / repositories likeRepository.ts

+
+ +
+ 22.22% + Statements + 2/9 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 22.22% + Lines + 2/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { LikeTarget } from '../../types/like';
+import { prisma } from '../lib/prismaClient';
+ 
+class LikdeRepository {
+  async findLike(userId: number, target: LikeTarget) {
+    const whereCondition =
+      'articleId' in target
+        ? { userId_articleId: { userId, articleId: target.articleId } }
+        : { userId_productId: { userId, productId: target.productId } };
+    return prisma.like.findUnique({
+      where: whereCondition,
+    });
+  }
+  async createLike(userId: number, target: LikeTarget) {
+    return prisma.like.create({ data: { userId, ...target } });
+  }
+  async deleteLike(userId: number, target: LikeTarget) {
+    const whereCondition =
+      'articleId' in target
+        ? { userId_articleId: { userId, articleId: target.articleId } }
+        : { userId_productId: { userId, productId: target.productId } };
+    return prisma.like.delete({
+      where: whereCondition,
+    });
+  }
+  async getLikers(target: LikeTarget) {
+    const whereCondition =
+      'articleId' in target ? { articleId: target.articleId } : { productId: target.productId };
+    return prisma.like.findMany({
+      where: whereCondition,
+      select: { userId: true },
+    });
+  }
+}
+ 
+export const likeRepo = new LikdeRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/repositories/notificationRepository.ts.html b/mission9-10/coverage/repositories/notificationRepository.ts.html new file mode 100644 index 000000000..196af5b36 --- /dev/null +++ b/mission9-10/coverage/repositories/notificationRepository.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for repositories/notificationRepository.ts + + + + + + + + + +
+
+

All files / repositories notificationRepository.ts

+
+ +
+ 37.5% + Statements + 3/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 37.5% + Lines + 3/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { prisma } from '../lib/prismaClient';
+ 
+export class NotificationRepository {
+  async getNotification(userId: number) {
+    return prisma.notification.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } });
+  }
+  async getUnreadCount(userId: number) {
+    return prisma.notification.count({ where: { userId, isRead: false } });
+  }
+  async create(userId: number, message: string) {
+    return prisma.notification.create({ data: { userId, message } });
+  }
+  async findByIds(notificationId: number, userId: number) {
+    return prisma.notification.findFirst({
+      where: { id: notificationId, userId },
+    });
+  }
+  async updateRead(notificationId: number) {
+    return prisma.notification.update({
+      where: { id: notificationId },
+      data: { isRead: true },
+    });
+  }
+}
+ 
+export const notificationRepo = new NotificationRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/repositories/productRepository.ts.html b/mission9-10/coverage/repositories/productRepository.ts.html new file mode 100644 index 000000000..d9370bb0f --- /dev/null +++ b/mission9-10/coverage/repositories/productRepository.ts.html @@ -0,0 +1,280 @@ + + + + + + Code coverage report for repositories/productRepository.ts + + + + + + + + + +
+
+

All files / repositories productRepository.ts

+
+ +
+ 36.36% + Statements + 4/11 +
+ + +
+ 30% + Branches + 3/10 +
+ + +
+ 25% + Functions + 2/8 +
+ + +
+ 36.36% + Lines + 4/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { ProductLikesAndCount } from '../../types/product';
+import { prisma } from '../lib/prismaClient';
+import { Prisma } from '@prisma/client';
+import type { ProductRecentType } from '../../types/product';
+ 
+class ProductRepository {
+  async create(data: Prisma.ProductCreateInput) {
+    return prisma.product.create({ data });
+  }
+  async findById(id: number) {
+    return prisma.product.findUniqueOrThrow({ where: { id } });
+  }
+  async findByIdWithLikes(id: number, userId?: number): Promise<ProductLikesAndCount> {
+    return prisma.product.findUniqueOrThrow({
+      where: { id },
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          where: { userId: userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async update(id: number, data: Prisma.ProductUpdateInput) {
+    return prisma.product.update({ where: { id }, data });
+  }
+  async delete(id: number) {
+    return prisma.product.delete({ where: { id } });
+  }
+  async findProductListWithLikes(params: {
+    skip: number;
+    take: number;
+    orderBy: Prisma.ProductOrderByWithRelationInput;
+    where: Prisma.ProductWhereInput;
+    userId?: number;
+  }): Promise<ProductLikesAndCount[]> {
+    return prisma.product.findMany({
+      skip: params.skip,
+      take: params.take,
+      orderBy: params.orderBy,
+      where: params.where,
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          where: { userId: params.userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async count(where: Prisma.ProductWhereInput) {
+    return prisma.product.count({ where });
+  }
+  async findRecentProduct(userId: number, limit: number, type: ProductRecentType) {
+    const whereCondition = type === 'myUploaded' ? { userId } : { likes: { some: { userId } } };
+    return prisma.product.findMany({
+      where: whereCondition,
+      orderBy: { createdAt: 'desc' },
+      take: limit,
+    });
+  }
+}
+ 
+export const productRepo = new ProductRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/repositories/userRepository.ts.html b/mission9-10/coverage/repositories/userRepository.ts.html new file mode 100644 index 000000000..babeb8a89 --- /dev/null +++ b/mission9-10/coverage/repositories/userRepository.ts.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for repositories/userRepository.ts + + + + + + + + + +
+
+

All files / repositories userRepository.ts

+
+ +
+ 33.33% + Statements + 2/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 33.33% + Lines + 2/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +201x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { prisma } from '../lib/prismaClient';
+import { Prisma } from '@prisma/client';
+ 
+class UserRepository {
+  async create(data: Prisma.UserCreateInput) {
+    return prisma.user.create({ data });
+  }
+  async findByEmail(email: string) {
+    return prisma.user.findUnique({ where: { email } });
+  }
+  async update(id: number, data: Prisma.UserUpdateInput) {
+    return prisma.user.update({ where: { id }, data });
+  }
+  async findById(id: number) {
+    return prisma.user.findUnique({ where: { id } });
+  }
+}
+ 
+export const userRepo = new UserRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/services/articleService.ts.html b/mission9-10/coverage/services/articleService.ts.html new file mode 100644 index 000000000..24a14424b --- /dev/null +++ b/mission9-10/coverage/services/articleService.ts.html @@ -0,0 +1,499 @@ + + + + + + Code coverage report for services/articleService.ts + + + + + + + + + +
+
+

All files / services articleService.ts

+
+ +
+ 13.55% + Statements + 8/59 +
+ + +
+ 0% + Branches + 0/34 +
+ + +
+ 0% + Functions + 0/10 +
+ + +
+ 14.03% + Lines + 8/57 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +1391x +  +1x +1x +1x +1x +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { articleRepo } from '../repositories/articleRepository';
+import { ArticleLikesAndCount, ArticleListResponse, ArticleResponse } from '../../types/article';
+import { AlreadyLikeError, AlreadyUnlikeError, ForbiddenError } from '../lib/errors/customErrors';
+import { commentRepo } from '../repositories/commentRepository';
+import { likeRepo } from '../repositories/likeRepository';
+import { Prisma, Article, Comment } from '@prisma/client';
+import type { CursorPaginated } from '../../types/cursorPaginated';
+import { notificationService } from './notificationService';
+ 
+//객체로 주면 콘트롤러에서 인자순서 상관없이 적용되지만, ()형태로 반환하게되면 인자순서를 서비스형태와 동일하게 넣어야 함
+export class ArticleService {
+  async createArticle(
+    userId: number,
+    title: string,
+    content: string,
+    image?: string | null,
+  ): Promise<Article> {
+    return articleRepo.create({
+      title,
+      content,
+      image,
+      user: { connect: { id: userId } },
+    });
+  }
+  async getArticle(articleId: number, userId?: number): Promise<ArticleResponse> {
+    const article: ArticleLikesAndCount = await articleRepo.findByIdWithLikes(articleId, userId);
+    const { likes, _count, ...articleData } = article;
+    const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined;
+    return { ...articleData, likeCount: _count.likes, isLiked };
+  }
+  async updateArticle(
+    articleId: number,
+    userId: number,
+    data: { title?: string; content?: string; image?: string | null },
+  ): Promise<Article> {
+    const article = await articleRepo.findById(articleId);
+    if (article.userId !== userId) {
+      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
+    }
+    return articleRepo.update(articleId, data);
+  }
+  async deleteArticle(articleId: number, userId: number): Promise<void> {
+    const article = await articleRepo.findById(articleId);
+    if (article.userId !== userId) {
+      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
+    }
+    await articleRepo.delete(articleId);
+  }
+  async getArticleList(
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+    keyword?: string,
+    userId?: number,
+  ): Promise<ArticleListResponse> {
+    const where = {
+      title: keyword ? { contains: keyword } : undefined,
+    };
+    const [totalCount, articles] = await Promise.all([
+      articleRepo.count(where),
+      articleRepo.findArticleListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId,
+      }),
+    ]);
+    const list: ArticleResponse[] = articles.map((m) => {
+      const { _count, likes, ...basicArticleData } = m;
+      const response: ArticleResponse = {
+        ...basicArticleData,
+        likeCount: _count.likes,
+      };
+      if (!userId) {
+        return response;
+      }
+      const isLiked = (likes ?? []).length > 0;
+      return { ...basicArticleData, isLiked, likeCount: _count.likes };
+    });
+    const response: ArticleListResponse = {
+      list,
+      totalCount,
+    };
+    return response;
+  }
+  async createComment(userId: number, articleId: number, content: string): Promise<Comment> {
+    await articleRepo.findById(articleId);
+    const comment = await commentRepo.create({
+      content,
+      user: { connect: { id: userId } },
+      article: { connect: { id: articleId } },
+    });
+    const article = await articleRepo.findById(articleId);
+    if (article.userId !== userId) {
+      await notificationService.createNotification(
+        article.userId,
+        `내 게시글 "${article.title}"에 새로운 댓글이 달렸습니다.`,
+      );
+    }
+    return comment;
+  }
+  async getCommentList(
+    articleId: number,
+    limit: number,
+    cursor?: number,
+  ): Promise<CursorPaginated<Comment>> {
+    await articleRepo.findById(articleId);
+    const commentsWithCursor = await commentRepo.findCommentListQuery({ articleId }, limit, cursor);
+    const comments = commentsWithCursor.slice(0, limit);
+    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
+    const nextCursor = cursorComment ? cursorComment.id : null;
+    return { list: comments, nextCursor };
+  }
+  //like , unlike 둘다 message를 반환해버려서 이게..프로미스로 타입 설정하는 것이 의미가 있는지...로직 수정 생각해봐야할 듯
+  async likeArticle(userId: number, articleId: number): Promise<{ message: string }> {
+    const article = await articleRepo.findById(articleId);
+    const existingLike = await likeRepo.findLike(userId, { articleId });
+    if (existingLike) {
+      throw new AlreadyLikeError();
+    }
+    await likeRepo.createLike(userId, { articleId });
+    return { message: `${article.title}게시글에 좋아요를 눌렀습니다.` };
+  }
+  async unlikeArticle(userId: number, articleId: number): Promise<{ message: string }> {
+    const article = await articleRepo.findById(articleId);
+    try {
+      await likeRepo.deleteLike(userId, { articleId });
+    } catch (error: unknown) {
+      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
+        throw new AlreadyUnlikeError();
+      }
+      throw error;
+    }
+    return { message: `${article.title}게시글의 좋아요를 취소했습니다` };
+  }
+}
+export const articleService = new ArticleService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/services/commentService.ts.html b/mission9-10/coverage/services/commentService.ts.html new file mode 100644 index 000000000..b00d0ec11 --- /dev/null +++ b/mission9-10/coverage/services/commentService.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for services/commentService.ts + + + + + + + + + +
+
+

All files / services commentService.ts

+
+ +
+ 33.33% + Statements + 4/12 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 33.33% + Lines + 4/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { commentRepo } from '../repositories/commentRepository';
+import { ForbiddenError } from '../lib/errors/customErrors';
+import { Comment } from '@prisma/client';
+ 
+export class CommentService {
+  async updateComment(commentId: number, userId: number, content?: string): Promise<Comment> {
+    const comment = await commentRepo.findById(commentId);
+    if (comment.userId !== userId) {
+      throw new ForbiddenError('해당 댓글을 수정할 권한이 없습니다.');
+    }
+    return commentRepo.update(commentId, content);
+  }
+  async deleteComment(commentId: number, userId: number): Promise<void> {
+    const comment = await commentRepo.findById(commentId);
+    if (comment.userId !== userId) {
+      throw new ForbiddenError('해당 댓글을 삭제할 권한이 없습니다.');
+    }
+    await commentRepo.delete(commentId);
+  }
+}
+ 
+export const commnetService = new CommentService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/services/imageService.ts.html b/mission9-10/coverage/services/imageService.ts.html new file mode 100644 index 000000000..6f8b0cf18 --- /dev/null +++ b/mission9-10/coverage/services/imageService.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for services/imageService.ts + + + + + + + + + +
+
+

All files / services imageService.ts

+
+ +
+ 38.46% + Statements + 5/13 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 38.46% + Lines + 5/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { uploadImageResponse } from '../../types/image';
+import { Request } from 'express';
+import { BadRequestError } from '../lib/errors/customErrors';
+import path from 'path';
+import { STATIC_PATH } from '../lib/constants';
+ 
+export class ImageService {
+  buildImageUrl(req: Request): uploadImageResponse {
+    const host = req.get('host');
+    if (!host) {
+      throw new BadRequestError('요청 헤더에 host 정보가 없습니다.');
+    }
+    if (!req.file) {
+      throw new BadRequestError();
+    }
+    const filePath = path.join(host, STATIC_PATH, req.file.filename);
+    const url = `http://${filePath}`;
+    return { url };
+  }
+}
+ 
+export const imageService = new ImageService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/services/index.html b/mission9-10/coverage/services/index.html new file mode 100644 index 000000000..02ae16e1c --- /dev/null +++ b/mission9-10/coverage/services/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for services + + + + + + + + + +
+
+

All files services

+
+ +
+ 19.26% + Statements + 47/244 +
+ + +
+ 2.02% + Branches + 3/148 +
+ + +
+ 5.12% + Functions + 2/39 +
+ + +
+ 20.17% + Lines + 46/228 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articleService.ts +
+
13.55%8/590%0/340%0/1014.03%8/57
commentService.ts +
+
33.33%4/120%0/40%0/233.33%4/12
imageService.ts +
+
38.46%5/130%0/40%0/138.46%5/13
notificationService.ts +
+
33.33%5/150%0/20%0/435.71%5/14
productService.ts +
+
28.35%19/676.25%3/4820%2/1027.69%18/65
userService.ts +
+
7.69%6/780%0/560%0/128.95%6/67
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/services/notificationService.ts.html b/mission9-10/coverage/services/notificationService.ts.html new file mode 100644 index 000000000..92c271ff3 --- /dev/null +++ b/mission9-10/coverage/services/notificationService.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for services/notificationService.ts + + + + + + + + + +
+
+

All files / services notificationService.ts

+
+ +
+ 33.33% + Statements + 5/15 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 35.71% + Lines + 5/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { UnauthorizedError } from '../lib/errors/customErrors';
+import { notificationRepo } from '../repositories/notificationRepository';
+import { getIO } from '../socket';
+import type { Notification as PrismaNotification } from '@prisma/client';
+ 
+export class NotificationService {
+  async getNotifications(userId: number): Promise<PrismaNotification[]> {
+    return notificationRepo.getNotification(userId);
+  }
+  async getUnreadCount(userId: number): Promise<number> {
+    return notificationRepo.getUnreadCount(userId);
+  }
+  async createNotification(userId: number, message: string): Promise<PrismaNotification> {
+    const notification = await notificationRepo.create(userId, message);
+    const io = getIO();
+    io.to(`user-${userId}`).emit('notification', notification);
+    return notification;
+  }
+  async markAsRead(notificationId: number, userId: number): Promise<PrismaNotification> {
+    const notification = await notificationRepo.findByIds(notificationId, userId);
+    if (!notification) throw new UnauthorizedError();
+    return notificationRepo.updateRead(notificationId);
+  }
+}
+ 
+export const notificationService = new NotificationService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/services/productService.ts.html b/mission9-10/coverage/services/productService.ts.html new file mode 100644 index 000000000..56fdc37ce --- /dev/null +++ b/mission9-10/coverage/services/productService.ts.html @@ -0,0 +1,604 @@ + + + + + + Code coverage report for services/productService.ts + + + + + + + + + +
+
+

All files / services productService.ts

+
+ +
+ 28.35% + Statements + 19/67 +
+ + +
+ 6.25% + Branches + 3/48 +
+ + +
+ 20% + Functions + 2/10 +
+ + +
+ 27.69% + Lines + 18/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174  +1x +  +  +1x +1x +  +  +1x +1x +1x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +2x +2x +2x +  +  +  +2x +2x +  +  +  +  +2x +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { ProductLikesAndCount } from '../../types/product';
+import { productRepo } from '../repositories/productRepository';
+import { Product } from '@prisma/client';
+import type { ProductListResponse, ProductResponse } from '../../types/product';
+import { ForbiddenError } from '../lib/errors/customErrors';
+import { commentRepo } from '../repositories/commentRepository';
+import type { Comment } from '@prisma/client';
+import type { CursorPaginated } from '../../types/cursorPaginated';
+import { AlreadyLikeError, AlreadyUnlikeError } from '../lib/errors/customErrors';
+import { likeRepo } from '../repositories/likeRepository';
+import { Prisma } from '@prisma/client';
+import { notificationService } from './notificationService';
+ 
+//인자 순서가 옵셔널 다음 필수파라미터가 들어오면 컴파일에러가 발생함
+//객체로 묶어 보내기, 이러면 필수인 userid의 파라미터 순서를 바꾸지 않아도 됨
+export class ProductService {
+  async createProduct(params: {
+    name: string;
+    description: string;
+    price: number;
+    tags?: string[];
+    images?: string[];
+    userId: number;
+  }): Promise<Product> {
+    const { name, description, price, tags, images, userId } = params;
+    return productRepo.create({
+      name,
+      description,
+      price,
+      tags: tags ?? [],
+      images: images ?? [],
+      user: { connect: { id: userId } },
+    });
+  }
+  async getProduct(productId: number, userId?: number): Promise<ProductResponse> {
+    const product: ProductLikesAndCount = await productRepo.findByIdWithLikes(productId, userId);
+    const { likes, _count, ...productData } = product;
+    const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined;
+    return { ...productData, likeCount: _count.likes, isLiked };
+  }
+  async updateProduct(
+    productId: number,
+    userId: number,
+    data: {
+      name?: string;
+      description?: string;
+      price?: number;
+      tags?: string[];
+      images?: string[];
+    },
+  ): Promise<Product> {
+    const product = await productRepo.findById(productId);
+    if (product.userId !== userId) {
+      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
+    }
+    const updateProduct = await productRepo.update(productId, data);
+    //undefined가 아니면서 기존가격과 다른 경우
+    if (data.price !== undefined && product.price !== data.price) {
+      const likers = await likeRepo.getLikers({ productId });
+      for (const liker of likers) {
+        if (liker.userId !== userId) {
+          await notificationService.createNotification(
+            liker.userId,
+            `관심 상품 "${product.name}"의 가격이 변동되었습니다.`,
+          );
+        }
+      }
+    }
+    return updateProduct;
+  }
+  async deleteProduct(productId: number, userId: number): Promise<void> {
+    const product = await productRepo.findById(productId);
+    if (product.userId !== userId) {
+      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
+    }
+    await productRepo.delete(productId);
+  }
+  async getProductList(
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+    keyword?: string,
+    userId?: number,
+  ): Promise<ProductListResponse> {
+    const where = keyword
+      ? {
+          OR: [
+            { name: { contains: keyword } },
+            { description: { contains: keyword } },
+            { tags: { has: keyword } },
+          ],
+        }
+      : {};
+    const [totalCount, products] = await Promise.all([
+      productRepo.count(where),
+      productRepo.findProductListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId,
+      }),
+    ]);
+    const list: ProductResponse[] = products.map((m) => {
+      const { _count, likes, ...basicProductData } = m;
+      const response: ProductResponse = {
+        ...basicProductData,
+        likeCount: _count.likes,
+      };
+      Eif (!userId) {
+        return response;
+      }
+      const isLiked = (likes ?? []).length > 0;
+      return { ...basicProductData, isLiked, likeCount: _count.likes };
+    });
+    const response: ProductListResponse = {
+      list,
+      totalCount,
+    };
+    return response;
+  }
+  async createComment(userId: number, productId: number, content: string): Promise<Comment> {
+    await productRepo.findById(productId);
+    const comment = await commentRepo.create({
+      content,
+      user: { connect: { id: userId } },
+      product: { connect: { id: productId } },
+    });
+    const product = await productRepo.findById(productId);
+    if (product.userId !== userId) {
+      await notificationService.createNotification(
+        product.userId,
+        `내 상품 "${product.name}"에 새로운 댓글이 달렸습니다.`,
+      );
+    }
+    return comment;
+  }
+  async getCommentList(
+    productId: number,
+    limit: number,
+    cursor?: number,
+  ): Promise<CursorPaginated<Comment>> {
+    await productRepo.findById(productId);
+    const commentsWithCursor = await commentRepo.findCommentListQuery({ productId }, limit, cursor);
+    const comments = commentsWithCursor.slice(0, limit);
+    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
+    const nextCursor = cursorComment ? cursorComment.id : null;
+    return { list: comments, nextCursor };
+  }
+  async likeProduct(userId: number, productId: number): Promise<{ message: string }> {
+    const product = await productRepo.findById(productId);
+    const existingLike = await likeRepo.findLike(userId, { productId });
+    if (existingLike) {
+      throw new AlreadyLikeError();
+    }
+    await likeRepo.createLike(userId, { productId });
+    return { message: `${product.name}상품에 좋아요를 눌렀습니다.` };
+  }
+  async unlikeProduct(userId: number, productId: number): Promise<{ message: string }> {
+    const product = await productRepo.findById(productId);
+    try {
+      await likeRepo.deleteLike(userId, { productId });
+    } catch (error: unknown) {
+      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
+        throw new AlreadyUnlikeError();
+      }
+      throw error;
+    }
+    return { message: `${product.name}상품의 좋아요를 취소했습니다` };
+  }
+}
+ 
+export const productService = new ProductService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/services/userService.ts.html b/mission9-10/coverage/services/userService.ts.html new file mode 100644 index 000000000..9923c4656 --- /dev/null +++ b/mission9-10/coverage/services/userService.ts.html @@ -0,0 +1,721 @@ + + + + + + Code coverage report for services/userService.ts + + + + + + + + + +
+
+

All files / services userService.ts

+
+ +
+ 7.69% + Statements + 6/78 +
+ + +
+ 0% + Branches + 0/56 +
+ + +
+ 0% + Functions + 0/12 +
+ + +
+ 8.95% + Lines + 6/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +2131x +1x +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import bcrypt from 'bcrypt';
+import { userRepo } from '../repositories/userRepository';
+import type { Prisma, User } from '@prisma/client';
+import { ForbiddenError, UnauthorizedError } from '../lib/errors/customErrors';
+import { generateToken, verifyRefreshToken } from '../lib/token';
+import { productRepo } from '../repositories/productRepository';
+import type { ProductListResponse } from '../../types/product';
+import { ProfileResponse } from '../../types/user';
+ 
+class UserService {
+  async register(
+    nickname: string,
+    email: string,
+    password: string,
+    image?: string,
+  ): Promise<Omit<User, 'password'>> {
+    const salt = await bcrypt.genSalt(10);
+    const hashedPassword = await bcrypt.hash(password, salt);
+    const user = await userRepo.create({
+      nickname,
+      email,
+      password: hashedPassword,
+      image,
+    });
+    const { password: _, ...userWithoutPassword } = user;
+    return userWithoutPassword;
+  }
+  async login(
+    email: string,
+    password: string,
+  ): Promise<{ tokens: { accessToken: string; refreshToken: string }; message: string }> {
+    const user = await userRepo.findByEmail(email);
+    if (!user) {
+      //이메일, 비밀번호 검증에 대한 에러를 같은 메세지로 던짐으로써 좀 더 방어적으로 설계
+      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
+    }
+    const isPasswordValid = await bcrypt.compare(password, user.password);
+    if (!isPasswordValid) {
+      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
+    }
+    const tokens = generateToken(user.id);
+    return { tokens, message: '로그인에 성공했습니다.' };
+  }
+  async getProfile(myId: number): Promise<ProfileResponse> {
+    const user = await userRepo.findById(myId);
+    if (!user) throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
+    const { password: _, ...userInfo } = user;
+    const [myProductCount, myLikeProductCount, recentProductsRaw, recentLikedProductsRaw] =
+      await Promise.all([
+        productRepo.count({ userId: myId }),
+        productRepo.count({ likes: { some: { userId: myId } } }),
+        productRepo.findProductListWithLikes({
+          skip: 0,
+          take: 5,
+          orderBy: { createdAt: 'desc' },
+          where: { userId: myId },
+          userId: myId,
+        }),
+        productRepo.findProductListWithLikes({
+          skip: 0,
+          take: 5,
+          orderBy: { createdAt: 'desc' },
+          where: { likes: { some: { userId: myId } } },
+          userId: myId,
+        }),
+      ]);
+    const myRecentProducts = recentProductsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    const myRecentLikeProducts = recentLikedProductsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    return {
+      user: userInfo,
+      myProducts: {
+        list: myRecentProducts,
+        totalCount: myProductCount,
+      },
+      myLikedProducts: {
+        list: myRecentLikeProducts,
+        totalCount: myLikeProductCount,
+      },
+    };
+  }
+ 
+  async updateProfile(
+    userId: number,
+    nickname?: string,
+    email?: string,
+    image?: string | null,
+  ): Promise<Omit<User, 'password'>> {
+    const data: Prisma.UserUpdateInput = {};
+    if (nickname !== undefined) data.nickname = nickname;
+    if (email !== undefined) data.email = email;
+    if (image !== undefined) data.image = image;
+    const update = await userRepo.update(userId, data);
+    const { password: _, ...userWithoutPassword } = update;
+    return userWithoutPassword;
+  }
+  async patchPassword(userId: number, currentPassword: string, newPassword: string): Promise<void> {
+    const user = await userRepo.findById(userId);
+    if (!user) {
+      throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
+    }
+    const isPasswordValid = await bcrypt.compare(currentPassword, user.password);
+    if (!isPasswordValid) {
+      throw new ForbiddenError('현재 비밀번호가 올바르지 않습니다.');
+    }
+    const salt = await bcrypt.genSalt(10);
+    const hashedNewPassword = await bcrypt.hash(newPassword, salt);
+    await userRepo.update(userId, { password: hashedNewPassword });
+  }
+  async getMyProductList(
+    myId: number,
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+    keyword?: string,
+  ): Promise<ProductListResponse> {
+    const where = {
+      userId: myId,
+      ...(keyword
+        ? {
+            OR: [
+              { name: { contains: keyword } },
+              { description: { contains: keyword } },
+              { tags: { has: keyword } },
+            ],
+          }
+        : {}),
+    };
+    const [totalCount, productsRaw] = await Promise.all([
+      productRepo.count(where),
+      productRepo.findProductListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId: myId,
+      }),
+    ]);
+    const list = productsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    return { list, totalCount };
+  }
+  async refreshToken(refreshToken: string) {
+    let userId: number;
+    try {
+      const payload = verifyRefreshToken(refreshToken);
+      userId = payload.userId;
+    } catch (error) {
+      throw new UnauthorizedError('유효하지 않은 리프레시 토큰입니다.');
+    }
+    const user = await userRepo.findById(userId);
+    if (!user) {
+      throw new UnauthorizedError('존재하지 않는 사용자입니다.');
+    }
+    const tokens = generateToken(user.id);
+    return tokens;
+  }
+  async getMyLikedProducts(
+    myId: number,
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+  ): Promise<ProductListResponse> {
+    const where = {
+      likes: {
+        some: {
+          userId: myId,
+        },
+      },
+    };
+    const [totalCount, productsRaw] = await Promise.all([
+      productRepo.count(where),
+      productRepo.findProductListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId: myId,
+      }),
+    ]);
+    const list = productsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    return { list, totalCount };
+  }
+}
+ 
+export const userService = new UserService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/sort-arrow-sprite.png b/mission9-10/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/mission9-10/coverage/sorter.js b/mission9-10/coverage/sorter.js new file mode 100644 index 000000000..4ed70ae5a --- /dev/null +++ b/mission9-10/coverage/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/mission9-10/coverage/src/app.ts.html b/mission9-10/coverage/src/app.ts.html new file mode 100644 index 000000000..ebbdc13c5 --- /dev/null +++ b/mission9-10/coverage/src/app.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/app.ts + + + + + + + + + +
+
+

All files / src app.ts

+
+ +
+ 100% + Statements + 26/26 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 26/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +325x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +  +5x +  +5x +5x +5x +5x +  +5x +5x +5x +5x +5x +5x +  +5x +5x +  +5x + 
import express from 'express';
+import cors from 'cors';
+import path from 'path';
+import { PUBLIC_PATH, STATIC_PATH } from './lib/constants';
+import articlesRouter from './routers/articlesRouter';
+import productsRouter from './routers/productsRouter';
+import commentsRouter from './routers/commentsRouter';
+import imagesRouter from './routers/imagesRouter';
+import usersRouter from './routers/usersRouter';
+import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController';
+import cookieParser from 'cookie-parser';
+import notificationRouter from './routers/notificationRouter';
+ 
+const app = express();
+ 
+app.use(cors());
+app.use(cookieParser());
+app.use(express.json());
+app.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH)));
+ 
+app.use('/articles', articlesRouter);
+app.use('/products', productsRouter);
+app.use('/comments', commentsRouter);
+app.use('/images', imagesRouter);
+app.use('/users', usersRouter);
+app.use('/notifications', notificationRouter);
+ 
+app.use(defaultNotFoundHandler);
+app.use(globalErrorHandler);
+ 
+export default app;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/articlesController.ts.html b/mission9-10/coverage/src/controllers/articlesController.ts.html new file mode 100644 index 000000000..ee8c380d1 --- /dev/null +++ b/mission9-10/coverage/src/controllers/articlesController.ts.html @@ -0,0 +1,376 @@ + + + + + + Code coverage report for src/controllers/articlesController.ts + + + + + + + + + +
+
+

All files / src/controllers articlesController.ts

+
+ +
+ 90.76% + Statements + 59/65 +
+ + +
+ 60% + Branches + 12/20 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 90.76% + Lines + 59/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +985x +5x +5x +5x +  +  +  +  +5x +  +5x +  +  +5x +1x +1x +1x +  +  +1x +1x +  +  +5x +2x +2x +2x +1x +  +  +5x +2x +2x +2x +2x +  +  +2x +1x +  +  +5x +2x +2x +2x +  +  +2x +1x +  +  +  +5x +8x +6x +6x +6x +  +  +5x +1x +1x +1x +1x +  +  +1x +1x +  +  +5x +2x +2x +2x +2x +  +  +5x +1x +1x +1x +  +  +1x +1x +  +  +  +5x +1x +1x +1x +  +  +1x +1x +  + 
import { create } from 'superstruct';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { IdParamsStruct } from '../structs/commonStructs';
+import {
+  CreateArticleBodyStruct,
+  UpdateArticleBodyStruct,
+  GetArticleListParamsStruct,
+} from '../structs/articlesStructs';
+import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
+import { Request, Response } from 'express';
+import { articleService } from '../services/articleService';
+ 
+//게시물 생성
+export async function createArticle(req: Request, res: Response) {
+  const { title, content, image } = create(req.body, CreateArticleBodyStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const article = await articleService.createArticle(user.id, title, content, image);
+  return res.status(201).send(article);
+}
+// 게시글 조회(좋아요 포함)
+export async function getArticle(req: Request, res: Response) {
+  const { id } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  const article = await articleService.getArticle(id, user?.id);
+  return res.send(article);
+}
+//게시물 수정
+export async function updateArticle(req: Request, res: Response) {
+  const { id } = create(req.params, IdParamsStruct);
+  const data = create(req.body, UpdateArticleBodyStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const updated = await articleService.updateArticle(id, user.id, data);
+  return res.send(updated);
+}
+//게시물 삭제
+export async function deleteArticle(req: Request, res: Response) {
+  const { id } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  await articleService.deleteArticle(id, user.id);
+  return res.status(204).send();
+}
+ 
+//게시글 목록 조회(좋아요 포함)
+export async function getArticleList(req: Request, res: Response) {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct);
+  const user = req.user;
+  const articles = await articleService.getArticleList(page, pageSize, orderBy, keyword, user?.id);
+  return res.send(articles);
+}
+//댓글 등록
+export async function createComment(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, CreateCommentBodyStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const comment = await articleService.createComment(user.id, articleId, content);
+  return res.status(201).send(comment);
+}
+//댓글 목록 조회
+export async function getCommentList(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
+  const commnetsList = await articleService.getCommentList(articleId, limit, cursor);
+  return res.send(commnetsList);
+}
+//게시글 좋아요 등록
+export async function likeArticle(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const articleLike = await articleService.likeArticle(user.id, articleId);
+  return res.status(200).send(articleLike);
+}
+ 
+//게시글 좋아요 취소
+export async function unlikeArticle(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const articleUnlike = await articleService.unlikeArticle(user.id, articleId);
+  return res.status(200).send(articleUnlike);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/commentsController.ts.html b/mission9-10/coverage/src/controllers/commentsController.ts.html new file mode 100644 index 000000000..9ef895178 --- /dev/null +++ b/mission9-10/coverage/src/controllers/commentsController.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/controllers/commentsController.ts + + + + + + + + + +
+
+

All files / src/controllers commentsController.ts

+
+ +
+ 35% + Statements + 7/20 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 35% + Lines + 7/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +305x +5x +5x +5x +  +5x +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  + 
import { create } from 'superstruct';
+import { UpdateCommentBodyStruct } from '../structs/commentsStruct';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { IdParamsStruct } from '../structs/commonStructs';
+import { Request, Response } from 'express';
+import { commnetService } from '../services/commentService';
+ 
+//댓글 수정
+export async function updateComment(req: Request, res: Response) {
+  const { id: commentId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, UpdateCommentBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const updatedComment = await commnetService.updateComment(commentId, user.id, content);
+  return res.send(updatedComment);
+}
+ 
+//댓글 삭제
+export async function deleteComment(req: Request, res: Response) {
+  const { id: commentId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  await commnetService.deleteComment(commentId, user.id);
+  return res.status(204).send();
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/errorController.ts.html b/mission9-10/coverage/src/controllers/errorController.ts.html new file mode 100644 index 000000000..86af6b171 --- /dev/null +++ b/mission9-10/coverage/src/controllers/errorController.ts.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for src/controllers/errorController.ts + + + + + + + + + +
+
+

All files / src/controllers errorController.ts

+
+ +
+ 24% + Statements + 6/25 +
+ + +
+ 0% + Branches + 0/18 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 24% + Lines + 6/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +1x +  +  +  +  +  +1x +  +1x +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { StructError } from 'superstruct';
+import {
+  NotFoundError,
+  BadRequestError,
+  ForbiddenError,
+  UnauthorizedError,
+} from '../lib/errors/customErrors';
+import { Prisma } from '@prisma/client';
+import { Request, Response, NextFunction } from 'express';
+import { isSyntaxJsonError } from '../lib/errors/errorUtils';
+ 
+//404 처리 미들웨어
+export function defaultNotFoundHandler(req: Request, res: Response, next: NextFunction) {
+  return res.status(404).send({ message: '존재하지 않습니다' });
+}
+//전역 에러 처리 미들웨어(400,401,403,404,500)
+export function globalErrorHandler(err: unknown, req: Request, res: Response, next: NextFunction) {
+  if (err instanceof StructError || err instanceof BadRequestError) {
+    return res.status(400).send({ message: '잘못된 요청입니다' });
+  }
+  if (isSyntaxJsonError(err)) {
+    return res.status(400).send({ message: '잘못된 요청입니다' });
+  }
+  if (err instanceof UnauthorizedError) {
+    return res.status(401).json({ message: err.message });
+  }
+  if (err instanceof ForbiddenError) {
+    return res.status(403).json({ message: err.message });
+  }
+  if (err instanceof NotFoundError) {
+    return res.status(404).send({ message: err.message });
+  }
+  //프리즈마 코드 에러, 그 외 known 에러 500처리
+  if (err instanceof Prisma.PrismaClientKnownRequestError) {
+    if (err.code === 'P2025') {
+      return res.status(404).json({ message: '존재하지 않습니다' });
+    }
+    if (err.code === 'P2002') {
+      return res.status(400).json({ message: '잘못된 요청입니다' });
+    }
+    return res.status(500).json({ message: '데이터 처리 중 오류가 발생했습니다' });
+  }
+ 
+  console.error(err);
+  return res.status(500).send({ message: '데이터 처리 중 오류가 발생했습니다' });
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/imagesController.ts.html b/mission9-10/coverage/src/controllers/imagesController.ts.html new file mode 100644 index 000000000..9de297b28 --- /dev/null +++ b/mission9-10/coverage/src/controllers/imagesController.ts.html @@ -0,0 +1,211 @@ + + + + + + Code coverage report for src/controllers/imagesController.ts + + + + + + + + + +
+
+

All files / src/controllers imagesController.ts

+
+ +
+ 50% + Statements + 10/20 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 50% + Lines + 10/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +431x +1x +1x +1x +1x +  +1x +  +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  + 
import multer from 'multer';
+import path from 'path';
+import { v4 as uuidv4 } from 'uuid';
+import { PUBLIC_PATH } from '../lib/constants';
+import { BadRequestError } from '../lib/errors/customErrors';
+import { Request, Response } from 'express';
+import { imageService } from '../services/imageService';
+ 
+const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];
+const FILE_SIZE_LIMIT = 5 * 1024 * 1024;
+ 
+//이미지 업로드 설정
+export const upload = multer({
+  storage: multer.diskStorage({
+    destination(req, file, cb) {
+      cb(null, PUBLIC_PATH);
+    },
+    filename(req, file, cb) {
+      const ext = path.extname(file.originalname);
+      const filename = `${uuidv4()}${ext}`;
+      cb(null, filename);
+    },
+  }),
+ 
+  limits: {
+    fileSize: FILE_SIZE_LIMIT,
+  },
+ 
+  fileFilter: function (req, file, cb) {
+    if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) {
+      const err = new BadRequestError('Only png, jpeg, and jpg are allowed');
+      return cb(err);
+    }
+ 
+    cb(null, true);
+  },
+});
+//이미지 업로드 핸들러
+export async function uploadImage(req: Request, res: Response) {
+  const response = imageService.buildImageUrl(req);
+  return res.send(response);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/index.html b/mission9-10/coverage/src/controllers/index.html new file mode 100644 index 000000000..68a331014 --- /dev/null +++ b/mission9-10/coverage/src/controllers/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/controllers + + + + + + + + + +
+
+

All files src/controllers

+
+ +
+ 70.68% + Statements + 164/232 +
+ + +
+ 41.93% + Branches + 26/62 +
+ + +
+ 68.75% + Functions + 22/32 +
+ + +
+ 70.68% + Lines + 164/232 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesController.ts +
+
90.76%59/6560%12/20100%9/990.76%59/65
commentsController.ts +
+
35%7/200%0/40%0/235%7/20
notificationController.ts +
+
30.43%7/230%0/60%0/330.43%7/23
productsController.ts +
+
90.76%59/6560%12/20100%9/990.76%59/65
usersController.ts +
+
54.23%32/5916.66%2/1244.44%4/954.23%32/59
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/notificationController.ts.html b/mission9-10/coverage/src/controllers/notificationController.ts.html new file mode 100644 index 000000000..3432fbb90 --- /dev/null +++ b/mission9-10/coverage/src/controllers/notificationController.ts.html @@ -0,0 +1,184 @@ + + + + + + Code coverage report for src/controllers/notificationController.ts + + + + + + + + + +
+
+

All files / src/controllers notificationController.ts

+
+ +
+ 30.43% + Statements + 7/23 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 30.43% + Lines + 7/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34  +5x +5x +5x +5x +  +5x +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  + 
import { Request, Response } from 'express';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { notificationService } from '../services/notificationService';
+import { IdParamsStruct } from '../structs/commonStructs';
+import { create } from 'superstruct';
+ 
+export async function getNotifications(req: Request, res: Response) {
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const notifications = await notificationService.getNotifications(user.id);
+  return res.send(notifications);
+}
+ 
+export async function getUnreadCount(req: Request, res: Response) {
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const count = await notificationService.getUnreadCount(user.id);
+  return res.send({ count });
+}
+ 
+export async function markAsRead(req: Request, res: Response) {
+  const { id: notificationId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const notification = await notificationService.markAsRead(notificationId, user.id);
+  return res.send(notification);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/productsController.ts.html b/mission9-10/coverage/src/controllers/productsController.ts.html new file mode 100644 index 000000000..11058dda7 --- /dev/null +++ b/mission9-10/coverage/src/controllers/productsController.ts.html @@ -0,0 +1,394 @@ + + + + + + Code coverage report for src/controllers/productsController.ts + + + + + + + + + +
+
+

All files / src/controllers productsController.ts

+
+ +
+ 90.76% + Statements + 59/65 +
+ + +
+ 60% + Branches + 12/20 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 90.76% + Lines + 59/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +1045x +5x +5x +  +  +  +  +5x +5x +  +5x +  +  +5x +1x +1x +1x +  +  +1x +  +  +  +  +  +  +  +1x +  +  +5x +2x +2x +2x +1x +  +  +5x +2x +2x +2x +2x +  +  +2x +1x +  +  +5x +2x +2x +2x +  +  +2x +1x +  +  +5x +12x +10x +10x +10x +  +  +  +5x +1x +1x +1x +1x +  +  +1x +1x +  +  +5x +2x +2x +2x +2x +  +  +5x +2x +2x +2x +  +  +2x +2x +  +  +5x +1x +1x +1x +  +  +1x +1x +  + 
import { create } from 'superstruct';
+import { IdParamsStruct } from '../structs/commonStructs';
+import {
+  CreateProductBodyStruct,
+  GetProductListParamsStruct,
+  UpdateProductBodyStruct,
+} from '../structs/productsStruct';
+import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { Request, Response } from 'express';
+import { productService } from '../services/productService';
+ 
+//상품 등록
+export async function createProduct(req: Request, res: Response) {
+  const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const product = await productService.createProduct({
+    name,
+    description,
+    price,
+    tags,
+    images,
+    userId: user.id,
+  });
+  return res.status(201).send(product);
+}
+//특정 상품 조회(좋아요 포함)
+export async function getProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  const product = await productService.getProduct(productId, user?.id);
+  return res.send(product);
+}
+//상품 수정
+export async function updateProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const data = create(req.body, UpdateProductBodyStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const updatedProduct = await productService.updateProduct(productId, user.id, data);
+  return res.send(updatedProduct);
+}
+//상품 삭제
+export async function deleteProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  await productService.deleteProduct(productId, user.id);
+  return res.status(204).send();
+}
+//상품 목록 조회(좋아요 포함)
+export async function getProductList(req: Request, res: Response) {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct);
+  const user = req.user;
+  const products = await productService.getProductList(page, pageSize, orderBy, keyword, user?.id);
+  return res.send(products);
+}
+ 
+//댓글 등록
+export async function createComment(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, CreateCommentBodyStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const comment = await productService.createComment(user.id, productId, content);
+  return res.status(201).send(comment);
+}
+//상품 댓글 목록 조회
+export async function getCommentList(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
+  const commentList = await productService.getCommentList(productId, limit, cursor);
+  return res.send(commentList);
+}
+//상품 좋아요 등록
+export async function likeProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const productLike = await productService.likeProduct(user.id, productId);
+  return res.status(200).send(productLike);
+}
+//상품 좋아요 취소
+export async function unlikeProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const productUnliked = await productService.unlikeProduct(user.id, productId);
+  return res.send(productUnliked);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/usersController.ts.html b/mission9-10/coverage/src/controllers/usersController.ts.html new file mode 100644 index 000000000..543581ad1 --- /dev/null +++ b/mission9-10/coverage/src/controllers/usersController.ts.html @@ -0,0 +1,361 @@ + + + + + + Code coverage report for src/controllers/usersController.ts + + + + + + + + + +
+
+

All files / src/controllers usersController.ts

+
+ +
+ 54.23% + Statements + 32/59 +
+ + +
+ 16.66% + Branches + 2/12 +
+ + +
+ 44.44% + Functions + 4/9 +
+ + +
+ 54.23% + Lines + 32/59 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +935x +  +  +  +  +  +  +  +5x +5x +5x +  +5x +5x +  +  +5x +22x +21x +20x +  +  +5x +18x +18x +17x +17x +  +  +5x +  +  +  +  +5x +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +5x +1x +1x +1x +  +  +1x +1x +  +  +5x +  +  +  +  +  +  +  +  +  +5x +1x +1x +1x +  +  +1x +1x +  + 
import {
+  CreateUserBodyStruct,
+  UpdateUserBodyStruct,
+  LoginBodyStruct,
+  ChangePasswordBodyStruct,
+  GetMyProductListParamsStruct,
+  GetMyLikedProductListParamsStruct,
+} from '../structs/usersStructs';
+import { create } from 'superstruct';
+import { clearTokenCookies, setTokenCookies } from '../lib/cookies';
+import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants';
+import { Request, Response } from 'express';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { userService } from '../services/userService';
+ 
+//회원가입
+export async function register(req: Request, res: Response) {
+  const { nickname, email, password, image } = create(req.body, CreateUserBodyStruct);
+  const user = await userService.register(nickname, email, password, image);
+  return res.status(201).send(user);
+}
+//로그인
+export async function login(req: Request, res: Response) {
+  const { email, password } = create(req.body, LoginBodyStruct);
+  const result = await userService.login(email, password);
+  setTokenCookies(res, result.tokens.accessToken, result.tokens.refreshToken);
+  return res.status(200).send({ message: result.message });
+}
+//로그아웃
+export async function logout(req: Request, res: Response) {
+  clearTokenCookies(res);
+  return res.status(200).send({ message: '로그아웃에 성공했습니다.' });
+}
+//내 프로필 조회 (최근 등록한 상품 5개, 최근 좋아요한 상품 5개 포함)
+export async function getProfile(req: Request, res: Response) {
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const profile = await userService.getProfile(user.id);
+  return res.send(profile);
+}
+//내 프로필 수정
+export async function updateProfile(req: Request, res: Response) {
+  const { nickname, email, image } = create(req.body, UpdateUserBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const update = await userService.updateProfile(user.id, nickname, email, image);
+  return res.send(update);
+}
+//내 비밀번호 변경
+export async function patchPassword(req: Request, res: Response) {
+  const { currentPassword, newPassword } = create(req.body, ChangePasswordBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  await userService.patchPassword(user.id, currentPassword, newPassword);
+  return res.status(200).send({ message: '비밀번호가 성공적으로 변경되었습니다.' });
+}
+//내가 등록한 상품 목록 조회 (상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능)
+export async function getMyProductList(req: Request, res: Response) {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetMyProductListParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const myProducts = await userService.getMyProductList(user.id, page, pageSize, orderBy, keyword);
+  return res.send(myProducts);
+}
+//토큰 갱신(리프레시)
+export async function refreshToken(req: Request, res: Response) {
+  const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME];
+  if (!refreshToken) {
+    throw new UnauthorizedError('리프레시 토큰이 없습니다.');
+  }
+  const tokens = await userService.refreshToken(refreshToken);
+  setTokenCookies(res, tokens.accessToken, tokens.refreshToken);
+  return res.status(200).send({ message: '토큰이 성공적으로 갱신되었습니다.' });
+}
+//내가 좋아요한 상품 목록 조회(상품이 꽤 많이 있을 경우 페이징 처리)
+export async function getMyLikedProducts(req: Request, res: Response) {
+  const { page, pageSize, orderBy } = create(req.query, GetMyLikedProductListParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const myLikedProducts = await userService.getMyLikedProducts(user.id, page, pageSize, orderBy);
+  return res.send(myLikedProducts);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/index.html b/mission9-10/coverage/src/index.html new file mode 100644 index 000000000..e19a66f1f --- /dev/null +++ b/mission9-10/coverage/src/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 100% + Statements + 26/26 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 26/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
app.ts +
+
100%26/26100%0/0100%0/0100%26/26
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/constants.ts.html b/mission9-10/coverage/src/lib/constants.ts.html new file mode 100644 index 000000000..e54059ce3 --- /dev/null +++ b/mission9-10/coverage/src/lib/constants.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for src/lib/constants.ts + + + + + + + + + +
+
+

All files / src/lib constants.ts

+
+ +
+ 100% + Statements + 20/20 +
+ + +
+ 50% + Branches + 4/8 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +1x +  +1x +1x +1x +1x +1x +  +1x +  +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  + 
import dotenv from 'dotenv';
+dotenv.config();
+ 
+const DATABASE_URL = process.env.DATABASE_URL;
+const NODE_ENV = process.env.NODE_ENV || 'development';
+const PORT = process.env.PORT || 3000;
+const PUBLIC_PATH = 'public';
+const STATIC_PATH = '/public';
+const JWT_ACCESS_TOKEN_SECRET =
+  process.env.JWT_ACCESS_TOKEN_SECRET || 'your_jwt_access_token_secret';
+const JWT_REFRESH_TOKEN_SECRET =
+  process.env.JWT_REFRESH_TOKEN_SECRET || 'your_jwt_refresh_token_secret';
+const ACCESS_TOKEN_COOKIE_NAME = 'access-token';
+const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token';
+ 
+export {
+  DATABASE_URL,
+  NODE_ENV,
+  PORT,
+  PUBLIC_PATH,
+  STATIC_PATH,
+  JWT_ACCESS_TOKEN_SECRET,
+  JWT_REFRESH_TOKEN_SECRET,
+  ACCESS_TOKEN_COOKIE_NAME,
+  REFRESH_TOKEN_COOKIE_NAME,
+};
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/cookies.ts.html b/mission9-10/coverage/src/lib/cookies.ts.html new file mode 100644 index 000000000..b4382c51e --- /dev/null +++ b/mission9-10/coverage/src/lib/cookies.ts.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for src/lib/cookies.ts + + + + + + + + + +
+
+

All files / src/lib cookies.ts

+
+ +
+ 42.85% + Statements + 3/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 42.85% + Lines + 3/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +291x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  + 
import { NODE_ENV, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from './constants';
+import { Response } from 'express';
+ 
+export function setTokenCookies(res: Response, accessToken: string, refreshToken: string) {
+  res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+    maxAge: 1 * 60 * 60 * 1000, // 1시간
+  });
+  res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+    maxAge: 7 * 24 * 60 * 60 * 1000, // 7일
+    path: '/users/refresh',
+  });
+}
+ 
+export function clearTokenCookies(res: Response) {
+  res.clearCookie(ACCESS_TOKEN_COOKIE_NAME, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+  });
+  res.clearCookie(REFRESH_TOKEN_COOKIE_NAME, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+    path: '/users/refresh',
+  });
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/errors/customErrors.ts.html b/mission9-10/coverage/src/lib/errors/customErrors.ts.html new file mode 100644 index 000000000..7992d9e0a --- /dev/null +++ b/mission9-10/coverage/src/lib/errors/customErrors.ts.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for src/lib/errors/customErrors.ts + + + + + + + + + +
+
+

All files / src/lib/errors customErrors.ts

+
+ +
+ 38.88% + Statements + 7/18 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 38.88% + Lines + 7/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  + 
export class BaseError extends Error {
+  statusCode: number;
+  constructor(message: string, statusCode: number) {
+    super(message);
+    this.name = new.target.name;
+    this.statusCode = statusCode;
+  }
+}
+ 
+export class NotFoundError extends BaseError {
+  constructor(message = '존재하지 않습니다') {
+    super(message, 404);
+  }
+}
+ 
+export class UnauthorizedError extends BaseError {
+  constructor(message = '인증이 필요합니다') {
+    super(message, 401);
+  }
+}
+ 
+export class BadRequestError extends BaseError {
+  constructor(message = '잘못된 요청입니다') {
+    super(message, 400);
+  }
+}
+ 
+export class ForbiddenError extends BaseError {
+  constructor(message = '비밀번호가 틀렸습니다') {
+    super(message, 403);
+  }
+}
+ 
+export class AlreadyLikeError extends ForbiddenError {
+  constructor(message = '이미 좋아요를 눌렀습니다.') {
+    super(message);
+    this.name = new.target.name;
+  }
+}
+ 
+export class AlreadyUnlikeError extends ForbiddenError {
+  constructor(message = '좋아요가 존재하지 않습니다.') {
+    super(message);
+    this.name = new.target.name;
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/errors/errorUtils.ts.html b/mission9-10/coverage/src/lib/errors/errorUtils.ts.html new file mode 100644 index 000000000..27ac22c0a --- /dev/null +++ b/mission9-10/coverage/src/lib/errors/errorUtils.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/lib/errors/errorUtils.ts + + + + + + + + + +
+
+

All files / src/lib/errors errorUtils.ts

+
+ +
+ 20% + Statements + 1/5 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 25% + Lines + 1/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14  +  +  +  +  +1x +  +  +  +  +  +  +  + 
interface SyntaxJsonError extends SyntaxError {
+  status?: number;
+  body?: unknown;
+}
+ 
+export function isSyntaxJsonError(err: unknown): err is SyntaxJsonError {
+  if (!(err instanceof SyntaxError)) return false;
+  const e = err as Partial<SyntaxJsonError>;
+  return typeof e.status === 'number' && 'body' in e;
+}
+// Partial<SyntaxJsonError>;
+// 얘는 SyntaxJsonError의 일부 프로퍼티만 가지고 있을 수도 있어”
+// 라고 TS에게 알려서 e.status, e.body 같은 속성 접근을 가능하게 해주는 장치
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/errors/index.html b/mission9-10/coverage/src/lib/errors/index.html new file mode 100644 index 000000000..2bab3a8f0 --- /dev/null +++ b/mission9-10/coverage/src/lib/errors/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/lib/errors + + + + + + + + + +
+
+

All files src/lib/errors

+
+ +
+ 34.78% + Statements + 8/23 +
+ + +
+ 0% + Branches + 0/10 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 36.36% + Lines + 8/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
customErrors.ts +
+
38.88%7/180%0/60%0/738.88%7/18
errorUtils.ts +
+
20%1/50%0/40%0/125%1/4
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/index.html b/mission9-10/coverage/src/lib/index.html new file mode 100644 index 000000000..1cd991112 --- /dev/null +++ b/mission9-10/coverage/src/lib/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/lib + + + + + + + + + +
+
+

All files src/lib

+
+ +
+ 74.46% + Statements + 35/47 +
+ + +
+ 50% + Branches + 4/8 +
+ + +
+ 37.5% + Functions + 3/8 +
+ + +
+ 73.91% + Lines + 34/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
constants.ts +
+
100%20/2050%4/8100%0/0100%20/20
cookies.ts +
+
42.85%3/7100%0/00%0/242.85%3/7
prismaClient.ts +
+
100%2/2100%0/0100%0/0100%2/2
token.ts +
+
41.66%5/12100%0/00%0/341.66%5/12
withAsync.ts +
+
83.33%5/6100%0/0100%3/380%4/5
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/prismaClient.ts.html b/mission9-10/coverage/src/lib/prismaClient.ts.html new file mode 100644 index 000000000..2b46ffc58 --- /dev/null +++ b/mission9-10/coverage/src/lib/prismaClient.ts.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for src/lib/prismaClient.ts + + + + + + + + + +
+
+

All files / src/lib prismaClient.ts

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +  +1x + 
import { PrismaClient } from '@prisma/client';
+ 
+export const prisma = new PrismaClient();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/token.ts.html b/mission9-10/coverage/src/lib/token.ts.html new file mode 100644 index 000000000..7f237a0d4 --- /dev/null +++ b/mission9-10/coverage/src/lib/token.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for src/lib/token.ts + + + + + + + + + +
+
+

All files / src/lib token.ts

+
+ +
+ 41.66% + Statements + 5/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 41.66% + Lines + 5/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  + 
import jwt, { JwtPayload } from 'jsonwebtoken';
+import { JWT_ACCESS_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET } from './constants';
+ 
+interface TokenPayload extends JwtPayload {
+  id: number;
+}
+ 
+export function generateToken(userId: number) {
+  const accessToken = jwt.sign({ id: userId }, JWT_ACCESS_TOKEN_SECRET, { expiresIn: '1h' });
+  const refreshToken = jwt.sign({ id: userId }, JWT_REFRESH_TOKEN_SECRET, { expiresIn: '1d' });
+  return { accessToken, refreshToken };
+}
+ 
+export function verifyAccessToken(token: string) {
+  const decoded = jwt.verify(token, JWT_ACCESS_TOKEN_SECRET) as TokenPayload;
+  return { userId: decoded.id };
+}
+ 
+export function verifyRefreshToken(token: string) {
+  const decoded = jwt.verify(token, JWT_REFRESH_TOKEN_SECRET) as TokenPayload;
+  return { userId: decoded.id };
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/withAsync.ts.html b/mission9-10/coverage/src/lib/withAsync.ts.html new file mode 100644 index 000000000..809cf0593 --- /dev/null +++ b/mission9-10/coverage/src/lib/withAsync.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/lib/withAsync.ts + + + + + + + + + +
+
+

All files / src/lib withAsync.ts

+
+ +
+ 83.33% + Statements + 5/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 80% + Lines + 4/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14  +  +1x +  +  +33x +2x +2x +  +  +  +  +  + 
import type { Request, Response, NextFunction, RequestHandler } from 'express';
+ 
+export function withAsync<T = unknown>(
+  handler: (req: Request, res: Response, next: NextFunction) => Promise<T>,
+): RequestHandler {
+  return async (req, res, next) => {
+    try {
+      await handler(req, res, next);
+    } catch (e) {
+      next(e);
+    }
+  };
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/middlewares/authenticate.ts.html b/mission9-10/coverage/src/middlewares/authenticate.ts.html new file mode 100644 index 000000000..357387e1e --- /dev/null +++ b/mission9-10/coverage/src/middlewares/authenticate.ts.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for src/middlewares/authenticate.ts + + + + + + + + + +
+
+

All files / src/middlewares authenticate.ts

+
+ +
+ 55% + Statements + 11/20 +
+ + +
+ 42.85% + Branches + 3/7 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 52.63% + Lines + 10/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +311x +1x +1x +1x +  +  +  +26x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { prisma } from '../lib/prismaClient';
+import { verifyAccessToken } from '../lib/token';
+import { ACCESS_TOKEN_COOKIE_NAME } from '../lib/constants';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { NextFunction, Request, Response } from 'express';
+ 
+function authenticate(options = { optional: false }) {
+  return async (req: Request, res: Response, next: NextFunction) => {
+    const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME];
+    Eif (!accessToken) {
+      Eif (options.optional) {
+        return next();
+      }
+      return next(new UnauthorizedError());
+    }
+    try {
+      const { userId } = verifyAccessToken(accessToken); //디코딩 된 토큰에서 user id 추출
+      const user = await prisma.user.findUniqueOrThrow({ where: { id: userId } });
+      req.user = user;
+    } catch (error) {
+      if (options.optional) {
+        return next();
+      }
+      return next(new UnauthorizedError());
+    }
+    next();
+  };
+}
+ 
+export default authenticate;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/middlewares/index.html b/mission9-10/coverage/src/middlewares/index.html new file mode 100644 index 000000000..3c8f540d7 --- /dev/null +++ b/mission9-10/coverage/src/middlewares/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/middlewares + + + + + + + + + +
+
+

All files src/middlewares

+
+ +
+ 55% + Statements + 11/20 +
+ + +
+ 42.85% + Branches + 3/7 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 52.63% + Lines + 10/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
authenticate.ts +
+
55%11/2042.85%3/7100%3/352.63%10/19
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/articleRepository.ts.html b/mission9-10/coverage/src/repositories/articleRepository.ts.html new file mode 100644 index 000000000..f3d106be9 --- /dev/null +++ b/mission9-10/coverage/src/repositories/articleRepository.ts.html @@ -0,0 +1,256 @@ + + + + + + Code coverage report for src/repositories/articleRepository.ts + + + + + + + + + +
+
+

All files / src/repositories articleRepository.ts

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 75% + Branches + 6/8 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58  +5x +  +  +5x +  +1x +  +  +10x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +1x +  +  +1x +  +  +  +5x + 
import { Prisma } from '@prisma/client';
+import { prisma } from '../lib/prismaClient';
+import { ArticleLikesAndCount } from '../../types/article';
+ 
+export class ArticleRepository {
+  async create(data: Prisma.ArticleCreateInput) {
+    return prisma.article.create({ data });
+  }
+  async findById(id: number) {
+    return prisma.article.findUniqueOrThrow({ where: { id } });
+  }
+  async findByIdWithLikes(id: number, userId?: number): Promise<ArticleLikesAndCount> {
+    return prisma.article.findUniqueOrThrow({
+      where: { id },
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          //비로그인 시 -1을 줘서 []을 뱉도록
+          where: { userId: userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async findArticleListWithLikes(params: {
+    skip: number;
+    take: number;
+    orderBy: Prisma.ArticleOrderByWithRelationInput;
+    where: Prisma.ArticleWhereInput;
+    userId?: number;
+  }): Promise<ArticleLikesAndCount[]> {
+    return prisma.article.findMany({
+      skip: params.skip,
+      take: params.take,
+      orderBy: params.orderBy,
+      where: params.where,
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          where: { userId: params.userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async count(where: Prisma.ArticleWhereInput) {
+    return prisma.article.count({ where });
+  }
+  async update(id: number, data: Prisma.ArticleUpdateInput) {
+    return prisma.article.update({ where: { id }, data });
+  }
+  async delete(id: number) {
+    return prisma.article.delete({ where: { id } });
+  }
+}
+ 
+export const articleRepo = new ArticleRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/commentRepository.ts.html b/mission9-10/coverage/src/repositories/commentRepository.ts.html new file mode 100644 index 000000000..7b20732b8 --- /dev/null +++ b/mission9-10/coverage/src/repositories/commentRepository.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/repositories/commentRepository.ts + + + + + + + + + +
+
+

All files / src/repositories commentRepository.ts

+
+ +
+ 62.5% + Statements + 5/8 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 40% + Functions + 2/5 +
+ + +
+ 62.5% + Lines + 5/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32  +5x +  +5x +  +2x +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x + 
import { Prisma } from '@prisma/client';
+import { prisma } from '../lib/prismaClient';
+ 
+export class CommentRepository {
+  async create(data: Prisma.CommentCreateInput) {
+    return prisma.comment.create({ data });
+  }
+  async findCommentListQuery(
+    whereCondition: { articleId: number } | { productId: number },
+    limit: number,
+    cursor?: number,
+  ) {
+    return prisma.comment.findMany({
+      cursor: cursor ? { id: cursor } : undefined,
+      take: limit + 1,
+      where: whereCondition,
+      orderBy: { createdAt: 'desc' },
+    });
+  }
+  async findById(id: number) {
+    return prisma.comment.findUniqueOrThrow({ where: { id } });
+  }
+  async update(id: number, content?: string) {
+    return prisma.comment.update({ where: { id }, data: { content } });
+  }
+  async delete(id: number) {
+    return prisma.comment.delete({ where: { id } });
+  }
+}
+ 
+export const commentRepo = new CommentRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/index.html b/mission9-10/coverage/src/repositories/index.html new file mode 100644 index 000000000..582634d54 --- /dev/null +++ b/mission9-10/coverage/src/repositories/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for src/repositories + + + + + + + + + +
+
+

All files src/repositories

+
+ +
+ 73.07% + Statements + 38/52 +
+ + +
+ 69.23% + Branches + 18/26 +
+ + +
+ 63.63% + Functions + 21/33 +
+ + +
+ 73.07% + Lines + 38/52 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articleRepository.ts +
+
100%10/1075%6/8100%7/7100%10/10
commentRepository.ts +
+
62.5%5/850%1/240%2/562.5%5/8
likeRepository.ts +
+
77.77%7/966.66%4/675%3/477.77%7/9
notificationRepository.ts +
+
37.5%3/8100%0/00%0/537.5%3/8
productRepository.ts +
+
81.81%9/1170%7/1087.5%7/881.81%9/11
userRepository.ts +
+
66.66%4/6100%0/050%2/466.66%4/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/likeRepository.ts.html b/mission9-10/coverage/src/repositories/likeRepository.ts.html new file mode 100644 index 000000000..72f19bc21 --- /dev/null +++ b/mission9-10/coverage/src/repositories/likeRepository.ts.html @@ -0,0 +1,193 @@ + + + + + + Code coverage report for src/repositories/likeRepository.ts + + + + + + + + + +
+
+

All files / src/repositories likeRepository.ts

+
+ +
+ 77.77% + Statements + 7/9 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 77.77% + Lines + 7/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37  +5x +  +  +  +  +3x +  +  +3x +  +  +  +  +3x +  +  +  +2x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +5x + 
import { LikeTarget } from '../../types/like';
+import { prisma } from '../lib/prismaClient';
+ 
+class LikdeRepository {
+  async findLike(userId: number, target: LikeTarget) {
+    const whereCondition =
+      'articleId' in target
+        ? { userId_articleId: { userId, articleId: target.articleId } }
+        : { userId_productId: { userId, productId: target.productId } };
+    return prisma.like.findUnique({
+      where: whereCondition,
+    });
+  }
+  async createLike(userId: number, target: LikeTarget) {
+    return prisma.like.create({ data: { userId, ...target } });
+  }
+  async deleteLike(userId: number, target: LikeTarget) {
+    const whereCondition =
+      'articleId' in target
+        ? { userId_articleId: { userId, articleId: target.articleId } }
+        : { userId_productId: { userId, productId: target.productId } };
+    return prisma.like.delete({
+      where: whereCondition,
+    });
+  }
+  async getLikers(target: LikeTarget) {
+    const whereCondition =
+      'articleId' in target ? { articleId: target.articleId } : { productId: target.productId };
+    return prisma.like.findMany({
+      where: whereCondition,
+      select: { userId: true },
+    });
+  }
+}
+ 
+export const likeRepo = new LikdeRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/notificationRepository.ts.html b/mission9-10/coverage/src/repositories/notificationRepository.ts.html new file mode 100644 index 000000000..145a57f7c --- /dev/null +++ b/mission9-10/coverage/src/repositories/notificationRepository.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for src/repositories/notificationRepository.ts + + + + + + + + + +
+
+

All files / src/repositories notificationRepository.ts

+
+ +
+ 37.5% + Statements + 3/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 37.5% + Lines + 3/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +275x +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x + 
import { prisma } from '../lib/prismaClient';
+ 
+export class NotificationRepository {
+  async getNotification(userId: number) {
+    return prisma.notification.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } });
+  }
+  async getUnreadCount(userId: number) {
+    return prisma.notification.count({ where: { userId, isRead: false } });
+  }
+  async create(userId: number, message: string) {
+    return prisma.notification.create({ data: { userId, message } });
+  }
+  async findByIds(notificationId: number, userId: number) {
+    return prisma.notification.findFirst({
+      where: { id: notificationId, userId },
+    });
+  }
+  async updateRead(notificationId: number) {
+    return prisma.notification.update({
+      where: { id: notificationId },
+      data: { isRead: true },
+    });
+  }
+}
+ 
+export const notificationRepo = new NotificationRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/productRepository.ts.html b/mission9-10/coverage/src/repositories/productRepository.ts.html new file mode 100644 index 000000000..9e6abc4a2 --- /dev/null +++ b/mission9-10/coverage/src/repositories/productRepository.ts.html @@ -0,0 +1,280 @@ + + + + + + Code coverage report for src/repositories/productRepository.ts + + + + + + + + + +
+
+

All files / src/repositories productRepository.ts

+
+ +
+ 81.81% + Statements + 9/11 +
+ + +
+ 70% + Branches + 7/10 +
+ + +
+ 87.5% + Functions + 7/8 +
+ + +
+ 81.81% + Lines + 9/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66  +5x +  +  +  +  +  +1x +  +  +11x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +  +  +  +  +  +12x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +12x +  +  +  +  +  +  +  +  +  +  +  +5x + 
import { ProductLikesAndCount } from '../../types/product';
+import { prisma } from '../lib/prismaClient';
+import { Prisma } from '@prisma/client';
+import type { ProductRecentType } from '../../types/product';
+ 
+class ProductRepository {
+  async create(data: Prisma.ProductCreateInput) {
+    return prisma.product.create({ data });
+  }
+  async findById(id: number) {
+    return prisma.product.findUniqueOrThrow({ where: { id } });
+  }
+  async findByIdWithLikes(id: number, userId?: number): Promise<ProductLikesAndCount> {
+    return prisma.product.findUniqueOrThrow({
+      where: { id },
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          where: { userId: userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async update(id: number, data: Prisma.ProductUpdateInput) {
+    return prisma.product.update({ where: { id }, data });
+  }
+  async delete(id: number) {
+    return prisma.product.delete({ where: { id } });
+  }
+  async findProductListWithLikes(params: {
+    skip: number;
+    take: number;
+    orderBy: Prisma.ProductOrderByWithRelationInput;
+    where: Prisma.ProductWhereInput;
+    userId?: number;
+  }): Promise<ProductLikesAndCount[]> {
+    return prisma.product.findMany({
+      skip: params.skip,
+      take: params.take,
+      orderBy: params.orderBy,
+      where: params.where,
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          where: { userId: params.userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async count(where: Prisma.ProductWhereInput) {
+    return prisma.product.count({ where });
+  }
+  async findRecentProduct(userId: number, limit: number, type: ProductRecentType) {
+    const whereCondition = type === 'myUploaded' ? { userId } : { likes: { some: { userId } } };
+    return prisma.product.findMany({
+      where: whereCondition,
+      orderBy: { createdAt: 'desc' },
+      take: limit,
+    });
+  }
+}
+ 
+export const productRepo = new ProductRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/userRepository.ts.html b/mission9-10/coverage/src/repositories/userRepository.ts.html new file mode 100644 index 000000000..97525f6a6 --- /dev/null +++ b/mission9-10/coverage/src/repositories/userRepository.ts.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for src/repositories/userRepository.ts + + + + + + + + + +
+
+

All files / src/repositories userRepository.ts

+
+ +
+ 66.66% + Statements + 4/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 2/4 +
+ + +
+ 66.66% + Lines + 4/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +205x +  +  +  +  +21x +  +  +18x +  +  +  +  +  +  +  +  +  +5x + 
import { prisma } from '../lib/prismaClient';
+import { Prisma } from '@prisma/client';
+ 
+class UserRepository {
+  async create(data: Prisma.UserCreateInput) {
+    return prisma.user.create({ data });
+  }
+  async findByEmail(email: string) {
+    return prisma.user.findUnique({ where: { email } });
+  }
+  async update(id: number, data: Prisma.UserUpdateInput) {
+    return prisma.user.update({ where: { id }, data });
+  }
+  async findById(id: number) {
+    return prisma.user.findUnique({ where: { id } });
+  }
+}
+ 
+export const userRepo = new UserRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/articlesRouter.ts.html b/mission9-10/coverage/src/routers/articlesRouter.ts.html new file mode 100644 index 000000000..79e08a796 --- /dev/null +++ b/mission9-10/coverage/src/routers/articlesRouter.ts.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for src/routers/articlesRouter.ts + + + + + + + + + +
+
+

All files / src/routers articlesRouter.ts

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 15/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +295x +5x +5x +  +  +  +  +  +  +  +  +  +  +5x +  +5x +  +5x +5x +5x +5x +5x +5x +5x +5x +5x +  +5x + 
import express from 'express';
+import { withAsync } from '../lib/withAsync';
+import {
+  createArticle,
+  getArticleList,
+  getArticle,
+  updateArticle,
+  deleteArticle,
+  createComment,
+  getCommentList,
+  likeArticle,
+  unlikeArticle,
+} from '../controllers/articlesController';
+import authenticate from '../middlewares/authenticate';
+ 
+const articlesRouter = express.Router();
+ 
+articlesRouter.post('/', authenticate(), withAsync(createArticle));
+articlesRouter.get('/', authenticate({ optional: true }), withAsync(getArticleList));
+articlesRouter.get('/:id', authenticate({ optional: true }), withAsync(getArticle));
+articlesRouter.patch('/:id', authenticate(), withAsync(updateArticle));
+articlesRouter.delete('/:id', authenticate(), withAsync(deleteArticle));
+articlesRouter.post('/:id/comments', authenticate(), withAsync(createComment));
+articlesRouter.get('/:id/comments', withAsync(getCommentList));
+articlesRouter.post('/:id/like', authenticate(), withAsync(likeArticle));
+articlesRouter.delete('/:id/like', authenticate(), withAsync(unlikeArticle));
+ 
+export default articlesRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/commentsRouter.ts.html b/mission9-10/coverage/src/routers/commentsRouter.ts.html new file mode 100644 index 000000000..8802d62a2 --- /dev/null +++ b/mission9-10/coverage/src/routers/commentsRouter.ts.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for src/routers/commentsRouter.ts + + + + + + + + + +
+
+

All files / src/routers commentsRouter.ts

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +125x +5x +5x +5x +  +5x +  +5x +5x +  +5x + 
import express from 'express';
+import { withAsync } from '../lib/withAsync';
+import { updateComment, deleteComment } from '../controllers/commentsController';
+import authenticate from '../middlewares/authenticate';
+ 
+const commentsRouter = express.Router();
+ 
+commentsRouter.patch('/:id', authenticate(), withAsync(updateComment));
+commentsRouter.delete('/:id', authenticate(), withAsync(deleteComment));
+ 
+export default commentsRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/imagesRouter.ts.html b/mission9-10/coverage/src/routers/imagesRouter.ts.html new file mode 100644 index 000000000..8754a8533 --- /dev/null +++ b/mission9-10/coverage/src/routers/imagesRouter.ts.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for src/routers/imagesRouter.ts + + + + + + + + + +
+
+

All files / src/routers imagesRouter.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +105x +5x +5x +  +5x +  +5x +  +5x + 
import express from 'express';
+import { withAsync } from '../lib/withAsync';
+import { upload, uploadImage } from '../controllers/imagesController';
+ 
+const imagesRouter = express.Router();
+ 
+imagesRouter.post('/upload', upload.single('image'), withAsync(uploadImage));
+ 
+export default imagesRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/index.html b/mission9-10/coverage/src/routers/index.html new file mode 100644 index 000000000..547f536b5 --- /dev/null +++ b/mission9-10/coverage/src/routers/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for src/routers + + + + + + + + + +
+
+

All files src/routers

+
+ +
+ 100% + Statements + 69/69 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 69/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesRouter.ts +
+
100%15/15100%0/0100%0/0100%15/15
commentsRouter.ts +
+
100%8/8100%0/0100%0/0100%8/8
imagesRouter.ts +
+
100%6/6100%0/0100%0/0100%6/6
notificationRouter.ts +
+
100%9/9100%0/0100%0/0100%9/9
productsRouter.ts +
+
100%18/18100%0/0100%0/0100%18/18
usersRouter.ts +
+
100%13/13100%0/0100%0/0100%13/13
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/notificationRouter.ts.html b/mission9-10/coverage/src/routers/notificationRouter.ts.html new file mode 100644 index 000000000..1756ffb34 --- /dev/null +++ b/mission9-10/coverage/src/routers/notificationRouter.ts.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for src/routers/notificationRouter.ts + + + + + + + + + +
+
+

All files / src/routers notificationRouter.ts

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +175x +5x +5x +5x +  +  +  +  +  +5x +  +5x +5x +5x +  +5x + 
import express from 'express';
+import authenticate from '../middlewares/authenticate';
+import { withAsync } from '../lib/withAsync';
+import {
+  getNotifications,
+  getUnreadCount,
+  markAsRead,
+} from '../controllers/notificationController';
+ 
+const notificationRouter = express.Router();
+ 
+notificationRouter.get('/', authenticate(), withAsync(getNotifications));
+notificationRouter.get('/unread-count', authenticate(), withAsync(getUnreadCount));
+notificationRouter.patch('/:id/read', authenticate(), withAsync(markAsRead));
+ 
+export default notificationRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/productsRouter.ts.html b/mission9-10/coverage/src/routers/productsRouter.ts.html new file mode 100644 index 000000000..9236e4c1a --- /dev/null +++ b/mission9-10/coverage/src/routers/productsRouter.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/routers/productsRouter.ts + + + + + + + + + +
+
+

All files / src/routers productsRouter.ts

+
+ +
+ 100% + Statements + 18/18 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 18/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +325x +5x +5x +  +  +  +  +  +  +  +  +  +  +5x +5x +  +5x +  +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +  +5x + 
import express from 'express';
+import { withAsync } from '../lib/withAsync';
+import {
+  createProduct,
+  getProduct,
+  updateProduct,
+  deleteProduct,
+  getProductList,
+  createComment,
+  getCommentList,
+  likeProduct,
+  unlikeProduct,
+} from '../controllers/productsController';
+import authenticate from '../middlewares/authenticate';
+import { getMyLikedProducts, getMyProductList } from '../controllers/usersController';
+ 
+const productsRouter = express.Router();
+ 
+productsRouter.get('/me', authenticate(), withAsync(getMyProductList));
+productsRouter.get('/me/likes', authenticate(), withAsync(getMyLikedProducts));
+productsRouter.get('/', authenticate({ optional: true }), withAsync(getProductList));
+productsRouter.post('/', authenticate(), withAsync(createProduct));
+productsRouter.get('/:id', authenticate({ optional: true }), withAsync(getProduct));
+productsRouter.patch('/:id', authenticate(), withAsync(updateProduct));
+productsRouter.delete('/:id', authenticate(), withAsync(deleteProduct));
+productsRouter.post('/:id/comments', authenticate(), withAsync(createComment));
+productsRouter.get('/:id/comments', withAsync(getCommentList));
+productsRouter.post('/:id/like', authenticate(), withAsync(likeProduct));
+productsRouter.delete('/:id/like', authenticate(), withAsync(unlikeProduct));
+ 
+export default productsRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/usersRouter.ts.html b/mission9-10/coverage/src/routers/usersRouter.ts.html new file mode 100644 index 000000000..3f6d130f9 --- /dev/null +++ b/mission9-10/coverage/src/routers/usersRouter.ts.html @@ -0,0 +1,157 @@ + + + + + + Code coverage report for src/routers/usersRouter.ts + + + + + + + + + +
+
+

All files / src/routers usersRouter.ts

+
+ +
+ 100% + Statements + 13/13 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 13/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +255x +5x +5x +  +  +  +  +  +  +  +  +5x +  +5x +  +5x +5x +5x +5x +5x +5x +5x +  +5x + 
import express from 'express';
+import { withAsync } from '../lib/withAsync';
+import {
+  register,
+  login,
+  logout,
+  getProfile,
+  patchPassword,
+  updateProfile,
+  refreshToken,
+} from '../controllers/usersController';
+import authenticate from '../middlewares/authenticate';
+ 
+const usersRouter = express.Router();
+ 
+usersRouter.post('/register', withAsync(register));
+usersRouter.post('/login', withAsync(login));
+usersRouter.post('/logout', withAsync(logout));
+usersRouter.post('/refresh', withAsync(refreshToken));
+usersRouter.get('/me', authenticate(), withAsync(getProfile));
+usersRouter.patch('/me', authenticate(), withAsync(updateProfile));
+usersRouter.patch('/me/password', authenticate(), withAsync(patchPassword));
+ 
+export default usersRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/services/articleService.ts.html b/mission9-10/coverage/src/services/articleService.ts.html new file mode 100644 index 000000000..add761584 --- /dev/null +++ b/mission9-10/coverage/src/services/articleService.ts.html @@ -0,0 +1,505 @@ + + + + + + Code coverage report for src/services/articleService.ts + + + + + + + + + +
+
+

All files / src/services articleService.ts

+
+ +
+ 88.13% + Statements + 52/59 +
+ + +
+ 41.17% + Branches + 14/34 +
+ + +
+ 100% + Functions + 10/10 +
+ + +
+ 87.71% + Lines + 50/57 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +1415x +  +5x +5x +5x +5x +  +5x +  +  +5x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +2x +1x +1x +1x +  +  +  +  +  +  +2x +2x +1x +  +1x +  +  +2x +2x +1x +  +1x +  +  +  +  +  +  +  +  +6x +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +6x +8x +8x +  +  +  +8x +8x +  +  +  +  +6x +  +  +  +6x +  +  +1x +1x +  +  +  +  +1x +1x +  +  +  +  +  +1x +  +  +  +  +  +  +2x +2x +2x +2x +2x +2x +  +  +  +1x +1x +1x +  +  +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +1x +  +  +5x + 
import { articleRepo } from '../repositories/articleRepository';
+import { ArticleLikesAndCount, ArticleListResponse, ArticleResponse } from '../../types/article';
+import { AlreadyLikeError, AlreadyUnlikeError, ForbiddenError } from '../lib/errors/customErrors';
+import { commentRepo } from '../repositories/commentRepository';
+import { likeRepo } from '../repositories/likeRepository';
+import { Prisma, Article, Comment } from '@prisma/client';
+import type { CursorPaginated } from '../../types/cursorPaginated';
+import { notificationService } from './notificationService';
+ 
+//객체로 주면 콘트롤러에서 인자순서 상관없이 적용되지만, ()형태로 반환하게되면 인자순서를 서비스형태와 동일하게 넣어야 함
+export class ArticleService {
+  async createArticle(
+    userId: number,
+    title: string,
+    content: string,
+    image?: string | null,
+  ): Promise<Article> {
+    return articleRepo.create({
+      title,
+      content,
+      image,
+      user: { connect: { id: userId } },
+    });
+  }
+  async getArticle(articleId: number, userId?: number): Promise<ArticleResponse> {
+    const article: ArticleLikesAndCount = await articleRepo.findByIdWithLikes(articleId, userId);
+    const { likes, _count, ...articleData } = article;
+    const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined;
+    return { ...articleData, likeCount: _count.likes, isLiked };
+  }
+  async updateArticle(
+    articleId: number,
+    userId: number,
+    data: { title?: string; content?: string; image?: string | null },
+  ): Promise<Article> {
+    const article = await articleRepo.findById(articleId);
+    if (article.userId !== userId) {
+      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
+    }
+    return articleRepo.update(articleId, data);
+  }
+  async deleteArticle(articleId: number, userId: number): Promise<void> {
+    const article = await articleRepo.findById(articleId);
+    if (article.userId !== userId) {
+      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
+    }
+    await articleRepo.delete(articleId);
+  }
+  async getArticleList(
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+    keyword?: string,
+    userId?: number,
+  ): Promise<ArticleListResponse> {
+    const where = keyword
+      ? {
+          OR: [{ title: { contains: keyword } }, { content: { contains: keyword } }],
+        }
+      : {};
+    const [totalCount, articles] = await Promise.all([
+      articleRepo.count(where),
+      articleRepo.findArticleListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId,
+      }),
+    ]);
+    const list: ArticleResponse[] = articles.map((m) => {
+      const { _count, likes, ...basicArticleData } = m;
+      const response: ArticleResponse = {
+        ...basicArticleData,
+        likeCount: _count.likes,
+      };
+      Eif (!userId) {
+        return response;
+      }
+      const isLiked = (likes ?? []).length > 0;
+      return { ...basicArticleData, isLiked, likeCount: _count.likes };
+    });
+    const response: ArticleListResponse = {
+      list,
+      totalCount,
+    };
+    return response;
+  }
+  async createComment(userId: number, articleId: number, content: string): Promise<Comment> {
+    await articleRepo.findById(articleId);
+    const comment = await commentRepo.create({
+      content,
+      user: { connect: { id: userId } },
+      article: { connect: { id: articleId } },
+    });
+    const article = await articleRepo.findById(articleId);
+    Iif (article.userId !== userId) {
+      await notificationService.createNotification(
+        article.userId,
+        `내 게시글 "${article.title}"에 새로운 댓글이 달렸습니다.`,
+      );
+    }
+    return comment;
+  }
+  async getCommentList(
+    articleId: number,
+    limit: number,
+    cursor?: number,
+  ): Promise<CursorPaginated<Comment>> {
+    await articleRepo.findById(articleId);
+    const commentsWithCursor = await commentRepo.findCommentListQuery({ articleId }, limit, cursor);
+    const comments = commentsWithCursor.slice(0, limit);
+    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
+    const nextCursor = cursorComment ? cursorComment.id : null;
+    return { list: comments, nextCursor };
+  }
+  //like , unlike 둘다 message를 반환해버려서 이게..프로미스로 타입 설정하는 것이 의미가 있는지...로직 수정 생각해봐야할 듯
+  async likeArticle(userId: number, articleId: number): Promise<{ message: string }> {
+    const article = await articleRepo.findById(articleId);
+    const existingLike = await likeRepo.findLike(userId, { articleId });
+    Iif (existingLike) {
+      throw new AlreadyLikeError();
+    }
+    await likeRepo.createLike(userId, { articleId });
+    return { message: `${article.title}게시글에 좋아요를 눌렀습니다.` };
+  }
+  async unlikeArticle(userId: number, articleId: number): Promise<{ message: string }> {
+    const article = await articleRepo.findById(articleId);
+    try {
+      await likeRepo.deleteLike(userId, { articleId });
+    } catch (error: unknown) {
+      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
+        throw new AlreadyUnlikeError();
+      }
+      throw error;
+    }
+    return { message: `${article.title}게시글의 좋아요를 취소했습니다` };
+  }
+}
+export const articleService = new ArticleService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/services/commentService.ts.html b/mission9-10/coverage/src/services/commentService.ts.html new file mode 100644 index 000000000..d697ad1ae --- /dev/null +++ b/mission9-10/coverage/src/services/commentService.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for src/services/commentService.ts + + + + + + + + + +
+
+

All files / src/services commentService.ts

+
+ +
+ 33.33% + Statements + 4/12 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 33.33% + Lines + 4/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +235x +5x +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x + 
import { commentRepo } from '../repositories/commentRepository';
+import { ForbiddenError } from '../lib/errors/customErrors';
+import { Comment } from '@prisma/client';
+ 
+export class CommentService {
+  async updateComment(commentId: number, userId: number, content?: string): Promise<Comment> {
+    const comment = await commentRepo.findById(commentId);
+    if (comment.userId !== userId) {
+      throw new ForbiddenError('해당 댓글을 수정할 권한이 없습니다.');
+    }
+    return commentRepo.update(commentId, content);
+  }
+  async deleteComment(commentId: number, userId: number): Promise<void> {
+    const comment = await commentRepo.findById(commentId);
+    if (comment.userId !== userId) {
+      throw new ForbiddenError('해당 댓글을 삭제할 권한이 없습니다.');
+    }
+    await commentRepo.delete(commentId);
+  }
+}
+ 
+export const commnetService = new CommentService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/services/imageService.ts.html b/mission9-10/coverage/src/services/imageService.ts.html new file mode 100644 index 000000000..d11cab840 --- /dev/null +++ b/mission9-10/coverage/src/services/imageService.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for src/services/imageService.ts + + + + + + + + + +
+
+

All files / src/services imageService.ts

+
+ +
+ 38.46% + Statements + 5/13 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 38.46% + Lines + 5/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { uploadImageResponse } from '../../types/image';
+import { Request } from 'express';
+import { BadRequestError } from '../lib/errors/customErrors';
+import path from 'path';
+import { STATIC_PATH } from '../lib/constants';
+ 
+export class ImageService {
+  buildImageUrl(req: Request): uploadImageResponse {
+    const host = req.get('host');
+    if (!host) {
+      throw new BadRequestError('요청 헤더에 host 정보가 없습니다.');
+    }
+    if (!req.file) {
+      throw new BadRequestError();
+    }
+    const filePath = path.join(host, STATIC_PATH, req.file.filename);
+    const url = `http://${filePath}`;
+    return { url };
+  }
+}
+ 
+export const imageService = new ImageService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/services/index.html b/mission9-10/coverage/src/services/index.html new file mode 100644 index 000000000..c091268ea --- /dev/null +++ b/mission9-10/coverage/src/services/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/services + + + + + + + + + +
+
+

All files src/services

+
+ +
+ 67.09% + Statements + 157/234 +
+ + +
+ 44.44% + Branches + 64/144 +
+ + +
+ 68.42% + Functions + 26/38 +
+ + +
+ 68.8% + Lines + 150/218 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articleService.ts +
+
88.13%52/5941.17%14/34100%10/1087.71%50/57
commentService.ts +
+
33.33%4/120%0/40%0/233.33%4/12
notificationService.ts +
+
33.33%5/150%0/20%0/435.71%5/14
productService.ts +
+
90%63/7066.66%32/48100%10/1089.7%61/68
userService.ts +
+
42.3%33/7832.14%18/5650%6/1244.77%30/67
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/services/notificationService.ts.html b/mission9-10/coverage/src/services/notificationService.ts.html new file mode 100644 index 000000000..8d579d208 --- /dev/null +++ b/mission9-10/coverage/src/services/notificationService.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for src/services/notificationService.ts + + + + + + + + + +
+
+

All files / src/services notificationService.ts

+
+ +
+ 33.33% + Statements + 5/15 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 35.71% + Lines + 5/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +275x +5x +5x +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x + 
import { UnauthorizedError } from '../lib/errors/customErrors';
+import { notificationRepo } from '../repositories/notificationRepository';
+import { getIO } from '../socket';
+import type { Notification as PrismaNotification } from '@prisma/client';
+ 
+export class NotificationService {
+  async getNotifications(userId: number): Promise<PrismaNotification[]> {
+    return notificationRepo.getNotification(userId);
+  }
+  async getUnreadCount(userId: number): Promise<number> {
+    return notificationRepo.getUnreadCount(userId);
+  }
+  async createNotification(userId: number, message: string): Promise<PrismaNotification> {
+    const notification = await notificationRepo.create(userId, message);
+    const io = getIO();
+    io.to(`user-${userId}`).emit('notification', notification);
+    return notification;
+  }
+  async markAsRead(notificationId: number, userId: number): Promise<PrismaNotification> {
+    const notification = await notificationRepo.findByIds(notificationId, userId);
+    if (!notification) throw new UnauthorizedError();
+    return notificationRepo.updateRead(notificationId);
+  }
+}
+ 
+export const notificationService = new NotificationService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/services/productService.ts.html b/mission9-10/coverage/src/services/productService.ts.html new file mode 100644 index 000000000..284300d3e --- /dev/null +++ b/mission9-10/coverage/src/services/productService.ts.html @@ -0,0 +1,616 @@ + + + + + + Code coverage report for src/services/productService.ts + + + + + + + + + +
+
+

All files / src/services productService.ts

+
+ +
+ 90% + Statements + 63/70 +
+ + +
+ 66.66% + Branches + 32/48 +
+ + +
+ 100% + Functions + 10/10 +
+ + +
+ 89.7% + Lines + 61/68 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178  +6x +  +  +6x +6x +  +  +6x +6x +6x +6x +  +  +  +6x +  +  +  +  +  +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +3x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +3x +1x +  +2x +  +2x +1x +1x +2x +1x +  +  +  +  +  +  +2x +  +  +2x +2x +1x +  +1x +  +  +  +  +  +  +  +  +11x +  +  +  +  +  +  +  +  +11x +  +  +  +  +  +  +  +  +  +11x +14x +14x +  +  +  +14x +13x +  +1x +1x +  +11x +  +  +  +11x +  +  +2x +2x +  +  +  +  +2x +2x +  +  +  +  +  +2x +  +  +  +  +  +  +2x +2x +2x +2x +2x +2x +  +  +2x +2x +2x +  +  +2x +2x +  +  +1x +1x +1x +  +  +  +  +  +  +1x +  +  +  +6x + 
import { ProductLikesAndCount } from '../../types/product';
+import { productRepo } from '../repositories/productRepository';
+import { Product } from '@prisma/client';
+import type { ProductListResponse, ProductResponse } from '../../types/product';
+import { ForbiddenError } from '../lib/errors/customErrors';
+import { commentRepo } from '../repositories/commentRepository';
+import type { Comment } from '@prisma/client';
+import type { CursorPaginated } from '../../types/cursorPaginated';
+import { AlreadyLikeError, AlreadyUnlikeError } from '../lib/errors/customErrors';
+import { likeRepo } from '../repositories/likeRepository';
+import { Prisma } from '@prisma/client';
+import { notificationService } from './notificationService';
+ 
+//인자 순서가 옵셔널 다음 필수파라미터가 들어오면 컴파일에러가 발생함
+//객체로 묶어 보내기, 이러면 필수인 userid의 파라미터 순서를 바꾸지 않아도 됨
+export class ProductService {
+  async createProduct(params: {
+    name: string;
+    description: string;
+    price: number;
+    tags?: string[];
+    images?: string[];
+    userId: number;
+  }): Promise<Product> {
+    const { name, description, price, tags, images, userId } = params;
+    return productRepo.create({
+      name,
+      description,
+      price,
+      tags: tags ?? [],
+      images: images ?? [],
+      user: { connect: { id: userId } },
+    });
+  }
+  async getProduct(productId: number, userId?: number): Promise<ProductResponse> {
+    const product: ProductLikesAndCount = await productRepo.findByIdWithLikes(productId, userId);
+    const { likes, _count, ...productData } = product;
+    const baseResponse = { ...productData, likeCount: _count.likes };
+    Eif (!userId) {
+      return baseResponse;
+    }
+    const isLiked = (likes?.length ?? 0) > 0;
+    return { ...baseResponse, isLiked };
+  }
+  async updateProduct(
+    productId: number,
+    userId: number,
+    data: {
+      name?: string;
+      description?: string;
+      price?: number;
+      tags?: string[];
+      images?: string[];
+    },
+  ): Promise<Product> {
+    const product = await productRepo.findById(productId);
+    if (product.userId !== userId) {
+      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
+    }
+    const updateProduct = await productRepo.update(productId, data);
+    //undefined가 아니면서 기존가격과 다른 경우
+    if (data.price !== undefined && product.price !== data.price) {
+      const likers = await likeRepo.getLikers({ productId });
+      for (const liker of likers) {
+        if (liker.userId !== userId) {
+          await notificationService.createNotification(
+            liker.userId,
+            `관심 상품 "${product.name}"의 가격이 변동되었습니다.`,
+          );
+        }
+      }
+    }
+    return updateProduct;
+  }
+  async deleteProduct(productId: number, userId: number): Promise<void> {
+    const product = await productRepo.findById(productId);
+    if (product.userId !== userId) {
+      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
+    }
+    await productRepo.delete(productId);
+  }
+  async getProductList(
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+    keyword?: string,
+    userId?: number,
+  ): Promise<ProductListResponse> {
+    const where = keyword
+      ? {
+          OR: [
+            { name: { contains: keyword } },
+            { description: { contains: keyword } },
+            { tags: { has: keyword } },
+          ],
+        }
+      : {};
+    const [totalCount, products] = await Promise.all([
+      productRepo.count(where),
+      productRepo.findProductListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId,
+      }),
+    ]);
+    const list: ProductResponse[] = products.map((m) => {
+      const { _count, likes, ...basicProductData } = m;
+      const response: ProductResponse = {
+        ...basicProductData,
+        likeCount: _count.likes,
+      };
+      if (!userId) {
+        return response;
+      }
+      const isLiked = (likes ?? []).length > 0;
+      return { ...basicProductData, isLiked, likeCount: _count.likes };
+    });
+    const response: ProductListResponse = {
+      list,
+      totalCount,
+    };
+    return response;
+  }
+  async createComment(userId: number, productId: number, content: string): Promise<Comment> {
+    await productRepo.findById(productId);
+    const comment = await commentRepo.create({
+      content,
+      user: { connect: { id: userId } },
+      product: { connect: { id: productId } },
+    });
+    const product = await productRepo.findById(productId);
+    Iif (product.userId !== userId) {
+      await notificationService.createNotification(
+        product.userId,
+        `내 상품 "${product.name}"에 새로운 댓글이 달렸습니다.`,
+      );
+    }
+    return comment;
+  }
+  async getCommentList(
+    productId: number,
+    limit: number,
+    cursor?: number,
+  ): Promise<CursorPaginated<Comment>> {
+    await productRepo.findById(productId);
+    const commentsWithCursor = await commentRepo.findCommentListQuery({ productId }, limit, cursor);
+    const comments = commentsWithCursor.slice(0, limit);
+    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
+    const nextCursor = cursorComment ? cursorComment.id : null;
+    return { list: comments, nextCursor };
+  }
+  async likeProduct(userId: number, productId: number): Promise<{ message: string }> {
+    const product = await productRepo.findById(productId);
+    const existingLike = await likeRepo.findLike(userId, { productId });
+    Iif (existingLike) {
+      throw new AlreadyLikeError();
+    }
+    await likeRepo.createLike(userId, { productId });
+    return { message: `${product.name}상품에 좋아요를 눌렀습니다.` };
+  }
+  async unlikeProduct(userId: number, productId: number): Promise<{ message: string }> {
+    const product = await productRepo.findById(productId);
+    try {
+      await likeRepo.deleteLike(userId, { productId });
+    } catch (error: unknown) {
+      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
+        throw new AlreadyUnlikeError();
+      }
+      throw error;
+    }
+    return { message: `${product.name}상품의 좋아요를 취소했습니다` };
+  }
+}
+ 
+export const productService = new ProductService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/services/userService.ts.html b/mission9-10/coverage/src/services/userService.ts.html new file mode 100644 index 000000000..d77f9ed9a --- /dev/null +++ b/mission9-10/coverage/src/services/userService.ts.html @@ -0,0 +1,721 @@ + + + + + + Code coverage report for src/services/userService.ts + + + + + + + + + +
+
+

All files / src/services userService.ts

+
+ +
+ 42.3% + Statements + 33/78 +
+ + +
+ 32.14% + Branches + 18/56 +
+ + +
+ 50% + Functions + 6/12 +
+ + +
+ 44.77% + Lines + 30/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +2135x +5x +  +5x +5x +5x +  +  +  +  +  +  +  +  +  +  +21x +21x +21x +  +  +  +  +  +20x +20x +  +  +  +  +  +18x +18x +  +  +  +18x +18x +1x +  +17x +17x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +2x +2x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +1x +  +  +  +5x + 
import bcrypt from 'bcrypt';
+import { userRepo } from '../repositories/userRepository';
+import type { Prisma, User } from '@prisma/client';
+import { ForbiddenError, UnauthorizedError } from '../lib/errors/customErrors';
+import { generateToken, verifyRefreshToken } from '../lib/token';
+import { productRepo } from '../repositories/productRepository';
+import type { ProductListResponse } from '../../types/product';
+import { ProfileResponse } from '../../types/user';
+ 
+class UserService {
+  async register(
+    nickname: string,
+    email: string,
+    password: string,
+    image?: string,
+  ): Promise<Omit<User, 'password'>> {
+    const salt = await bcrypt.genSalt(10);
+    const hashedPassword = await bcrypt.hash(password, salt);
+    const user = await userRepo.create({
+      nickname,
+      email,
+      password: hashedPassword,
+      image,
+    });
+    const { password: _, ...userWithoutPassword } = user;
+    return userWithoutPassword;
+  }
+  async login(
+    email: string,
+    password: string,
+  ): Promise<{ tokens: { accessToken: string; refreshToken: string }; message: string }> {
+    const user = await userRepo.findByEmail(email);
+    Iif (!user) {
+      //이메일, 비밀번호 검증에 대한 에러를 같은 메세지로 던짐으로써 좀 더 방어적으로 설계
+      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
+    }
+    const isPasswordValid = await bcrypt.compare(password, user.password);
+    if (!isPasswordValid) {
+      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
+    }
+    const tokens = generateToken(user.id);
+    return { tokens, message: '로그인에 성공했습니다.' };
+  }
+  async getProfile(myId: number): Promise<ProfileResponse> {
+    const user = await userRepo.findById(myId);
+    if (!user) throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
+    const { password: _, ...userInfo } = user;
+    const [myProductCount, myLikeProductCount, recentProductsRaw, recentLikedProductsRaw] =
+      await Promise.all([
+        productRepo.count({ userId: myId }),
+        productRepo.count({ likes: { some: { userId: myId } } }),
+        productRepo.findProductListWithLikes({
+          skip: 0,
+          take: 5,
+          orderBy: { createdAt: 'desc' },
+          where: { userId: myId },
+          userId: myId,
+        }),
+        productRepo.findProductListWithLikes({
+          skip: 0,
+          take: 5,
+          orderBy: { createdAt: 'desc' },
+          where: { likes: { some: { userId: myId } } },
+          userId: myId,
+        }),
+      ]);
+    const myRecentProducts = recentProductsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    const myRecentLikeProducts = recentLikedProductsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    return {
+      user: userInfo,
+      myProducts: {
+        list: myRecentProducts,
+        totalCount: myProductCount,
+      },
+      myLikedProducts: {
+        list: myRecentLikeProducts,
+        totalCount: myLikeProductCount,
+      },
+    };
+  }
+ 
+  async updateProfile(
+    userId: number,
+    nickname?: string,
+    email?: string,
+    image?: string | null,
+  ): Promise<Omit<User, 'password'>> {
+    const data: Prisma.UserUpdateInput = {};
+    if (nickname !== undefined) data.nickname = nickname;
+    if (email !== undefined) data.email = email;
+    if (image !== undefined) data.image = image;
+    const update = await userRepo.update(userId, data);
+    const { password: _, ...userWithoutPassword } = update;
+    return userWithoutPassword;
+  }
+  async patchPassword(userId: number, currentPassword: string, newPassword: string): Promise<void> {
+    const user = await userRepo.findById(userId);
+    if (!user) {
+      throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
+    }
+    const isPasswordValid = await bcrypt.compare(currentPassword, user.password);
+    if (!isPasswordValid) {
+      throw new ForbiddenError('현재 비밀번호가 올바르지 않습니다.');
+    }
+    const salt = await bcrypt.genSalt(10);
+    const hashedNewPassword = await bcrypt.hash(newPassword, salt);
+    await userRepo.update(userId, { password: hashedNewPassword });
+  }
+  async getMyProductList(
+    myId: number,
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+    keyword?: string,
+  ): Promise<ProductListResponse> {
+    const where = {
+      userId: myId,
+      ...(keyword
+        ? {
+            OR: [
+              { name: { contains: keyword } },
+              { description: { contains: keyword } },
+              { tags: { has: keyword } },
+            ],
+          }
+        : {}),
+    };
+    const [totalCount, productsRaw] = await Promise.all([
+      productRepo.count(where),
+      productRepo.findProductListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId: myId,
+      }),
+    ]);
+    const list = productsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    return { list, totalCount };
+  }
+  async refreshToken(refreshToken: string) {
+    let userId: number;
+    try {
+      const payload = verifyRefreshToken(refreshToken);
+      userId = payload.userId;
+    } catch (error) {
+      throw new UnauthorizedError('유효하지 않은 리프레시 토큰입니다.');
+    }
+    const user = await userRepo.findById(userId);
+    if (!user) {
+      throw new UnauthorizedError('존재하지 않는 사용자입니다.');
+    }
+    const tokens = generateToken(user.id);
+    return tokens;
+  }
+  async getMyLikedProducts(
+    myId: number,
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+  ): Promise<ProductListResponse> {
+    const where = {
+      likes: {
+        some: {
+          userId: myId,
+        },
+      },
+    };
+    const [totalCount, productsRaw] = await Promise.all([
+      productRepo.count(where),
+      productRepo.findProductListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId: myId,
+      }),
+    ]);
+    const list = productsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    return { list, totalCount };
+  }
+}
+ 
+export const userService = new UserService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/socket.ts.html b/mission9-10/coverage/src/socket.ts.html new file mode 100644 index 000000000..7dcdc9ac8 --- /dev/null +++ b/mission9-10/coverage/src/socket.ts.html @@ -0,0 +1,214 @@ + + + + + + Code coverage report for src/socket.ts + + + + + + + + + +
+
+

All files / src socket.ts

+
+ +
+ 27.58% + Statements + 8/29 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 24% + Lines + 6/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +441x +  +1x +1x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  + 
import { Server as SocketIOServer } from 'socket.io';
+import { Server as HttpServer } from 'http';
+import { verifyAccessToken } from './lib/token';
+import { UnauthorizedError } from './lib/errors/customErrors';
+ 
+let io: SocketIOServer | null = null;
+ 
+export const initSocket = (Server: HttpServer) => {
+  io = new SocketIOServer(Server, {
+    cors: {
+      origin: '*',
+      methods: ['GET', 'POST'],
+    },
+  });
+ 
+  io.use((socket, next) => {
+    try {
+      const token = socket.handshake.auth.accessToken;
+      if (!token) return next(new UnauthorizedError());
+      const { userId } = verifyAccessToken(token);
+      if (!userId) return next(new UnauthorizedError());
+      socket.data.userId = userId;
+      next();
+    } catch (e) {
+      next(new UnauthorizedError());
+    }
+  });
+ 
+  io.on('connection', (socket) => {
+    const userId = socket.data.userId;
+    console.log('User connected', socket.id);
+    socket.join(`user-${userId}`);
+    console.log(`User ${userId} joined room user-${userId}`);
+  });
+  return io;
+};
+ 
+export const getIO = () => {
+  if (!io) {
+    throw new Error('Socket.IO 서버가 초기화되지 않았습니다.');
+  }
+  return io;
+};
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/structs/articlesStructs.ts.html b/mission9-10/coverage/src/structs/articlesStructs.ts.html new file mode 100644 index 000000000..120a77143 --- /dev/null +++ b/mission9-10/coverage/src/structs/articlesStructs.ts.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for src/structs/articlesStructs.ts + + + + + + + + + +
+
+

All files / src/structs articlesStructs.ts

+
+ +
+ 83.33% + Statements + 5/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 83.33% + Lines + 5/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +131x +1x +  +1x +  +1x +  +  +  +  +  +1x + 
import { coerce, nonempty, nullable, object, partial, string } from 'superstruct';
+import { PageParamsStruct } from './commonStructs';
+ 
+export const GetArticleListParamsStruct = PageParamsStruct;
+ 
+export const CreateArticleBodyStruct = object({
+  title: coerce(nonempty(string()), string(), (value) => value.trim()),
+  content: nonempty(string()),
+  image: nullable(string()),
+});
+ 
+export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct);
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/structs/commentsStruct.ts.html b/mission9-10/coverage/src/structs/commentsStruct.ts.html new file mode 100644 index 000000000..27619246e --- /dev/null +++ b/mission9-10/coverage/src/structs/commentsStruct.ts.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/structs/commentsStruct.ts + + + + + + + + + +
+
+

All files / src/structs commentsStruct.ts

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +  +1x +  +  +  +1x +  +1x + 
import { nonempty, object, partial, string } from 'superstruct';
+import { CursorParamsStruct } from './commonStructs';
+ 
+export const CreateCommentBodyStruct = object({
+  content: nonempty(string()),
+});
+ 
+export const GetCommentListParamsStruct = CursorParamsStruct;
+ 
+export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct);
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/structs/commonStructs.ts.html b/mission9-10/coverage/src/structs/commonStructs.ts.html new file mode 100644 index 000000000..d83d00745 --- /dev/null +++ b/mission9-10/coverage/src/structs/commonStructs.ts.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for src/structs/commonStructs.ts + + + + + + + + + +
+
+

All files / src/structs commonStructs.ts

+
+ +
+ 83.33% + Statements + 5/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +221x +  +1x +  +1x +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  + 
import { coerce, integer, object, string, defaulted, optional, enums, nonempty } from 'superstruct';
+ 
+const integerString = coerce(integer(), string(), (value) => parseInt(value));
+ 
+export const IdParamsStruct = object({
+  id: integerString,
+});
+ 
+export const PageParamsStruct = object({
+  page: defaulted(integerString, 1),
+  pageSize: defaulted(integerString, 10),
+  orderBy: optional(enums(['recent'])),
+  keyword: optional(nonempty(string())),
+});
+ 
+export const CursorParamsStruct = object({
+  cursor: defaulted(integerString, 0),
+  limit: defaulted(integerString, 10),
+  orderBy: optional(enums(['recent'])),
+  keyword: optional(nonempty(string())),
+});
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/structs/index.html b/mission9-10/coverage/src/structs/index.html new file mode 100644 index 000000000..de1e47be2 --- /dev/null +++ b/mission9-10/coverage/src/structs/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/structs + + + + + + + + + +
+
+

All files src/structs

+
+ +
+ 81.81% + Statements + 36/44 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 87.8% + Lines + 36/41 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesStructs.ts +
+
83.33%5/6100%0/00%0/183.33%5/6
commentsStruct.ts +
+
100%5/5100%0/0100%0/0100%5/5
commonStructs.ts +
+
83.33%5/6100%0/00%0/1100%5/5
productsStruct.ts +
+
85.71%6/7100%0/00%0/185.71%6/7
usersStructs.ts +
+
75%15/200%0/40%0/583.33%15/18
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/structs/productsStruct.ts.html b/mission9-10/coverage/src/structs/productsStruct.ts.html new file mode 100644 index 000000000..01ca56f56 --- /dev/null +++ b/mission9-10/coverage/src/structs/productsStruct.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for src/structs/productsStruct.ts + + + + + + + + + +
+
+

All files / src/structs productsStruct.ts

+
+ +
+ 85.71% + Statements + 6/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 85.71% + Lines + 6/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +1x +  +1x +  +1x + 
import {
+  coerce,
+  partial,
+  object,
+  string,
+  min,
+  nonempty,
+  array,
+  integer,
+  optional,
+} from 'superstruct';
+import { PageParamsStruct } from './commonStructs';
+ 
+export const CreateProductBodyStruct = object({
+  name: coerce(nonempty(string()), string(), (value) => value.trim()),
+  description: nonempty(string()),
+  price: min(integer(), 0),
+  tags: optional(array(string())),
+  images: optional(array(string())),
+});
+ 
+export const GetProductListParamsStruct = PageParamsStruct;
+ 
+export const UpdateProductBodyStruct = partial(CreateProductBodyStruct);
+ 
+export const LikeProductParamsStruct = PageParamsStruct;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/coverage/src/structs/usersStructs.ts.html b/mission9-10/coverage/src/structs/usersStructs.ts.html new file mode 100644 index 000000000..79a230ceb --- /dev/null +++ b/mission9-10/coverage/src/structs/usersStructs.ts.html @@ -0,0 +1,229 @@ + + + + + + Code coverage report for src/structs/usersStructs.ts + + + + + + + + + +
+
+

All files / src/structs usersStructs.ts

+
+ +
+ 75% + Statements + 15/20 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 83.33% + Lines + 15/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +491x +1x +  +1x +  +  +1x +  +1x +  +  +  +1x +1x +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +1x +  +1x + 
import * as s from 'superstruct';
+import { PageParamsStruct } from './commonStructs';
+ 
+const CoercedNumber = s.coerce(s.number(), s.union([s.string(), s.number()]), (value) =>
+  Number(value),
+);
+const Integer = s.refine(CoercedNumber, 'Integer', (value) => Number.isInteger(value) && value > 0);
+ 
+export const userIdStruct = s.object({
+  userId: Integer,
+});
+//이메일: 기본적인 이메일 형식 체크, 닉네임: 영어 + 숫자 + 한글, 2~10글자, 비밀번호: 8~16글자
+const email = s.refine(s.string(), 'Email', (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value));
+const nickname = s.refine(s.string(), 'Nickname', (value) =>
+  /^[A-Za-z0-9가-힣]{2,10}$/.test(value),
+);
+const password = s.refine(
+  s.string(),
+  'Password',
+  (value) => value.length >= 8 && value.length <= 16,
+);
+ 
+export const CreateUserBodyStruct = s.object({
+  nickname: nickname,
+  email: email,
+  password: password,
+  image: s.optional(s.string()),
+});
+ 
+export const UpdateUserBodyStruct = s.partial(CreateUserBodyStruct);
+ 
+export const LoginBodyStruct = s.object({
+  email: email,
+  password: password,
+});
+ 
+export const ChangePasswordBodyStruct = s.object({
+  currentPassword: password,
+  newPassword: password,
+});
+ 
+export const RefreshTokenBodyStruct = s.object({
+  refreshToken: s.string(),
+});
+ 
+export const GetMyProductListParamsStruct = PageParamsStruct;
+ 
+export const GetMyLikedProductListParamsStruct = PageParamsStruct;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10/infra/test b/mission9-10/infra/test new file mode 100644 index 000000000..e69de29bb diff --git a/mission9-10/jest.config.js b/mission9-10/jest.config.js new file mode 100644 index 000000000..cb2decff9 --- /dev/null +++ b/mission9-10/jest.config.js @@ -0,0 +1,33 @@ +module.exports = { + testEnvironment: 'node', + verbose: true, + testMatch: ['**/*.test.ts'], + transform: { + '^.+\\.ts$': 'ts-jest', + }, + globals: { + 'ts-jest': { + tsconfig: 'tsconfig.test.json', + }, + }, + moduleFileExtensions: ['ts', 'js'], + // 커버리지 활성화 + collectCoverage: true, + // 어떤 파일을 커버리지 대상으로 볼지 + collectCoverageFrom: [ + 'src/**/*.ts', + '!src/main.ts', // 서버 시작 파일 제외 + '!src/**/*.d.ts', + '!src/socket.ts', + '!src/lib/**', + '!src/controllers/errorController.ts', + '!src/controllers/imagesController.ts', + '!src/middlewares/**', + '!src/services/imageService.ts', + '!src/structs/**', + ], + // 결과물 위치 + coverageDirectory: 'coverage', + // 리포트 형식 + coverageReporters: ['text', 'html'], +}; diff --git a/mission9-10/package-lock.json b/mission9-10/package-lock.json new file mode 100644 index 000000000..ad5cf974a --- /dev/null +++ b/mission9-10/package-lock.json @@ -0,0 +1,9108 @@ +{ + "name": "sprint-mission", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "sprint-mission", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@aws-sdk/client-s3": "^3.975.0", + "@prisma/client": "^6.19.0", + "bcrypt": "^6.0.0", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "dotenv": "^16.6.1", + "dotenv-cli": "^11.0.0", + "express": "^5.2.1", + "fs": "^0.0.1-security", + "is-uuid": "^1.0.2", + "jsonwebtoken": "^9.0.2", + "multer": "^2.0.2", + "socket.io": "^4.8.3", + "superstruct": "^2.0.2", + "tslib": "^2.8.1", + "uuid": "^13.0.0" + }, + "devDependencies": { + "@types/bcrypt": "^6.0.0", + "@types/cookie-parser": "^1.4.10", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/jest": "^30.0.0", + "@types/jsonwebtoken": "^9.0.10", + "@types/mocha": "^10.0.10", + "@types/multer": "^2.0.0", + "@types/node": "^24.10.1", + "@types/supertest": "^6.0.3", + "express-list-endpoints": "^7.1.1", + "jest": "^30.2.0", + "nodemon": "^3.1.11", + "prisma": "^6.19.0", + "supertest": "^7.2.2", + "ts-jest": "^29.4.6", + "ts-node": "^10.9.2", + "typescript": "^5.9.3" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/crc32c": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.975.0.tgz", + "integrity": "sha512-aF1M/iMD29BPcpxjqoym0YFa4WR9Xie1/IhVumwOGH6TB45DaqYO7vLwantDBcYNRn/cZH6DFHksO7RmwTFBhw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/credential-provider-node": "^3.972.1", + "@aws-sdk/middleware-bucket-endpoint": "^3.972.1", + "@aws-sdk/middleware-expect-continue": "^3.972.1", + "@aws-sdk/middleware-flexible-checksums": "^3.972.1", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-location-constraint": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-sdk-s3": "^3.972.2", + "@aws-sdk/middleware-ssec": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.2", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/signature-v4-multi-region": "3.972.0", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.1", + "@smithy/eventstream-serde-browser": "^4.2.8", + "@smithy/eventstream-serde-config-resolver": "^4.3.8", + "@smithy/eventstream-serde-node": "^4.2.8", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-blob-browser": "^4.2.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/hash-stream-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/md5-js": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-retry": "^4.4.27", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.26", + "@smithy/util-defaults-mode-node": "^4.2.29", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.975.0.tgz", + "integrity": "sha512-HpgJuleH7P6uILxzJKQOmlHdwaCY+xYC6VgRDzlwVEqU/HXjo4m2gOAyjUbpXlBOCWfGgMUzfBlNJ9z3MboqEQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.2", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-retry": "^4.4.27", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.26", + "@smithy/util-defaults-mode-node": "^4.2.29", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.973.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.3.tgz", + "integrity": "sha512-ZbM2Xy8ytAcfnNpkBltr6Qdw36W/4NW5nZdZieCuTfacoBFpi/NYiwb8U05KNJvLKeZnrV9Vi696i+r2DQFORg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/xml-builder": "^3.972.2", + "@smithy/core": "^3.21.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/crc64-nvme": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.0.tgz", + "integrity": "sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.2.tgz", + "integrity": "sha512-wzH1EdrZsytG1xN9UHaK12J9+kfrnd2+c8y0LVoS4O4laEjPoie1qVK3k8/rZe7KOtvULzyMnO3FT4Krr9Z0Dg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.3.tgz", + "integrity": "sha512-IbBGWhaxiEl64fznwh5PDEB0N7YJEAvK5b6nRtPVUKdKAHlOPgo6B9XB8mqWDs8Ct0oF/E34ZLiq2U0L5xDkrg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.2.tgz", + "integrity": "sha512-Jrb8sLm6k8+L7520irBrvCtdLxNtrG7arIxe9TCeMJt/HxqMGJdbIjw8wILzkEHLMIi4MecF2FbXCln7OT1Tag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/credential-provider-env": "^3.972.2", + "@aws-sdk/credential-provider-http": "^3.972.3", + "@aws-sdk/credential-provider-login": "^3.972.2", + "@aws-sdk/credential-provider-process": "^3.972.2", + "@aws-sdk/credential-provider-sso": "^3.972.2", + "@aws-sdk/credential-provider-web-identity": "^3.972.2", + "@aws-sdk/nested-clients": "3.975.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.2.tgz", + "integrity": "sha512-mlaw2aiI3DrimW85ZMn3g7qrtHueidS58IGytZ+mbFpsYLK5wMjCAKZQtt7VatLMtSBG/dn/EY4njbnYXIDKeQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/nested-clients": "3.975.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.2.tgz", + "integrity": "sha512-Lz1J5IZdTjLYTVIcDP5DVDgi1xlgsF3p1cnvmbfKbjCRhQpftN2e2J4NFfRRvPD54W9+bZ8l5VipPXtTYK7aEg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.2", + "@aws-sdk/credential-provider-http": "^3.972.3", + "@aws-sdk/credential-provider-ini": "^3.972.2", + "@aws-sdk/credential-provider-process": "^3.972.2", + "@aws-sdk/credential-provider-sso": "^3.972.2", + "@aws-sdk/credential-provider-web-identity": "^3.972.2", + "@aws-sdk/types": "^3.973.1", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.2.tgz", + "integrity": "sha512-NLKLTT7jnUe9GpQAVkPTJO+cs2FjlQDt5fArIYS7h/Iw/CvamzgGYGFRVD2SE05nOHCMwafUSi42If8esGFV+g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.2.tgz", + "integrity": "sha512-YpwDn8g3gCGUl61cCV0sRxP2pFIwg+ZsMfWQ/GalSyjXtRkctCMFA+u0yPb/Q4uTfNEiya1Y4nm0C5rIHyPW5Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.975.0", + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/token-providers": "3.975.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.2.tgz", + "integrity": "sha512-x9DAiN9Qz+NjJ99ltDiVQ8d511M/tuF/9MFbe2jUgo7HZhD6+x4S3iT1YcP07ndwDUjmzKGmeOEgE24k4qvfdg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/nested-clients": "3.975.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.2.tgz", + "integrity": "sha512-ofuXBnitp9j8t05O4NQVrpMZDECPtUhRIWdLzR35baR5njOIPY7YqNtJE+yELVpSn2m4jt2sV1ezYMBY4/Lo+w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-arn-parser": "^3.972.2", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.2.tgz", + "integrity": "sha512-d9bBQlGk1T5j5rWfof20M2tErddOSoSLDauP2/yyuXfeOfQRCSBUZNrApSxjJ9Hw+/RDGR/XL+LEOqmXxSlV3A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.972.2.tgz", + "integrity": "sha512-GgWVZJdzXzqhXxzNAYB3TnZCj7d5rZNdovqSIV91e97nowHVaExRoyaZ3H/Ydqot7veHGPTl8nBp464zZeLDTQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/crc64-nvme": "3.972.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.2.tgz", + "integrity": "sha512-42hZ8jEXT2uR6YybCzNq9OomqHPw43YIfRfz17biZjMQA4jKSQUaHIl6VvqO2Ddl5904pXg2Yd/ku78S0Ikgog==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.2.tgz", + "integrity": "sha512-pyayzpq+VQiG1o9pEUyr6BXEJ2g2t4JIPdNxDkIHp2AhR63Gy/10WQkXTBOgRnfQ7/aLPLOnjRIWwOPp0CfUlA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.2.tgz", + "integrity": "sha512-iUzdXKOgi4JVDDEG/VvoNw50FryRCEm0qAudw12DcZoiNJWl0rN6SYVLcL1xwugMfQncCXieK5UBlG6mhH7iYA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.2.tgz", + "integrity": "sha512-/mzlyzJDtngNFd/rAYvqx29a2d0VuiYKN84Y/Mu9mGw7cfMOCyRK+896tb9wV6MoPRHUX7IXuKCIL8nzz2Pz5A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.3.tgz", + "integrity": "sha512-ZVtakKpQ7vI9l7tE2SJjQgoPYv2f/Bw/HMip5wBigsQBDvVbN300h+6nPnm0gnEQwIGGG0yJF3XCvr1/4pZW9A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-arn-parser": "^3.972.2", + "@smithy/core": "^3.21.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.2.tgz", + "integrity": "sha512-HJ3OmQnlQ1es6esrDWnx3nVPhBAN89WaFCzsDcb6oT7TMjBPUfZ5+1BpI7B0Hnme8cc6kp7qc4cgo2plrlROJA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.3.tgz", + "integrity": "sha512-zq6aTiO/BiAIOA8EH8nB+wYvvnZ14Md9Gomm5DDhParshVEVglAyNPO5ADK4ZXFQbftIoO+Vgcvf4gewW/+iYQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.972.0", + "@smithy/core": "^3.21.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.975.0.tgz", + "integrity": "sha512-OkeFHPlQj2c/Y5bQGkX14pxhDWUGUFt3LRHhjcDKsSCw6lrxKcxN3WFZN0qbJwKNydP+knL5nxvfgKiCLpTLRA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.2", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-retry": "^4.4.27", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.26", + "@smithy/util-defaults-mode-node": "^4.2.29", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.2.tgz", + "integrity": "sha512-/7vRBsfmiOlg2X67EdKrzzQGw5/SbkXb7ALHQmlQLkZh8qNgvS2G2dDC6NtF3hzFlpP3j2k+KIEtql/6VrI6JA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.972.0.tgz", + "integrity": "sha512-2udiRijmjpN81Pvajje4TsjbXDZNP6K9bYUanBYH8hXa/tZG5qfGCySD+TyX0sgDxCQmEDMg3LaQdfjNHBDEgQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.972.0", + "@aws-sdk/types": "3.972.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/core": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.972.0.tgz", + "integrity": "sha512-nEeUW2M9F+xdIaD98F5MBcQ4ITtykj3yKbgFZ6J0JtL3bq+Z90szQ6Yy8H/BLPYXTs3V4n9ifnBo8cprRDiE6A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.972.0", + "@aws-sdk/xml-builder": "3.972.0", + "@smithy/core": "^3.20.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.0.tgz", + "integrity": "sha512-0bcKFXWx+NZ7tIlOo7KjQ+O2rydiHdIQahrq+fN6k9Osky29v17guy68urUKfhTobR6iY6KvxkroFWaFtTgS5w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.972.0", + "@aws-sdk/types": "3.972.0", + "@aws-sdk/util-arn-parser": "3.972.0", + "@smithy/core": "^3.20.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz", + "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.0.tgz", + "integrity": "sha512-RM5Mmo/KJ593iMSrALlHEOcc9YOIyOsDmS5x2NLOMdEmzv1o00fcpAkCQ02IGu1eFneBFT7uX0Mpag0HI+Cz2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/xml-builder": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.0.tgz", + "integrity": "sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.975.0.tgz", + "integrity": "sha512-AWQt64hkVbDQ+CmM09wnvSk2mVyH4iRROkmYkr3/lmUtFNbE2L/fnw26sckZnUcFCsHPqbkQrcsZAnTcBLbH4w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/nested-clients": "3.975.0", + "@aws-sdk/types": "^3.973.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.2.tgz", + "integrity": "sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.972.0.tgz", + "integrity": "sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.972.0", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz", + "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.4.tgz", + "integrity": "sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.2.tgz", + "integrity": "sha512-gz76bUyebPZRxIsBHJUd/v+yiyFzm9adHbr8NykP2nm+z/rFyvQneOHajrUejtmnc5tTBeaDPL4X25TnagRk4A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.2.tgz", + "integrity": "sha512-vnxOc4C6AR7hVbwyFo1YuH0GB6dgJlWt8nIOOJpnzJAWJPkUMPJ9Zv2lnKsSU7TTZbhP2hEO8OZ4PYH59XFv8Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.2.tgz", + "integrity": "sha512-jGOOV/bV1DhkkUhHiZ3/1GZ67cZyOXaDb7d1rYD6ZiXf5V9tBNOcgqXwRRPvrCbYaFRa1pPMFb3ZjqjWpR3YfA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", + "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.2.0", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/test-result": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@prisma/client": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.0.tgz", + "integrity": "sha512-QXFT+N/bva/QI2qoXmjBzL7D6aliPffIwP+81AdTGq0FXDoLxLkWivGMawG8iM5B9BKfxLIXxfWWAF6wbuJU6g==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/config": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.0.tgz", + "integrity": "sha512-zwCayme+NzI/WfrvFEtkFhhOaZb/hI+X8TTjzjJ252VbPxAl2hWHK5NMczmnG9sXck2lsXrxIZuK524E25UNmg==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "c12": "3.1.0", + "deepmerge-ts": "7.1.5", + "effect": "3.18.4", + "empathic": "2.0.0" + } + }, + "node_modules/@prisma/debug": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.0.tgz", + "integrity": "sha512-8hAdGG7JmxrzFcTzXZajlQCidX0XNkMJkpqtfbLV54wC6LSSX6Vni25W/G+nAANwLnZ2TmwkfIuWetA7jJxJFA==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.0.tgz", + "integrity": "sha512-pMRJ+1S6NVdXoB8QJAPIGpKZevFjxhKt0paCkRDTZiczKb7F4yTgRP8M4JdVkpQwmaD4EoJf6qA+p61godDokw==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.0", + "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", + "@prisma/fetch-engine": "6.19.0", + "@prisma/get-platform": "6.19.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773.tgz", + "integrity": "sha512-gV7uOBQfAFlWDvPJdQxMT1aSRur3a0EkU/6cfbAC5isV67tKDWUrPauyaHNpB+wN1ebM4A9jn/f4gH+3iHSYSQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.0.tgz", + "integrity": "sha512-OOx2Lda0DGrZ1rodADT06ZGqHzr7HY7LNMaFE2Vp8dp146uJld58sRuasdX0OiwpHgl8SqDTUKHNUyzEq7pDdQ==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.0", + "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", + "@prisma/get-platform": "6.19.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.0.tgz", + "integrity": "sha512-ym85WDO2yDhC3fIXHWYpG3kVMBA49cL1XD2GCsCF8xbwoy2OkDQY44gEbAt2X46IQ4Apq9H6g0Ex1iFfPqEkHA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.47", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.47.tgz", + "integrity": "sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", + "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", + "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", + "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.22.0.tgz", + "integrity": "sha512-6vjCHD6vaY8KubeNw2Fg3EK0KLGQYdldG4fYgQmA0xSW0dJ8G2xFhSOdrlUakWVoP5JuWHtFODg3PNd/DN3FDA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", + "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.8.tgz", + "integrity": "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.8.tgz", + "integrity": "sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.8.tgz", + "integrity": "sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.8.tgz", + "integrity": "sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.8.tgz", + "integrity": "sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.9.tgz", + "integrity": "sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/chunked-blob-reader": "^5.2.0", + "@smithy/chunked-blob-reader-native": "^4.2.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", + "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.8.tgz", + "integrity": "sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", + "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.8.tgz", + "integrity": "sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", + "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.12.tgz", + "integrity": "sha512-9JMKHVJtW9RysTNjcBZQHDwB0p3iTP6B1IfQV4m+uCevkVd/VuLgwfqk5cnI4RHcp4cPwoIvxQqN4B1sxeHo8Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.22.0", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.4.29", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.29.tgz", + "integrity": "sha512-bmTn75a4tmKRkC5w61yYQLb3DmxNzB8qSVu9SbTYqW6GAL0WXO2bDZuMAn/GJSbOdHEdjZvWxe+9Kk015bw6Cg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/service-error-classification": "^4.2.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", + "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", + "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", + "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.8.tgz", + "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.11.1.tgz", + "integrity": "sha512-SERgNg5Z1U+jfR6/2xPYjSEHY1t3pyTHC/Ma3YQl6qWtmiL42bvNId3W/oMUWIwu7ekL2FMPdqAmwbQegM7HeQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.22.0", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.28", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.28.tgz", + "integrity": "sha512-/9zcatsCao9h6g18p/9vH9NIi5PSqhCkxQ/tb7pMgRFnqYp9XUOyOlGPDMHzr8n5ih6yYgwJEY2MLEobUgi47w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.31", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.31.tgz", + "integrity": "sha512-JTvoApUXA5kbpceI2vuqQzRjeTbLpx1eoa5R/YEZbTgtxvIB7AQZxFJ0SEyfCpgPCyVV9IT7we+ytSeIB3CyWA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.6", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", + "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", + "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", + "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.8.tgz", + "integrity": "sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookie-parser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.10.tgz", + "integrity": "sha512-B4xqkqfZ8Wek+rCOeRxsjMS9OgvzebEzzLYw7NHYuvzb7IdxOkI0ZHGgeEBX4PUM7QGVvNSK60T3OvWj3YfBRg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", + "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/multer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.0.0.tgz", + "integrity": "sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/node": { + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", + "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "license": "MIT" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", + "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/bowser": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", + "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c12": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", + "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.6.1", + "exsolve": "^1.0.7", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001765", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz", + "integrity": "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-cli": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-11.0.0.tgz", + "integrity": "sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "dotenv": "^17.1.0", + "dotenv-expand": "^12.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "dotenv": "cli.js" + } + }, + "node_modules/dotenv-cli/node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.3.tgz", + "integrity": "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/effect": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", + "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.5.tgz", + "integrity": "sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.18.3" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-list-endpoints": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/express-list-endpoints/-/express-list-endpoints-7.1.1.tgz", + "integrity": "sha512-SA6YHH1r6DrioJ4fFJNqiwu1FweGFqJZO9KBApMzwPosoSGPOX2AW0wiMepOXjojjEXDuP9whIvckomheErbJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/express/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/express/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-uuid": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-uuid/-/is-uuid-1.0.2.tgz", + "integrity": "sha512-tCByphFcJgf2qmiMo5hMCgNAquNSagOetVetDvBXswGkNfoyEMvGH1yDlF8cbZbKnbVBr4Y5/rlpMz9umxyBkQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", + "import-local": "^3.2.0", + "jest-cli": "30.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.2.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "p-limit": "^3.1.0", + "pretty-format": "30.2.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/jest-cli": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-leak-detector": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.2.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", + "object-assign": "^4.1.1", + "type-is": "^1.6.18", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", + "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nypm": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", + "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.2", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "tinyexec": "^1.0.1" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.0.tgz", + "integrity": "sha512-F3eX7K+tWpkbhl3l4+VkFtrwJlLXbAM+f9jolgoUZbFcm1DgHZ4cq9AgVEgUym2au5Ad/TDLN8lg83D+M10ycw==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/config": "6.19.0", + "@prisma/engines": "6.19.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/socket.io": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", + "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", + "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", + "license": "MIT", + "dependencies": { + "debug": "~4.4.1", + "ws": "~8.18.3" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz", + "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/superagent": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", + "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.5", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.14.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/supertest": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz", + "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-signature": "^1.2.2", + "methods": "^1.1.2", + "superagent": "^10.3.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supertest/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-jest": { + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/mission9-10/package.json b/mission9-10/package.json new file mode 100644 index 000000000..435f38267 --- /dev/null +++ b/mission9-10/package.json @@ -0,0 +1,60 @@ +{ + "name": "sprint-mission", + "version": "1.0.0", + "description": "", + "keywords": [], + "license": "ISC", + "author": "", + "main": "src/main.js", + "scripts": { + "dev": "nodemon --watch src --exec ts-node src/main.ts", + "build": "tsc -p tsconfig.build.json", + "start": "node dist/main.js", + "test": "dotenv -e .env.test -- npm run prisma:migrate && dotenv -e .env.test -- jest --runInBand", + "test:coverage": "jest --coverage", + "prisma:generate": "prisma generate", + "prisma:migrate": "prisma migrate dev", + "prisma:seed": "ts-node prisma/seed.ts" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.975.0", + "@prisma/client": "^6.19.0", + "bcrypt": "^6.0.0", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "dotenv": "^16.6.1", + "dotenv-cli": "^11.0.0", + "express": "^5.2.1", + "fs": "^0.0.1-security", + "is-uuid": "^1.0.2", + "jsonwebtoken": "^9.0.2", + "multer": "^2.0.2", + "socket.io": "^4.8.3", + "superstruct": "^2.0.2", + "tslib": "^2.8.1", + "uuid": "^13.0.0" + }, + "devDependencies": { + "@types/bcrypt": "^6.0.0", + "@types/cookie-parser": "^1.4.10", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/jest": "^30.0.0", + "@types/jsonwebtoken": "^9.0.10", + "@types/mocha": "^10.0.10", + "@types/multer": "^2.0.0", + "@types/node": "^24.10.1", + "@types/supertest": "^6.0.3", + "express-list-endpoints": "^7.1.1", + "jest": "^30.2.0", + "nodemon": "^3.1.11", + "prisma": "^6.19.0", + "supertest": "^7.2.2", + "ts-jest": "^29.4.6", + "ts-node": "^10.9.2", + "typescript": "^5.9.3" + }, + "prisma": { + "schema": "prisma/schema.prisma" + } +} diff --git a/mission9-10/prisma/migrations/20260119073239_add_notification/migration.sql b/mission9-10/prisma/migrations/20260119073239_add_notification/migration.sql new file mode 100644 index 000000000..fc7d680ba --- /dev/null +++ b/mission9-10/prisma/migrations/20260119073239_add_notification/migration.sql @@ -0,0 +1,114 @@ +-- CreateTable +CREATE TABLE "Article" ( + "id" SERIAL NOT NULL, + "title" TEXT NOT NULL, + "content" TEXT NOT NULL, + "image" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "userId" INTEGER NOT NULL, + + CONSTRAINT "Article_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Product" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT NOT NULL, + "price" INTEGER NOT NULL, + "tags" TEXT[], + "images" TEXT[], + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "userId" INTEGER NOT NULL, + + CONSTRAINT "Product_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Comment" ( + "id" SERIAL NOT NULL, + "content" TEXT NOT NULL, + "productId" INTEGER, + "articleId" INTEGER, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "userId" INTEGER NOT NULL, + + CONSTRAINT "Comment_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "email" TEXT NOT NULL, + "nickname" TEXT NOT NULL, + "image" TEXT, + "password" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Like" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "productId" INTEGER, + "articleId" INTEGER, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Like_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Notification" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "message" TEXT NOT NULL, + "isRead" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Notification_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_nickname_key" ON "User"("nickname"); + +-- CreateIndex +CREATE UNIQUE INDEX "Like_userId_productId_key" ON "Like"("userId", "productId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Like_userId_articleId_key" ON "Like"("userId", "articleId"); + +-- AddForeignKey +ALTER TABLE "Article" ADD CONSTRAINT "Article_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Product" ADD CONSTRAINT "Product_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Comment" ADD CONSTRAINT "Comment_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Comment" ADD CONSTRAINT "Comment_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Comment" ADD CONSTRAINT "Comment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Like" ADD CONSTRAINT "Like_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Like" ADD CONSTRAINT "Like_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Like" ADD CONSTRAINT "Like_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/mission9-10/prisma/migrations/migration_lock.toml b/mission9-10/prisma/migrations/migration_lock.toml new file mode 100644 index 000000000..044d57cdb --- /dev/null +++ b/mission9-10/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql" diff --git a/mission9-10/prisma/schema.prisma b/mission9-10/prisma/schema.prisma new file mode 100644 index 000000000..f78c7da69 --- /dev/null +++ b/mission9-10/prisma/schema.prisma @@ -0,0 +1,93 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? +// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model Article { + id Int @id @default(autoincrement()) + title String + content String + image String? + articleComment Comment[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + user User @relation(fields: [userId], references: [id]) + userId Int + likes Like[] +} + +model Product { + id Int @id @default(autoincrement()) + name String + description String + price Int + tags String[] + images String[] + productComment Comment[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + user User @relation(fields: [userId], references: [id]) + userId Int + likes Like[] +} + +model Comment { + id Int @id @default(autoincrement()) + content String + product Product? @relation(fields: [productId], references: [id], onDelete: Cascade) + productId Int? + article Article? @relation(fields: [articleId], references: [id], onDelete: Cascade) + articleId Int? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + user User @relation(fields: [userId], references: [id]) + userId Int +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + nickname String @unique + image String? + password String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + products Product[] + articles Article[] + comments Comment[] + likes Like[] + notifications Notification[] +} + +model Like { + id Int @id @default(autoincrement()) + user User @relation(fields: [userId], references: [id]) + userId Int + product Product? @relation(fields: [productId], references: [id], onDelete: Cascade) + productId Int? + article Article? @relation(fields: [articleId], references: [id], onDelete: Cascade) + articleId Int? + createdAt DateTime @default(now()) + + @@unique([userId, productId]) + @@unique([userId, articleId]) +} + +model Notification { + id Int @id @default(autoincrement()) + userId Int + user User @relation(fields: [userId], references: [id]) + message String + isRead Boolean @default(false) + createdAt DateTime @default(now()) +} diff --git a/mission9-10/public/.gitkeep b/mission9-10/public/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/mission9-10/public/4f3edda9-25e4-462b-b18b-a45bb5f789ca.png b/mission9-10/public/4f3edda9-25e4-462b-b18b-a45bb5f789ca.png new file mode 100644 index 0000000000000000000000000000000000000000..35a7b5616a6b18773cb64d62627874b0bde02271 GIT binary patch literal 6066 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 + + + + + Document + + +

Socket.IO client test

+
+ + +
+ + + + + diff --git a/mission9-10/readme.md b/mission9-10/readme.md new file mode 100644 index 000000000..886574b32 --- /dev/null +++ b/mission9-10/readme.md @@ -0,0 +1,163 @@ +# 스프린트 미션5 + +- 미션8 소켓io를 활용한 알림 api 기능 개발 + +## 추가된 주요 기능 + +- 자신의 알림 목록 조회 +- 자신이 읽지 않은 알림 개수 조회 +- 자신의 알림 읽음 처리 +- 클라이언트 실시간 알림 기능 +- 좋아요한 상품의 가격 변동 알림 +- 자신이 작성한 게시글의 댓글 알림 + +## ERD 다이어그램 + +```mermaid +erDiagram + USER { + Int id PK + String email "UNIQUE" + String nickname "UNIQUE" + String image "nullable" + String password + DateTime createdAt + DateTime updatedAt + } + + ARTICLE { + Int id PK + String title + String content + String image "nullable" + DateTime createdAt + DateTime updatedAt + Int userId FK + } + + PRODUCT { + Int id PK + String name + String description + Int price + String[] tags + String[] images + DateTime createdAt + DateTime updatedAt + Int userId FK + } + + COMMENT { + Int id PK + String content + Int productId FK "nullable" + Int articleId FK "nullable" + DateTime createdAt + DateTime updatedAt + Int userId FK + } + + LIKE { + Int id PK + Int userId FK + Int productId FK "nullable" + Int articleId FK "nullable" + DateTime createdAt + } + + NOTIFICATION { + Int id PK + Int userId FK + String message + Boolean isRead + DateTime createdAt + } + + USER ||--o{ ARTICLE : writes + USER ||--o{ PRODUCT : sells + USER ||--o{ COMMENT : writes + USER ||--o{ LIKE : creates + USER ||--o{ NOTIFICATION : receives + + ARTICLE ||--o{ COMMENT : has + PRODUCT ||--o{ COMMENT : has + + ARTICLE ||--o{ LIKE : likedBy + PRODUCT ||--o{ LIKE : likedBy + +``` + +- 한 유저는 같은 Product/Article 에 한 번만 좋아요를 누를 수 있습니다. (unique 제약) + +## 프로젝트 구조 + +``` +mission8 +├── prisma +│ ├── migrations +│ └── schema.prisma +├── public +│ └──socket-client-test.html +├── src +│ ├── controllers +│ │ ├── articlesController.ts +│ │ ├── commentsController.ts +│ │ ├── errorController.ts +│ │ ├── imagesController.ts +│ │ ├── notificationController.ts +│ │ ├── productsController.ts +│ │ └── usersController.ts +│ │ +│ ├── lib +│ │ ├── errors +│ │ │ ├── customErrors.ts +│ │ │ └── errorUtils.ts +│ │ ├── constants.ts +│ │ ├── cookies.ts +│ │ ├── prismaClient.ts +│ │ ├── token.ts +│ │ └── withAsync.ts +│ │ +│ ├── middlewares +│ │ └── authenticate.ts +│ │ +│ ├── repositories +│ │ ├── articleRepository.ts +│ │ ├── commentRepository.ts +│ │ ├── likeRepository.ts +│ │ ├── notificationRepository.ts +│ │ ├── productRepository.ts +│ │ └── userRepository.ts +│ │ +│ ├── routers +│ │ ├── articlesRouter.ts +│ │ ├── commentsRouter.ts +│ │ ├── imagesRouter.ts +│ │ ├── notificationRepository.ts +│ │ ├── productsRouter.ts +│ │ └── usersRouter.ts +│ │ +│ ├── services +│ │ ├── articleService.ts +│ │ ├── commentService.ts +│ │ ├── imageService.ts +│ │ ├── notificationService.ts +│ │ ├── productService.ts +│ │ └── userService.ts +│ │ +│ ├── structs +│ │ ├── articlesStructs.ts +│ │ ├── commentsStructs.ts +│ │ ├── commonStructs.ts +│ │ ├── productsStructs.ts +│ │ └── usersStructs.ts +│ │ +│ ├── socket.ts +│ └── main.ts +│ +├── tests +├── types +├── package.json +├── package-lock.json +└── readme.md +``` diff --git a/mission9-10/src/app.ts b/mission9-10/src/app.ts new file mode 100644 index 000000000..740e4bc17 --- /dev/null +++ b/mission9-10/src/app.ts @@ -0,0 +1,30 @@ +import express from 'express'; +import cors from 'cors'; +import articlesRouter from './routers/articlesRouter'; +import productsRouter from './routers/productsRouter'; +import commentsRouter from './routers/commentsRouter'; +import imagesRouter from './routers/imagesRouter'; +import usersRouter from './routers/usersRouter'; +import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController'; +import cookieParser from 'cookie-parser'; +import notificationRouter from './routers/notificationRouter'; +import { setupStatic } from './lib/setupStatic'; + +const app = express(); + +app.use(cors()); +app.use(cookieParser()); +app.use(express.json()); +setupStatic(app); + +app.use('/articles', articlesRouter); +app.use('/products', productsRouter); +app.use('/comments', commentsRouter); +app.use('/images', imagesRouter); +app.use('/users', usersRouter); +app.use('/notifications', notificationRouter); + +app.use(defaultNotFoundHandler); +app.use(globalErrorHandler); + +export default app; diff --git a/mission9-10/src/controllers/articlesController.ts b/mission9-10/src/controllers/articlesController.ts new file mode 100644 index 000000000..688e97352 --- /dev/null +++ b/mission9-10/src/controllers/articlesController.ts @@ -0,0 +1,97 @@ +import { create } from 'superstruct'; +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { IdParamsStruct } from '../structs/commonStructs'; +import { + CreateArticleBodyStruct, + UpdateArticleBodyStruct, + GetArticleListParamsStruct, +} from '../structs/articlesStructs'; +import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct'; +import { Request, Response } from 'express'; +import { articleService } from '../services/articleService'; + +//게시물 생성 +export async function createArticle(req: Request, res: Response) { + const { title, content, image } = create(req.body, CreateArticleBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const article = await articleService.createArticle(user.id, title, content, image); + return res.status(201).send(article); +} +// 게시글 조회(좋아요 포함) +export async function getArticle(req: Request, res: Response) { + const { id } = create(req.params, IdParamsStruct); + const user = req.user; + const article = await articleService.getArticle(id, user?.id); + return res.send(article); +} +//게시물 수정 +export async function updateArticle(req: Request, res: Response) { + const { id } = create(req.params, IdParamsStruct); + const data = create(req.body, UpdateArticleBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const updated = await articleService.updateArticle(id, user.id, data); + return res.send(updated); +} +//게시물 삭제 +export async function deleteArticle(req: Request, res: Response) { + const { id } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + await articleService.deleteArticle(id, user.id); + return res.status(204).send(); +} + +//게시글 목록 조회(좋아요 포함) +export async function getArticleList(req: Request, res: Response) { + const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct); + const user = req.user; + const articles = await articleService.getArticleList(page, pageSize, orderBy, keyword, user?.id); + return res.send(articles); +} +//댓글 등록 +export async function createComment(req: Request, res: Response) { + const { id: articleId } = create(req.params, IdParamsStruct); + const { content } = create(req.body, CreateCommentBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const comment = await articleService.createComment(user.id, articleId, content); + return res.status(201).send(comment); +} +//댓글 목록 조회 +export async function getCommentList(req: Request, res: Response) { + const { id: articleId } = create(req.params, IdParamsStruct); + const { cursor, limit } = create(req.query, GetCommentListParamsStruct); + const commnetsList = await articleService.getCommentList(articleId, limit, cursor); + return res.send(commnetsList); +} +//게시글 좋아요 등록 +export async function likeArticle(req: Request, res: Response) { + const { id: articleId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const articleLike = await articleService.likeArticle(user.id, articleId); + return res.status(200).send(articleLike); +} + +//게시글 좋아요 취소 +export async function unlikeArticle(req: Request, res: Response) { + const { id: articleId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const articleUnlike = await articleService.unlikeArticle(user.id, articleId); + return res.status(200).send(articleUnlike); +} diff --git a/mission9-10/src/controllers/commentsController.ts b/mission9-10/src/controllers/commentsController.ts new file mode 100644 index 000000000..ad89524bc --- /dev/null +++ b/mission9-10/src/controllers/commentsController.ts @@ -0,0 +1,29 @@ +import { create } from 'superstruct'; +import { UpdateCommentBodyStruct } from '../structs/commentsStruct'; +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { IdParamsStruct } from '../structs/commonStructs'; +import { Request, Response } from 'express'; +import { commnetService } from '../services/commentService'; + +//댓글 수정 +export async function updateComment(req: Request, res: Response) { + const { id: commentId } = create(req.params, IdParamsStruct); + const { content } = create(req.body, UpdateCommentBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const updatedComment = await commnetService.updateComment(commentId, user.id, content); + return res.send(updatedComment); +} + +//댓글 삭제 +export async function deleteComment(req: Request, res: Response) { + const { id: commentId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + await commnetService.deleteComment(commentId, user.id); + return res.status(204).send(); +} diff --git a/mission9-10/src/controllers/errorController.ts b/mission9-10/src/controllers/errorController.ts new file mode 100644 index 000000000..0ebb1e34a --- /dev/null +++ b/mission9-10/src/controllers/errorController.ts @@ -0,0 +1,46 @@ +import { StructError } from 'superstruct'; +import { + NotFoundError, + BadRequestError, + ForbiddenError, + UnauthorizedError, +} from '../lib/errors/customErrors'; +import { Prisma } from '@prisma/client'; +import { Request, Response, NextFunction } from 'express'; +import { isSyntaxJsonError } from '../lib/errors/errorUtils'; + +//404 처리 미들웨어 +export function defaultNotFoundHandler(req: Request, res: Response, next: NextFunction) { + return res.status(404).send({ message: '존재하지 않습니다' }); +} +//전역 에러 처리 미들웨어(400,401,403,404,500) +export function globalErrorHandler(err: unknown, req: Request, res: Response, next: NextFunction) { + if (err instanceof StructError || err instanceof BadRequestError) { + return res.status(400).send({ message: '잘못된 요청입니다' }); + } + if (isSyntaxJsonError(err)) { + return res.status(400).send({ message: '잘못된 요청입니다' }); + } + if (err instanceof UnauthorizedError) { + return res.status(401).json({ message: err.message }); + } + if (err instanceof ForbiddenError) { + return res.status(403).json({ message: err.message }); + } + if (err instanceof NotFoundError) { + return res.status(404).send({ message: err.message }); + } + //프리즈마 코드 에러, 그 외 known 에러 500처리 + if (err instanceof Prisma.PrismaClientKnownRequestError) { + if (err.code === 'P2025') { + return res.status(404).json({ message: '존재하지 않습니다' }); + } + if (err.code === 'P2002') { + return res.status(400).json({ message: '잘못된 요청입니다' }); + } + return res.status(500).json({ message: '데이터 처리 중 오류가 발생했습니다' }); + } + + console.error(err); + return res.status(500).send({ message: '데이터 처리 중 오류가 발생했습니다' }); +} diff --git a/mission9-10/src/controllers/imagesController.ts b/mission9-10/src/controllers/imagesController.ts new file mode 100644 index 000000000..b34821e61 --- /dev/null +++ b/mission9-10/src/controllers/imagesController.ts @@ -0,0 +1,7 @@ +import { Request, Response } from 'express'; +import { imageService } from '../services/imageService'; + +export async function uploadImage(req: Request, res: Response) { + const response = await imageService.buildImageUrl(req); + return res.send(response); +} diff --git a/mission9-10/src/controllers/notificationController.ts b/mission9-10/src/controllers/notificationController.ts new file mode 100644 index 000000000..18917a816 --- /dev/null +++ b/mission9-10/src/controllers/notificationController.ts @@ -0,0 +1,33 @@ +import { Request, Response } from 'express'; +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { notificationService } from '../services/notificationService'; +import { IdParamsStruct } from '../structs/commonStructs'; +import { create } from 'superstruct'; + +export async function getNotifications(req: Request, res: Response) { + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const notifications = await notificationService.getNotifications(user.id); + return res.send(notifications); +} + +export async function getUnreadCount(req: Request, res: Response) { + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const count = await notificationService.getUnreadCount(user.id); + return res.send({ count }); +} + +export async function markAsRead(req: Request, res: Response) { + const { id: notificationId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const notification = await notificationService.markAsRead(notificationId, user.id); + return res.send(notification); +} diff --git a/mission9-10/src/controllers/productsController.ts b/mission9-10/src/controllers/productsController.ts new file mode 100644 index 000000000..de9f9f6da --- /dev/null +++ b/mission9-10/src/controllers/productsController.ts @@ -0,0 +1,103 @@ +import { create } from 'superstruct'; +import { IdParamsStruct } from '../structs/commonStructs'; +import { + CreateProductBodyStruct, + GetProductListParamsStruct, + UpdateProductBodyStruct, +} from '../structs/productsStruct'; +import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct'; +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { Request, Response } from 'express'; +import { productService } from '../services/productService'; + +//상품 등록 +export async function createProduct(req: Request, res: Response) { + const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const product = await productService.createProduct({ + name, + description, + price, + tags, + images, + userId: user.id, + }); + return res.status(201).send(product); +} +//특정 상품 조회(좋아요 포함) +export async function getProduct(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const user = req.user; + const product = await productService.getProduct(productId, user?.id); + return res.send(product); +} +//상품 수정 +export async function updateProduct(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const data = create(req.body, UpdateProductBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const updatedProduct = await productService.updateProduct(productId, user.id, data); + return res.send(updatedProduct); +} +//상품 삭제 +export async function deleteProduct(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + await productService.deleteProduct(productId, user.id); + return res.status(204).send(); +} +//상품 목록 조회(좋아요 포함) +export async function getProductList(req: Request, res: Response) { + const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct); + const user = req.user; + const products = await productService.getProductList(page, pageSize, orderBy, keyword, user?.id); + return res.send(products); +} + +//댓글 등록 +export async function createComment(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const { content } = create(req.body, CreateCommentBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const comment = await productService.createComment(user.id, productId, content); + return res.status(201).send(comment); +} +//상품 댓글 목록 조회 +export async function getCommentList(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const { cursor, limit } = create(req.query, GetCommentListParamsStruct); + const commentList = await productService.getCommentList(productId, limit, cursor); + return res.send(commentList); +} +//상품 좋아요 등록 +export async function likeProduct(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const productLike = await productService.likeProduct(user.id, productId); + return res.status(200).send(productLike); +} +//상품 좋아요 취소 +export async function unlikeProduct(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const productUnliked = await productService.unlikeProduct(user.id, productId); + return res.send(productUnliked); +} diff --git a/mission9-10/src/controllers/usersController.ts b/mission9-10/src/controllers/usersController.ts new file mode 100644 index 000000000..fe8a9898b --- /dev/null +++ b/mission9-10/src/controllers/usersController.ts @@ -0,0 +1,92 @@ +import { + CreateUserBodyStruct, + UpdateUserBodyStruct, + LoginBodyStruct, + ChangePasswordBodyStruct, + GetMyProductListParamsStruct, + GetMyLikedProductListParamsStruct, +} from '../structs/usersStructs'; +import { create } from 'superstruct'; +import { clearTokenCookies, setTokenCookies } from '../lib/cookies'; +import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants'; +import { Request, Response } from 'express'; +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { userService } from '../services/userService'; + +//회원가입 +export async function register(req: Request, res: Response) { + const { nickname, email, password, image } = create(req.body, CreateUserBodyStruct); + const user = await userService.register(nickname, email, password, image); + return res.status(201).send(user); +} +//로그인 +export async function login(req: Request, res: Response) { + const { email, password } = create(req.body, LoginBodyStruct); + const result = await userService.login(email, password); + setTokenCookies(res, result.tokens.accessToken, result.tokens.refreshToken); + return res.status(200).send({ message: result.message }); +} +//로그아웃 +export async function logout(req: Request, res: Response) { + clearTokenCookies(res); + return res.status(200).send({ message: '로그아웃에 성공했습니다.' }); +} +//내 프로필 조회 (최근 등록한 상품 5개, 최근 좋아요한 상품 5개 포함) +export async function getProfile(req: Request, res: Response) { + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const profile = await userService.getProfile(user.id); + return res.send(profile); +} +//내 프로필 수정 +export async function updateProfile(req: Request, res: Response) { + const { nickname, email, image } = create(req.body, UpdateUserBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const update = await userService.updateProfile(user.id, nickname, email, image); + return res.send(update); +} +//내 비밀번호 변경 +export async function patchPassword(req: Request, res: Response) { + const { currentPassword, newPassword } = create(req.body, ChangePasswordBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + await userService.patchPassword(user.id, currentPassword, newPassword); + return res.status(200).send({ message: '비밀번호가 성공적으로 변경되었습니다.' }); +} +//내가 등록한 상품 목록 조회 (상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능) +export async function getMyProductList(req: Request, res: Response) { + const { page, pageSize, orderBy, keyword } = create(req.query, GetMyProductListParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const myProducts = await userService.getMyProductList(user.id, page, pageSize, orderBy, keyword); + return res.send(myProducts); +} +//토큰 갱신(리프레시) +export async function refreshToken(req: Request, res: Response) { + const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME]; + if (!refreshToken) { + throw new UnauthorizedError('리프레시 토큰이 없습니다.'); + } + const tokens = await userService.refreshToken(refreshToken); + setTokenCookies(res, tokens.accessToken, tokens.refreshToken); + return res.status(200).send({ message: '토큰이 성공적으로 갱신되었습니다.' }); +} +//내가 좋아요한 상품 목록 조회(상품이 꽤 많이 있을 경우 페이징 처리) +export async function getMyLikedProducts(req: Request, res: Response) { + const { page, pageSize, orderBy } = create(req.query, GetMyLikedProductListParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const myLikedProducts = await userService.getMyLikedProducts(user.id, page, pageSize, orderBy); + return res.send(myLikedProducts); +} diff --git a/mission9-10/src/lib/constants.ts b/mission9-10/src/lib/constants.ts new file mode 100644 index 000000000..51abd9949 --- /dev/null +++ b/mission9-10/src/lib/constants.ts @@ -0,0 +1,26 @@ +import dotenv from 'dotenv'; +dotenv.config(); + +const DATABASE_URL = process.env.DATABASE_URL; +const NODE_ENV = process.env.NODE_ENV || 'development'; +const PORT = process.env.PORT || 3000; +const PUBLIC_PATH = 'public'; +const STATIC_PATH = '/public'; +const JWT_ACCESS_TOKEN_SECRET = + process.env.JWT_ACCESS_TOKEN_SECRET || 'your_jwt_access_token_secret'; +const JWT_REFRESH_TOKEN_SECRET = + process.env.JWT_REFRESH_TOKEN_SECRET || 'your_jwt_refresh_token_secret'; +const ACCESS_TOKEN_COOKIE_NAME = 'access-token'; +const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token'; + +export { + DATABASE_URL, + NODE_ENV, + PORT, + PUBLIC_PATH, + STATIC_PATH, + JWT_ACCESS_TOKEN_SECRET, + JWT_REFRESH_TOKEN_SECRET, + ACCESS_TOKEN_COOKIE_NAME, + REFRESH_TOKEN_COOKIE_NAME, +}; diff --git a/mission9-10/src/lib/cookies.ts b/mission9-10/src/lib/cookies.ts new file mode 100644 index 000000000..36311f1b2 --- /dev/null +++ b/mission9-10/src/lib/cookies.ts @@ -0,0 +1,28 @@ +import { NODE_ENV, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from './constants'; +import { Response } from 'express'; + +export function setTokenCookies(res: Response, accessToken: string, refreshToken: string) { + res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, { + httpOnly: true, + secure: NODE_ENV === 'production', + maxAge: 1 * 60 * 60 * 1000, // 1시간 + }); + res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, { + httpOnly: true, + secure: NODE_ENV === 'production', + maxAge: 7 * 24 * 60 * 60 * 1000, // 7일 + path: '/users/refresh', + }); +} + +export function clearTokenCookies(res: Response) { + res.clearCookie(ACCESS_TOKEN_COOKIE_NAME, { + httpOnly: true, + secure: NODE_ENV === 'production', + }); + res.clearCookie(REFRESH_TOKEN_COOKIE_NAME, { + httpOnly: true, + secure: NODE_ENV === 'production', + path: '/users/refresh', + }); +} diff --git a/mission9-10/src/lib/errors/customErrors.ts b/mission9-10/src/lib/errors/customErrors.ts new file mode 100644 index 000000000..8bde3cfe8 --- /dev/null +++ b/mission9-10/src/lib/errors/customErrors.ts @@ -0,0 +1,46 @@ +export class BaseError extends Error { + statusCode: number; + constructor(message: string, statusCode: number) { + super(message); + this.name = new.target.name; + this.statusCode = statusCode; + } +} + +export class NotFoundError extends BaseError { + constructor(message = '존재하지 않습니다') { + super(message, 404); + } +} + +export class UnauthorizedError extends BaseError { + constructor(message = '인증이 필요합니다') { + super(message, 401); + } +} + +export class BadRequestError extends BaseError { + constructor(message = '잘못된 요청입니다') { + super(message, 400); + } +} + +export class ForbiddenError extends BaseError { + constructor(message = '비밀번호가 틀렸습니다') { + super(message, 403); + } +} + +export class AlreadyLikeError extends ForbiddenError { + constructor(message = '이미 좋아요를 눌렀습니다.') { + super(message); + this.name = new.target.name; + } +} + +export class AlreadyUnlikeError extends ForbiddenError { + constructor(message = '좋아요가 존재하지 않습니다.') { + super(message); + this.name = new.target.name; + } +} diff --git a/mission9-10/src/lib/errors/errorUtils.ts b/mission9-10/src/lib/errors/errorUtils.ts new file mode 100644 index 000000000..55c11df26 --- /dev/null +++ b/mission9-10/src/lib/errors/errorUtils.ts @@ -0,0 +1,13 @@ +interface SyntaxJsonError extends SyntaxError { + status?: number; + body?: unknown; +} + +export function isSyntaxJsonError(err: unknown): err is SyntaxJsonError { + if (!(err instanceof SyntaxError)) return false; + const e = err as Partial; + return typeof e.status === 'number' && 'body' in e; +} +// Partial; +// 얘는 SyntaxJsonError의 일부 프로퍼티만 가지고 있을 수도 있어” +// 라고 TS에게 알려서 e.status, e.body 같은 속성 접근을 가능하게 해주는 장치 diff --git a/mission9-10/src/lib/prismaClient.ts b/mission9-10/src/lib/prismaClient.ts new file mode 100644 index 000000000..9b6c4ce30 --- /dev/null +++ b/mission9-10/src/lib/prismaClient.ts @@ -0,0 +1,3 @@ +import { PrismaClient } from '@prisma/client'; + +export const prisma = new PrismaClient(); diff --git a/mission9-10/src/lib/setupStatic.ts b/mission9-10/src/lib/setupStatic.ts new file mode 100644 index 000000000..06121ff65 --- /dev/null +++ b/mission9-10/src/lib/setupStatic.ts @@ -0,0 +1,8 @@ +import express from 'express'; +import path from 'path'; +import { PUBLIC_PATH, STATIC_PATH } from './constants'; + +export function setupStatic(app: express.Express) { + if (process.env.UPLOAD_PROVIDER === 's3') return; + app.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH))); +} diff --git a/mission9-10/src/lib/token.ts b/mission9-10/src/lib/token.ts new file mode 100644 index 000000000..0e16839c3 --- /dev/null +++ b/mission9-10/src/lib/token.ts @@ -0,0 +1,22 @@ +import jwt, { JwtPayload } from 'jsonwebtoken'; +import { JWT_ACCESS_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET } from './constants'; + +interface TokenPayload extends JwtPayload { + id: number; +} + +export function generateToken(userId: number) { + const accessToken = jwt.sign({ id: userId }, JWT_ACCESS_TOKEN_SECRET, { expiresIn: '1h' }); + const refreshToken = jwt.sign({ id: userId }, JWT_REFRESH_TOKEN_SECRET, { expiresIn: '1d' }); + return { accessToken, refreshToken }; +} + +export function verifyAccessToken(token: string) { + const decoded = jwt.verify(token, JWT_ACCESS_TOKEN_SECRET) as TokenPayload; + return { userId: decoded.id }; +} + +export function verifyRefreshToken(token: string) { + const decoded = jwt.verify(token, JWT_REFRESH_TOKEN_SECRET) as TokenPayload; + return { userId: decoded.id }; +} diff --git a/mission9-10/src/lib/withAsync.ts b/mission9-10/src/lib/withAsync.ts new file mode 100644 index 000000000..500839366 --- /dev/null +++ b/mission9-10/src/lib/withAsync.ts @@ -0,0 +1,13 @@ +import type { Request, Response, NextFunction, RequestHandler } from 'express'; + +export function withAsync( + handler: (req: Request, res: Response, next: NextFunction) => Promise, +): RequestHandler { + return async (req, res, next) => { + try { + await handler(req, res, next); + } catch (e) { + next(e); + } + }; +} diff --git a/mission9-10/src/main.ts b/mission9-10/src/main.ts new file mode 100644 index 000000000..8ed2dac0e --- /dev/null +++ b/mission9-10/src/main.ts @@ -0,0 +1,12 @@ +import { createServer } from 'http'; +import app from './app'; +import { PORT } from './lib/constants'; +import { initSocket } from './socket'; + +const server = createServer(app); + +initSocket(server); + +server.listen(PORT, () => { + console.log(`Server started on port ${PORT}`); +}); diff --git a/mission9-10/src/middlewares/authenticate.ts b/mission9-10/src/middlewares/authenticate.ts new file mode 100644 index 000000000..5c70effec --- /dev/null +++ b/mission9-10/src/middlewares/authenticate.ts @@ -0,0 +1,30 @@ +import { prisma } from '../lib/prismaClient'; +import { verifyAccessToken } from '../lib/token'; +import { ACCESS_TOKEN_COOKIE_NAME } from '../lib/constants'; +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { NextFunction, Request, Response } from 'express'; + +function authenticate(options = { optional: false }) { + return async (req: Request, res: Response, next: NextFunction) => { + const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME]; + if (!accessToken) { + if (options.optional) { + return next(); + } + return next(new UnauthorizedError()); + } + try { + const { userId } = verifyAccessToken(accessToken); //디코딩 된 토큰에서 user id 추출 + const user = await prisma.user.findUniqueOrThrow({ where: { id: userId } }); + req.user = user; + } catch (error) { + if (options.optional) { + return next(); + } + return next(new UnauthorizedError()); + } + next(); + }; +} + +export default authenticate; diff --git a/mission9-10/src/middlewares/upload.ts b/mission9-10/src/middlewares/upload.ts new file mode 100644 index 000000000..c9f773f69 --- /dev/null +++ b/mission9-10/src/middlewares/upload.ts @@ -0,0 +1,44 @@ +import multer from 'multer'; +import path from 'path/win32'; +import { PUBLIC_PATH } from '../lib/constants'; +import { BadRequestError } from '../lib/errors/customErrors'; +import { v4 as uuidv4 } from 'uuid'; + +const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg']; +const FILE_SIZE_LIMIT = 5 * 1024 * 1024; +const uploadProvider = process.env.UPLOAD_PROVIDER ?? 'local'; + +function fileFilter(req: any, file: any, cb: any) { + if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) { + return cb(new BadRequestError('Only png, jpeg, and jpg are allowed')); + } + cb(null, true); +} + +function makeFilename(originalname: string) { + const ext = path.extname(originalname); + return `${uuidv4()}${ext}`; +} + +// local: 디스크 저장 +const localUpload = multer({ + storage: multer.diskStorage({ + destination(req, file, cb) { + cb(null, PUBLIC_PATH); + }, + filename(req, file, cb) { + cb(null, makeFilename(file.originalname)); + }, + }), + limits: { fileSize: FILE_SIZE_LIMIT }, + fileFilter, +}); + +// s3: memoryStorage (S3로 업로드는 서비스에서 처리) +const s3Upload = multer({ + storage: multer.memoryStorage(), + limits: { fileSize: FILE_SIZE_LIMIT }, + fileFilter, +}); + +export const upload = uploadProvider === 's3' ? s3Upload : localUpload; diff --git a/mission9-10/src/repositories/articleRepository.ts b/mission9-10/src/repositories/articleRepository.ts new file mode 100644 index 000000000..3505e0393 --- /dev/null +++ b/mission9-10/src/repositories/articleRepository.ts @@ -0,0 +1,57 @@ +import { Prisma } from '@prisma/client'; +import { prisma } from '../lib/prismaClient'; +import { ArticleLikesAndCount } from '../../types/article'; + +export class ArticleRepository { + async create(data: Prisma.ArticleCreateInput) { + return prisma.article.create({ data }); + } + async findById(id: number) { + return prisma.article.findUniqueOrThrow({ where: { id } }); + } + async findByIdWithLikes(id: number, userId?: number): Promise { + return prisma.article.findUniqueOrThrow({ + where: { id }, + include: { + _count: { select: { likes: true } }, + likes: { + //비로그인 시 -1을 줘서 []을 뱉도록 + where: { userId: userId ?? -1 }, + select: { id: true }, + }, + }, + }); + } + async findArticleListWithLikes(params: { + skip: number; + take: number; + orderBy: Prisma.ArticleOrderByWithRelationInput; + where: Prisma.ArticleWhereInput; + userId?: number; + }): Promise { + return prisma.article.findMany({ + skip: params.skip, + take: params.take, + orderBy: params.orderBy, + where: params.where, + include: { + _count: { select: { likes: true } }, + likes: { + where: { userId: params.userId ?? -1 }, + select: { id: true }, + }, + }, + }); + } + async count(where: Prisma.ArticleWhereInput) { + return prisma.article.count({ where }); + } + async update(id: number, data: Prisma.ArticleUpdateInput) { + return prisma.article.update({ where: { id }, data }); + } + async delete(id: number) { + return prisma.article.delete({ where: { id } }); + } +} + +export const articleRepo = new ArticleRepository(); diff --git a/mission9-10/src/repositories/commentRepository.ts b/mission9-10/src/repositories/commentRepository.ts new file mode 100644 index 000000000..cc81be921 --- /dev/null +++ b/mission9-10/src/repositories/commentRepository.ts @@ -0,0 +1,31 @@ +import { Prisma } from '@prisma/client'; +import { prisma } from '../lib/prismaClient'; + +export class CommentRepository { + async create(data: Prisma.CommentCreateInput) { + return prisma.comment.create({ data }); + } + async findCommentListQuery( + whereCondition: { articleId: number } | { productId: number }, + limit: number, + cursor?: number, + ) { + return prisma.comment.findMany({ + cursor: cursor ? { id: cursor } : undefined, + take: limit + 1, + where: whereCondition, + orderBy: { createdAt: 'desc' }, + }); + } + async findById(id: number) { + return prisma.comment.findUniqueOrThrow({ where: { id } }); + } + async update(id: number, content?: string) { + return prisma.comment.update({ where: { id }, data: { content } }); + } + async delete(id: number) { + return prisma.comment.delete({ where: { id } }); + } +} + +export const commentRepo = new CommentRepository(); diff --git a/mission9-10/src/repositories/likeRepository.ts b/mission9-10/src/repositories/likeRepository.ts new file mode 100644 index 000000000..033015eaf --- /dev/null +++ b/mission9-10/src/repositories/likeRepository.ts @@ -0,0 +1,36 @@ +import { LikeTarget } from '../../types/like'; +import { prisma } from '../lib/prismaClient'; + +class LikdeRepository { + async findLike(userId: number, target: LikeTarget) { + const whereCondition = + 'articleId' in target + ? { userId_articleId: { userId, articleId: target.articleId } } + : { userId_productId: { userId, productId: target.productId } }; + return prisma.like.findUnique({ + where: whereCondition, + }); + } + async createLike(userId: number, target: LikeTarget) { + return prisma.like.create({ data: { userId, ...target } }); + } + async deleteLike(userId: number, target: LikeTarget) { + const whereCondition = + 'articleId' in target + ? { userId_articleId: { userId, articleId: target.articleId } } + : { userId_productId: { userId, productId: target.productId } }; + return prisma.like.delete({ + where: whereCondition, + }); + } + async getLikers(target: LikeTarget) { + const whereCondition = + 'articleId' in target ? { articleId: target.articleId } : { productId: target.productId }; + return prisma.like.findMany({ + where: whereCondition, + select: { userId: true }, + }); + } +} + +export const likeRepo = new LikdeRepository(); diff --git a/mission9-10/src/repositories/notificationRepository.ts b/mission9-10/src/repositories/notificationRepository.ts new file mode 100644 index 000000000..945c2b5ac --- /dev/null +++ b/mission9-10/src/repositories/notificationRepository.ts @@ -0,0 +1,26 @@ +import { prisma } from '../lib/prismaClient'; + +export class NotificationRepository { + async getNotification(userId: number) { + return prisma.notification.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } }); + } + async getUnreadCount(userId: number) { + return prisma.notification.count({ where: { userId, isRead: false } }); + } + async create(userId: number, message: string) { + return prisma.notification.create({ data: { userId, message } }); + } + async findByIds(notificationId: number, userId: number) { + return prisma.notification.findFirst({ + where: { id: notificationId, userId }, + }); + } + async updateRead(notificationId: number) { + return prisma.notification.update({ + where: { id: notificationId }, + data: { isRead: true }, + }); + } +} + +export const notificationRepo = new NotificationRepository(); diff --git a/mission9-10/src/repositories/productRepository.ts b/mission9-10/src/repositories/productRepository.ts new file mode 100644 index 000000000..a461c300b --- /dev/null +++ b/mission9-10/src/repositories/productRepository.ts @@ -0,0 +1,65 @@ +import { ProductLikesAndCount } from '../../types/product'; +import { prisma } from '../lib/prismaClient'; +import { Prisma } from '@prisma/client'; +import type { ProductRecentType } from '../../types/product'; + +class ProductRepository { + async create(data: Prisma.ProductCreateInput) { + return prisma.product.create({ data }); + } + async findById(id: number) { + return prisma.product.findUniqueOrThrow({ where: { id } }); + } + async findByIdWithLikes(id: number, userId?: number): Promise { + return prisma.product.findUniqueOrThrow({ + where: { id }, + include: { + _count: { select: { likes: true } }, + likes: { + where: { userId: userId ?? -1 }, + select: { id: true }, + }, + }, + }); + } + async update(id: number, data: Prisma.ProductUpdateInput) { + return prisma.product.update({ where: { id }, data }); + } + async delete(id: number) { + return prisma.product.delete({ where: { id } }); + } + async findProductListWithLikes(params: { + skip: number; + take: number; + orderBy: Prisma.ProductOrderByWithRelationInput; + where: Prisma.ProductWhereInput; + userId?: number; + }): Promise { + return prisma.product.findMany({ + skip: params.skip, + take: params.take, + orderBy: params.orderBy, + where: params.where, + include: { + _count: { select: { likes: true } }, + likes: { + where: { userId: params.userId ?? -1 }, + select: { id: true }, + }, + }, + }); + } + async count(where: Prisma.ProductWhereInput) { + return prisma.product.count({ where }); + } + async findRecentProduct(userId: number, limit: number, type: ProductRecentType) { + const whereCondition = type === 'myUploaded' ? { userId } : { likes: { some: { userId } } }; + return prisma.product.findMany({ + where: whereCondition, + orderBy: { createdAt: 'desc' }, + take: limit, + }); + } +} + +export const productRepo = new ProductRepository(); diff --git a/mission9-10/src/repositories/userRepository.ts b/mission9-10/src/repositories/userRepository.ts new file mode 100644 index 000000000..0f337d690 --- /dev/null +++ b/mission9-10/src/repositories/userRepository.ts @@ -0,0 +1,19 @@ +import { prisma } from '../lib/prismaClient'; +import { Prisma } from '@prisma/client'; + +class UserRepository { + async create(data: Prisma.UserCreateInput) { + return prisma.user.create({ data }); + } + async findByEmail(email: string) { + return prisma.user.findUnique({ where: { email } }); + } + async update(id: number, data: Prisma.UserUpdateInput) { + return prisma.user.update({ where: { id }, data }); + } + async findById(id: number) { + return prisma.user.findUnique({ where: { id } }); + } +} + +export const userRepo = new UserRepository(); diff --git a/mission9-10/src/routers/articlesRouter.ts b/mission9-10/src/routers/articlesRouter.ts new file mode 100644 index 000000000..1b4989b36 --- /dev/null +++ b/mission9-10/src/routers/articlesRouter.ts @@ -0,0 +1,28 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync'; +import { + createArticle, + getArticleList, + getArticle, + updateArticle, + deleteArticle, + createComment, + getCommentList, + likeArticle, + unlikeArticle, +} from '../controllers/articlesController'; +import authenticate from '../middlewares/authenticate'; + +const articlesRouter = express.Router(); + +articlesRouter.post('/', authenticate(), withAsync(createArticle)); +articlesRouter.get('/', authenticate({ optional: true }), withAsync(getArticleList)); +articlesRouter.get('/:id', authenticate({ optional: true }), withAsync(getArticle)); +articlesRouter.patch('/:id', authenticate(), withAsync(updateArticle)); +articlesRouter.delete('/:id', authenticate(), withAsync(deleteArticle)); +articlesRouter.post('/:id/comments', authenticate(), withAsync(createComment)); +articlesRouter.get('/:id/comments', withAsync(getCommentList)); +articlesRouter.post('/:id/like', authenticate(), withAsync(likeArticle)); +articlesRouter.delete('/:id/like', authenticate(), withAsync(unlikeArticle)); + +export default articlesRouter; diff --git a/mission9-10/src/routers/commentsRouter.ts b/mission9-10/src/routers/commentsRouter.ts new file mode 100644 index 000000000..f0da623c4 --- /dev/null +++ b/mission9-10/src/routers/commentsRouter.ts @@ -0,0 +1,11 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync'; +import { updateComment, deleteComment } from '../controllers/commentsController'; +import authenticate from '../middlewares/authenticate'; + +const commentsRouter = express.Router(); + +commentsRouter.patch('/:id', authenticate(), withAsync(updateComment)); +commentsRouter.delete('/:id', authenticate(), withAsync(deleteComment)); + +export default commentsRouter; diff --git a/mission9-10/src/routers/imagesRouter.ts b/mission9-10/src/routers/imagesRouter.ts new file mode 100644 index 000000000..5a848d5f7 --- /dev/null +++ b/mission9-10/src/routers/imagesRouter.ts @@ -0,0 +1,10 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync'; +import { uploadImage } from '../controllers/imagesController'; +import { upload } from '../middlewares/upload'; + +const imagesRouter = express.Router(); + +imagesRouter.post('/upload', upload.single('image'), withAsync(uploadImage)); + +export default imagesRouter; diff --git a/mission9-10/src/routers/notificationRouter.ts b/mission9-10/src/routers/notificationRouter.ts new file mode 100644 index 000000000..35209701a --- /dev/null +++ b/mission9-10/src/routers/notificationRouter.ts @@ -0,0 +1,16 @@ +import express from 'express'; +import authenticate from '../middlewares/authenticate'; +import { withAsync } from '../lib/withAsync'; +import { + getNotifications, + getUnreadCount, + markAsRead, +} from '../controllers/notificationController'; + +const notificationRouter = express.Router(); + +notificationRouter.get('/', authenticate(), withAsync(getNotifications)); +notificationRouter.get('/unread-count', authenticate(), withAsync(getUnreadCount)); +notificationRouter.patch('/:id/read', authenticate(), withAsync(markAsRead)); + +export default notificationRouter; diff --git a/mission9-10/src/routers/productsRouter.ts b/mission9-10/src/routers/productsRouter.ts new file mode 100644 index 000000000..f4907ccca --- /dev/null +++ b/mission9-10/src/routers/productsRouter.ts @@ -0,0 +1,31 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync'; +import { + createProduct, + getProduct, + updateProduct, + deleteProduct, + getProductList, + createComment, + getCommentList, + likeProduct, + unlikeProduct, +} from '../controllers/productsController'; +import authenticate from '../middlewares/authenticate'; +import { getMyLikedProducts, getMyProductList } from '../controllers/usersController'; + +const productsRouter = express.Router(); + +productsRouter.get('/me', authenticate(), withAsync(getMyProductList)); +productsRouter.get('/me/likes', authenticate(), withAsync(getMyLikedProducts)); +productsRouter.get('/', authenticate({ optional: true }), withAsync(getProductList)); +productsRouter.post('/', authenticate(), withAsync(createProduct)); +productsRouter.get('/:id', authenticate({ optional: true }), withAsync(getProduct)); +productsRouter.patch('/:id', authenticate(), withAsync(updateProduct)); +productsRouter.delete('/:id', authenticate(), withAsync(deleteProduct)); +productsRouter.post('/:id/comments', authenticate(), withAsync(createComment)); +productsRouter.get('/:id/comments', withAsync(getCommentList)); +productsRouter.post('/:id/like', authenticate(), withAsync(likeProduct)); +productsRouter.delete('/:id/like', authenticate(), withAsync(unlikeProduct)); + +export default productsRouter; diff --git a/mission9-10/src/routers/usersRouter.ts b/mission9-10/src/routers/usersRouter.ts new file mode 100644 index 000000000..1a4a28f8f --- /dev/null +++ b/mission9-10/src/routers/usersRouter.ts @@ -0,0 +1,24 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync'; +import { + register, + login, + logout, + getProfile, + patchPassword, + updateProfile, + refreshToken, +} from '../controllers/usersController'; +import authenticate from '../middlewares/authenticate'; + +const usersRouter = express.Router(); + +usersRouter.post('/register', withAsync(register)); +usersRouter.post('/login', withAsync(login)); +usersRouter.post('/logout', withAsync(logout)); +usersRouter.post('/refresh', withAsync(refreshToken)); +usersRouter.get('/me', authenticate(), withAsync(getProfile)); +usersRouter.patch('/me', authenticate(), withAsync(updateProfile)); +usersRouter.patch('/me/password', authenticate(), withAsync(patchPassword)); + +export default usersRouter; diff --git a/mission9-10/src/services/articleService.ts b/mission9-10/src/services/articleService.ts new file mode 100644 index 000000000..1c1e9c016 --- /dev/null +++ b/mission9-10/src/services/articleService.ts @@ -0,0 +1,140 @@ +import { articleRepo } from '../repositories/articleRepository'; +import { ArticleLikesAndCount, ArticleListResponse, ArticleResponse } from '../../types/article'; +import { AlreadyLikeError, AlreadyUnlikeError, ForbiddenError } from '../lib/errors/customErrors'; +import { commentRepo } from '../repositories/commentRepository'; +import { likeRepo } from '../repositories/likeRepository'; +import { Prisma, Article, Comment } from '@prisma/client'; +import type { CursorPaginated } from '../../types/cursorPaginated'; +import { notificationService } from './notificationService'; + +//객체로 주면 콘트롤러에서 인자순서 상관없이 적용되지만, ()형태로 반환하게되면 인자순서를 서비스형태와 동일하게 넣어야 함 +export class ArticleService { + async createArticle( + userId: number, + title: string, + content: string, + image?: string | null, + ): Promise
{ + return articleRepo.create({ + title, + content, + image, + user: { connect: { id: userId } }, + }); + } + async getArticle(articleId: number, userId?: number): Promise { + const article: ArticleLikesAndCount = await articleRepo.findByIdWithLikes(articleId, userId); + const { likes, _count, ...articleData } = article; + const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined; + return { ...articleData, likeCount: _count.likes, isLiked }; + } + async updateArticle( + articleId: number, + userId: number, + data: { title?: string; content?: string; image?: string | null }, + ): Promise
{ + const article = await articleRepo.findById(articleId); + if (article.userId !== userId) { + throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.'); + } + return articleRepo.update(articleId, data); + } + async deleteArticle(articleId: number, userId: number): Promise { + const article = await articleRepo.findById(articleId); + if (article.userId !== userId) { + throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.'); + } + await articleRepo.delete(articleId); + } + async getArticleList( + page: number, + pageSize: number, + orderBy?: 'recent' | 'desc' | 'asc', + keyword?: string, + userId?: number, + ): Promise { + const where = keyword + ? { + OR: [{ title: { contains: keyword } }, { content: { contains: keyword } }], + } + : {}; + const [totalCount, articles] = await Promise.all([ + articleRepo.count(where), + articleRepo.findArticleListWithLikes({ + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, + where, + userId, + }), + ]); + const list: ArticleResponse[] = articles.map((m) => { + const { _count, likes, ...basicArticleData } = m; + const response: ArticleResponse = { + ...basicArticleData, + likeCount: _count.likes, + }; + if (!userId) { + return response; + } + const isLiked = (likes ?? []).length > 0; + return { ...basicArticleData, isLiked, likeCount: _count.likes }; + }); + const response: ArticleListResponse = { + list, + totalCount, + }; + return response; + } + async createComment(userId: number, articleId: number, content: string): Promise { + await articleRepo.findById(articleId); + const comment = await commentRepo.create({ + content, + user: { connect: { id: userId } }, + article: { connect: { id: articleId } }, + }); + const article = await articleRepo.findById(articleId); + if (article.userId !== userId) { + await notificationService.createNotification( + article.userId, + `내 게시글 "${article.title}"에 새로운 댓글이 달렸습니다.`, + ); + } + return comment; + } + async getCommentList( + articleId: number, + limit: number, + cursor?: number, + ): Promise> { + await articleRepo.findById(articleId); + const commentsWithCursor = await commentRepo.findCommentListQuery({ articleId }, limit, cursor); + const comments = commentsWithCursor.slice(0, limit); + const cursorComment = commentsWithCursor[commentsWithCursor.length - 1]; + const nextCursor = cursorComment ? cursorComment.id : null; + return { list: comments, nextCursor }; + } + //like , unlike 둘다 message를 반환해버려서 이게..프로미스로 타입 설정하는 것이 의미가 있는지...로직 수정 생각해봐야할 듯 + async likeArticle(userId: number, articleId: number): Promise<{ message: string }> { + const article = await articleRepo.findById(articleId); + const existingLike = await likeRepo.findLike(userId, { articleId }); + if (existingLike) { + throw new AlreadyLikeError(); + } + await likeRepo.createLike(userId, { articleId }); + return { message: `${article.title}게시글에 좋아요를 눌렀습니다.` }; + } + async unlikeArticle(userId: number, articleId: number): Promise<{ message: string }> { + const article = await articleRepo.findById(articleId); + try { + await likeRepo.deleteLike(userId, { articleId }); + } catch (error: unknown) { + if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') { + throw new AlreadyUnlikeError(); + } + throw error; + } + return { message: `${article.title}게시글의 좋아요를 취소했습니다` }; + } +} +export const articleService = new ArticleService(); diff --git a/mission9-10/src/services/commentService.ts b/mission9-10/src/services/commentService.ts new file mode 100644 index 000000000..24581974f --- /dev/null +++ b/mission9-10/src/services/commentService.ts @@ -0,0 +1,22 @@ +import { commentRepo } from '../repositories/commentRepository'; +import { ForbiddenError } from '../lib/errors/customErrors'; +import { Comment } from '@prisma/client'; + +export class CommentService { + async updateComment(commentId: number, userId: number, content?: string): Promise { + const comment = await commentRepo.findById(commentId); + if (comment.userId !== userId) { + throw new ForbiddenError('해당 댓글을 수정할 권한이 없습니다.'); + } + return commentRepo.update(commentId, content); + } + async deleteComment(commentId: number, userId: number): Promise { + const comment = await commentRepo.findById(commentId); + if (comment.userId !== userId) { + throw new ForbiddenError('해당 댓글을 삭제할 권한이 없습니다.'); + } + await commentRepo.delete(commentId); + } +} + +export const commnetService = new CommentService(); diff --git a/mission9-10/src/services/imageService.ts b/mission9-10/src/services/imageService.ts new file mode 100644 index 000000000..1adab9d10 --- /dev/null +++ b/mission9-10/src/services/imageService.ts @@ -0,0 +1,82 @@ +import { uploadImageResponse } from '../../types/image'; +import { BadRequestError } from '../lib/errors/customErrors'; +import path from 'path'; +import { STATIC_PATH } from '../lib/constants'; +import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3'; +import type { MulterRequest } from '../../types/multer'; + +export class ImageService { + s3: S3Client | null; + constructor() { + if (process.env.UPLOAD_PROVIDER === 's3') { + this.s3 = new S3Client({ + region: process.env.AWS_REGION, + credentials: { + accessKeyId: process.env.AWS_ACCESS_KEY_ID ?? '', + secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY ?? '', + }, + }); + } else { + this.s3 = null; + } + } + + async buildImageUrl(req: MulterRequest): Promise { + if (process.env.UPLOAD_PROVIDER === 's3') { + return await this.buildImageUrlFromS3(req); + } + return this.buildImageUrlFromLocal(req); + } + + // 로컬 : static URL 생성 + buildImageUrlFromLocal(req: MulterRequest): uploadImageResponse { + const host = req.get('host'); + if (!host) { + throw new BadRequestError('요청 헤더에 host 정보가 없습니다.'); + } + + if (!req.file?.filename) { + throw new BadRequestError('업로드된 파일이 없습니다.'); + } + + const baseUrl = `${req.protocol}://${host}`; + const url = `${baseUrl}/${STATIC_PATH}/${req.file.filename}`; + return { url }; + } + + // 프로덕션 : 업로드하고 S3 URL 반환 + async buildImageUrlFromS3(req: MulterRequest): Promise { + if (!this.s3) { + throw new BadRequestError('S3 설정이 없습니다.'); + } + + const bucket = process.env.AWS_S3_BUCKET; + const region = process.env.AWS_REGION; + + if (!bucket || !region) { + throw new BadRequestError('S3 환경 변수가 없습니다.'); + } + + if (!req.file?.buffer || !req.file.originalname) { + throw new BadRequestError('S3 업로드용 파일이 없습니다.'); + } + + const ext = path.extname(req.file.originalname); + //s3에 uploads 폴더를 만들어서 그 안에 파일들이 들어가도록 설정 + const key = `uploads/${Date.now()}-${Math.random().toString(16).slice(2)}${ext}`; + + await this.s3.send( + new PutObjectCommand({ + Bucket: bucket, + Key: key, + Body: req.file.buffer, + ContentType: req.file.mimetype ?? 'application/octet-stream', + }), + ); + + const url = `https://${bucket}.s3.${region}.amazonaws.com/${key}`; + return { url }; + } +} + +export const imageService = new ImageService(); diff --git a/mission9-10/src/services/notificationService.ts b/mission9-10/src/services/notificationService.ts new file mode 100644 index 000000000..bff17da06 --- /dev/null +++ b/mission9-10/src/services/notificationService.ts @@ -0,0 +1,26 @@ +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { notificationRepo } from '../repositories/notificationRepository'; +import { getIO } from '../socket'; +import type { Notification as PrismaNotification } from '@prisma/client'; + +export class NotificationService { + async getNotifications(userId: number): Promise { + return notificationRepo.getNotification(userId); + } + async getUnreadCount(userId: number): Promise { + return notificationRepo.getUnreadCount(userId); + } + async createNotification(userId: number, message: string): Promise { + const notification = await notificationRepo.create(userId, message); + const io = getIO(); + io.to(`user-${userId}`).emit('notification', notification); + return notification; + } + async markAsRead(notificationId: number, userId: number): Promise { + const notification = await notificationRepo.findByIds(notificationId, userId); + if (!notification) throw new UnauthorizedError(); + return notificationRepo.updateRead(notificationId); + } +} + +export const notificationService = new NotificationService(); diff --git a/mission9-10/src/services/productService.ts b/mission9-10/src/services/productService.ts new file mode 100644 index 000000000..922a43d57 --- /dev/null +++ b/mission9-10/src/services/productService.ts @@ -0,0 +1,177 @@ +import { ProductLikesAndCount } from '../../types/product'; +import { productRepo } from '../repositories/productRepository'; +import { Product } from '@prisma/client'; +import type { ProductListResponse, ProductResponse } from '../../types/product'; +import { ForbiddenError } from '../lib/errors/customErrors'; +import { commentRepo } from '../repositories/commentRepository'; +import type { Comment } from '@prisma/client'; +import type { CursorPaginated } from '../../types/cursorPaginated'; +import { AlreadyLikeError, AlreadyUnlikeError } from '../lib/errors/customErrors'; +import { likeRepo } from '../repositories/likeRepository'; +import { Prisma } from '@prisma/client'; +import { notificationService } from './notificationService'; + +//인자 순서가 옵셔널 다음 필수파라미터가 들어오면 컴파일에러가 발생함 +//객체로 묶어 보내기, 이러면 필수인 userid의 파라미터 순서를 바꾸지 않아도 됨 +export class ProductService { + async createProduct(params: { + name: string; + description: string; + price: number; + tags?: string[]; + images?: string[]; + userId: number; + }): Promise { + const { name, description, price, tags, images, userId } = params; + return productRepo.create({ + name, + description, + price, + tags: tags ?? [], + images: images ?? [], + user: { connect: { id: userId } }, + }); + } + async getProduct(productId: number, userId?: number): Promise { + const product: ProductLikesAndCount = await productRepo.findByIdWithLikes(productId, userId); + const { likes, _count, ...productData } = product; + const baseResponse = { ...productData, likeCount: _count.likes }; + if (!userId) { + return baseResponse; + } + const isLiked = (likes?.length ?? 0) > 0; + return { ...baseResponse, isLiked }; + } + async updateProduct( + productId: number, + userId: number, + data: { + name?: string; + description?: string; + price?: number; + tags?: string[]; + images?: string[]; + }, + ): Promise { + const product = await productRepo.findById(productId); + if (product.userId !== userId) { + throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.'); + } + const updateProduct = await productRepo.update(productId, data); + //undefined가 아니면서 기존가격과 다른 경우 + if (data.price !== undefined && product.price !== data.price) { + const likers = await likeRepo.getLikers({ productId }); + for (const liker of likers) { + if (liker.userId !== userId) { + await notificationService.createNotification( + liker.userId, + `관심 상품 "${product.name}"의 가격이 변동되었습니다.`, + ); + } + } + } + return updateProduct; + } + async deleteProduct(productId: number, userId: number): Promise { + const product = await productRepo.findById(productId); + if (product.userId !== userId) { + throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.'); + } + await productRepo.delete(productId); + } + async getProductList( + page: number, + pageSize: number, + orderBy?: 'recent' | 'desc' | 'asc', + keyword?: string, + userId?: number, + ): Promise { + const where = keyword + ? { + OR: [ + { name: { contains: keyword } }, + { description: { contains: keyword } }, + { tags: { has: keyword } }, + ], + } + : {}; + const [totalCount, products] = await Promise.all([ + productRepo.count(where), + productRepo.findProductListWithLikes({ + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, + where, + userId, + }), + ]); + const list: ProductResponse[] = products.map((m) => { + const { _count, likes, ...basicProductData } = m; + const response: ProductResponse = { + ...basicProductData, + likeCount: _count.likes, + }; + if (!userId) { + return response; + } + const isLiked = (likes ?? []).length > 0; + return { ...basicProductData, isLiked, likeCount: _count.likes }; + }); + const response: ProductListResponse = { + list, + totalCount, + }; + return response; + } + async createComment(userId: number, productId: number, content: string): Promise { + await productRepo.findById(productId); + const comment = await commentRepo.create({ + content, + user: { connect: { id: userId } }, + product: { connect: { id: productId } }, + }); + const product = await productRepo.findById(productId); + if (product.userId !== userId) { + await notificationService.createNotification( + product.userId, + `내 상품 "${product.name}"에 새로운 댓글이 달렸습니다.`, + ); + } + return comment; + } + async getCommentList( + productId: number, + limit: number, + cursor?: number, + ): Promise> { + await productRepo.findById(productId); + const commentsWithCursor = await commentRepo.findCommentListQuery({ productId }, limit, cursor); + const comments = commentsWithCursor.slice(0, limit); + const cursorComment = commentsWithCursor[commentsWithCursor.length - 1]; + const nextCursor = cursorComment ? cursorComment.id : null; + return { list: comments, nextCursor }; + } + async likeProduct(userId: number, productId: number): Promise<{ message: string }> { + const product = await productRepo.findById(productId); + const existingLike = await likeRepo.findLike(userId, { productId }); + if (existingLike) { + throw new AlreadyLikeError(); + } + await likeRepo.createLike(userId, { productId }); + return { message: `${product.name}상품에 좋아요를 눌렀습니다.` }; + } + async unlikeProduct(userId: number, productId: number): Promise<{ message: string }> { + const product = await productRepo.findById(productId); + try { + await likeRepo.deleteLike(userId, { productId }); + } catch (error: unknown) { + if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') { + throw new AlreadyUnlikeError(); + } + throw error; + } + return { message: `${product.name}상품의 좋아요를 취소했습니다` }; + } +} + +export const productService = new ProductService(); diff --git a/mission9-10/src/services/userService.ts b/mission9-10/src/services/userService.ts new file mode 100644 index 000000000..850dad53b --- /dev/null +++ b/mission9-10/src/services/userService.ts @@ -0,0 +1,212 @@ +import bcrypt from 'bcrypt'; +import { userRepo } from '../repositories/userRepository'; +import type { Prisma, User } from '@prisma/client'; +import { ForbiddenError, UnauthorizedError } from '../lib/errors/customErrors'; +import { generateToken, verifyRefreshToken } from '../lib/token'; +import { productRepo } from '../repositories/productRepository'; +import type { ProductListResponse } from '../../types/product'; +import { ProfileResponse } from '../../types/user'; + +class UserService { + async register( + nickname: string, + email: string, + password: string, + image?: string, + ): Promise> { + const salt = await bcrypt.genSalt(10); + const hashedPassword = await bcrypt.hash(password, salt); + const user = await userRepo.create({ + nickname, + email, + password: hashedPassword, + image, + }); + const { password: _, ...userWithoutPassword } = user; + return userWithoutPassword; + } + async login( + email: string, + password: string, + ): Promise<{ tokens: { accessToken: string; refreshToken: string }; message: string }> { + const user = await userRepo.findByEmail(email); + if (!user) { + //이메일, 비밀번호 검증에 대한 에러를 같은 메세지로 던짐으로써 좀 더 방어적으로 설계 + throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.'); + } + const isPasswordValid = await bcrypt.compare(password, user.password); + if (!isPasswordValid) { + throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.'); + } + const tokens = generateToken(user.id); + return { tokens, message: '로그인에 성공했습니다.' }; + } + async getProfile(myId: number): Promise { + const user = await userRepo.findById(myId); + if (!user) throw new UnauthorizedError('사용자를 찾을 수 없습니다.'); + const { password: _, ...userInfo } = user; + const [myProductCount, myLikeProductCount, recentProductsRaw, recentLikedProductsRaw] = + await Promise.all([ + productRepo.count({ userId: myId }), + productRepo.count({ likes: { some: { userId: myId } } }), + productRepo.findProductListWithLikes({ + skip: 0, + take: 5, + orderBy: { createdAt: 'desc' }, + where: { userId: myId }, + userId: myId, + }), + productRepo.findProductListWithLikes({ + skip: 0, + take: 5, + orderBy: { createdAt: 'desc' }, + where: { likes: { some: { userId: myId } } }, + userId: myId, + }), + ]); + const myRecentProducts = recentProductsRaw.map((m) => { + const { _count, likes, ...rest } = m; + return { + ...rest, + likeCount: _count.likes, + isLiked: (likes?.length ?? 0) > 0, + }; + }); + const myRecentLikeProducts = recentLikedProductsRaw.map((m) => { + const { _count, likes, ...rest } = m; + return { + ...rest, + likeCount: _count.likes, + isLiked: (likes?.length ?? 0) > 0, + }; + }); + return { + user: userInfo, + myProducts: { + list: myRecentProducts, + totalCount: myProductCount, + }, + myLikedProducts: { + list: myRecentLikeProducts, + totalCount: myLikeProductCount, + }, + }; + } + + async updateProfile( + userId: number, + nickname?: string, + email?: string, + image?: string | null, + ): Promise> { + const data: Prisma.UserUpdateInput = {}; + if (nickname !== undefined) data.nickname = nickname; + if (email !== undefined) data.email = email; + if (image !== undefined) data.image = image; + const update = await userRepo.update(userId, data); + const { password: _, ...userWithoutPassword } = update; + return userWithoutPassword; + } + async patchPassword(userId: number, currentPassword: string, newPassword: string): Promise { + const user = await userRepo.findById(userId); + if (!user) { + throw new UnauthorizedError('사용자를 찾을 수 없습니다.'); + } + const isPasswordValid = await bcrypt.compare(currentPassword, user.password); + if (!isPasswordValid) { + throw new ForbiddenError('현재 비밀번호가 올바르지 않습니다.'); + } + const salt = await bcrypt.genSalt(10); + const hashedNewPassword = await bcrypt.hash(newPassword, salt); + await userRepo.update(userId, { password: hashedNewPassword }); + } + async getMyProductList( + myId: number, + page: number, + pageSize: number, + orderBy?: 'recent' | 'desc' | 'asc', + keyword?: string, + ): Promise { + const where = { + userId: myId, + ...(keyword + ? { + OR: [ + { name: { contains: keyword } }, + { description: { contains: keyword } }, + { tags: { has: keyword } }, + ], + } + : {}), + }; + const [totalCount, productsRaw] = await Promise.all([ + productRepo.count(where), + productRepo.findProductListWithLikes({ + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, + where, + userId: myId, + }), + ]); + const list = productsRaw.map((m) => { + const { _count, likes, ...rest } = m; + return { + ...rest, + likeCount: _count.likes, + isLiked: (likes?.length ?? 0) > 0, + }; + }); + return { list, totalCount }; + } + async refreshToken(refreshToken: string) { + let userId: number; + try { + const payload = verifyRefreshToken(refreshToken); + userId = payload.userId; + } catch (error) { + throw new UnauthorizedError('유효하지 않은 리프레시 토큰입니다.'); + } + const user = await userRepo.findById(userId); + if (!user) { + throw new UnauthorizedError('존재하지 않는 사용자입니다.'); + } + const tokens = generateToken(user.id); + return tokens; + } + async getMyLikedProducts( + myId: number, + page: number, + pageSize: number, + orderBy?: 'recent' | 'desc' | 'asc', + ): Promise { + const where = { + likes: { + some: { + userId: myId, + }, + }, + }; + const [totalCount, productsRaw] = await Promise.all([ + productRepo.count(where), + productRepo.findProductListWithLikes({ + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, + where, + userId: myId, + }), + ]); + const list = productsRaw.map((m) => { + const { _count, likes, ...rest } = m; + return { + ...rest, + likeCount: _count.likes, + isLiked: (likes?.length ?? 0) > 0, + }; + }); + return { list, totalCount }; + } +} + +export const userService = new UserService(); diff --git a/mission9-10/src/socket.ts b/mission9-10/src/socket.ts new file mode 100644 index 000000000..cc35975ce --- /dev/null +++ b/mission9-10/src/socket.ts @@ -0,0 +1,43 @@ +import { Server as SocketIOServer } from 'socket.io'; +import { Server as HttpServer } from 'http'; +import { verifyAccessToken } from './lib/token'; +import { UnauthorizedError } from './lib/errors/customErrors'; + +let io: SocketIOServer | null = null; + +export const initSocket = (Server: HttpServer) => { + io = new SocketIOServer(Server, { + cors: { + origin: '*', + methods: ['GET', 'POST'], + }, + }); + + io.use((socket, next) => { + try { + const token = socket.handshake.auth.accessToken; + if (!token) return next(new UnauthorizedError()); + const { userId } = verifyAccessToken(token); + if (!userId) return next(new UnauthorizedError()); + socket.data.userId = userId; + next(); + } catch (e) { + next(new UnauthorizedError()); + } + }); + + io.on('connection', (socket) => { + const userId = socket.data.userId; + console.log('User connected', socket.id); + socket.join(`user-${userId}`); + console.log(`User ${userId} joined room user-${userId}`); + }); + return io; +}; + +export const getIO = () => { + if (!io) { + throw new Error('Socket.IO 서버가 초기화되지 않았습니다.'); + } + return io; +}; diff --git a/mission9-10/src/structs/articlesStructs.ts b/mission9-10/src/structs/articlesStructs.ts new file mode 100644 index 000000000..3d25131b5 --- /dev/null +++ b/mission9-10/src/structs/articlesStructs.ts @@ -0,0 +1,12 @@ +import { coerce, nonempty, nullable, object, partial, string } from 'superstruct'; +import { PageParamsStruct } from './commonStructs'; + +export const GetArticleListParamsStruct = PageParamsStruct; + +export const CreateArticleBodyStruct = object({ + title: coerce(nonempty(string()), string(), (value) => value.trim()), + content: nonempty(string()), + image: nullable(string()), +}); + +export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct); diff --git a/mission9-10/src/structs/commentsStruct.ts b/mission9-10/src/structs/commentsStruct.ts new file mode 100644 index 000000000..dce57521b --- /dev/null +++ b/mission9-10/src/structs/commentsStruct.ts @@ -0,0 +1,10 @@ +import { nonempty, object, partial, string } from 'superstruct'; +import { CursorParamsStruct } from './commonStructs'; + +export const CreateCommentBodyStruct = object({ + content: nonempty(string()), +}); + +export const GetCommentListParamsStruct = CursorParamsStruct; + +export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct); diff --git a/mission9-10/src/structs/commonStructs.ts b/mission9-10/src/structs/commonStructs.ts new file mode 100644 index 000000000..00f563f2b --- /dev/null +++ b/mission9-10/src/structs/commonStructs.ts @@ -0,0 +1,21 @@ +import { coerce, integer, object, string, defaulted, optional, enums, nonempty } from 'superstruct'; + +const integerString = coerce(integer(), string(), (value) => parseInt(value)); + +export const IdParamsStruct = object({ + id: integerString, +}); + +export const PageParamsStruct = object({ + page: defaulted(integerString, 1), + pageSize: defaulted(integerString, 10), + orderBy: optional(enums(['recent'])), + keyword: optional(nonempty(string())), +}); + +export const CursorParamsStruct = object({ + cursor: defaulted(integerString, 0), + limit: defaulted(integerString, 10), + orderBy: optional(enums(['recent'])), + keyword: optional(nonempty(string())), +}); diff --git a/mission9-10/src/structs/productsStruct.ts b/mission9-10/src/structs/productsStruct.ts new file mode 100644 index 000000000..6c3f9781e --- /dev/null +++ b/mission9-10/src/structs/productsStruct.ts @@ -0,0 +1,26 @@ +import { + coerce, + partial, + object, + string, + min, + nonempty, + array, + integer, + optional, +} from 'superstruct'; +import { PageParamsStruct } from './commonStructs'; + +export const CreateProductBodyStruct = object({ + name: coerce(nonempty(string()), string(), (value) => value.trim()), + description: nonempty(string()), + price: min(integer(), 0), + tags: optional(array(string())), + images: optional(array(string())), +}); + +export const GetProductListParamsStruct = PageParamsStruct; + +export const UpdateProductBodyStruct = partial(CreateProductBodyStruct); + +export const LikeProductParamsStruct = PageParamsStruct; diff --git a/mission9-10/src/structs/usersStructs.ts b/mission9-10/src/structs/usersStructs.ts new file mode 100644 index 000000000..10740ff77 --- /dev/null +++ b/mission9-10/src/structs/usersStructs.ts @@ -0,0 +1,48 @@ +import * as s from 'superstruct'; +import { PageParamsStruct } from './commonStructs'; + +const CoercedNumber = s.coerce(s.number(), s.union([s.string(), s.number()]), (value) => + Number(value), +); +const Integer = s.refine(CoercedNumber, 'Integer', (value) => Number.isInteger(value) && value > 0); + +export const userIdStruct = s.object({ + userId: Integer, +}); +//이메일: 기본적인 이메일 형식 체크, 닉네임: 영어 + 숫자 + 한글, 2~10글자, 비밀번호: 8~16글자 +const email = s.refine(s.string(), 'Email', (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)); +const nickname = s.refine(s.string(), 'Nickname', (value) => + /^[A-Za-z0-9가-힣]{2,10}$/.test(value), +); +const password = s.refine( + s.string(), + 'Password', + (value) => value.length >= 8 && value.length <= 16, +); + +export const CreateUserBodyStruct = s.object({ + nickname: nickname, + email: email, + password: password, + image: s.optional(s.string()), +}); + +export const UpdateUserBodyStruct = s.partial(CreateUserBodyStruct); + +export const LoginBodyStruct = s.object({ + email: email, + password: password, +}); + +export const ChangePasswordBodyStruct = s.object({ + currentPassword: password, + newPassword: password, +}); + +export const RefreshTokenBodyStruct = s.object({ + refreshToken: s.string(), +}); + +export const GetMyProductListParamsStruct = PageParamsStruct; + +export const GetMyLikedProductListParamsStruct = PageParamsStruct; diff --git a/mission9-10/tests/articles.auth.test.ts b/mission9-10/tests/articles.auth.test.ts new file mode 100644 index 000000000..70aac9c5f --- /dev/null +++ b/mission9-10/tests/articles.auth.test.ts @@ -0,0 +1,170 @@ +import request from 'supertest'; +import app from '../src/app'; +import { prisma } from '../src/lib/prismaClient'; +import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; + +jest.mock('uuid', () => ({ + v4: () => 'test-uuid', +})); + +async function registerAndLogin(email: string, nickname: string) { + const agent = request.agent(app); + await agent.post('/users/register').send({ + email, + nickname, + password: 'password1', + }); + await agent.post('/users/login').send({ + email, + password: 'password1', + }); + return agent; +} + +describe('인증이 필요한 게시글 API 통합 테스트', () => { + beforeAll(async () => { + await cleanDb(); + }); + + beforeEach(async () => { + await prisma.like.deleteMany(); + await prisma.comment.deleteMany(); + await prisma.article.deleteMany(); + await prisma.user.deleteMany(); + }); + + afterAll(async () => { + await cleanDb(); + await disconnectDb(); + }); + + describe('POST /articles', () => { + test('로그인 없이 요청하면 401을 반환한다', async () => { + const res = await request(app).post('/articles').send({ + title: 'NoAuth', + content: 'x', + image: null, + }); + expect(res.status).toBe(401); + }); + + test('로그인 상태면 201과 게시글 정보를 반환한다', async () => { + const agent = await registerAndLogin('owner-a@example.com', 'ownerA'); + const res = await agent.post('/articles').send({ + title: 'MyArticle', + content: 'content', + image: null, + }); + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body).toHaveProperty('title', 'MyArticle'); + }); + }); + + describe('PATCH /articles/:id', () => { + test('본인 게시글이면 수정된다', async () => { + const agent = await registerAndLogin('owner-b@example.com', 'ownerB'); + const article = await prisma.article.create({ + data: { + title: 'Old', + content: 'old', + image: null, + user: { connect: { email: 'owner-b@example.com' } }, + }, + }); + const res = await agent.patch(`/articles/${article.id}`).send({ title: 'New' }); + expect(res.status).toBe(200); + expect(res.body.title).toBe('New'); + }); + + test('다른 사람 게시글이면 403을 반환한다', async () => { + await prisma.user.create({ + data: { email: 'owner-c@example.com', nickname: 'ownerC', password: 'pw' }, + }); + const article = await prisma.article.create({ + data: { + title: 'Other', + content: 'x', + image: null, + user: { connect: { email: 'owner-c@example.com' } }, + }, + }); + const agent = await registerAndLogin('user-a@example.com', 'userA'); + const res = await agent.patch(`/articles/${article.id}`).send({ title: 'Nope' }); + expect(res.status).toBe(403); + }); + }); + + describe('DELETE /articles/:id', () => { + test('본인 게시글이면 삭제된다', async () => { + const agent = await registerAndLogin('owner-d@example.com', 'ownerD'); + const article = await prisma.article.create({ + data: { + title: 'DeleteMe', + content: 'x', + image: null, + user: { connect: { email: 'owner-d@example.com' } }, + }, + }); + const res = await agent.delete(`/articles/${article.id}`); + expect(res.status).toBe(204); + }); + + test('다른 사람 게시글이면 403을 반환한다', async () => { + await prisma.user.create({ + data: { email: 'owner-e@example.com', nickname: 'ownerE', password: 'pw' }, + }); + const article = await prisma.article.create({ + data: { + title: 'Other', + content: 'x', + image: null, + user: { connect: { email: 'owner-e@example.com' } }, + }, + }); + const agent = await registerAndLogin('user-b@example.com', 'userB'); + const res = await agent.delete(`/articles/${article.id}`); + expect(res.status).toBe(403); + }); + }); + + describe('POST /articles/:id/comments', () => { + test('로그인 상태면 댓글이 등록된다', async () => { + const agent = await registerAndLogin('owner-f@example.com', 'ownerF'); + const article = await prisma.article.create({ + data: { + title: 'WithComment', + content: 'x', + image: null, + user: { connect: { email: 'owner-f@example.com' } }, + }, + }); + + const res = await agent.post(`/articles/${article.id}/comments`).send({ content: 'hello' }); + + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body).toHaveProperty('content', 'hello'); + }); + }); + + describe('POST/DELETE /articles/:id/like', () => { + test('좋아요 등록/취소가 동작한다', async () => { + const agent = await registerAndLogin('owner-g@example.com', 'ownerG'); + const article = await prisma.article.create({ + data: { + title: 'LikeMe', + content: 'x', + image: null, + user: { connect: { email: 'owner-g@example.com' } }, + }, + }); + + const likeRes = await agent.post(`/articles/${article.id}/like`); + expect(likeRes.status).toBe(200); + + const unlikeRes = await agent.delete(`/articles/${article.id}/like`); + expect(unlikeRes.status).toBe(200); + }); + }); +}); diff --git a/mission9-10/tests/articles.public.test.ts b/mission9-10/tests/articles.public.test.ts new file mode 100644 index 000000000..458eca67c --- /dev/null +++ b/mission9-10/tests/articles.public.test.ts @@ -0,0 +1,188 @@ +import request from 'supertest'; +import app from '../src/app'; +import { prisma } from '../src/lib/prismaClient'; +import { createSeedUser } from './utils.ts/createUser'; +import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; + +jest.mock('uuid', () => ({ + v4: () => 'test-uuid', +})); + +describe('인증이 필요하지 않은 게시글 API 통합 테스트', () => { + let ownerId: number; + + beforeAll(async () => { + await cleanDb(); + const owner = await createSeedUser(); + ownerId = owner.id; + }); + + beforeEach(async () => { + await prisma.like.deleteMany(); + await prisma.comment.deleteMany(); + await prisma.article.deleteMany(); + }); + + afterAll(async () => { + await cleanDb(); + await disconnectDb(); + }); + + describe('GET /articles (공개 조회)', () => { + it('게시글이 없으면 { list: [], totalCount: 0 }을 반환한다', async () => { + const res = await request(app).get('/articles'); + + expect(res.status).toBe(200); + expect(res.body).toEqual({ list: [], totalCount: 0 }); + }); + + it('여러 개의 게시글이 있으면 list/totalCount를 올바르게 반환한다', async () => { + await prisma.article.createMany({ + data: [ + { title: '글1', content: '내용1', image: null, userId: ownerId }, + { title: '글2', content: '내용2', image: null, userId: ownerId }, + ], + }); + + const res = await request(app) + .get('/articles') + .query({ page: 1, pageSize: 10, orderBy: 'recent' }); + + expect(res.status).toBe(200); + expect(res.body.totalCount).toBe(2); + expect(res.body.list).toHaveLength(2); + expect(res.body.list).toEqual( + expect.arrayContaining([ + expect.objectContaining({ title: '글1', content: '내용1' }), + expect.objectContaining({ title: '글2', content: '내용2' }), + ]), + ); + }); + + it('page/pageSize로 페이징이 된다', async () => { + await prisma.article.createMany({ + data: [ + { title: 'A1', content: 'C1', image: null, userId: ownerId }, + { title: 'A2', content: 'C2', image: null, userId: ownerId }, + { title: 'A3', content: 'C3', image: null, userId: ownerId }, + { title: 'A4', content: 'C4', image: null, userId: ownerId }, + { title: 'A5', content: 'C5', image: null, userId: ownerId }, + ], + }); + + const res1 = await request(app) + .get('/articles') + .query({ page: 1, pageSize: 2, orderBy: 'recent' }); + expect(res1.status).toBe(200); + expect(res1.body.totalCount).toBe(5); + expect(res1.body.list).toHaveLength(2); + + const res2 = await request(app) + .get('/articles') + .query({ page: 2, pageSize: 2, orderBy: 'recent' }); + expect(res2.status).toBe(200); + expect(res2.body.totalCount).toBe(5); + expect(res2.body.list).toHaveLength(2); + + // 실제로 다른 페이지인지 확인 + expect(res1.body.list[0].id).not.toBe(res2.body.list[0].id); + }); + + it("orderBy='asc' 같은 값은 허용되지 않아 400을 반환한다(Struct 기준)", async () => { + const res = await request(app) + .get('/articles') + .query({ page: 1, pageSize: 10, orderBy: 'asc' }); + + expect(res.status).toBe(400); + }); + + it('keyword 검색은 title/content에 매칭되면 포함된다', async () => { + await prisma.article.createMany({ + data: [ + { title: 'Apple Story', content: 'fresh', image: null, userId: ownerId }, + { title: 'Banana', content: 'yellowDescOnly', image: null, userId: ownerId }, + { title: 'Car', content: 'vehicle', image: null, userId: ownerId }, + ], + }); + + const r1 = await request(app) + .get('/articles') + .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'Apple' }); + expect(r1.status).toBe(200); + expect(r1.body.totalCount).toBe(1); + expect(r1.body.list[0].title).toContain('Apple'); + + const r2 = await request(app) + .get('/articles') + .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'yellowDescOnly' }); + expect(r2.status).toBe(200); + expect(r2.body.totalCount).toBe(1); + expect(r2.body.list[0].title).toBe('Banana'); + }); + + it('잘못된 쿼리(page가 숫자가 아님)는 400(또는 스펙 코드)을 반환한다', async () => { + const res = await request(app).get('/articles').query({ page: 'abc', pageSize: 10 }); + expect([400, 422]).toContain(res.status); + }); + }); + + describe('GET /articles/:id (공개 상세 조회)', () => { + it('ID로 게시글 상세를 반환한다', async () => { + const article = await prisma.article.create({ + data: { title: 'Detail', content: 'Detail content', image: null, userId: ownerId }, + }); + + const res = await request(app).get(`/articles/${article.id}`); + + expect(res.status).toBe(200); + expect(res.body.title).toBe('Detail'); + expect(res.body.content).toBe('Detail content'); + }); + + it('존재하지 않는 id면 404(또는 400)를 반환한다', async () => { + const res = await request(app).get('/articles/999999999'); + expect([404, 400]).toContain(res.status); + }); + }); + + describe('GET /articles/:id/comments (공개 댓글 목록 조회)', () => { + it('댓글이 없으면 빈 목록을 반환한다', async () => { + const article = await prisma.article.create({ + data: { title: 'A', content: 'C', image: null, userId: ownerId }, + }); + + const res = await request(app) + .get(`/articles/${article.id}/comments`) + .query({ cursor: 0, limit: 10 }); + + expect(res.status).toBe(200); + expect(res.body).toEqual({ list: [], nextCursor: null }); + }); + + it('cursor/limit로 페이지네이션이 된다(구현되어 있다면)', async () => { + const article = await prisma.article.create({ + data: { title: 'A', content: 'C', image: null, userId: ownerId }, + }); + + const commenter = await prisma.user.create({ + data: { email: `c+${Date.now()}@ex.com`, nickname: `c_${Date.now()}`, password: 'pw' }, + }); + + await prisma.comment.createMany({ + data: [ + { content: 'c1', articleId: article.id, userId: commenter.id }, + { content: 'c2', articleId: article.id, userId: commenter.id }, + { content: 'c3', articleId: article.id, userId: commenter.id }, + ], + }); + + const res = await request(app) + .get(`/articles/${article.id}/comments`) + .query({ cursor: 0, limit: 2 }); + + expect(res.status).toBe(200); + expect(res.body.list).toHaveLength(2); + expect(res.body.nextCursor).toBeTruthy(); + }); + }); +}); diff --git a/mission9-10/tests/auth.test.ts b/mission9-10/tests/auth.test.ts new file mode 100644 index 000000000..62266c90c --- /dev/null +++ b/mission9-10/tests/auth.test.ts @@ -0,0 +1,103 @@ +import request from 'supertest'; +import app from '../src/app'; +import { prisma } from '../src/lib/prismaClient'; +import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; + +jest.mock('uuid', () => ({ + v4: () => 'test-uuid', +})); + +describe('인증 API 통합 테스트 (회원가입/로그인)', () => { + beforeAll(async () => { + await cleanDb(); + }); + + beforeEach(async () => { + await prisma.user.deleteMany(); + }); + + afterAll(async () => { + await cleanDb(); + await disconnectDb(); + }); + + describe('POST /users/register', () => { + test('정상 입력이면 201과 사용자 정보를 반환한다', async () => { + const res = await request(app).post('/users/register').send({ + email: 'newuser@example.com', + nickname: 'user01', + password: 'password1', + image: 'https://example.com/profile.png', + }); + + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body).toHaveProperty('email', 'newuser@example.com'); + expect(res.body).toHaveProperty('nickname', 'user01'); + expect(res.body).not.toHaveProperty('password'); + }); + + test('이메일 형식이 틀리면 400을 반환한다', async () => { + const res = await request(app).post('/users/register').send({ + email: 'invalid-email', + nickname: 'user01', + password: 'password1', + }); + + expect(res.status).toBe(400); + }); + + test('중복 이메일이면 400을 반환한다', async () => { + await request(app).post('/users/register').send({ + email: 'dup@example.com', + nickname: 'user01', + password: 'password1', + }); + + const res = await request(app).post('/users/register').send({ + email: 'dup@example.com', + nickname: 'user02', + password: 'password1', + }); + + expect(res.status).toBe(400); + }); + }); + + describe('POST /users/login', () => { + test('올바른 이메일/비밀번호면 200과 쿠키를 반환한다', async () => { + await request(app).post('/users/register').send({ + email: 'login@example.com', + nickname: 'login01', + password: 'password1', + }); + + const res = await request(app).post('/users/login').send({ + email: 'login@example.com', + password: 'password1', + }); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('message'); + const setCookie = res.headers['set-cookie'] ?? []; + const cookieHeader = Array.isArray(setCookie) ? setCookie.join(';') : setCookie; + expect(cookieHeader).toContain('access-token='); + expect(cookieHeader).toContain('refresh-token='); + }); + + test('잘못된 비밀번호면 401을 반환한다', async () => { + await request(app).post('/users/register').send({ + email: 'wrongpw@example.com', + nickname: 'wrongpw', + password: 'password1', + }); + + const res = await request(app).post('/users/login').send({ + email: 'wrongpw@example.com', + password: 'password2', + }); + + expect(res.status).toBe(401); + }); + }); +}); diff --git a/mission9-10/tests/product.service.unit.test.ts b/mission9-10/tests/product.service.unit.test.ts new file mode 100644 index 000000000..57aacc178 --- /dev/null +++ b/mission9-10/tests/product.service.unit.test.ts @@ -0,0 +1,175 @@ +import { productService } from '../src/services/productService'; +import { productRepo } from '../src/repositories/productRepository'; +import { likeRepo } from '../src/repositories/likeRepository'; +import { commentRepo } from '../src/repositories/commentRepository'; +import { notificationService } from '../src/services/notificationService'; + +jest.mock('../src/repositories/productRepository', () => ({ + productRepo: { + create: jest.fn(), + findById: jest.fn(), + findByIdWithLikes: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + findProductListWithLikes: jest.fn(), + count: jest.fn(), + }, +})); + +jest.mock('../src/repositories/likeRepository', () => ({ + likeRepo: { + findLike: jest.fn(), + createLike: jest.fn(), + deleteLike: jest.fn(), + getLikers: jest.fn(), + }, +})); + +jest.mock('../src/repositories/commentRepository', () => ({ + commentRepo: { + create: jest.fn(), + findCommentListQuery: jest.fn(), + }, +})); + +jest.mock('../src/services/notificationService', () => ({ + notificationService: { + createNotification: jest.fn(), + }, +})); + +const mockedProductRepo = productRepo as jest.Mocked; +const mockedLikeRepo = likeRepo as jest.Mocked; +const mockedCommentRepo = commentRepo as jest.Mocked; +const mockedNotificationService = notificationService as jest.Mocked; + +describe('ProductService (unit)', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('createProduct: tags/images가 없으면 빈 배열로 저장한다', async () => { + mockedProductRepo.create.mockResolvedValueOnce({ + id: 1, + name: 'P', + description: 'D', + price: 100, + tags: [], + images: [], + userId: 1, + } as any); + + await productService.createProduct({ + name: 'P', + description: 'D', + price: 100, + userId: 1, + }); + + expect(mockedProductRepo.create).toHaveBeenCalledWith({ + name: 'P', + description: 'D', + price: 100, + tags: [], + images: [], + user: { connect: { id: 1 } }, + }); + }); + + test('getProduct: 비로그인은 isLiked 키가 내려오지 않는다', async () => { + mockedProductRepo.findByIdWithLikes.mockResolvedValueOnce({ + id: 1, + name: 'P', + description: 'D', + price: 100, + tags: [], + images: [], + userId: 1, + likes: [], + _count: { likes: 0 }, + } as any); + + const res = await productService.getProduct(1); + + expect(res.likeCount).toBe(0); + expect(res).not.toHaveProperty('isLiked'); + }); + + test('updateProduct: 가격 변경 시 좋아요 누른 유저에게 알림을 보낸다', async () => { + mockedProductRepo.findById.mockResolvedValueOnce({ + id: 1, + name: 'P', + description: 'D', + price: 100, + tags: [], + images: [], + userId: 1, + } as any); + mockedProductRepo.update.mockResolvedValueOnce({ + id: 1, + name: 'P', + description: 'D', + price: 200, + tags: [], + images: [], + userId: 1, + } as any); + mockedLikeRepo.getLikers.mockResolvedValueOnce([{ userId: 2 }, { userId: 1 }]); + + await productService.updateProduct(1, 1, { price: 200 }); + + expect(mockedNotificationService.createNotification).toHaveBeenCalledTimes(1); + expect(mockedNotificationService.createNotification).toHaveBeenCalledWith( + 2, + '관심 상품 "P"의 가격이 변동되었습니다.', + ); + }); + + test('getProductList: 로그인 유저는 isLiked를 포함한다', async () => { + mockedProductRepo.count.mockResolvedValueOnce(1); + mockedProductRepo.findProductListWithLikes.mockResolvedValueOnce([ + { + id: 1, + name: 'P', + description: 'D', + price: 100, + tags: [], + images: [], + userId: 1, + likes: [{ id: 99 }], + _count: { likes: 1 }, + }, + ] as any); + + const res = await productService.getProductList(1, 10, 'recent', undefined, 1); + + expect(res.totalCount).toBe(1); + expect(res.list[0].isLiked).toBe(true); + expect(res.list[0].likeCount).toBe(1); + }); + + test('createComment: 댓글이 등록된다', async () => { + mockedProductRepo.findById.mockResolvedValue({ + id: 1, + name: 'P', + description: 'D', + price: 100, + tags: [], + images: [], + userId: 1, + } as any); + mockedCommentRepo.create.mockResolvedValueOnce({ + id: 10, + content: 'c1', + } as any); + + const res = await productService.createComment(1, 1, 'c1'); + + expect(res).toHaveProperty('id', 10); + expect(mockedCommentRepo.create).toHaveBeenCalledWith({ + content: 'c1', + user: { connect: { id: 1 } }, + product: { connect: { id: 1 } }, + }); + }); +}); diff --git a/mission9-10/tests/products.auth.test.ts b/mission9-10/tests/products.auth.test.ts new file mode 100644 index 000000000..89d66be78 --- /dev/null +++ b/mission9-10/tests/products.auth.test.ts @@ -0,0 +1,254 @@ +import request from 'supertest'; +import app from '../src/app'; +import { prisma } from '../src/lib/prismaClient'; +import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; + +jest.mock('uuid', () => ({ + v4: () => 'test-uuid', +})); + +async function registerAndLogin(email: string, nickname: string) { + const agent = request.agent(app); + await agent.post('/users/register').send({ + email, + nickname, + password: 'password1', + }); + await agent.post('/users/login').send({ + email, + password: 'password1', + }); + return agent; +} + +describe('인증이 필요한 상품 API 통합 테스트', () => { + beforeAll(async () => { + await cleanDb(); + }); + + beforeEach(async () => { + await prisma.like.deleteMany(); + await prisma.comment.deleteMany(); + await prisma.product.deleteMany(); + await prisma.user.deleteMany(); + }); + + afterAll(async () => { + await cleanDb(); + await disconnectDb(); + }); + + describe('POST /products', () => { + test('로그인 없이 요청하면 401을 반환한다', async () => { + const res = await request(app).post('/products').send({ + name: 'NoAuth', + description: 'x', + price: 100, + tags: [], + images: [], + }); + expect(res.status).toBe(401); + }); + + test('로그인 상태면 201과 상품 정보를 반환한다', async () => { + const agent = await registerAndLogin('owner@example.com', 'owner01'); + const res = await agent.post('/products').send({ + name: 'MyProduct', + description: 'desc', + price: 1000, + tags: ['t1'], + images: ['i1'], + }); + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body).toHaveProperty('name', 'MyProduct'); + }); + }); + + describe('PATCH /products/:id', () => { + test('본인 상품이면 수정된다', async () => { + const agent = await registerAndLogin('owner2@example.com', 'owner02'); + const product = await prisma.product.create({ + data: { + name: 'Old', + description: 'old', + price: 1, + tags: [], + images: [], + user: { connect: { email: 'owner2@example.com' } }, + }, + }); + const res = await agent.patch(`/products/${product.id}`).send({ name: 'New' }); + expect(res.status).toBe(200); + expect(res.body.name).toBe('New'); + }); + + test('다른 사람 상품이면 403을 반환한다', async () => { + await prisma.user.create({ + data: { email: 'owner3@example.com', nickname: 'owner03', password: 'pw' }, + }); + const product = await prisma.product.create({ + data: { + name: 'Other', + description: 'x', + price: 1, + tags: [], + images: [], + user: { connect: { email: 'owner3@example.com' } }, + }, + }); + const agent = await registerAndLogin('user@example.com', 'user01'); + const res = await agent.patch(`/products/${product.id}`).send({ name: 'Nope' }); + expect(res.status).toBe(403); + }); + }); + + describe('DELETE /products/:id', () => { + test('본인 상품이면 삭제된다', async () => { + const agent = await registerAndLogin('owner4@example.com', 'owner04'); + const product = await prisma.product.create({ + data: { + name: 'DeleteMe', + description: 'x', + price: 1, + tags: [], + images: [], + user: { connect: { email: 'owner4@example.com' } }, + }, + }); + const res = await agent.delete(`/products/${product.id}`); + expect(res.status).toBe(204); + }); + + test('다른 사람 상품이면 403을 반환한다', async () => { + await prisma.user.create({ + data: { email: 'owner5@example.com', nickname: 'owner05', password: 'pw' }, + }); + const product = await prisma.product.create({ + data: { + name: 'Other', + description: 'x', + price: 1, + tags: [], + images: [], + user: { connect: { email: 'owner5@example.com' } }, + }, + }); + const agent = await registerAndLogin('user2@example.com', 'user02'); + const res = await agent.delete(`/products/${product.id}`); + expect(res.status).toBe(403); + }); + }); + + describe('POST /products/:id/comments', () => { + test('로그인 상태면 댓글이 등록된다', async () => { + const agent = await registerAndLogin('owner6@example.com', 'owner06'); + const product = await prisma.product.create({ + data: { + name: 'WithComment', + description: 'x', + price: 1, + tags: [], + images: [], + user: { connect: { email: 'owner6@example.com' } }, + }, + }); + + const res = await agent + .post(`/products/${product.id}/comments`) + .send({ content: 'hello' }); + + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body).toHaveProperty('content', 'hello'); + }); + }); + + describe('POST/DELETE /products/:id/like', () => { + test('좋아요 등록/취소가 동작한다', async () => { + const agent = await registerAndLogin('owner7@example.com', 'owner07'); + const product = await prisma.product.create({ + data: { + name: 'LikeMe', + description: 'x', + price: 1, + tags: [], + images: [], + user: { connect: { email: 'owner7@example.com' } }, + }, + }); + + const likeRes = await agent.post(`/products/${product.id}/like`); + expect(likeRes.status).toBe(200); + + const unlikeRes = await agent.delete(`/products/${product.id}/like`); + expect(unlikeRes.status).toBe(200); + }); + }); + + describe('GET /products/me', () => { + test('내가 등록한 상품 목록을 반환한다', async () => { + const agent = await registerAndLogin('owner8@example.com', 'owner08'); + const owner = await prisma.user.findUnique({ + where: { email: 'owner8@example.com' }, + select: { id: true }, + }); + if (!owner) { + throw new Error('Test user not found'); + } + await prisma.product.createMany({ + data: [ + { + name: 'Mine1', + description: 'x', + price: 1, + tags: [], + images: [], + userId: owner.id, + }, + { + name: 'Mine2', + description: 'x', + price: 2, + tags: [], + images: [], + userId: owner.id, + }, + ], + }); + + const res = await agent.get('/products/me').query({ page: 1, pageSize: 10, orderBy: 'recent' }); + expect(res.status).toBe(200); + expect(res.body.totalCount).toBe(2); + expect(res.body.list).toHaveLength(2); + }); + }); + + describe('GET /products/me/likes', () => { + test('내가 좋아요한 상품 목록을 반환한다', async () => { + const agent = await registerAndLogin('owner9@example.com', 'owner09'); + const product = await prisma.product.create({ + data: { + name: 'Liked', + description: 'x', + price: 1, + tags: [], + images: [], + user: { + create: { email: 'seller@example.com', nickname: 'seller01', password: 'pw' }, + }, + }, + }); + + await agent.post(`/products/${product.id}/like`); + + const res = await agent + .get('/products/me/likes') + .query({ page: 1, pageSize: 10, orderBy: 'recent' }); + expect(res.status).toBe(200); + expect(res.body.totalCount).toBe(1); + expect(res.body.list).toHaveLength(1); + expect(res.body.list[0].id).toBe(product.id); + }); + }); +}); diff --git a/mission9-10/tests/products.public.test.ts b/mission9-10/tests/products.public.test.ts new file mode 100644 index 000000000..f97097efa --- /dev/null +++ b/mission9-10/tests/products.public.test.ts @@ -0,0 +1,275 @@ +import request from 'supertest'; +import app from '../src/app'; +import { prisma } from '../src/lib/prismaClient'; +import { createSeedUser } from './utils.ts/createUser'; +import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; + +jest.mock('uuid', () => ({ + v4: () => 'test-uuid', +})); + +describe('인증이 필요하지 않은 상품 API 통합 테스트', () => { + let ownerId: number; + + beforeAll(async () => { + await cleanDb(); + const owner = await createSeedUser(); + ownerId = owner.id; + }); + + beforeEach(async () => { + await prisma.like.deleteMany(); + await prisma.comment.deleteMany(); + await prisma.product.deleteMany(); + }); + + afterAll(async () => { + await cleanDb(); + await disconnectDb(); + }); + + test('상품이 없을 때, { list: [], totalCount: 0 }을 반환한다', async () => { + const res = await request(app).get('/products'); + + expect(res.status).toBe(200); + expect(res.body).toEqual({ list: [], totalCount: 0 }); + }); + + test('여러 개의 상품이 있을 때, list/totalCount를 올바르게 반환한다', async () => { + await prisma.product.createMany({ + data: [ + { name: '상품1', price: 1000, description: '설명1', tags: [], images: [], userId: ownerId }, + { name: '상품2', price: 2000, description: '설명2', tags: [], images: [], userId: ownerId }, + ], + }); + + const res = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10, orderBy: 'recent' }); + + expect(res.status).toBe(200); + expect(res.body.totalCount).toBe(2); + expect(res.body.list).toHaveLength(2); + expect(res.body.list[0]).toHaveProperty('likeCount'); + expect(res.body.list).toEqual( + expect.arrayContaining([ + expect.objectContaining({ name: '상품1', price: 1000, description: '설명1' }), + expect.objectContaining({ name: '상품2', price: 2000, description: '설명2' }), + ]), + ); + }); + + test('page/pageSize로 페이징이 된다', async () => { + await prisma.product.createMany({ + data: [ + { name: 'P1', price: 1, description: 'D1', tags: [], images: [], userId: ownerId }, + { name: 'P2', price: 2, description: 'D2', tags: [], images: [], userId: ownerId }, + { name: 'P3', price: 3, description: 'D3', tags: [], images: [], userId: ownerId }, + { name: 'P4', price: 4, description: 'D4', tags: [], images: [], userId: ownerId }, + { name: 'P5', price: 5, description: 'D5', tags: [], images: [], userId: ownerId }, + ], + }); + + const res1 = await request(app) + .get('/products') + .query({ page: 1, pageSize: 2, orderBy: 'recent' }); + expect(res1.status).toBe(200); + expect(res1.body.totalCount).toBe(5); + expect(res1.body.list).toHaveLength(2); + + const res2 = await request(app) + .get('/products') + .query({ page: 2, pageSize: 2, orderBy: 'recent' }); + expect(res2.status).toBe(200); + expect(res2.body.totalCount).toBe(5); + expect(res2.body.list).toHaveLength(2); + + const res3 = await request(app) + .get('/products') + .query({ page: 3, pageSize: 2, orderBy: 'recent' }); + expect(res3.status).toBe(200); + expect(res3.body.totalCount).toBe(5); + expect(res3.body.list).toHaveLength(1); + }); + + test('orderBy를 안 주면(기본) createdAt 오래된 순(오름차순)이다', async () => { + const oldOne = await prisma.product.create({ + data: { name: 'Old', price: 1, description: 'old', tags: [], images: [], userId: ownerId }, + }); + await new Promise((r) => setTimeout(r, 30)); + const newOne = await prisma.product.create({ + data: { name: 'New', price: 2, description: 'new', tags: [], images: [], userId: ownerId }, + }); + + const res = await request(app).get('/products').query({ page: 1, pageSize: 10 }); //orderBy 생략 + + expect(res.status).toBe(200); + expect(res.body.list[0].id).toBe(oldOne.id); + expect(res.body.list[1].id).toBe(newOne.id); + }); + + test("orderBy에 'asc' 같은 값은 허용되지 않아서 400을 반환한다", async () => { + const res = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10, orderBy: 'asc' }); + + expect(res.status).toBe(400); + }); + + test('keyword 검색은 name/description/tags 중 하나라도 매칭되면 포함된다', async () => { + await prisma.product.createMany({ + data: [ + { + name: 'Apple', + price: 100, + description: 'fresh', + tags: ['fruitTagOnly'], + images: [], + userId: ownerId, + }, + { + name: 'Banana', + price: 200, + description: 'yellowDescOnly', + tags: ['tasty'], + images: [], + userId: ownerId, + }, + { + name: 'Car', + price: 300, + description: 'vehicle', + tags: ['transport'], + images: [], + userId: ownerId, + }, + ], + }); + + const r1 = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'App' }); + expect(r1.status).toBe(200); + expect(r1.body.totalCount).toBe(1); + expect(r1.body.list[0].name).toBe('Apple'); + + const r2 = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'yellowDescOnly' }); + expect(r2.status).toBe(200); + expect(r2.body.totalCount).toBe(1); + expect(r2.body.list[0].name).toBe('Banana'); + + const r3 = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'fruitTagOnly' }); + expect(r3.status).toBe(200); + expect(r3.body.totalCount).toBe(1); + expect(r3.body.list[0].name).toBe('Apple'); + }); + + test('공개 조회에서는 isLiked 필드가 내려오지 않는다(로그인 안 함)', async () => { + await prisma.product.create({ + data: { name: 'NoAuth', price: 10, description: 'x', tags: [], images: [], userId: ownerId }, + }); + + const res = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10, orderBy: 'recent' }); + expect(res.status).toBe(200); + + // list 내 isLiked가 없어야 함 + for (const item of res.body.list) { + expect(item).not.toHaveProperty('isLiked'); + expect(item).toHaveProperty('likeCount'); + } + }); + + test('잘못된 쿼리(page가 숫자가 아님)는 400을 반환한다', async () => { + const res = await request(app).get('/products').query({ page: 'abc', pageSize: 10 }); + expect([400, 422]).toContain(res.status); + }); + + describe('GET /products/:id (공개 상세 조회)', () => { + test('ID로 상품 상세를 반환한다', async () => { + const product = await prisma.product.create({ + data: { + name: 'Detail', + description: 'Detail desc', + price: 123, + tags: [], + images: [], + userId: ownerId, + }, + }); + + const res = await request(app).get(`/products/${product.id}`); + + expect(res.status).toBe(200); + expect(res.body.name).toBe('Detail'); + expect(res.body.description).toBe('Detail desc'); + expect(res.body).toHaveProperty('likeCount'); + expect(res.body).not.toHaveProperty('isLiked'); + }); + + test('존재하지 않는 id면 404(또는 400)를 반환한다', async () => { + const res = await request(app).get('/products/999999999'); + expect([404, 400]).toContain(res.status); + }); + }); + + describe('GET /products/:id/comments (공개 댓글 목록 조회)', () => { + test('댓글이 없으면 빈 목록을 반환한다', async () => { + const product = await prisma.product.create({ + data: { + name: 'NoComment', + description: 'x', + price: 1, + tags: [], + images: [], + userId: ownerId, + }, + }); + + const res = await request(app) + .get(`/products/${product.id}/comments`) + .query({ cursor: 0, limit: 10 }); + + expect(res.status).toBe(200); + expect(res.body).toEqual({ list: [], nextCursor: null }); + }); + + test('cursor/limit로 페이지네이션이 된다', async () => { + const product = await prisma.product.create({ + data: { + name: 'WithComments', + description: 'x', + price: 1, + tags: [], + images: [], + userId: ownerId, + }, + }); + + const commenter = await prisma.user.create({ + data: { email: `c+${Date.now()}@ex.com`, nickname: `c_${Date.now()}`, password: 'pw' }, + }); + + await prisma.comment.createMany({ + data: [ + { content: 'c1', productId: product.id, userId: commenter.id }, + { content: 'c2', productId: product.id, userId: commenter.id }, + { content: 'c3', productId: product.id, userId: commenter.id }, + ], + }); + + const res = await request(app) + .get(`/products/${product.id}/comments`) + .query({ cursor: 0, limit: 2 }); + + expect(res.status).toBe(200); + expect(res.body.list).toHaveLength(2); + expect(res.body.nextCursor).toBeTruthy(); + }); + }); +}); diff --git a/mission9-10/tests/test.http b/mission9-10/tests/test.http new file mode 100644 index 000000000..82dfa1bf8 --- /dev/null +++ b/mission9-10/tests/test.http @@ -0,0 +1,210 @@ +### Article 목록 조회하기(좋아요 포함) +GET http://localhost:3000/articles/?page=1&pageSize=3&orderBy=recent&keyword=이것은 +Accept: application/json + +### 새로운 Article 만들기 +POST http://localhost:3000/articles +Content-Type: application/json + +{ + "title": "새로운 Article2 제목입니다.", + "content": "이것은 새로운 Article의 내용입니다.", + "image": "https://example.com/image.jpg" +} + +### 특정 ID의 Article 가져오기(좋아요 포함) +GET http://localhost:3000/articles/4 +Accept: application/json + +### Article 업데이트하기 +PATCH http://localhost:3000/articles/9 +Content-Type: application/json + +{ + "title": "Article 2 업데이트", + "content": "이것은 업데이트된 내용입니다." +} + +### Article 삭제하기 +DELETE http://localhost:3000/articles/9 +Accept: application/json + +### Article에 Comment 달기 테스트 +POST http://localhost:3000/articles/1/comments +Content-Type: application/json + +{ + "content": "이것은 Article에 대한 테스트 Comment입니다." +} + +### Article의 Comment 가져오기 테스트 +GET http://localhost:3000/articles/2/comments?limit=200 +Accept: application/json + +### Comment 업데이트 테스트 +PATCH http://localhost:3000/comments/6 +Content-Type: application/json + +{ + "content": "이것은 업데이트된 테스트 Comment입니다." +} + +### Comment 삭제 테스트 +DELETE http://localhost:3000/comments/7 +Accept: application/json + +### 새로운 Product 만들기 테스트 +POST http://localhost:3000/products +Content-Type: application/json + +{ + "name": "2025년 최신형 세탁기", + "description": "신상품입니다.", + "price": 2000000, + "tags": ["세탁기"], + "images": ["image1.png", "image2.png"] +} + +### 모든 Product 가져오기 테스트 +GET http://localhost:3000/products/?page=1&pageSize=10&orderBy=recent& +Accept: application/json + +### 특정 Product 조회 (좋아요 포함) +GET http://localhost:3000/products/4 +Accept: application/json + +### Product 업데이트하기 테스트 +PATCH http://localhost:3000/products/1 +Content-Type: application/json + +{ + "name": "업데이트된 테스트 Product", + "description": "이것은 업데이트된 테스트 Product 설명입니다.", + "price": 3000000, + "tags": ["업데이트", "Product"], + "images": ["업데이트된_image1.png"] +} + +### Product 삭제하기 테스트 +DELETE http://localhost:3000/products/60 +Accept: application/json + +### Product에 Comment 달기 테스트 +POST http://localhost:3000/products/1/comments +Content-Type: application/json + +{ + "content": "이것은 Product에 대한 테스트 Comment입니다." +} + +### Product의 Comment 가져오기 테스트 +GET http://localhost:3000/products/1/comments +Accept: application/json + + +### Comment 업데이트하기 테스트 +PATCH http://localhost:3000/comments/7 +Content-Type: application/json + +{ + "content": "이것은 업데이트된 테스트 Comment입니다." +} + +### Comment 삭제하기 테스트 +DELETE http://localhost:3000/comments/4 +Accept: application/json + +### 이미지 업로드 테스트(s3) +POST http://localhost:3000/images/upload +Content-Type: multipart/form-data; boundary=boundary + +--boundary +Content-Disposition: form-data; name="image"; filename="test.png" +Content-Type: image/png + +< ./test.png +--boundary-- + +### 사용자 등록 테스트 +POST http://localhost:3000/users/register +Content-Type: application/json + +{ + "email": "alstn7@gmail.com", + "password": "password123", + "nickname": "민수bingsu7" +} + +### 사용자 로그인 테스트 +POST http://localhost:3000/users/login +Content-Type: application/json + +{ + "email": "alstn6@gmail.com", + "password": "password123" +} + +### 사용자 로그아웃 테스트 +POST http://localhost:3000/users/logout + +### 사용자 정보 가져오기 테스트(최근 등록 상품 5개 포함, 최근 좋아요 상품 5개 포함) +GET http://localhost:3000/users/me +Accept: application/json + +### 사용자 정보 업데이트 테스트 +PATCH http://localhost:3000/users/me +Content-Type: application/json + +{ + "email": "chlalstn@gmail.com", + "nickname": "수정한닉네임", + "image": "https://example.com/newprofile.jpg" +} + +### 비밀번호 변경 테스트 +PATCH http://localhost:3000/users/me/password +Content-Type: application/json + +{ + "currentPassword": "password123", + "newPassword": "newpassword123" +} + +###refresh token 테스트 +POST http://localhost:3000/users/refresh + +###상품like 테스트 +POST http://localhost:3000/products/1/like +Accept: application/json + +###상품unlike 테스트 , 취소가 됐음에도 불구하고 다시 시도하는 경우 에러메세지(존재하지 않습니다) 변경 고려 +DELETE http://localhost:3000/products/35/like +Accept: application/json + +### Article like 테스트 +POST http://localhost:3000/articles/8/like +Accept: application/json + +### Article unlike 테스트 +DELETE http://localhost:3000/articles/8/like +Accept: application/json + +### 내가 좋아요한 product 목록 가져오기 테스트(상품이 꽤 많이 있을 경우 페이징 처리) +GET http://localhost:3000/products/me/likes/?page=1&pageSize=10&orderBy=recent +Accept: application/json + +### 내가 등록한 상품 목록 가져오기 테스트, &keword=세탁기(상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능) +GET http://localhost:3000/products/me/?page=1&pageSize=10&orderBy=recent +Accept: application/json + +### 알림 목록 조회 테스트 +GET http://localhost:3000/notifications +Accept: application/json + +### 안 읽은 알림 개수 조회 테스트 +GET http://localhost:3000/notifications/unread-count +Accept: application/json + +### 알림 읽음 처리 테스트 +PATCH http://localhost:3000/notifications/6/read +Accept: application/json diff --git a/mission9-10/tests/test.js b/mission9-10/tests/test.js new file mode 100644 index 000000000..8cd82dc8c --- /dev/null +++ b/mission9-10/tests/test.js @@ -0,0 +1,68 @@ +async function bulkArticleCreate() { + for (let i = 1; i <= 100; i++) { + await fetch(`http://localhost:3000/articles`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + title: `Article ${i}`, + content: `This is the content of article ${i}.`, + image: `https://example.com/image${i}.jpg`, + }), + }); + } +} + +async function bulkArticleCommentCreate(articleId) { + for (let i = 1; i <= 100; i++) { + await fetch(`http://localhost:3000/articles/${articleId}/comments`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + content: `This is the content of article ${articleId} comment${i}.`, + }), + }); + } +} + +async function bulkProductCreate() { + for (let i = 1; i <= 100; i++) { + await fetch(`http://localhost:3000/products`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + name: `Test Product ${i}`, + description: `This is a test product description ${i}.`, + price: 100, + tags: ['test', 'product'], + images: ['image1.png', 'image2.png'], + }), + }); + } +} + +async function bulkProductCommentCreate(productId) { + for (let i = 1; i <= 100; i++) { + await fetch(`http://localhost:3000/products/${productId}/comments`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + content: `This is the content of product ${productId} comment${i}.`, + }), + }); + } +} + +bulkArticleCreate(); +bulkArticleCommentCreate(1); +bulkArticleCommentCreate(2); +bulkProductCreate(); +bulkProductCommentCreate(1); +bulkProductCommentCreate(2); diff --git a/mission9-10/tests/test.png b/mission9-10/tests/test.png new file mode 100644 index 0000000000000000000000000000000000000000..35a7b5616a6b18773cb64d62627874b0bde02271 GIT binary patch literal 6066 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 부모" 순서로 삭제해야 함 +// 스키마 기준: Like/Notification/Comment -> Product/Article -> User +export async function cleanDb() { + await prisma.like.deleteMany(); + await prisma.notification.deleteMany(); + await prisma.comment.deleteMany(); + await prisma.product.deleteMany(); + await prisma.article.deleteMany(); + await prisma.user.deleteMany(); +} +// 테스트 종료 시 prisma 연결 종료 +export async function disconnectDb() { + await prisma.$disconnect(); +} diff --git a/mission9-10/tests/utils.ts/createUser.ts b/mission9-10/tests/utils.ts/createUser.ts new file mode 100644 index 000000000..2a5f37cd0 --- /dev/null +++ b/mission9-10/tests/utils.ts/createUser.ts @@ -0,0 +1,12 @@ +import { prisma } from '../../src/lib/prismaClient'; + +export async function createSeedUser() { + const now = Date.now(); + return prisma.user.create({ + data: { + email: `seed+${now}@example.com`, + nickname: `seed_${now}`, + password: 'seed-password', + }, + }); +} diff --git a/mission9-10/tsconfig.build.json b/mission9-10/tsconfig.build.json new file mode 100644 index 000000000..e4c703bb8 --- /dev/null +++ b/mission9-10/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": ["node"], + "rootDir": "./src", + "outDir": "./dist", + "noEmit": false + }, + "include": ["src"], + "exclude": ["tests", "node_modules", "dist"] +} diff --git a/mission9-10/tsconfig.json b/mission9-10/tsconfig.json new file mode 100644 index 000000000..d9c28d604 --- /dev/null +++ b/mission9-10/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + "rootDir": "." /* Allow src + tests in this tsconfig */, + "outDir": "./dist", + "baseUrl": ".", + "paths": { + "superstruct/src/*": ["node_modules/superstruct/dist/*"] + }, + "typeRoots": [ + "./types", + "./node_modules/@types" + ] /* Specify multiple folders that act like './node_modules/@types'. */, + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": ["src", "tests"], + "exclude": ["node_modules", "dist"] +} diff --git a/mission9-10/tsconfig.test.json b/mission9-10/tsconfig.test.json new file mode 100644 index 000000000..fd329ed6a --- /dev/null +++ b/mission9-10/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": ["jest", "node"], + "noEmit": true + }, + "include": ["tests", "src", "types"] +} diff --git a/mission9-10/types/article.d.ts b/mission9-10/types/article.d.ts new file mode 100644 index 000000000..f57178922 --- /dev/null +++ b/mission9-10/types/article.d.ts @@ -0,0 +1,34 @@ +import { Prisma, Article, Comment } from '@prisma/client'; + +type ArticleLikesAndCount = Prisma.ArticleGetPayload<{ + include: { + _count: { + select: { + likes: true; + }; + }; + likes: { + select: { + id: true; + }; + }; + }; +}>; + +//db는 주방 냉장고, 클라이언트는 손님, dto는 서빙되는 접시(플레이팅된 요리) +//DTO 주방에서 재료를 꺼내 손님이 먹기 좋게 가공, 예쁜 그릇에 담은 상태 +//기술적인 의미로는 데이터베이스에 저장된 원본 데이터와 클라이언트가 실제로 받는 데이터의 모양이 다를때 dto사용 + +// DB/내부 모델을 ‘그대로’ 밖으로 내보내지 않고, +// 외부(프론트/외부 API)가 쓰기 좋은 모양으로 +// 한 번 가공해서 내보내는 역할을 하는 타입/객체 + +interface ArticleResponse extends Article { + likeCount: number; + isLiked?: boolean; +} + +interface ArticleListResponse { + list: ArticleResponse[]; + totalCount: number; +} diff --git a/mission9-10/types/cursorPaginated.d.ts b/mission9-10/types/cursorPaginated.d.ts new file mode 100644 index 000000000..1b168ea24 --- /dev/null +++ b/mission9-10/types/cursorPaginated.d.ts @@ -0,0 +1,4 @@ +export type CursorPaginated = { + list: T[]; + nextCursor: number | null; +}; diff --git a/mission9-10/types/express.d.ts b/mission9-10/types/express.d.ts new file mode 100644 index 000000000..04e33bd43 --- /dev/null +++ b/mission9-10/types/express.d.ts @@ -0,0 +1,17 @@ +import type { User } from '@prisma/client'; + +declare global { + namespace Express { + interface Request { + user?: User; + } + } +} + +export {}; + +/*tsconfig에서 Include로 type경로를 지정해버리면 +실행 코드로 인식해버려 소스 코드가 되어버림, 심지어 d.ts 파일인데 import/export 구조 때문에 node가 실제 모듈처럼 취급하고 실행 경로에 영향을 줌. +실제 내가 사용하려고했던 글로벌 타입(확장)선언이 컴파일러 입장에서는 '타입이 아니고 실행모듈이네?'로 인식하게 된다는 것임. +결과적으로 내가 의도한 타입선언이 제대로 이루어지지 않은 것. +그래서 include를 제거하고 typeRoots : "./types" 해당 경로를 통하게 되면, 타입선언 전용으로만 참여하게 됨. => 정상작동*/ diff --git a/mission9-10/types/image.d.ts b/mission9-10/types/image.d.ts new file mode 100644 index 000000000..5045caa2d --- /dev/null +++ b/mission9-10/types/image.d.ts @@ -0,0 +1,3 @@ +export interface uploadImageResponse { + url: string; +} diff --git a/mission9-10/types/like.d.ts b/mission9-10/types/like.d.ts new file mode 100644 index 000000000..d2a0203d7 --- /dev/null +++ b/mission9-10/types/like.d.ts @@ -0,0 +1 @@ +export type LikeTarget = { articleId: number } | { productId: number }; diff --git a/mission9-10/types/multer.ts b/mission9-10/types/multer.ts new file mode 100644 index 000000000..6c52fe127 --- /dev/null +++ b/mission9-10/types/multer.ts @@ -0,0 +1,10 @@ +import { Request } from 'express'; + +export type MulterRequest = Request & { + file?: { + filename?: string; + buffer?: Buffer; + originalname?: string; + mimetype?: string; + }; +}; diff --git a/mission9-10/types/product.d.ts b/mission9-10/types/product.d.ts new file mode 100644 index 000000000..4d483852f --- /dev/null +++ b/mission9-10/types/product.d.ts @@ -0,0 +1,28 @@ +import { Prisma, Product } from '@prisma/client'; + +type ProductLikesAndCount = Prisma.ProductGetPayload<{ + include: { + _count: { + select: { + likes: true; + }; + }; + likes: { + select: { + id: true; + }; + }; + }; +}>; + +type ProductRecentType = 'myUploaded' | 'myliked'; + +interface ProductResponse extends Product { + likeCount: number; + isLiked?: boolean; +} + +interface ProductListResponse { + list: ProductResponse[]; + totalCount: number; +} diff --git a/mission9-10/types/user.d.ts b/mission9-10/types/user.d.ts new file mode 100644 index 000000000..57314d2c5 --- /dev/null +++ b/mission9-10/types/user.d.ts @@ -0,0 +1,11 @@ +export interface ProfileResponse { + user: Omit; + myProducts: { + list: ProductResponse[]; + totalCount: number; + }; + myLikedProducts: { + list: ProductResponse[]; + totalCount: number; + }; +} From 779279d961d90350c0a49c92ea90374c5aca28ff Mon Sep 17 00:00:00 2001 From: Minsoo Choi Date: Tue, 3 Feb 2026 23:46:27 +0900 Subject: [PATCH 03/17] sprint10 --- mission9-10/infra/ec2/ecosystem.config.js | 17 ++++ mission9-10/infra/ec2/nginx.conf | 74 ++++++++++++++++++ .../infra/ec2/secure-group-inbound.png | Bin 0 -> 90868 bytes .../infra/ec2/secure-gruop-outbound.png | Bin 0 -> 65630 bytes mission9-10/infra/ec2/start.sh | 20 +++++ .../infra/rds/secure-group-inbound.png | Bin 0 -> 95011 bytes .../infra/rds/secure-gruop-outbound.png | Bin 0 -> 91869 bytes mission9-10/infra/s3/policy.png | Bin 0 -> 208287 bytes 8 files changed, 111 insertions(+) create mode 100644 mission9-10/infra/ec2/ecosystem.config.js create mode 100644 mission9-10/infra/ec2/nginx.conf create mode 100644 mission9-10/infra/ec2/secure-group-inbound.png create mode 100644 mission9-10/infra/ec2/secure-gruop-outbound.png create mode 100644 mission9-10/infra/ec2/start.sh create mode 100644 mission9-10/infra/rds/secure-group-inbound.png create mode 100644 mission9-10/infra/rds/secure-gruop-outbound.png create mode 100644 mission9-10/infra/s3/policy.png diff --git a/mission9-10/infra/ec2/ecosystem.config.js b/mission9-10/infra/ec2/ecosystem.config.js new file mode 100644 index 000000000..435b50ec8 --- /dev/null +++ b/mission9-10/infra/ec2/ecosystem.config.js @@ -0,0 +1,17 @@ +module.exports = { + apps: [ + { + name: 'mission9-10', + script: 'dist/main.js', + cwd: '/home/ec2-user/6-sprint-mission/mission9-10', + instances: 1, + exec_mode: 'fork', + autorestart: true, + watch: false, + max_memory_restart: '300M', + env: { + NODE_ENV: 'production', + }, + }, + ], +}; diff --git a/mission9-10/infra/ec2/nginx.conf b/mission9-10/infra/ec2/nginx.conf new file mode 100644 index 000000000..6794d6a6a --- /dev/null +++ b/mission9-10/infra/ec2/nginx.conf @@ -0,0 +1,74 @@ +# server블록만 수정했습니다. + +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log notice; +pid /run/nginx.pid; + +# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. +include /usr/share/nginx/modules/*.conf; + +events { + worker_connections 1024; +} + +http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + access_log /var/log/nginx/access.log main; + + sendfile on; + tcp_nopush on; + keepalive_timeout 65; + types_hash_max_size 4096; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # Load modular configuration files from the /etc/nginx/conf.d directory. + # See http://nginx.org/en/docs/ngx_core_module.html#include + # for more information. + include /etc/nginx/conf.d/*.conf; + + server { + listen 80; + + location / { + proxy_pass http://localhost:3000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } + } + +# Settings for a TLS enabled server. +# +# server { +# listen 443 ssl; +# listen [::]:443 ssl; +# http2 on; +# server_name _; +# root /usr/share/nginx/html; +# +# ssl_certificate "/etc/pki/nginx/server.crt"; +# ssl_certificate_key "/etc/pki/nginx/private/server.key"; +# ssl_session_cache shared:SSL:1m; +# ssl_session_timeout 10m; +# ssl_ciphers PROFILE=SYSTEM; +# ssl_prefer_server_ciphers on; +# +# # Load configuration files for the default server block. +# include /etc/nginx/default.d/*.conf; +# +# error_page 404 /404.html; +# location = /404.html { +# } +# +# error_page 500 502 503 504 /50x.html; +# location = /50x.html { +# } +# } +} \ No newline at end of file diff --git a/mission9-10/infra/ec2/secure-group-inbound.png b/mission9-10/infra/ec2/secure-group-inbound.png new file mode 100644 index 0000000000000000000000000000000000000000..52dbdc15bfeb1ea9862c9dab2ed12dbde992e2fc GIT binary patch literal 90868 zcmeEOby!qe*Cz%96af*C9!UWKY3V^)QjspD8|elC5tMFel#-TiP(iwpF6r(VV2JOG zdiB1qT;J>c{=GcUFlSEeSovFPuYI1&%Zg)S5Mdx7AYe*Lh}=g&xa5U^fcO~=6*!}N zpLP=Xp>8ZJEH5c643@XHG%z;PM?km{Y97)hg(P&fsV4{e(gn?d9;HY9kH+6v*liBTERJQ?fw6f+qH|p2dy?dv-g$*B1uA9t6HioQY1i&J z?jS^G*;r&D6mpNgct%jX7bw%Q10on(tOpz)?#eG3~SOIz7X z)_K4Q^v4paHV6p#)bJ0Y4^elDsnH)D9QeggVPtFjn1`9!!NGyafsM)1+K`!ro12^Y7ArF=Djr`G$h`x=kwee$HV@nG#yxm7SmUg!M6cq4|zW;q4r@o`{kDe@SzD*05AT#_5 zGYiu#=I?C-kMhCK^2i%I>YJ&G7@Gq$1NsnPzkQ4E%l$uH`O)K_o>ckqBpd53);~Y` zr%V6+sG^O&wXmf*(5J1y4}N`n_|F%=J;=ulpZcFj@s-YB&H{uMz~E#4&NKmx{Ci%! z03S(=MdTg;-++{T`2*OFa0B?jzkyGH_t0ai2m}NOf~1Jh14qQwai{ox#S_6zuKEBp zuT={FX{5XgaD^V-{QYu~k^MbWI;INj2q{(7*KZE@Oe+`+VoXi;vX9-R?j3p2n513F zt3cGbWJCm;Mq>M5DUejnWl+b~ZoM(KkkQo6zu?-*owVbWsO|w`md#*9wJa0R0HI-n zAx{txk-i;x@?E)BI{wy{!)BqQBSlda(%NZ#OsFAPR->O@iAf&uRF7HmC;z39()gK>trN{JqYd zn1E3)5bHVpHx>WRYtEnwgMP+qGiY&&VPu_-|Utbr)Cj_J1kq-9|*V=Qg*8Ho?zh%ZC|0?ru(F@_LXMT+$=x|Md z&)s=ub~Qk-4whIxw?A667eyZt5z$cZ@iI1H-KXw^vDST`d)V0qBP}hhCqr&SrK*%d zDMtloWia2elfBXPMt7Q2^o_N#3a#K5t*!JcC3X{M!OX7L8x!2s_9vVc^p(F)-3u9XX$RdsN(7vZux8-lc}vASRzG)=eOY_ z1Q$NbcXz!=CV5~vS=h}%c4H^XeZ-d4ILg`{ZhVKI+SS~w(Y@lGw_B_}DA&f5y0k7C zHmq{n6z)k+Ju}S<;(N76;xy{$8s^R?A&QqWCtd%D0etmcE&Rjf+{Rq zBMzn_l{qQ{@;%HoT#t3hv&$xhJzS|QYWD_sHh6JTW$^=lm#sHU060Q4dRB0<@88B; zL&al9pJ|n`zFfjJhFwvbTXN9rm!XB_km*F(_f<5e^ z*!)pP4YaX@OS?aA?=4K7a@~L>6x`a%zT2!I15<&Jo&l`-4QiHKiHEJElqKj56a&FnK zt ziB_Eb(v?0k*JJ~m&OPMI0#u{Q*i=%l{>-7j2U5u~ilwk;3w+5<3NR%;fG2Om;_+iP z_LIg*MlH)Ud6f0_MO~NLnwnmV`kQprw9v#g@HTukDn!F;cGG;Y_$zZIS|9+o+9v??JK zB7}UQF@L?50T#69qXrTx6!`~+5d&%M3aDazIh*r{JtRO>3efn+O=mI{f;px zQ~cqlqwD2t7Bw?Lfr;4*^KnflXE4EGC%CnK`FLP>*tz4wcL8-B8LY);uG=53`|Ox`yq20W)iWi~Df)h}bef z`)q&0WQ~J?ln#y6I=^N*mcc#3?c;{~+3`W2_Gwry*Mr60G^yj$iAj;Nyz#Y zCf6;gtu^Vi(AU~9FW?0(Eqzrz+L4KNcIuE!WXR(gbMlY~r$V{tgUdLtiqWP1T z{Du~#fTcwYvkW*>>!%|Z7gbeNP3O+&(r=4ynkApS>hW@a1L3Y4GVgutSp{EGBHS)s zW>^+6sz+hq-c>P=WreMi4fl+J@fNP}t98d7b$R`X#{VqY;28j^LJ<;Mtq|96=vR!f zV_(^M;*DiIP=17Z0>xr_9=uWKvA_S#drW3L)w2j7VWG&Y*nT0+p>+nEoOv29*D^55 zfEK3t&evy9+k;>B_FOhcT+v>K%dTJjWqzu#-1;ziimyQC zdh2w%A^aXN^CGE)y`ZZg?)9NFKdX#{D7P*a#p|!AuJ#Q@#;0!=#krG=S2@U4(L73| z@(b6HJgi!f%VBk+$Q?YUM!T;dlJI-56R=_O+%sM< zA|X|PZy_xQ?4OQ^B0>tCvguO@YZtl0NT$_TL6bq&aF@fR8&{>>N)!P8f(1?;UC+EO zvi0v4aSMeg$O=*#bj2u`C#G80b0~{nc_WbrNIxDPUO_5-d1yr|!A(C)_l2q$lQ@ro zOI~KHNHpO$TM-*wgbmfw{}B7S9ANI2}xF?d1ph%W$1Qi#87Dm}i;CcV!{9&cWkS)PpO)K5#Z+LokkEYLo_ z6A=~F&ue>fw72z{{1kg|@?d6Fd#uaWA|Kqm!(5F$)5XV76tG()70qNdXkMmdY8u#D z)WuI8t>x}ilDTso&3Y%;vK{qy7GoX?gCxSjXSv{@FxiA@25kYRAVM~pBgKTA!l}I` zLN=XVYC(y5K1ta73#3!9OmlLh1&`;%L~#(ll7yuid5^tk6n^S_ujgra+0C`1p3 zHkgzcj_v3;olEA8!NdZ5+>+C&xIw|B_CwcEv4|e*5$sFpo*dZ$$baI6lVS$f*onV( zgFkak^;C!%caj%4P6O1zim0$_RFniO3fnmd@?%cAh zy<@%LO8d3gQre6vxLB4PQDKq~+YPdVA|fU|&Q2WX`jx|VO0r+mf41tZn3Nrbn}c0Y z)T~GdwN!Ki$Dk&8FyE0%$tkhY-Me?EyM-?YrCb)|V}hFta?6^?8o>0V$^R~g5InI^ zwrS8<0UI@4nT1PERC)RKLC78W(@Ub{q0571mX}Cw-{L(6uy#|HVs@b&%5Nt-ZwPo+qkB>9eiN}* zotj1~eGq}d6()GRxvF-$n<3c5yHOhlcyS{DQ4H4AaN#p*Jun^772u^owK&Yb^$xH& zI-g$o>cglqB->vKFsgf;`Vi~TwD%071Ko?AU3*?j3M90DxG0{|p@UInk?E zPeaG8mtxn71O}QC9L5uJqk%LJJcY8ipzV0QG091(R7?3)L9)0mbS2iNzSP|frj&5I z*QGvPi7q;t*$+CHW4u3Rjt8pPo%WBdX}s=z;R_@t-4F@6>4WsULw=zIX7&ajz9r5j z1sOkgFbf1XZ$7GjEe>5@+8)T&Chrm$EXM8}loez=-4Q%Zq1MWO&)xa*)^#n{r8!g> zyKPaf7Z@}5Re{U5tc*v}O-i)hmoH&IsPgv$#l-_)^+y-x?UT9PF#wnm?SIyLazik7E?sBqcAh#wGV$eq@@tYw%BGTFo zFxq`A_YSZG|G2edvv{XYF5=~|GAOXzW^Z~k z;1|y7{7XdG*r3b{;@GKVFEIh6&-u>CXSzW9NGCvWCSbK4msaM5IGNi`b>-hTywkWq z%Z6RSg6ri&mXmJF6{EZJ{!BIOr-xmlGUP+={O04)wgb0jbel+@aosXqFVjlkr_GDw zD-b}A-}y7Sv~4Rg}zclL3TwH3?V<-CC>QqWS$y z1PJ2+pa>AI&cffe_D>Kz;f$xN<%c%@t||j`gLq<~d0ky>ROS39^l}C0^|5SW;^q0W z{!8xNkO%UANaMHL{t3Na$N}^^*dHVQZ3qdB6onp8^<-kh;eSG}Ep&ihlZh_6zl|)w zkYot3N{?YXb2ILr&`SWI*Yv23rSv}$&NqN?dRoNm{}Xz_7Z&cjx~vEO6X8U{1BA0X zu*mG6(Cc4i{w+cISDAlLH6Z^g^KV&w&wrKq_vrPnXZ}5_|F38MJ$n5=J#%w5Si;!Y zcz0uv*%`V_%J01Em#0}JW^AnL*{gOAAoQHZd6Sdl2c2+XR?1bwYl~v`7xgC)*VotI zLU2_0_0Wq$AzC1zN{0AN_~TAaCy1P#mm+3K)+^R&N2 z)Q}#uVi#<^gSS&GwkxkxH-Y+!hG}XkosX?}TkBODVxpp=`-$hq+lO@WN=o?Sm3ID# zanJxDfEP;=a4Wi)pe-Oc-<}Yj%kV#P(vTe#c!EA2sc@yUN+g&pE+bp}pz*^EZTZA! zg0W{jV&@h4g-%pNE#{=tEDbNuW5?13o&pef&IPb3#@~*$tHPhO|`T*oE8;ZIF3EHBW z^T+R9JnxA=ab=dOdtNAHmMSE8or4wAv-)IzbnAmZ^K7wv!g=WahKA?3{Wv4AA{O#Y z==5m!Caw3?btN_KU-q(g6W)g#bb{9T!O4op9q?N94w>A~t~@yqh4oR0qGAR}kb5VS z)4j6k*EOffx@g75-vy(fa2d-vY5PJA=?w8K<2i$87kZeK<#EGc2ma6f@c1R0gDkGt z^8cz1cn*m}`6Ab_wIb~-0h@t#fEhlde~L-J&m_4S1ZRay@EEV#3T>h@1+eg^sfVN$ z{cDs*OxtZB6ryQA!VRbm$;C;PYx&hjt&O=OM(0TjhSI|fQim6Sa5ccyh`DCl`hBgh z&#!@hGCyd93hlm{8qoz(NBJXn5BKRVxbl=XRXNj~$2=!+cdmNbkVoA~UnJl5A|nr9H>R1-r6ndy80|Y@jOlGHbHV(Sgvb6`t#I|>Jn>d9 z12dOZ@%o<>;GCy!XnAs?d#zSM1$t7N=2^aSTy)FC#pb-(-}g-9cWIoUga#>QD>a6* zCB6P%NfvI5VoB`TWMpwsz!JARnu$Gl@L;x_ef$R200(e_`FK)N zYSW<+5l6X4&sbaL&OyF`y>e43zllJi4=M1EKz*{kgXE`!waNkwo!8gh0Iw3AeLt z<)|cg1z^GBPO0YT6f$VYna*R(2n1*tGlbvkueC3E9K{*BPTCg5XbQDcftY*V8IOC7 z=0!CXOet{b$)}0RWk#$AK0=^7S#fX9u|-Ch!0ZR)Iet;n4-r5&D_gSe;5 zGiBH>xw<`Jy9kz0Kmv2rHITAkTla41>NbDA4zJrPKTU7p&~{2$x!`(?Yt@aI((9C0 zdpe?W(zzU%Sj0iI*jFV7FOIX5tuZ?+%sTUQtLb#fT~l5V=J-j)c-{g@feRBF`C{kr zkFA%Nl zLp0$GTPwDd%m^ztnnvl#RLF1yDkjR;793{T#T9r013@xegaE5|5a(pWb6>M>}9#a643OO|o7pznTPkyc}J!UgD#j>ud6p zd9{5E(E4)id#%6T0U_Uj#Nmxf_(HX-{e^y8lzx`Ls8F)Q#srIXL$jJ3Q|c`V-%DPf z2#{jf94w@Pg2(Z2<^2S%pV)XJKg8obP8LGj><2eUskErak8&{G>YYqTW9TBI-&Atk9VWNLwl>< zWIT)`h<9(d*nC8|Pq%RH&sRK92@=YTm6T4z4kIySoi_vIxejQjzi4)&oz``zz>Hf z4p{Xiws6D2>ir>e=UNRYug`jp9!SH>5r9 zT*m)IJ&__Fe0zO}xv_;d5gWOTL|!@i#w=K3`;JegAt@8u{T=p@`KPy+F~W7V=4XkjPt z*u8*PVyg_+Kb&DO|uuOYmz zlum&hUcfD~@4gV$$+C3(+*m?yKc3raf!{%YgCp(nR>Q@V)KseZ=;)@7vhm)CSH%6$ z<{t3|pjobjnHNA6?;JyvavU?dRlI$xa!O8djvDL}m?8!>Pf~6>x8EDiV^GSG#=0zV z`FgX4k2{6LJU@mx7OyRKDtCsb9w#fhC)J~nb`Hb!F`!a%%}M6yv;nB+3{*Dk3Q9Vg zUSGY>nqgJF(^+LTj2CS<%H~rq$j>8CJK5B0(($(8?V9h$=i1x?HP9-cVmhYiG?p-G zXW_Gux6W8*M#f17KRdqx->FKcE?4P{L#>m=?&1W$Qmz(hwDw_2eEO*MyC*LnH`dAG zNTMEZW-;i_Wkv1L7U`C57c42xV_xmGi=Or7n{oI)t!;H%XlE;76ra-c%)|plq?Aqq$(6ZoTo$D!QTAyiww; zNa(XX-t}6xquq5}Vc*NS1Ljao2mcPvl_;_uwxwRFtZ~zh)&&6<>D7{j#3f4Bjfw7^ zFzn`~jCi8wbI+88GoG{0mre1t{yaAsU?I#nHhSXcE8ou?Qp(@(^o+t^SriIs$j07R z!cO(Hw0F56Bv5eHr29Dvxer@>Qot=6=@N2Ze-yI{w&a^f;e|4<9X7N=<1xZC;00^8 z>to!E%1TONS6YYC>5I4eaph!3)1}>jGQn9~WA4NLic}kE9uFNJkJ19q5Bh>fj{*eU zG|Xz9f_Ypzn3;p)EUVHwT^Pq-R(n`qxeItcAgUIeIf|piTxw+hm7*RyjB2=e@X)aA1WgR@&gNjo=dq8QRr5 z^2sGHUtC8E8|p7>DoTt2QaOyKj1%z-Yw|)NMKscWQ}xgEwNGP-E&RA`77SKo=%{w6 zcJ%Y~67_0Jt7~^UY*K*20~z;OpeUUZ-Jj}Jz;}J;&ie@gsGY6!6;W`rq}Bq(NGjW{ z+4&9S3SDn75+e+%>{bRCE0q%wfjxT2C)09^|)*Dlb}A3OUT;aIWE&!#Nw9wTth z7T#F+78yRSl%G-4_cJ5P4`;O~QylUq`teyd_MAeGZFjR(yud9219+&arLL;&Sw~gS zH8*sxPesV$L1d)j4^H&*E~Lu_(kTj>JCUBmu=LbvpTYgrQF#18fx%j=N|n8Nj%pF- zg!Ya*U?X{#x|SW3;PpwmK#D3f9yP2YEV&;41eT%8RJ+qFT5Gz`;T4$d zWfhM_X#0{{8wDISATEWN(rT0Y<1=>}A7otSzsb3>pN}9Zi)>R7R?lwnp>3U zMC0NBWH20$h7Efw1Z&Su3%Z(Xbo*qgQla5b+RrASu$O!7eZ!~1s8~ULvZp4Tm%_#* zkXXu2j)RKjgx!ZF&)GB(OAXNOCa3pzO8tB=q6)#Do%HBB{R3SkIHcN;zRFzP z_01>?+Vm|douwlS&#y=yQ5&U1yKj!zk+WJby53{6)1liFM!mJoz^oiM2e%cIwQfLx z>0kpE(^ehIZ}`v)O&9orU(*H?hjFZ ztpUq--&x_QXR2}Df05D@@chxJIXO_^Y1MBxn0|7XC$d2lm)TD?fk*M8uO6-9A0Fg~ zPZ_!a#1w(kY`<9EPEG*9BScE^fSkQuo!fY+DzczV22hxpW9_PyFAoltr}=XP@s2)7 zm{U`dozixX#b73F!WGGfuPO%f&lb2spI&EG{sSsBKl%eISa2-uOg|@>KJL2p$GZU1 zGmP868V~A>f*O~-7tHSK7fX&TYWkIo)vc|YfO;;|@k!f0nZ7=mFyicN**mJ0w#K;v zQ2txgr&|Mpy(v+hhmA2?YW-Vx`^epII_S^=PzF207}4ED%sS~*B=rLO9%_9gd9 z{;*30K0NZ6k>%%K6Igq-#4@whWKF7OSm)na2L`q~kibE;oaKpXt^lR@Dqd5-q1njk zj>~$G@D3T-A=r*75C?p$8ff-7IA9amGCFC|F z2EteDK23>>0EOh=!rx5JRW@-FLb$mbu|JGdZpiA-E`)}&#F-UJnhls2WrcG%i{@t~ zF33kzzN_&C|o3(1$Hl!W>dJ8(ZB{HBTqVE}|I}kn% zC%a5sWd;IYs_S7uahKJOdD#Q?!C~CafLb?Ls(Fhffn*(A4_6eF=LUE!gPrp05+{f} zM#`_u9BFxNs!>ANC~=;02^N%$ThvGUdxwPy}zsm zT`^hgFH&}0$thZ?jI>eLbmztz2>r<&CTjtj?QA^uv(A4%a|7&o2Ls#erl~ll*VPd+ z`(_|Onlrm`sW+b4(&d>@BZ<=kVBw@rvQ1WY?;5aMhR5JrOsn5S`zjbNl^LJKtz(;E zrUMPzS(_hUfArUB{d8dlsF{~rFu7qA=B5(lW0jFe25cR`IuwK?T zUng*4d%WRRmpz;|aWtTA9@$rAar-@hm}mUtf@R}Oj?9PTVt$_0ArJy~l(B{Vbme=3 z2V4ijV3g?As0q3TqHCyGc?-lp{=+yQzzI@3O{qJyoZQWCr#x8l6I|UC{dBjU$rS7a z@qVO^*0#S!Oyt~ku zkmCB@>tHEYFng~#lyd)tZlf!w`Pm`ALsPbm!QgUV7^W|&t3&|L=XbWPmB(t^s`Edk zEU#w6$558_Q(RxaHYaMxehZa#_HvNQ7jxR&SU>+|TjmXJJGkZ0%oE9s?hnlT^k~RJsWeyua=bso_>+G)t#Q2 zKI%U}LHqW|UJAP8Tg9zM#5+ujEaE;oEx7ZVpRV-DDRUp^8ARjf(wa&RMEn5=b3_-o2*3CL$HBWg zzzMnH{)|DspW(@ZxCwcG%k|lP8f5Z=E(5!BfK5S#18NI30?c7acgjIR)FVR-&&3zE;%aJtABKX{7TB@+qV+7M_LA(0CiWlcDDIBE9?psnoei`l$-f(cfj4D zC??N@FzAfBL!s18Wp^ftg+fT`UhVk^Anz_ldW#-jAq^NUvsK&1pK}2}@GLM2BltRB;l>0E zzFghZuF9tS@dci!_loFw!+N8hY}l1p00m-){;bF?Am&8 z4-)c5ZCd3nN^uo($`v*GA>cn`Ke-%KI$^Rh^yuL7)_k001CZs{&|uy$KW{KUo_~vj zWPSxiSUwk3u);+C9KPP)*CkMd)5Z~T&e%MIz;6c=DPPMa)ox8odH8!&?%Tf0my=hBcc6DYF>YIXl^xBiIKv zM~DE4p;N}*7vJe}?mV z)*Hn$xN`hB*~T0d(L49)PXY&1(7w-~zWxt)zJ3eT%vFI4m53 z;UJY8|0}8UR4ya=KXI)U^og>DpcDQCn5M>ol$fTvV@+C%l9)A_P-VT^nXq8 zyjHu9faojNauxkA2X{WPzO?0u54?lV7)LDpyq15^<}U`W2CtFW3*`U(EyDocyD5Ni zGk!3-@=M|WNkG2N60!p9|0%95p#5j#76HaBdQIkkRm7Z2Q6o11-wkl>|BsrZ^9Kg; z2TD$g(NZM;VqU)%fLvxkIgT0=zcA)3sRs6>C{~5|_VI^8sg2%j3dIMYn@@%yu{Gcq z$y$5#`#~!AASh`U?Q2b6J=ZL-3N;mS4h`C!h@N;f6~|>-$bAw&UPN7WcF-3tO=A;A z+e8%?%?trSeIw!J=^&%Sh2?7$DSyOjt}b5j zz$XMKvcr&|k2 ztPT^}!U}#g7xQjo|hs+`#5E#r6XXcZox(BGquMWrDns+H`%-qkS4H!0SE3}ZPPl^PHJ-J zlr1%%B$L9y*(o*dzq{O@YdEJ~ZTnn0o}F%*Qx5`80XV`+|FWnoUn@5@qU|#q6nLA1 z9xRBI8wMG!;=3NAoUe?z+#fv;djfN45GQY3bET!4jXpla&DoZXzkQvKj?Ri9 z&g(1p(P%=HHx}OCoQ@Q8gH%(|UHHOZ&m5fQ>@MN;{cMGFxk%Nbg$BIi5Az*qRw*_) ztjhVSl#?f$ZW?VFx4zJD6F884D4N zYK0>12TK{dX04oG`3w#bN2xx3P3hroek*j6$A-4#{nJCP*vyCTsU)SP3k%5v-8C+g z3y^de+*??(ht|!tKQmN0%#ep-uP--#CM9gI#LE6&tzOc=_%szCd z%iJV4j@7)f!Z#Q_Hdq8SP4{k(zS!W-9j^!`MS9z3HwG4WPS^QeUN^^ZtMZIHrfAqs z`4G~(?q(#lCMjeXyt%|F1|~zQm~vKJDeg->L?Mvy*~UvX8)lt%dxx{5@m3h9OJb}$ zVNtzIc4>7ndH8TaDq7v501f(brKO191@-aro=NwLv4?i;;lN|nT5ElXz}ZuVk&@`k zYa?ncZAv*2*Xt*CyFRdfRTL{cfFAKjPXbP^78VJBbzM3KzA~>t`CVI=u*Gxyj@TB= zK`ldSsU{h(=y1wr5w_EuX+9%`lUJ|+HLv_3M5tOwL!6Iu>hGS^9HuTv=5Mi$e z!00bxkcpYHzte_5R1ZVJgW_%ti`DIn5_-`bXbnt+7KzO=@7k79noKzY%iHev%@0 zEVO#uWa!FGZF{BT2U#lj5;uA%hb%-B>{o|aoOUxaKFnK=q!t`!ub2z%P|ci%3^QLW-k&H>?y91hh7gHoHq-r9{S z9qR2as&Iy` zDJo0l_Q~3{78&mLcL1*e%9(g`jC=8dC?nGY@?bJ*(~dU; zrwTw8b=HTh>wvbYxZ1fx4R?t5#w_PLwDdZgs7lXC#loGSu!Yl6$~!FAl{2^wc=SAT zAm9Wfts1SRDSTE+oe7%-&2)Xud9%3jop5&|a=p{UfPVybQOHgJ;$2I=gJAC)E zZm^G8RaVT{hLAUk*RJcj6WzV)as{pO7@)4m&t7XL5e;NzdMg<20>6M{&fDFngay(g-ik}Tnfx<2XjlA6oW8gx zYzX9wJ3~KZpati?MoYq&XP3w=oHew` ziv55$Exy?ABwMlV(sYn~)aNIbvCDbaUmV>0-uuE_reP9h6^z65Q%Dq}8mObl1B{5%fg*`*#B(ZM3%OT1xU9809e#bGf*Vj3m&17wl4f{}4~7E)1lN-GiKC&tl9ik{#RrzY?5 zO74_r!;>3lPM_Z)E}0UUt&dgosfvRAgx^c!V?3_8f^JvSis=camWqe~=Fo8L?|g6y zOFIz6%O?*eqV6+1;*<`qfN(;ox`c#A2pHd7HBVxjC*m#+uRt?iWv-VP0jWc^d9QFqc!@h;2<=zt-gC}?tCM=$F z<35#Z3L`0wtP8t#iF3)0ORJhy)m`>*3_3f){J@7^tB z&EUeOVqv*Qul#}^E$ta$jHrv^fH5?&W?Q3+AotMmls3f^%oxiN-I-uvZBI93#Gzce z0bUzTuX$<13hP)MEtA7%RHe{%-zizrKT4id!^eSuR`YAIy0@bpM_+g7>BCw6H*C?WOEp|#SfgeUkS0dwf= zEUD};j{;2GujbI$a=7#1^vl=7v<8jz}-xK#bL~A zfKaBIt9&tba6~!;7s{!;gW+oZIM>Z7G}zk@?xl6rx$Ne>L#?>+@_a=ru1EnnX^Ic1ZYik|yAm;{^36 z=IXCnKZxd~n?C03LpzFeKgn@D#SE+`L}j?0=n1wzB*JFhFX}=P!!H=zd5(bOiKJCq zhe8&plA^u{Lp$M03HJa?He_t875J)TY5nTf6YVZib8Re>(~uSQ)~<<)}wp$3~P7X zlt%}m+xnHY9_0p6W6#EIG`2m}rg=usId6+uSzFVV%VN1u_x{4!mU;1dU7|jy@b0_p z!EDZ4wH6L#O?{T78>BT_E{sp4&rS!S2s}${4Ks3rYkUrX|9B^g1cyaWd;!4}RJLA5 zM)Gj1s1X2f`bmC?${^qwfKz0J!CFa(wzh`~tx+Z6vt@!bZRN}YWlqg*eR-1(+=>FDA=bAq{2mik7>I=ICbmBG1Oq5! z%h>2>X(6d?Bb*lID%wHBkpp?ed+lHxhrIb1CDZf676xeR@WTy);wDVDDIK{J)Jq|D zD}$r{0!gQyU?Q`}6pg5jBcsOv)^Kg@Xh(5Co|K8>;(brNzG1symEjxbz=hfx1n}y) z2Q+bffC--sQOrIh^i05m-8y2CO%N9eO$5IglX<(O&(~$6QoS{bkrFUwp@`lWT1UWx zyV?2G_ldZ8#DS3Lrp;+A!4}U{8YHANy6iGH5#%i-Bs;(S&WM(K#U3&MSbZ+J+o-$? z7Tp*>(Oy}p_Bi}3NFMvJt1ibC2xUPhH*M; zy$$lEh-`5Nu?hoH!T_E0Bbt3him^IeHR!we!hS7HxT;iXB#Kcz&0(_mVdyT%%k`i| zLbb>~u*(6YUOqeRKN}X6X(ttcc17Bc9qy+*9WOfWx#wM8hlK1_%9Do-utX3nBlo%_ z4qyHnc|HCrL)nrujn)h1WyAghhId=h`<(Ozch>E)GtZi1At7xt3&cD}ezJz2EFVss zB${-vQTTm)=kXpznNfhpKpjJXd@#r)7l)p>8`u zGeorG59CJPND(_M?bgc)wm}6?j5?~2h4xp6b+t-UIlN#-v$TkqvN?g%yX5BVIqyI2 zr>1Bay%TxcB8WX}+-KT+dIIy-?_e<|h<8Y|T^k!7A$Ox0G_*O(G>Ocz?(xa22_0II z&9|#$`;?pBk;tZenVj1!KMGi3JpD1zV#0l??vYD&)&pZAuFZ%5FTdet{-8T_Me7AW&3LC2h;Df zE`&Hw86EvFcO~-V)OJzbvSqR@3gy=6N@-qiu@x@E39wn2Cdp$@5kltR73HG7z_gzF zW}ZPY>xLqI2I~C=R*L4zJ>vEv8?y~vkJAm2;ZpuJr^y;`BCySA#X>r&!^<9Ijv-2p z?ioM4gKW%Rthi!e>F=moib*poV%KSjI^za2Uj{F4n{*!j=JH;aAEEJ1+Cq{I(z?Ui zh&hTUlUC&?&}dW`TgRIXp2F1e9`CcA2Y`Hh1@}3A2QH5)c?{KL}!H!M|4;T zM^E07LoD*K(D-!je@!Vgm&4)x?qZ2<^McIiCjiCjJOTn@=_|Mj;!1-K7wadT)MaD$ zvllqcm%Y|Qa~-r=W*IG98|#>=~etk&&D zrW2%SI@IN-DS>JZRJ2w1r+Kpj)wQ`ik@k1*!X55hyn_TfWQC>Qlg|ZNQZ!Q4@wM3 zDcz|E(jXu$QYtCk0}9e0-Q77-GceRy1OA@9|8YKN@8{KdvET55`hI7vd);we*L|72g+xHL0~!B!FZR!v#|vca#$N44F>QVjztO8Ek9;S#fLZrjT69SXsU> zI(4}Xmih=Q?JG(QTjGwOd9f;_!k`en=h+sDtJWTU1dk9S5`1ZZYDs(OH!zqdoEA#U z0g6C;HkycaO?E%Xa~Gzjb_u(B7B;PdYv1`CcYb39+@+^ai=Ev>O~t$op%6+~PgtLl zL`}jttp2pltGKufJqi$a2Bo{Z)61^Joj)h2qhlNLPW#!pdplD>C@;YPITc6{F5>08 z%TY{T&R_Mi-p7WCN6P8t$zpal=$&soVtLEu=Kx;jDV4p4m$bniO%q31M@Uo|-LJ$^##HbcK`m{AXPMFgN0f6taG-{38&Ibj7E9QSMzD1Yau% zIh9w(xAGy{zHd*D(j%anANP9nb!vVbw$yX4e;(Jx8#*`zC&&Ye7G9^k(3hScIRD-85l@?4B5+vl>cZR;h zP9jB&j7zfJq12V?cXW(=a)nTU#?>NG`J&wHRx*5e1`?ihVSSTD+1r? zZK`8^%fR|Ybz7u!uLu^wO17iupNCI@ua>PuDUjjqMXF;>(kYzF0co8EAu)_k6(^Z|Fcd5vsngtgo`OfxUceam!t?(} zw&z9L=km6~WtE}KYS5l!!#!hY$*aXl8@ickH(oDUf3_+My0r`3(h|o`2PVCFjr<_! zdj7OS*&OWPE1BX?*6>lG_;blu&CeaD0mjkw6-yIVRhh_IX#*&a@p9lb=S{7#JY-*X zSf?Y^$?D@nhcz--){)H1Y2TFC0!kN15Su{us0HgY6V}Mi3wQ+*nR}%c{aI2)!Cdp0 zj7>`kjoe~9RGZe-!J?&FnN3Yhb_kzvJK9w4`&}^=4Ugw2i34T@;M3S=CSp!IW=N&5 zwZW{T`3QYzhQxj11h@L%hP?*1C%o^uCEyY*Y$Jm|0{4NdPyvEvhV9%S z<*Fw6wuP4cht=ThS@$p*NDX^S*ZEn+J$aT87=dE z>OMoSrnUHt(sWjg??sAOA=%T|-zv@jAxz?T={uI~-GPg~yNc60U$eiY56b$dopr}) zNmc4E*Fup+Vy7*1O0qO?bRMWS-UYm6zuC$$oGVoA9P5yjDVlR~u#2;P_J}`SG+>px zT$zQ1dExt(NEu1;FVgxT9f7kI_VQq49RQrk zJYzyreTZDiF6YDR3%2D*lg(nbdgg%?7 z4?VF?CWZpkIJSk(yGdcZ)UBkpuQ2WWIj`&N;T2&3?W{3LH*SfIDg{_}_rMKY?qWOZ zq@ydf&UJmhqgwGs42Qdm6{p_A@cf-cm4`mWw<0r}?ye)AoQxN}n*A{Zm+s6t6|qop z&UkAfgY&(D06ALujInAxTqsXdaBKx|14MCQe?wuhRD%`Df&c10mTlO;;e-(#iEC5l z1-BOY8mmx*_})Eo9vTTzrdU=jN1{_yTTDJA;)9ROQIR%}_3wsKhfQmz&@YS;^_DUU z$~{34XSa0GP4UQr6g#K2BCC(xuUWP7jBQ@P)d|W(F3?9ebxcfm{6JjutQm|DTR4n| z61n51BDV9YX0!RYsJT2pS_FuD*lXVhOvCqG3}SI{QcPoghm9O74MEhVdXrw~AYhm-z`3s%2-(H>p+6!2gYWH9;5dC z)H@PZMzSrpk49lbo`?2}i=X2t^ul~LjkJkrh3{VuB)Y*Xu-+MHKfLMkcyUFBiex97 za!{K3-cl)uVQ_7uEi?B#j`WhDOp&}5LOx75$3SBGy`QDCmP>jB@v>2%*?#~xxaDc# zfb8jN{#bWpq^kH;a#jltbRiv=XC>vTNleP%;hvpNz8`=D3LS=Ig-T$EsmKiFD{PFp zz&bZ2zwlh&8fYiMmUu!Cm70LTkIDHm4kp&943#ezY`|b%@2Y<}ewj}#MV+Wy4V6ak zp+VE=OIR85VSIA(2KzWS@QxsHr0kcoaTY*V_#4hz=8UERZlYwlJN9kJtl z&YM%43(V&^Lp*`&ru!mo@O_b-C$fP95KnB0zKoU&T2Vj~V_OxB7q*oQY^$>6AKN;? zHu9wHBPuNY*)-|l9O7)wZP$1l8L0;wC~khsWwNByiz-4op4FigV%s(Iq&M$x^Y=fG z^KdWI=48=j$QK=}>-L!vkDp<^r6N;*wn|K4{n60g{Zy(@qO;H1fcd>MqiK_DXNy z05Y>t5R_%ILj_PfX5Gg76)shp?QtwtS*xu+V-2#@_)8$sq^w8@s7Skl4V;m9|~hk5fIIcZuE(_j5~g0qJa{_??UzcqXf1}buM5TS3Y}du)M$T}1Y_3-Dso@t1Ll5M}cPg!oiK-4gA_{!_*Bv39 zyHD4GV$u)3X%w(8^I5*g7qzW-IgSu})4rBz$CpCJZcsa-Ykr}Y^K&I|-S)Pn6WYfr zml}g97ZS^jt1tbnnFX+oyl4fptaau2Qq*7O@FzUt{i3aM_2V;*j0EQ-6tf_@+Jk|l zDZfz|&#wYd6wiJ)g@c>{AD+!P_VQcsNecqSEbLyBkSut zU<#1dy@Zm5`Dcs)y5M&Bzy9qpcxrDt-Y3bV)ZsmYWt|D`!CdVaOvQe0bE-sJtH5B@ zXtT3$yvT@2IdOp$BD==g7=43-YZkGJP}*d zy4R`K^0+PM4Qlv3yk3)cmI0=s`~HJ!G1>3~KH;e{kBC8ERl>pPH@I#qrKYQDfIPk3 zKi)=bHF`p46Pi~SU0OMV?RIp6N-^3!p{BC(4MO5jZw`Fcb#O@L7Z}~Y_mR)mQ3XS{ z=*h!W(5SbkDK}nH{jNwe$#g44odS>krd?SO8~--Op7+LbB`x12e$&d|!1=yvAp@EW z2x2wskC&`QZ%7j#(Gvz0F${@E;x|i|jnT;2170}iM}~PA)y{xPgtVs27bW+)VWVPv z9D;jN?&bup`|g@~I*)R8lS9X@QSvGASx?+n4b{FZF@a~lDxDqW+BmTM(#4&9cXz2L zhC{#NS22OxjaD*@UG6M)EDLiUWK^!3pCUlthU^su1=jof>x0{EdKJzzRh4FnY)=EE zQh8H6Mq_HO331S-4Ir8%qqxrP%KyUR@cv&c&YMOXO9;$V#f$RAvrLxFB z)2qz1ZW_u$W!bTJ3S?m(H5eTOxcIAWhXhO9x!yPpfNf8U+7r6JnX$#;g`(&3u5pnf z#7VpohT(S5G`qEZJ?JQymGrl+XgKK_{#loqkyw5TbG3DG&)bE6MA4lxX3OZytg2;Y z22^RmOwq4@^c45+d1uA&jole3Oj{ikvJW1MIZc;*x6sfisr6^JV6rAJ6@CV?u2QT1 zK=H`dHw!@};nXh9Y9v}$l_Vf2NCJDfdZR+MR@`GewZ?Gq6+CUr@U{PI!~8WG==xX!7Fg{K%Qqc{Exu-LWS zN(UI0n9e8FI8H@jyklH$d?-J^Bs$t&&B#5gqMxKuRC5+vVng`vOMy2VrJvcSph@qX z)7*BDIYF!a+~X?fAF>(8%q&W;@00K8exEiBb(4O7i{s^{Vo}saataSO=u(N)0%DMR zs}36@J--BUe;ztn40pTtW+W_kp0NE4>*Hc1X%dZecUl)@{5fLz-FwY~rcs8BKvNkc z?Q2QTUFkN4x()?tco%zfQs<--8Gl^EZoEP>nI}QLrJ-@eBEEKoWTax%J z8LlX0yspc!H2eA8M0WAZAu5rr@FvY8sT@mgb4;NiiM-}Lo^J?b%fEG>&+p+c46SRr zv%eV4ew`s>KTPAIleB{0C8+RBn3-lf6PhNf9OZQcr(fsC3D=u5#eXCTk;A_oEy5Bx zUZA~=kMmWvzILI5PWtZ4P}uRG^q=OY-3?J3ChUP57x@DY{zCatm6z}A6l~n>^I@i_ zxDv_96K)2lv6aE?0^*=0;mE%luTHW*=v~$HCs(q@;fUabFYbdc)ryRx%M5t{ZS>Sb z*X!3eyS4GMfbVks68%`irK|mm>vr&1vVM9B!0BL)@hSEw75---2hDdxT0N1-a2g@! z&a2m0R6qHq+@1G1ZoEqJ`sQguFcZmL7M3=iKh-@x{U77_lctt`g(_M#Q1t&Yy-*}x z@)Kq`-)UvNT2}7~#-AKIm8}}SwRCH2DSI2BD5rS1oG4RtPtii<&OI}5zfZ9h$`%Gc zhD~7MwnXH#GOA=>r_aSA)6CWQ&Npi7E}F{k<5yDUF%Si^0D13+XXd8uo#K%-ws1+R zwEp{yHO!KM#M~Jnc|p~ou6X{!=--m&AL8}8QC1l+o8wNP1e*o>{T9`>RR$=qBNSaE zDf3V5YZjy(bIl<_HCuG}b9sM~+-9b1`#yP#usN-jT5{QM=)mt-h5%)y?!$N|?5chD z*inBY0vr~z)Q(;0XV2CU`*{S%9BP?Cv7JGXQ$coEyl;G=Ho?-_Puit3HV-NR^Uw(t z!bhm*7BUEO*!kzhmLOf1k5PYiUzIwumHOEYiH)7T5bM%bB7LAitRHW?cW9SX}j+Kns(#bp!ZG4I+oBB4+Vu|4^>#2(eAnGmcVO zo~-m{4Apd~ncrQwS>R4R`3@xAZAa#B=I2`?q{r?JorCZTk1+CzXNV4^h_+#E}4_1-i&A0Y)6~fOxH^e73e21`j~A251pDK!oOp|><)3V8s-f%d#~Ff z1(BQiiYZfZk&YJQ%3~Ea^Sk%#>QBnqPmb);cy3`NGrmXqpX8Mlwuy1v(zOeHdo@o` z+8*DiMi5TS3F0I`@EJjfIeO-4w+eCmlSlt3v8Yw5cHRLBq>PoL7b*BS!3h!9x#Sx< zhI8M%!J!m1_GRRD9eKEWW`09nNujh)t3dBwjq|4cPz@|G#i!n}YVj5uivdIqE?Ow} z{l!;CM{gec%+8Oz9fsF-FV5luJ_b7ciKRwIqRi}Ms0_4FwK@NY5FD=9|J;pqHc$BQ z0loE5FTaE;m0mg|yS^fb3?IPZ#B!5@W%-|-aFBMtBH|NDU~K?XyIfyjpQX@;+!?}f zMzG0csMo!-qfLHT!e2G321FLee@e#X%C8n& z`H(6e2|$e2*`MzM;+B=!q4mihIMjy}Kz_;b^E|%vUfkXy<`eKKMy+Ldq5#W`$!~tL|rQsAF#1654VmG`Go_iX>8gBcdt|PL?-gS z9I1Kk^+2cccc{Xy-+7ECF#tQ97~aM_chAROuXI zbU}7?N48Bit>-~IvI56m2_ok{(oc%tS8+yN?EUjs5Y%NqR$BoRSOFm}wZL%sZ=!zy zYG!HK=Bq#k2us}-dVjzkeo+)|sq1Lr`IlPvJ^{H&FN|)k?9U6tR5U2f$(D(59$oft zE#DkZcA7PB|L}kVjV+gxOpAYW>+zHPUBqiqHc<6%h6s59{V`W(C~omjC!)#q1i;Tg zv9|0iX^|)Sg;m64DC*Bb9NOsR?4IO%fB>LW2a?UECg~-E2SEM0i31zlUn>|#ME+XN z#Er`I^7ysv$m6#R^&ZWExIlo7$}Y6_GK#Ke=-xhA%_)A>``Mxx6nskLf5!IP!=j=< z-77G=M1Vt(^HcDgU{7Y4DLWF_$67sGTo^$6?$O=Qzi>PxbQo~yiqJ~{nh(*?J$?nz zDUY;-tE94Hn5=4}^{7(Ow$v$}{eH!>({ZC~hog&e-F+L!yLtOo!};;UcmRW^vS-vf zPhb~Vu)v2;wgq1rB18YyQ_s#<8Hh&NPdpMr?+7umYP)0udjdBYz87Ly@CFFg#dZ@%zL4Y`7`Tj?>pKLV`a(}J2&xf$_;_SWp!ee3Dyi~-^^*> z)9&JKgVFkcQoHeA%p3#$xU0u}hc1TzO}5`#=~W$-1IsRkS$2r-V3FV^HDeEutc(WT zaRb&ioV&Bw-k}~L7RSPDF|iD7?Hn!1d;hERnn6c_cqH)JdcbR2Wsf|&kF85TQ??#E z-UOKXP1JNe7z$lgA|+CYWe7lR>>a@Ji=M5q9a^0p`wB;Jld zj9gr8?J^W{i30;D*?M}+_m=EhB8U^x$j?s=fbe>*_;*5!RFSeb@^v%Zd3$lm1RpWT zO&zBNWc+PxV8k}^=#7euguW-|NR5&ts@hEd`3{?EtVR}xpz8S>^4{>hTj?Jw3!U-& zlX-e^d->G9I-pn8N-dsQ`G7=On1k{G9PZ>)eE2*XOlBCqWDEmh&Eu{I!OVEW=<-TKtFrYt1c$5!3yWLT_#p1VndRUqz%{hISE(~`pb&u@t|`$xohp>$hKf0=)^R&ki!Ir;3|7W2JG5wLnB;128~nYu)}wPqx&9i*!UwePH5wf1^9%q&f_HIzOu?xH_v;@` zXYD{$=1*=n*gVl&mTOTLsyr5F+%;BK>^vzrT4M*_Pt{ycR)}S%2m0<6Co#9=&bav)uw@mlXII)dMJWn#s;fC4EZ;YN0)|p(6lLbtB;q6+sbL67Ab&_qKr7}KYp(22E;q)Fvwd>>pW5tO+{J0 z7wpxG6moe$`N%b>e_~~OeqlN`H`$GeM0{p~WCk%l>XicUI7X3b=dcwB9x)vgHJ`0Q zS=bPVzI<5-XYty}LBGn*+C&w7h2@SbBe+#sa0pH3jn*|vI+AIv25N3S?Bn|PaSNlP z$_U%ZERC0WAblHNTZ} zj&7o)2Y#)N92|dJmM_Uxks8>efOZj6EhNXu5a7s%+;X}h-jI9AXS!CwOi5&uY_i@d zDacvW`3KHuv6Iy|n}M%}iokW)4vyEl#jqQevoG-B_`k_~-fT%WgBrAK5+O|VE|8RE z(Jhv0lI3a>-ZiWdLE#Tm$&4Ur$>?R(tOA^M@V#Rt7mcB68b%s zgBmuSPD2XoKaesjUE3r{){Z{oaj1-(LJ%#myA1UVKi7J2S*|O7b^|vxQbawUF4iuG-(6}8QbgE z^+eSz;rD>LcU?VMx2o8zD81w8-R6g@W9=6%>^6}inx1luU)xVTUDsB*B#fuUG<3)*Mh| z;X@)9aSl9E7as^P{}V#7uoGr?BfZm7IP@EWvtA<)wo8enZji>Pzc3+`Po1cGda2c0 zej-h7MwV*wYdH8Hre=N)f+Tm@ppUz0&J}c6INi2>oqs;fZ`@j1IWK~^p7_G;DAT(| zftFeXoCAdjs&Rm!%HaPwVr3i{WxlZ3Uh)})o1=*3^?&}02$m>uipOv$<9T#xy#u=D zOvBe(bMih;)mzzK z=MM=5eobHIO9>D>$wh$m>dW{AIGo5EV1wH6osbtCoVX)+2(6)t-rsH?KL-`x9?9h? z-ua+&SHSh|k{={tUeNy5MQ;6fZ~i*%|I+s&ui$_s$EHY7|Cem+@3NeK%>T+4zfO8_ zFifN}9PH+Q>6zzy{l9)O#R8jB+#tO~_SeV#S04P=RR6v&!~q|aKmrAfunQg3e`gi` zc^O?W$0m~fRg{4Ag?sw%E(K=e|M!#f-+vGBTO<&YyMzX&$~XSkkNDqMl>ae}i*ASW zCHo)K_|JCq{~ObIC4()|oojEj^n30fU;N*&@PD1n2<+UUyd9l>4_<7ETK#7iQQ$v+ z;D7z*|JR}Z!~Uup*WXoClJzfG_uoIe;4j{gJ!Yhoc(RppQM>({E-@8^!fhq#f8P;_ zLrgHyRL2L2NfiE#(13A@uD2j0P2A+<|F&1Y=H3pyM_LsJ$x|uA@d`nyS^DV8vlqU8+$3=+4RZIa= z$Oe1+FTYL#QDu0b3_#Kc+chqDdGcO-OtM5Q+6BpXnV7Pzjs{S#ki)GB+&LDiO>z19 z3%}DPVH>_B37k_3aX~S6vSXT-x{~_qruPiaj3%qw?(x3N99eGH%*`Ao;j zRMFa-A?rURU`W^_z20voQL{>VU#I9(6FKJtYCh}8ySpg*{I@7$z2-0HJph7IR$by3<%o2;#H>2x?gB~Je&{ZWLD0!`*XPt)t$hm zErmiDMW74{T)^0X4wDFB>y#g$gQKg?Ww+m5g=V#`r^>qPJEN~S*gFQZ%oo#kDOYoa zQsXTJhlH48e+9D!oJCtxU3<}vOvpDoi*~cLrk~GkX^Q)RU51DY=%|m&7}qjC#**H~ z{}%pmIcAdLOG*0lQ+w-S^p~zin5u!$At9FwQL;aU%2oWN}r#bBEcEdf7PF%X}3rR=2D99!8u5sC*W%Q3$`c)Qw zMu;J+-J15tDlFLsA5^!#l)X#^5Le1#fE~Y-pKqa!nQML@?CknIgo^!emy=TH`LX4C zt-W;0Sl>!-OQuF!G}88|?1vaF-)3U5Gxn0@+BtS&-WzTEK6|t87N=?uL}PmZZp@TT z6YZ|<%TiEW*W$=B7`2b)x1)ts(H7!%hu-G?<-mN~D@_#Ow*!UR(Bd>OJ)&>m>&{WM zSh915z_T(1P0BxgAreW#&KnedSsd*kYip>v|^h?5Ah6LzsP zbV%JtZBUti#_l}`O=DKEbt{)eUs z`Vahneo7KFKnAVk{#=0LpE3%POK2hc2HZSH*zpHY*c}rU(?ohXUEDpb`@=@mjwyAo zramybutgc2C1jU8 ztFLv-&nBi3WZ$KD5D5ftiU!{w>(+RuDfp&8yxK{+p;LOf^CJQ2 z!aF*jYvp5l*(oq8u_3uVs^+Ex|G16zn4GSMM`?CFGW%sJ5vgi*W6fGgW4#zrZRGSV zjyU0^i3nPOL`6Ynk;sY8*wL=M2 zNw00I75D-@BSVS%OPiF0mlhItkuiT{IQd4>&Bk|r^;ay#8g)9K<$RwGS5b@xWmUwSA-t_Frxf+ z-NQ={T3CgC*>Ab6n-dUjRMVx;*Reg%thAia=S_M4iBoCN9(w&zPYQR7K;ZClJqyBT z@A-Rm%UAPZeRE%Pj^nI;2h~HbCZQ5)EPgBHmfL`_E4_6i?R>kACFW`s-Q?Z~HkYh^ zN_?(vN6}#J6xC926rig|JBnL|M^B0Ac%<566}K8Phh=0T({(~qj>l~*(jjC~BO_0W zt+Z=Pw|-CA>2KC@d+6CW#5g-&)f}=Lxj*TF+R>-EZUx6pXtT%eXMVcVv6YEv#NmGO zn!fAWO%l&6KWL00Lc4iR4%aGESg}@|#g_Q|8Y=v} zQ-?*XG{~XV9a?F!tQ^ccD!;KoU9Hx0vgmiY|HGjacf5=}r*59bGfI;!yh$Hoo}!0S z6VsMjzbC3OtS zstC+P*Ma6{YXYPHl(M#tVMvP2^`6mx;SmYS5a^UAmr1*6PQS$QmI%|jG&8fq8)v55 zCNlb+X`E?JTVppedSg@)!zt>OZ87;d5akIx7!x>M#5%dRs?p+PDCYUcIHy0*8Etoy zd(hlC>oqtLaack3J+a9_}7A36UG_w*P zW#ls%5k7`q>s%;B*gU-zN+aa5!U})ka%~v(>m3thB?UF*Fa<-4_WClohqGbsdIyvRULoi#c z8txC_Mq<6Sh~YfL_2eRFT&v;gGE$P88z@19#Jdmz9FoUBvB&85J`-{lA;0;xrF6AU z&ngrV75H!%vLd|y_~jXu=#~Ebdh5g>D?#j=p}|v8^n%GUcc>6!>vTtahay&raoKzk z?xYcDgzkRsx!1h(FxIb>h zK?`VJuZ@#K+#58C=zRd@B*qusVlRR%HU^?PE?-ADEM4{)Uf=Hpy^GEvw@x0Yn=8iy zSz&Jdl=|7Up-Y=2xC+G@4knST?*Aa{_Iybil?p9FX6zft1bqB;jc)7Ow@*E>so?&> zX0KO8Ccn+LmT9LwQ7NJP66;3q%~fpXtK&~+ThdJT4i=WRovEXyjz%^yo+1GXl9Ug_ z2L{AAz1;1$V)S=XwY9_ZpbRaZetRH*U=5acxhF<*| zy{RGI8vHZ3xLp4!>?9#kjsssRB0xNn+lhCC_&=4^unG{LV5t4s3wHIq2JO55N28y4 zaVUveM}IYbdu;X?6ms7A7R+8W3H`Kn&$#_9%t<(0ro7(?_pZFQ(vz*TM(_2r2-a9F z1q7S4=sE4RY-mGcRF=HfI`NWj4-~>R3N#)yf8)M^ztb8(-0p>%h1vGDBF`O)dtS1S!#&t^}J3j*$A|tCN6C*?gtCz+Z=+`o8s|F4@!h8R#ql_ zIQ1VmOnZ+DE)OeR3K!wBD)n^o@oToBWLIr2C~SO&M#yx)*|g$)~XHd<0W7cCPf8E-!sg^2i!Z#uh5U-EO%#>9ZF4e4}$oR^6n z1zUzSdU900X9uJzuDB(aC3r4vfgCNmV*0SKjYmxfxBj@eU#1d_OhAOl645Z3Da02e z%iKD&RtL&LN}wJLMJ7Ju;WYW7^horp!l((wwYsGZ&~fY0-BW*{X5N_^`@+Sr^Ao<) z%i-cUJoAFzZ#fe@kgrLZ-w2zd93o4J@JZSZvmQsO6Hc_u7sL!Lb0xA!ad%tvdK{*j zH@q)fAF4^ZCXk=H_A*}evdYN%rgk0O>Qq(;_lkVcGNJRN9Kvhk{Bw130`j!oDwz`G z?x~tfx?nFOEAfn?o0<_Fv%Dexb4^25tj*L&=b?PJg2ZH{tEb1)U&%~=c-2;qS#(m z@OLO*ZIfeQh2l6YEo$V++k4NajVP_KFF9&RU)T8prn8c<>Zp3_*Xk_Q@5dQV_UC$- zHjACvjh)#}Metjn30@uJltKpmLNXOp)&HR&M-`tI{q7tf9vIV%N&!H|YL$RZdb zb!+uYmLS^X%V*IrTCV}U{1ok>!s+`!>t4L1zW(Y{BO~~>0hsz|V;0@b!g5lJHeq~0gFUIi=N;lD>-&`ik zmd@6@_Bk03cb0e?$*Vda1(9oH9C_`+?erNxkJ+r`)~h7)Sz2=lI<6EE{E+V!pDh?J zl_yn4X<0ophJBJNfa__(4_c3T|F*wvGbqCug&fJGK)s2tRo)}9x70;nr8Fcjn0)W zn}O7}Fb>Hy?;rOxsa$T^w!YiIsC-|Knb)dtQHz%I-L2eAae1N6xz(QUA!#k% zBo!tDDaGl#2|SM^ahul}%BQ>F=M^`>SZtu-CCW4bHjrK%+b`q z9L-6k9OpWp-kYqdpQQ|vLupn!KEIx8l6Tu1IQdLbtjBAmfV?xhSRoyfvX(g82Y{H8 zXF7!)64z2nhhN#0usTGUa*{F2*9^6#$BMNzl20d=`$WYoCDg@{`9T!n z(G1u1hW{QGGOoA@|7H_lqE7lod!V+#k3IHQNq zv*qUMCp~3(XircvmEGXe|>t|EIdSc(_upS$LpF`-F)_3>1U=r&kaLrDGV3|u9C%^_;@oBKzkg^)u&&$ zh%g^=R*mXV@ZN}*y=RFsABFEJj-IUE|0?MDR^3Gsp0qGhu;1;;!@PH*UwufH)3)zb zP~P3BJM)@B#1E40FOKY_W|X$ITdsf=`rY%Uegx)G{|6kHpp5aLE}%v2Umny88#sp; z4A9l+f8_~Z5u0~KscqVEk*<*F-a{;sF*i}2Ud}f}G@{m5uvgFxzJA(IVL{0PCV5Yf zYWJe|JWt(nFV{>C0YUS^VXDZ+s0Nhx((|ok?PT|#GGR(Ltc?pDVW+=u+@TZVE&k%+ zXtFu;iH62M_T83`_!b;tWTpA!hp1&QdenFjg8+VJ^cx$MWqO*zI&A2WPilSh0g03l z@+^&j;d{ViY?n_hBDQl)ku;A6OxE5Ibn_aTVq2Z+p({wOqo%|o8=fi3CT!dnJ54^8 zj;N7TnR!&RJne=Oaq9?ee;FUXIo77>w60fDgW8CNjiLP=HujOZHQbR8JThOC3b^gO zdHsF^9YHHPQEi0ueo_be6jYg>Cf#~jRwDecB#7#3YhvNl7Ry553xUKYA>j;k$Ca z%@FLm-vgRXiZpK#d$D}ipz0E9Mcz8HvUSYY&N{Z3esxm zGQ|=`=h11&nh)nsxt;)&XbxH!C&izLbzd*xTC(2WsKl;TzUi6YWp7$y9_#zWiDzY* zC{$uiqXn-2n;K5%!hVPTOZYUVj5@3RB{{oF_cX+niZ-8c?Amj#*0+RA*U6^Z4D)F? za9OSKv?cLJl!3QN9ZbJeyTxCbY0@h|zH4 z&%k$`k5{I;Q-?ePwX; zC#u8%;`8RS3Z)?OoMEPqO|h>PFSfE!-MRVg?kT!p!?WXtY-NUPMEHpgBLomt z(E!kg_5WnL4ck3v$#*j}+J1}ZLLYa#qng?n@$Ttwd3JvWn1|Zj?5Wys9OBV?byyTz zR_QibL&}wq$jM!qBSU@8&C!;ge@3UAt0GKo0dC5L+F#uG7opUH?bS)qHkf-4&+(3^ zr<8Luf{Rk<#XX(r!)ZD*PW=ndzf#dlaV$COrN2W*nSpcHuvUm=hvj4?cz7hzK+o9+j*5j&Ub|3Oa+~J zu4_GI3Z-0k{C(zeXz%vb$LBSShJYO3ep&?8&PXgeQ~Gt-3tw~cRvYO2u;`ov-^&%A1<^}pI(}92 zt5JM(b}CEPw(hW;twUQm;~Z1AAirB*+%fa~r|CAG&q&F0Xq~fdFS{Ujj#8|!o4x+# z*VXV8p|DknbuXApb#E-Dkd2+4Uo}^0>*CL%#V@u!aVHHLRL4z1S>KDfC*46Tc4Fwiq~~bY!dT%6sl$b7w1k_m*89-54Y1 z%oi$E=?~tfRU)MTj2z@Twj}{hf~aLQ*?rZ9my@Rx34w;XnsvCK(dV?3fIZ*NCT8f_ zRKL5@0AK}6)G>bH(W6H@Yn=(*4wt)BM~<2)@{TA)=92{++AE_nl090lKz$fvvY8?} zlWAiw{Db#_A70jM9ZKijN4-lSLi1)X=DaOWm2&rz6HCJ4J=**@Q8BEsY`Wu_NYsy% z>x1?24$imCKdYwun;X9mRt~d+pG{G<{?Lu=CctZi`tq@J)BR;{DBkXh1=p&SJ24>9RKCoc0ZnbP2liK7 z|Bsh~SS91o${PodVs1Q-zr!yna z++>Jd!nbf=RfDzuAclaUZMJ}k`RT0?Yk|%g4S->g@kgnnxdHWf%6Go$YsU* zMBlkGpJzxrUarP>ty<(2Ds^dc_z6Flix#a%5@eeehb$Gn@(&7(A^VC0K~b+eFX-^M zNe#fo->?h25;sF19)NK#aLw{*3ENYAe%*&JW0gIivx&pahZwJ)n$uPiOqY9V^W@_2BdP{OUQ*9BdwbhRhSK zP436)ofIhNRny`q&~l>-C_yWK=7Q2&>lC|*t3cu2Td-8Cm2aSnTYFs0O=k_=>Lhfx zRS`SNyCdR$cM$Xm{P~<=JH{ybk}0^?{O;2(_w+2C?=QHB70fo(#=Xh=- zSh)0QGsLH@g>#c@op#67I`6qz&x z&uEaDXh~n^NqQQt4*jwA+Da=WLiA7y4Eif+c&eTfF(5cdqe|aTXu&M9nFoufEP-{v zpq|frveE4x4>cKB!A9d?yoK9*tblUSpX0aCjs;8g{#qC(XkqfOi)*uo`P>Tog^#op zRpkRIbbU$A43t!jN*uLJt!Q#FKPe7+97T~cS1O{yhFbI73}zwKmsSG)fwRDaY5 zi!1(_&d`aWi6f{>7w=H|OJBtfzI;hqWSvWHb3cIR8KFy=7dK>)JlNKvEFq)QNxM(OSxLO{i$ zr5g$9?l$OKn}TKoB}{lwm1-VgsT{)X|Md+xd7yv{hzk zJ&Bj%?~{Ow+PpO!8>JD>L^e&1B=N2-pC)yg-)X#bFfhzpCqZ$^hsPnM;Mn68=;N6+ z;NPr3%?elkMoqK%Y`SAW<+ZlmF-WvV-?%ts?T+EZ6IzuYzrw{z--wVe^ab6{Ewzl{ zx^!=lSJ+=U_$Uwns#@xaiXQk z|E>E*$D>QlrBmh=kyregB>GuqeBO2D4YYVnGs!*cKkY1oMLl-jd&#L7Yo6AjS(HG{ zZI>cCkJq!0r_UwD3~7#Mub1GTikrL6&i$xc0a-*VB1I_=snXSv@)6lRAEMEBa_zo4 zU`yeS+rUw$U!Gx05t|gjovntOdpsC+#8g%^cEj1{!XD6;vH=U@bPqfJuAh;^+d}BD zPPy5piL>Ql|7ZhN*wS5nU4rwoXru7pqJ!@B=PT7pws(Thk+YL3{>NSk$VF@t(+j`` zLQfT|Ye&O7p%7|s#QuGI``#-m1_=@9p`pM0)B9hoWR(|`VnTh$M_gi(K^x(NG0}TY zgoiFiwTuTqOMl_fU2mN=9k^9BX1#81RfuiRfpZ5Gc zkWHt!{C7S>_`0(EIiq5+3GP=iM>KftCqxJ`-%s8bM=dDEb3bo#H@OKCJZz?E}DNE%VkPi60tGl4H&L# z$e#9xH>y`E+^~s1j}vf-@!1`T)e?x1D{ihL2L!0w26YO(-5et;1w5wTaC9m>OT`k` z^T+zww|^@#Mx(dR{=BCT0bf8>;jzVgWCLp&R^T9vI1g@9xDkdv;6Tjka; zw=zKk_RzOSW}s)|(~B`lqF#&)3aQP@RC^(vB4l>svY)klKZHV}Z{i8UY4;U*SL208 z7_uS0T}Rw%l250^G5u%9kSTtErEgoY)pl!r{dVh>!T44{`{9ZH&FuCy=)hgwJ!`wqC8fVOp^-MPP=af^J-rZo8`9b(2AOH84iZ zTh zMh9iuSCYmpt?QvMt4X7NSPZOzHOn?}tnh^LZfUj+zQq*qk{B3mV-J0O(PH`tdZdp; zky(3bOK`3QiJNyJFxB!r%NCjM;?Vmeh#o4NGW!qCD-V@xu8>#tTeG4rju{?}L@LWD z1n6E^uoH^HNuwXKbzCOu+b{;7e#giy@Y;UPESa@~uPR>(fgIa;?Tug88DbRDlbKIU zP%ORJupb$ad>3*BaN^YmVK!g{k`}lWf3*CVWab--TO)sb&Y#mb%yiEcrQ{sL1E%D1Kl#)_Q7yMLw=0J^C15?!P_mRSCKa~tqF z9$dX9Xe1ZQYouf&WL)N?6elY0r$<`1SO;;H?VTI=q?(#$2f@dP=kcxcsWg`QA<)3l zaM6TXN=Lz~^K8PuEEa`gw@x}@2Y%p1V|8x{s2_UWn2Z&(I%e!19@waF#P8DaNtsgQ zeZ|n}FfK_lfiuvpYW%>z?+$#E%wOP!L$yyrHlraRYo_CdF2Ye?+*@=!Gg#*<0vWq* zhJouEZ;p=9biB@*V^>TPbOH!zq%^y8Qhk}qS9+WT+`?X4a}KKzw1=fS22yM;ALW}f z4D>Jz)SX9wTp_GOmR6yUqvWR#zw_*9-rM_du$J+%z6f|+^BY?bX%Ob^7OJT(LpURm zX;H0sKr1Z}^C&IzTx~A@^2&rU6<56M{kh(ndD#`a@tRgchA`3Nv}y1CUZ$b`+xw{H z7nWp1XCCUG)e1WKNH@ls%!}5}7V!G2=9w~{(G>ZPn%SeBRf|u!I#xlOPvEPy_Dmwf zG3+U-Nr*IydjRAwDU3Ot+AI*i>6WZaR&V^M91%h(Fsu_j+dm4JIC4t4NG?w62fIYc zv#;iZQd-ni=|$cq_u(<67~#7wVvGY|CqB>fybROgdFa^zw8rVeaC8yZ-DtCknGjL0 zSKSO^G9~lDrMY*Pm7I6G!<(VH;>b;xcrn-w8{zRVm95F{Xt&}Lt*n?CX;#fbbapsgo_WG34D7U{V4XmOTVA64)WWI;f*14y)w0s^jH zwpEU>Hl9W;-MwjH@Zy*dD_$}@chof?!9$@l+oaHHUsg`bhUiu2PK2%#HivDh6_%tf z59fC#OzRm&#>C??t1Ll4wO`2N8gJUYhJrM>>Ea313?q^nZKrA@bJlM-4~m+I?Z8A? z9BUm~K8FO^#{#ULZo5X&qDW-@b7dQEMDRn?e(k72tFw6mGC6jlZ(XYcyZ%ghO!bw% z3tOe#USN*}#eZgfKCE42z|Xz`=OjF|ih7rtu<76^Yy8p|~qzkjSUaE+_= z9cns*1}Bo8srtz#s?bZ~M!9?8In@dDu6(^9wg{Qzb<1EFN| zU6wf^}FWa@FdLjEPnL!Gj0G zMg9PjLzy;|Wg-h3Kb)-KM-$oJC~i;E-5so59#rIrNXZcnT1OcmZWI7cWjM=CPGJ;XS|8 zwVb^!o8l}a4ya(P!g{=nd~O%VU4vMiB}J_SJ--6V?=Xx8pEil&b+0{VXp@S$z}a?A zPJHu8SAGH7txd>t)RM&Us>wzZG)1-FCNqG}5dMCql_Y_CVZyzYS7cQP5K7bRNq=fD z9NOhcdt?pUS~hep>paLsJJbCl)<1CQ>zxpAkK+jc$@Oh`_$a$><{MlE>J^OmRhKCD zm3V0%pN67PgrA%$`>BCoxJE>c+_V_H?82rt$FiFf)5XTDBN!Ko#iy@_I0n=s*h-wlE=Zm0W=A}yZK$$g(SQdBB+9_6mNBK2-&LjEdra#Gh%l-qFh@Cb8J z2k*=24slI*vCI{gnQ6iMVZbrs)%|FPGLIX5MBJ3TY|73uVjH;Bd?1j2e*TEI>qw{x zhSCf!ChCmP2({I}2T@jg)XChg=e9Zb!gj(%ZaKZ1aVoc9(grdbLxO!IjB>-qdkHuo zUtk}0$8-y}^he1C^mKHd?m{s@ws1?xa9 zp;MwIK5xC+aInYQ;;`NCO>iHpqQc% zE23wgJp6>9=y)_C;B@@xv(rm7qS1MVcBjbbO__6$Z$eva~{_U-j*|9*pTGznT}4CsBNcwbMu zATHzq2bWUt`_s|Ni6-A*wiDk{fN)l&5SxxInx)wx@l+myoDEUo5RXT!{Yd}Hgp+CV zj_#hs3nE@a;c5&lqnDOl4o-R`nF|Eh08h+wLEsl-k`ubw54(M+f7yeGR&D8%meP+&oK z9$1LgmVgzcyq8UWbIdvW85X{4<($M?rM+Pkqw{n}gnF7JT0UB%_SkR!y|Wa(3(Kb& zyZUY2+!99}^v(cGFQf@MSYyo}D{x=gdTUeEq&u02#%sAU0(ExKNc=oBg5mZf2$zR~W}F+X9f1vyg~JT$D`}ejV8) zPB8nT_?Cf)LAx_gy$P}d%RXu%JVnNngond3HnLpvbw=~RKJ1uGabxhPwN~G*B`h?n zm!Not8S;dpswZKrC0zL{ytK^0l8k^|R#~#IEudO==!npxMDnvF5&oUrAB&14(i*Lk zNvv zfssi4JB;I#U~0$A~ZF5vWIFo8HCE3~WjBMl3Wgz!&cYVv4KIA~zZIiQbHU z`kCsNR()}vKTw{@c)9%oK9JvE1TrFly^5R-;YGY~ld5uAD;4c4wtr$N!t-8)hMw0T zc~E7FoGv_u<5YHlv12lR6HB*(-Y++jv2e}EUylJ4@G7#e_)7ymKzip7)WQrUI?YH% z|1-ub!PmIkspvr}ak&8Rkg-9_(f@ieJ*C7XgXn0YN)RFk?*DG-8}#%2nT4*QJyWeX0L8C z8{y$FC>duYXVXa+hJIp%aK6Fj6TB)1n#RFC(~KKi!n{WD^iaQxWZ)ajZ%d|kUox2` z0}6i<=1AV8akoQF*@PtFXMv<_s~e~3-4$0l45LcvnPfjK^@5XQ<;Qm|P>Fb6OnBtI zh%fk5=b`INsY$!^74Zt`jguT^B57#OS1f#I+rt`R%ADjPTeeXt@6(8sK6b_PQ&yji z6?Q?(Rj%gi3XK?nAE<=7aMy9k)0`B860?v|%7rF!{mm>MvRqr!S;-B7(UyAHQ`p@+ z)siRyJ7uhN*5s(9X2$>}fz}X1Jh)V``Y`ZgEpakI#BjRGtv+pvKD59;C%AJHWQYAZ zjW{?D;j~X*d4U;jDVO}*e+(eI9pe!>!l&_|^t#R>JSS<~2|8|YofGG$C346rh-!T2 ze7vtn4SE|*&$Uryeb;CzNY6Dxt^yGHaG^%K@Gu~D)D6PLxaFa{(m1W?4jg}2MZ!qk=ndw6-@6-5eE`o( zp|l)QJsX1%_muda9n=dQ1T8eW-G}iC!LSs?$IR?_t~=L#RjqM*)TqW)G7;hdTil=v zCti`RQZgL9ayt^l#i-xSnE*EOw>>@zfiKbD9>Kdq$5hT}xODF35$M^QUHq^cMKsD>HGqzrj(fIQ zKYw_Eq4&ZRu(Jq8aqPIZCXdI0COc+=lnRoQvb`H7|=w7ZH5|6cIEyha{i!BQ zdkXIcPR0h`V%NOpz{O^!oyN~|RQ)PAbF*+2fBw;DaCzoBZ>u{k{R+S(M@eedUMDK4 zbv*2Q6ME0sf^_v~;4~JiE~YPAE(c~mZ+n|`=dc>u1qgtG1P1c;1Zy*8@NJSq-KP)M zR-`sC^**-}lq9w`N5n~{g{o-XZ0^c2pGFg?ljDtS zu$P(ezz)6UnVSko^*bjokqT!#pU9Z>hnkz}f8yRzi3sU=6K1iO{EJkwdZVQG)vZg2IYMW{8^A30)LzXur{$EO>OFz}Zg8h9ML`c&Kig&j z^8ii@sI*U1IGNNgR!tRr9e`A~wHaN}LRSRf3$w{@Z~GP|ikp}KgVb>R*xSwQDS)RgQ8jpjK?r+w^FA(8SQoxaEwKpcL}-1uH6EaL-&;Ym)&J+ZmHXB zJoDR)Ap5=REqZBJ0Ll<-v#X6OihT=Bk^;S-OPo6V8LXfLu$Ly!6&1dd`Q!{Jx0I-l1W-*7W%u(j!MWH*wn%NnuC)k&$KRPCocb%zf#m2V@Z848zwal7 z<0Tct4#V6nG-u#`zV~zTono(+D`$?BRVWL(iB2U7sFh}v$zCVKp2$>91BDvVk*={? zhMgM2WFZY#*T?MXGL_e++fw|OTCtZw<4CD_W%)Of-UOj!rq_v~NT=`br!<3_R(j&Q zDFzN|Cd2_pZr<38>5YN8fZx+1zPVjPg9BM3L+qzAwS-ms)J!(-k|Q3V7n_DcFSoUBXRXdRiVCbmP4j5{+l1RG|Z|e z7KFeQW`ZUap3g@97GnW4)SsNrhKO<0Gaa8%@Y~ibbuQvv9dy~At*^EP`6i*Z10~P3 z=?pY^7tmtIC(+`{p-Y_M5~0Cj{6&$j;|wvwOgIClGE)J8adyb&#Kr~YCl3GYM~b!S zDR9N+MhHo!S>kBjxW+)=L*YS(z9ep~Gvnla)!53MD`3YFS?(P#?xl)sJN7Y-qk42G zOal?dM5JW5U$j_}%P9goDffg>iMP9wf8rEf;{7WTOLVC(Yb8J`aqte&Ht#v8GtzJA zO4#t{AhN;)yzVT)^I(8M5cJF1kKha9yoxnZv;h>E@b`yLr~4nAKi$i@b}e#^ZwKM- zzb`tk8nw$8xv*@=BOsu~l=y*WqUSDDH(M!{!-)N9`19&*3)+*-g|{ocg#}6Oj~bb2 zrkhhi@CkBoLp|kWy-&UC-o@^}Z*!sGY^NnBXI_+HvS?2}ThC`wGf#nLhe_;xK7|@w zl*X*>e`;Hycne9p*4%Z=VmjyrwWzCHiqFX!sh*5CJSszq4CGR>NiWksGjGM7uHY62 z&@mHiMpTOVP83gvdvzJzF%xNq>5+!x-l;OwV3{qcuH;~ORv*p&wXsmlV8C?l4U1M^ zf*b88qZr(B_n{8da>t3pX77Whlr_n4AAU-?wH1wmMWHgM+$9dZ-mWrdN90(UTN&pu zy~nHWO#Pe-9XA5DbGf}lC3f9VJ3U4!EF`)}A!d$WO|hOao!mL4pknSy=M{^s69*&t z<84jEir)~xAFY$q#%BTeN_Tii#2lW~>wR~&e`+ul@xD)azZme{X1=}4~Dh;aEJ zz9M+szeo=dl#;Z4a6_kbCG7_ofo{&`GizZIQ^5&=JjM6ss`C2!&T8NMFAzlyXU!he z>Dm^3&cc4d>z;E@j_yCMdtx=j?f+Rr)>g;g>;b2CaAS&0y)r1u?>Vb zaL5XOi`$&=rD1A9Zi`SzSVbBo51V^?z;E;CC33nc;R-xA-O{bh%wMaph&2Xv=Z(P= z@AkrK`5~r|!rljN89*y2;b47qrnYMGZHdVkhaZjjgRSaH+=g5apfzZ{we;h2u0P$I zCI>78EnR8ps{-Kw3MsxHCW~##D#jrY32y`NWgK4nE2U%`PL*rptp<-WoX!ArV|Dej ziOh#^AFqAg_OuJ2UNgd*p+tAodAU8^+C!+9PpK4@rX7SK?jIj!)4v&8U?h^h5^SDW zz~}zk0O-}svI*N(`7LTYAEZ-wMqOWYK3lg&+N`OsS;)K^xeT>fjEV}_jIMi2JA3>V zX1_o90&NdbW+rSEJ!EAE4;t%XpWFVHZE*r5KRYdlki9nZVyl|(ya6qy9U1~Qszy;h zjoO?9#EQON$`%6wLD*&hwmJ$mw@9~naPgW}>{0-dq%aHU!#l+72*0*5HeBAE z6JfD+6~E&(i~R{(+jnPcXEQskK}o0&KQm#`7~>JrUTvuHvCf^3d}xG!0m3wTfw=E@=u1EG|g@E&cN(!r|=KQQYhXc!^l z`xkl!t6kU(+mDT^7Fs^g1;mq$9ySeDGXmm`*o*8=Y7?Fv$TV6 zZN@o#?apP@$|70YVB_pe zRf8PsqtjPeJ~@bF&qjDfZ;Hy>GN?Sq+i>z23XsX|pYjpek-cRi8*ncqk{(e8k@ zu9_<$6QZxcXY3W~=5R6R&<(Iv*R{Kg_AE-_+YsAVj8)v(<9v~km6!1gA8-dK3XqpKUw^G_RnY8!?ngucGy@EQ8B;MwE) zX2{KEv>^JWFD{TLWvrb$-Osd*=V`+4Ro!As*CCviV(9DQBFS~T|3f*Lkn+xQ7bD!} z>@~g?Ebee)OtDD6wuhgUCDzb6H%Ytl9cYzD@Qk<)Bh=MFR*#J(A-F79LCFgj~Q^8l6 zuUl-0E>-cIiiFMWta40vY8`S;J~VH-m>rUloLf}8elN!*CX{q4`ysZ?MO`a9KBb%s z?|Lo=w9YPZO|D$teRKMm*(bn%QL$E_+l{+DaH5;@)un$eQ$r=EvYdp8r%=+^F*)UP zQ@=XvHsUtCb-3bE9z92qt}uXZvea|$C9cYEIllU!at5>$h|SuIlC@w9HP63il^~T0 z0#c0pQH4rzn;TD+>E5un0qEmP5&&ZH@ldPZR!o($WO^GyC8*FE_^N=7PTTNtdu{&@ z*tIQTx2kQ%3cu7_Vp-mm@7)FuWJOtem0o`d3MSCqPxk}avbP7o_!I|FyO{TUjJs)6 z(r{}LK$}6E2W!Dxv^BZ53y-4pnNV>v2d(ekTNT~q(5W6ef)L-J`>TQ6Olfl{TK}EG zYx_eRjhR@~4W?z0laH{Sk723)W?OZYD?(qrR?bmA%`kL35qG{Lk*#&6o9Uol-<-l* zjDTz(_FWzOHd?4>R)Xs{pk5(&J^sEx?L()M7g%H2eVJqXE&@2*5tAkv6VDrEO?q6i-Ys``XEBi!iaib7ULcH0c1i0TT;m9USI=@b(OnejFBe5V zKRKKzFGMt$&+FTuKd6d_apU6Ru83*qABbt>naW!v0v^*YmzjDbzRdLy2(1OS67XYU zh(3dI7zvw`E6Q4^Y(;yb+%cPas!0LB>Vhms3E7#$s6Wo6hD3bb@DtQw`q5hMfH&3AD!&e((x4%;|T@*$wwwqo=sxGgt+=vu2Dp=yse&`${tO_vsdITJ2 zU6Y7-ppB9oW6!U#XYlb^WFqC%CqP`zqKFEU5L4l?SEUtm(~icJd=`}Z18 z--E!tr-%vV59yC5NV?zPUdrHekw99r>CS>&^0YW?HN!K5dbliQ;u?1vZ85R9jyzN; z3D;6^ppz@&A(uzO#9b$at;DrAjZOnPz4wZj?ml_2H&*i!E+&awD$p=9+saV(9Hsy^WMGYND%D=eP<4n`<0xyWSNsPPUp3k2^^PNml4) zjzIx1y&!k!6#b@t@J(l)r?7D2=%K;dER%Y7XU&}2U%V$t|*hV%SH(#nS0 zQ)3v?nk9nxNa3kd6w-87)S_`lzDI}1{K17m<<>aMBkZCfE1DI@r_u5l+YM&~UKs<6 zR^o}lRQ%3Wz(G;t0#uk5PcQ9+x94PSRr`KF3R5On#P(Ml5r_*4+J3gS1s`bnyQcR~ z!t7~m{p)NKI`6LcoupGJY}sC`YwB0z?3B1T&yTvTXx#3DfQcbwB4){_?5x@p@kQn#?uZ z^%-V3mXm|~t#+LJ&7$EgdtGc*OFwI_2-fxC7?`lDYaTXacB#NsIdl0`KQSv#X{+`F zsO&!fN{4qaF5g5>_cE_I;88-fHZM(` zB7mz*Z*hlQ_JyXo?srBOxApolTU&g(`?Na!qbHltew7hpGIuN0N^DH!eJ=Vp=Ea{g zD1@AY{bUM~&ytmH=G+EazDgpeHtiRVX0SvtGiaDg;XMk#Eq~MYI@=E8(Q9+{)7g|h zE9&2&rZe##sx?7`(*bmvuP+iew`S=&Tq8Tv%FdThw0wIhqdpn$8OurKiM$`A!pXoV z{p^+V(N=iWina3X0oEl(CH12vA6q4eS5#Grf>FAemR$IFgXM5OK2^pCQi;nO3**xja zTm%9#V;njMD0oKlsYT*%uSC6kSjH{lIV&X2PI)aLh&q;`oNjGAvilo%k~=`(`@#0? z%!fG7$M00|CnGKi9C&PpJJRY0BG`-TR}#{sZc@H10mxP_tCp5DGAXKSPvdlhuhiFJ z@wsv*FKj(l*;?Knvzw}ZKWQaEz`5*-8CWCBTxiPE=?XHb=vRb?RjyzVBwo*@wH^N< zJl!H0KIPD;d8?*4odT^&^4-t?Vt!i;l65gBMj}qs(!*CgL$oXNTx0JuC z<=ohh2zs*->x=6uZr=vA*mXOQuw)p=OGaHfx;`@?8vu$JG=k*TduID_I&CcU>@{u&2lyVjl zCVJWuq{Z*?BB0TrWUNJsYdRG%eRx?I+niMn+CT8H*ciRZv`FpV6e@lxOl?tn4yge|7*eTk$D?B|_QO7;^0BO1f zX_5Fl0A|Jj9QI0Wq2gETvkp8#2mI~vP#tqs%c-es33^!pwo)=po>o>Nr79wJZ$DHl z1EISKJDMbz_o4U~w?W_&WplA08b+$3A7|!=3CU(8ao2&SE-&|Bli8IyU8U*@YN!s704)Ty!NY-4a)m7sKdPAlgf z$c=+hdI*N`&!aG42%Ll+Yr|P~zf8j%HOZT|Z?A7*sAaoav0T@F06Ik2HUw=yGWxS$ zdWJ)80xqx~CtzRUGgDVHdY{mul8bcQ-PiqBKE%Rz^Tz!iK@@5aiRQ zCf)Z}daqNn?L^ZW5C8FEh2&uTC$eadZ6#mxs?*)b^tBJlF%%ABG0#D z4s=vvP=M`5`p~gbL%p}#T9-bwSf^elhTUkMMI_Wc8-(adH~3;iJZ`zzQYq(TM32Jb zNmlTTuKod^O}Z8E{L%YMH9b=|HZkvE4EuKYM<8F>2?Xj?`U$LV0HFT|Nj~w#4LTg} ze!X-bFBZ+RkDC+qvI21y*C|b#ApI%ffZ}DL07jnRwQI|H(y+Xj5ZlQ(!WjYVS7(3o z`8`0?|BO)2V0|=~UgG>zu?{-}r~b-VS0E;y0@z_$0Cd4r-lbr(^8q-@b=K1U>Y!WF z*UW%5O7V1iW&kQhs@r2PQ&;@Bu?~n1wKWJT>LMn9zKURf^k@f2Q#{z7|AT5mZ^KRP zJpkHi5tB4ZXb(XkG)hv4{0SHLI0%Y=V>H2^Bp*3Nqkc&;OY~MU6p(7PBXUlCljt38 zciIUObqEv1OeIuWjUN?m`JyhxnN>%_AdRrn16{zikJCHWnxLam-v2k zW{BdFtAe^(FdmDp(j87)Hu5KVtX9kfii6pV&dxc=P{FMyYABf5CpC>^h6Z&p7D_!G zbz%?2uISuwv{N3>z;PeOp|_V882j(=i)tN-uJP%8QJzrLG{nA|Lau; zD_S6(7o)tyuiw$)b(hO&^FH8AiTe1F^iqO^T0zv5r;OnMjTS60NGpKa@(k}<^n|pWiiGuK}a5#!L6~tf4b~vIsNhJe?9%rq)inggR!{!s?%}zTmeLFpff)sNs6`k|{+*Ng;V!m8nFC$d`gLyqA2lIN-M*UMv_}?4U4w6fg z|3!}ZKbY5ZJTR~RCZWGZ=ij*1(p#{+M4x4n{0H-TacP>Gxn=*COX=^%{r@*+!%-`c zF5O%(eLPL zC6vAYPv87sE~dlzV)O5<^q)7nO9yt{)ee&HR{z6U``@i)3@K0i|G;=)UY<>8UK#h5 z|NY^7L5EZP@6V=W+6!QcS?E+rbAA^F`fp6#zuwG581wx9-7x*@PyQS{QX*h^Fqhsg z@cr+cmB0PDfpiU6f47nUckczDgY!A_h3MlXrhng%OA@^t`?tpL_a&qz363MuaOQVI z|A86>PT&sZf7vMimp`vwdTHo;(oPBg!<_wht6qx8@XEjcaY;1bqo_-!+*SDx^j7|# zarkK(|DSRA-B$b;jCmAP#3gEnk*|!)Ofv55>F;G=7cMMfA>o9 z>C?wH%K(d9URms+`pSicjZF!_Bh3w_LG-!w?JWtc=M@>d?vu;tdtY8bA#!+l*kxsU z??n2*%hGd1Q$1e>f8(&uyVqLhnIRki$9gv&4$%Iyb&({%xP?SCXDP+=jHXDO9)G$N zN5pO{!TbF(89D~(2VdWdkXp(6VBe&?Wu^asJqk29cdS)tgc9;zT%ZGGYk9c{t_|tI z$gsD_hus$!^2@Ch!_>{U^%|*9T?46&E}|F;FNE|^12_L_Hm~M@ef|a6;H>%QMiocj zb#ltM9rW@FwojF5(|A3^qqf4Z@f!XpAl`38A^JKoh_h*JK7na1d=^sZPAP0Tk*yqq zN-D(CU{d-xKA2VT)prLF9(R3tWwG%?NLb}*#2xiqbw(lQCAliY4Q>5%!L{M^MiOr) z+S7?p8phkVTN}IL!`{7%RA*G|0vgK6Zas9syLqk{8$-;P0YY=T$QUx8ntos3kvy$v zKm(YffhK@JULu`;|EWpJ0jH-vX|0EVM5P-f#+*-Q*~1^HH1XmLr$Y1$YrnOB@BZdw zl3XMkM$6oMUiD4qD7mxWW>1W)`{xZXRp|CeN7 z@Pp#4`ln$_t9z>D6JIa<_e~G> z%fYGsF-SZ^ccAg!w@laZp;Lo_Df^{c-FYCLfrwiSpb@F#Y=`^ob(*gIsC9X5C;X;C zcFdk)6s5O2&rJJ1C8$|GwZ7iI*}(NhgqYO}nB*5Uuf@XZr73uGxweJpFq-DRc^_$^ z--3g+Ly;4_sj)9xxRNtwMLD%B#iCyKop?Vs!L5&}e&_OJ4Mzz>qhh>(+KVLbty^)I z>-p+{$zT>lCbnU(>!8K5ija%t%g=3c~%Z2F8fpi$a_%@lp{7vs|$p;gc)W4%ScJ_Iqk*j zL&A8(y~<462~U_eh4W=+!sP*LqG<2$x8;9^v_FwFKigyML4Q=kmE)0gS;1 zRU;|Fz?U*HAJ-oaJ-)> z>eH5thycv(`&pkMhs0WQV;@uLmz7)J-ZCJqcgM=C4~>Y)shBUBLILCT@k~FoD+xnt zK?ySo*Q70hO5f|=+f_-FY@+yDF=TBz{S%+HXEfBVi4~iG=AM6%?sBDWzSQcA$ko*Y zq5$n6UOWh5JL)J|1UbbpW`Ob-lC>!g7-_;6w4Y@2#U|+B>Zqf`mI4ejY>bL+$A;Fg zmwQs0FMFVbt88M^8=G&OP$r4nxW883nylhKA2WXnH{1pMncdT|XV^~Ld}xv8s@cs| z=TB<~uf4e#xb|5gLOn~NOE%T#UXCgxj}c>EwAip*3+oz1(mY3FabGI@2A6YcD!c)! z>XyUNN4Rw-Uh%c$vW150Kjvbvq|lWqan_E%;Q8gxSw6M?7Jgg3^ua5o`X5~y^lcv^ zmRYqxLm57>N-rb=bTo3zkcK@_zq&rC@!W~FAq!24ugbd{inKkE6F@G4FtS+-GCM`E zK4!#G_hTCO{u`@}DmxyZ;m@|3xA8Lc5-u~7#2vk`paPC^fbQaPZE1PY+ztvo_h!70 zN*=7~9K!0ws-YCeM=--a&RFEie%cx2te&1mvXL_fo6|1!#Kks|MQvJt%@vYb+(6R&$3|V^+$vubw6DoIJGbAP5a_z- z{er$7*Bi3E(bZQ3GUA^e>HQ@(x>|gBY@w!|&3?D#fG*RE^+%}zgx9zs!sSe>GVlsE z!|)SK7Bj4^;Fq3XZcMfqMPnN@TehO-%-Fm)j0GKflG-rKE_ou;!J1uSa_u%DLvtx~ zyC2mSoVA(uH2HQ&tR%3|#n zL{;3}rwezW%WVuIFt;A73Td}n`m(yRS_g~Nk_a=j+pkSY%?x*cm#x z{cL3bW3%5EHcX@I*lB&3>0Ozpg<30LiCbqh^4dxq38cXos25h{4>|;vYH4$DHShJ{ zd@U?V@(mV#LY3{B?HC2ZK%W0*np7ADNy7jO1H%)n!wpvQQHADmR~Wg`M;fLAV^vHc zoV~7Tua!e$bAzr=D_(e{UrLL|&Q_a_%(4SpN+RfI60h{d-qTUfR!&%|7*L=NdQA{9 z%o{*DBX0f;$Kpj@Gfc%}d!{j1Ul&fCp9*-L75bZelf`Fvz1g-jn8jqOQ^Xom+FQ?1 z5V3wS)IkJ((O6_XC)5j?$8^c$?$C5LS{=XC#`@5r;C?a2bTL%o;zSWEK`jX~2z5&q z$-a2zwzD&zG2*nD>-0%x&j)pMlyQ18MNA>)msGA_?M}01;>WakPvrzvVH0+%&)pmx zU;#;2udNP^;pSV7m%sO-y zqj>8P5^+Y@5rhC$PzxAB&CthUj(WUb$*;CX!eMKw+Gx_vdsfKX&nU`;?()&V8jt>Y zwpxI*b@j%pm#-A13tvYznAIi;JKbM=L^j9oMS~$!I!``vA>$xaYZ3H`*y))G%f*2b zt`G^1yrS@(#JY>#3BM}yva12BUPKr|di_}Ke@UCqO_R~#INM7|BmrFWA3?dK0H&^h z4M+8i_xsA&*P^=dSFxB?l6KY~VV7?t&upR97qjVGYGV0urNe%40hCf1I7-#9#qmxV zezXvA{|FfMErjZMCvXE-Uo-^xqJ*T#P)`E_={Q3u=$E^^w~hIqA6V+t*~T~OsfBru zt%7QzjGxiAzXW0qvbEDm#-3bX7{lf9CH1o2n3S?I?G~O6&m5uK+zElFJ@B{y;ZSsp zT|>Ug@sXQAtc6m_9d2&Mf`=#hx5{^xF-JG#;BjXiQL5&s;S_RF$tN@z6{&_iWs z>zR*C7%XjtJRVX_GD`-%@j1iw znMIZMGbe|GQy9WNIhTInc_Zq6J_?_b0W>)~#kk2}e^lXZzh{-Vy_(tj(Ju%~cR%3V z>oh`k+32ES%8IA|$>P8|^Lh5PCvqdq4Ho>ONr0T)bE0;<$1kUzmD?AnBJAzu7Yn04 zQ1R>D`^ag*4j->o6!zFyw=K8ufuC5fqb9Brsad5)^ftjii?9#CzW z=0A9>B}Igqp1G2YfUAbXQs9;j3zxb}SAK>nnvyI1@rzHcAUB(hI+Bq4JfGe91#K_#qUKp*#{@^>Q%zE)dX`58v}+KK*5Z<30GfPo@)=nFWP zJvCohC>vr*E!?8MD;v|qEKe1C{QYfhQ~bwTiL?5h5YFM~q1;ZtDJwa| zK)XXPy4>!6inM@ndYoiB}Mgo@4+84VD7K7-#VBp3eV`bE6+~( z?Ik5Yq%L}>Pi&~?Nq5b@QZz}U-sYmJ*s|>reqe>b4Y`EGt=N(JCkl!6D#0(`fEqg+ zm2%~~PIJdk4khhtt366l{xhtHJuZ)%K*NeK2ghYt10(@DiTAyAPf+SP&tD6SNy%LJ z?MUsPG#X}Pd}0_ry|%ic4PTM)Jz}F6^p|X*dqcCg+sFiU>9Vcu-tSig?bQXnlzu;m zq)VbiT6SY`%?aL)yCnRc(%xJ`g~kAyPi<`Z4VL1d8)?@qpJ8(T;pAbhQpYK z!#9z2oIQLHYvGmA>^@CCrBin5#ulzmk0u@6Ou2uh0EzMIE8Odq1uaK5ZX@W2M** zOm8s#2K-+Nj>zAYnP17!#nAyLL+7piahkNDbCf0O&UMCucO)l`(AL(yPFb+>&QeXI?g;2??;M%d9m6iZHM2rh(z@Uu*={mYNvxeFGG?k7u(1_vBOogiHoBb*L;Ju z^H{U&k9;grBWv`CXQ|99Sy10@nvgJArr52M*#}VeuK##~yR%UKpmk zvJtVF7!a6vjkHmoCIxc)FB487tOr_$N6Xs@?yd!^P{(7N!={IWvY}Z|g(|0c z<&I49i;@qUvD^R9?l?ZawEhqSvf=%;`@TH!jAo1y6@pGU1tYFdW5zEjc z|FzwQ@cOjAk&V6Mk|!NszY(j1p(Jf}r0uJ<8j#u%>q>DTQQ42*A-m7oDd`|Gw2@qf z3>8FrcbFdrT~pL8Hj614gG@>;?M}a=prb=sA*+pZtA}zkixT?Zuj?a!gP`V5@|95* z#F?G+?sUBMI1u9xk}VEo^TIASpKc!pxnSkBAq632cm+Yhb+g-?Ap4M4T5Hw7|B) zNq^5(cBIsH!O9T0BQJ+V0yD zIYTXkC_0ZyXL*!&C7BcBypaEXt1)=~Y4|a{Lhjn4+pt>l*<&R_)0&#a-9=ro`m%F= zS~I-oD>kGITDxG-_Z^ol!Kmy8e)n^q~>JbTzNq}exQu6G$WDAJ^;WW*>Q?0~>9}<9plwwCX z+p>V8+pNFDG*u_%R{FrhL+y2o8?ULHwDes|FO$dzW1!bf1P5Y>o!{rD`HX~XJH-2 zm>~@Bj#}PUhU(Xj*jKVTaaN0-seR4*p;P`uSN$)su~U<_SqX2gh!mpxukcuLQEMr& z7sqlKeNCddZ*2BVb2Z_}pD5tS%-VrKDoo&reJXNAt`#pSUch*0Fkw6DEL6}aLhKrd zBcJ3w^2#2%aXhc38#uheVgo32iJX7$B_g91kxb{tFZDlFcbtiaD5D{sor$q~ML=_J{*Lv{(bcMY!Q;`h@y zrs2Aa1gBEJ@2Ai1KDF5Z??+T8oloHWf(#eR@Z>?LBttMJ*!1sjvSSDp)! z`PU#R&7@BkX*YOjvQ|gEFvHBs8r4%4`Wt*nLvv zr7>9i>QF_W#WbmJIlA}kd*F8*G5zEltetjGz{^^| zAXx*qWiC?cd~c)0HODAgR%{-wH&QXxT9>`x1>jiXybKYh=! zrb#U6*5L5Rt zLrBoTg|$;3kf3Tjcek)AVM-zzoFTWUA@bR~H=XPazq_?<*y z;>RqlJ1m}+R2_z5(7wOrV?I{IFIfqBJVyB525tFQo&c@sYxiEt3IwxISdphY=VmHt ze5J|5s;R2xh3J)%HIsr=@EP7|9!S%mpTU`nG)654DtH^RFtxmQfkYaK13WA}_H44x z=Oa6NDC)-xvb$9DT1T6Kj?@QUO5Hv&KQpykPUp1or4-MkHMauiG4aUf?2N0?YAidc z$dbz+a#2(v_m0MM4I(+WcnGKQ3Ks0mg8d_JTf#SX;djGr`(HCY$;eoKm8|%tX}jjj zIKo`*8)N#L3ZeekW8U+=Lu!^H-HrnLplMwjfX>jXR4a zP%I%pt9$M96x20gA^08|-94rK1SjmN^VH758&hUN``^@ow6VAyffReO;jN4OVuDVE z)cE@?v=eNYAGmKT8@7*Yg%>Ru)|!medOsCI>YA%nMt*D)gY0^SJoD*TxN3wS{OdC4w?<-MJAlW4R82a&#Z$3;DgKo~g);6Lyq&TaR&yU}D zOnx(${0%BO5nC)q`D;r(RKp7|xjH9ZtEQbl_|&>!=*d>J(6u{~ z=~=Or2EiDX9CBNFDJs5K6og>Q2s+j$ie%h(P)sc<*UL%`L2k>RwKvi{c+a|!*mv>F z2{MW+6rdOFn?QvIz@UZp;R_!%3|Pb4?)x2T1x<+kNIEwj`xF6fo^5kcTe8XtT^;(` zs59VLhI6%Y`u94Nxg}yBpU9Koa;`SUbX2~JntxUQNE5d=hY^^rIvgRrf$Pb!gl!N; z^csMJD2dPFb{Zz(4k8fW0(h)2f&kvBn`!78?NOdz%9{DdYqKZA&=X5; z`9^##xhqoT4^Hg%g@4x;y;fb-PyzM@^G$Cg8 z#E*~qcF*7!+SgBJMy?p%REWab=zX6(Ey)BdhzMZ->Am|x)b-mguO4uO726yX^T8`a zw-0woe1E|7We#^yb33W2lo(T4jF3gc4TWgV@L|V=d&j~b5S`_@J&W5J;ji;|sEc`m z@NG@H;yIx(14onKoj_pg67RG2A&;uEK=bh4^ZT-JwXWrU|= z#21xFHDiG@x=2e44ZbQyI;xODCPm#-sM5e&e1od@6%@P{Da}B*Mx$BTwXN)Jk?0p& ziHdzj#CRhx$9m2l^cgDdNL^vFwJd_86>U&-Fm;MzeJ>APa7?a!>;U%qLA=7BWElWg zf|oId8z*B{iF2-Lg#M-*hP}X&jEIwQF4^N7(dBXuRkOxwQs0EJl1FML|cUZ9K zwYau7i>Y38hXoZnet+RYNyKrHTZ6zoCuXs|tEM1KO@{30=(y2Y2zk@+FhVgFb12(M z(v`p|!Yab-&~AW016rZ{LB}FH0^V`};+0jJv76H=dNd-gZ`# z7~hak_rwA1Z0kC`P{(kry~LGDLldcxXZIN@pYmrx}Bs}MR%L~@Hd0*Ak zT7IeN`xmJ~+2;nLvR(+`RjV7P(kncI3J*;p=4w^rWMCy&TzQ2vU0 zam37PBAJ1#PNpP^ok`-2*=JIX2w~?o*U(69FH7bSj)MJo(Vq0TS_~!wV{ThW?%FRS z<$esmp=zR${COYpp<_6{V~`Pa&4Xp2>%h#rkbaWd+8@9>3hOwpicE-B#^U!4k^Dm5 z9wHf9jiU|NK^T53SB@j&0uBFn+nC0(G({7ygQ_Z+X8)o&d+ty;>Epqf#WS}Oo$Tf% zY$_h2;M-iL43YWJYHeOthEE;Zcv5`Qyq3%A))q>jnij!tIXLp}8r`_bA#a9+E~-r| zq^-tafxndxd8CI$cW`?NYIlIxeDnqfg2Sh$=kYZO_u_~T!Dx^1!;|I|qX)c4d6fi4 z>tiLl!p>gx>)6Wg`aUwzUVd7YABg~+q4nb{45Y_}QU?{*=0OI-O{0=pWy>Wta1lYu zK**&Vn@Q(Hm_$LZY_k&aG)#!X#rT|p4Qbx_YLYU9<* zM^`>D@DZklPspZx$Ub+)tUY)A!VxV~t=^c%qa6qg+wH6ZvV7Fcou6ca$NRXRI0Q7p z{oh4i;(Dciv)~U4S~Dmbv3&geMVWgy-0d2!9LU~v58Z5frmoj@`d{YY>JQ93Az_+2 zHgZ_xK%9hA4`q#@p~~AJ<>b>4Y!>N=?JD;>?=fEz{i#E|yQkQy&z{10t~PHMKA4zl z&%(jTWp$fMF{C+8QPz0oymP`U`8FC|d8_aw1CJzSxu_5NeYwUF)fJIV*xbPWM}C(^ zUysihLjv)9iF~C6%@{XT-rMgXZO;k5Mb<9gHsx2#z?iBQC%CP}uuYApI+$%*nO-Sd zm`a|AIJVt!xG$*8#QO;mDQ+rEtGgMynzWtAzm5sUjBGIxQfO9&sW0tDW?!ADFdAv2 z&3!qV<>9Hqv}lYzSXKsA{rcCEPAAU}`&<-%q0*=I6FYAr0AbfA+2&vV#YSmWf7bct zqH5cPqrs(^?B=`1hkOUtZQm6~$xui`uDrPeUqcSpoz>AnTV2Rg#>eC@n}MP4+@K+5 zjcF*7Yz&etx>JXv=?H7xa24=n2v>aejg-3_=jw>Ii4-|{TpV*@ksEYDp*?Z{M28BZ zaqnJJ+`U*u@%rbk>@?{$vc$*HlL7?!eq5r2zl{pJ%beJL!TmY)&=QbpqP(=>QD~~U z{53P)2O4_u;sCW6_WZa~e?+1P@9I1p2VV0e*cp`k)NV8y*h-MniR%?_1uEC$OO4^^ zjnSQy&uN6D*+WrCKNl;owOLsT;qgr=^pJ#A!xjg)Q@KU+M6&wnh@VAl|kaBRsF zp!R?B{(VRc#a-oB@}o<|zh}_fw-XKq#qRx>NbwuqRVg(x#Xd7G7?dfCuMy8>kOh6& zif(MjT-85oH1Pt%Ri>^9;^u`Bx39f`ovf8*@K_u@EfAnhwqzaTgO6Ayt~Y>UiY;EW z=itIXN0~$vg4@R?QAFXGLktIxx5|M;UnzlS_(;?pwUf0rc7nvC_J>)Yx{xm|QooWV zm)3{@DYW1@)X56YG3j@Crx}@G2hzws^Z<(CO`rCwYp|RF$mFXtoI^k#GeC);vMDQfbQNlKh5Y2(L$I`;A-Hf17AQ;{o?l8_5ELjc3*buvMzkk|oUs@<}x zbgLp>!OXi-??|ZA?of#r#*Nhnh&d*Qf9jCv`l9e#0b2|iInPI!mN;;=ME-t|`^5HY z-0u79hD#N9mA~!1OMlvxJ6nA45j_;7!n{nZQW9d_xE>N-HK@IymffdIVbJdw{t1Wv zeT1K(GNikY_A*HFpKI(a?vzGlmF`Jw&CnF0omJ|ZmhQZZCAKzyovU+1H^TskBFr_0_#;>!ncjrVZFH$H=GM z7>=S7GI4tBH&8f!SL9EcXKP~FI9FGk_!4ufPl#iUTbpy)Gf3kYzEtsuAL*;}d|t<0f?LaJ0R}jB{Nx+0;S+;1C?+08)%os(sXPZV z8wkOjVxL-&KFCMDEGFU|>SIz7;Fo&G=h3@z7nF}R$F9CO{DP!WN#>V<>l{TE6<|b< zNG2iF_%RhrKvdJYBdYuE-s(69ZRfK^$#Bh0&~8_rRU=lzXC8L6(WkQa{B?@}OsDOG z;MnB#mNF?-)k3XXbFm9a;Z04_x!PZ(LPq9Ef8Zz*)+fb@9T)RIt#ZzdIz_m(bA#jS zN4vTX^FC`WbV2U3qsT+ny}>F1w;t~RC4eobcTo;AyMscx$Ky5q!;7Ym{8(xXR;S9B zEGIWjRNOSWdI#;->BehvVEZl^8afRPqL90N3sY<}b4eiXGt)&|y6)`TZ>`uWjOn{} zA>xHPDiq3VeRMCf=&9#hRiE0!@g1d~EvCt@QpS3B@hfXE9v`fIuc=zS0}&^4A#Uav zf}3gW*f{byW^XGhS1<29IqsX)%)5qAu?*b#6zY$y7R zC$GOSsJiewK0s>%L~c%*WylBf!)S(U!X|j98J}e86*~f7 z4T{QP$PPry2W8*4U*5m**2C<}+|CIVZuZCm4beN;%S1mBLJAKpQ#Q9z$ALpN8H$&V z$*%`IHBWFU_1@$`-bL8X9aQ;>5T;RavX?@|CT~#GCN8LRvJE~Dx>URBl6&0COy8P> zhtS>TZ^^sNrm7xR28(#WqW+}x;H6~^Eh!-g!~129=hR_CKXT#ev?8HqOwKWAuDiA{5j*c1W! z?%Fo{k-{B9vG&OYsC63LUS~LnaTc`84wUP67OKd8qa3>yqRB_8lzm>)b#p#VM6Z&r?(ROgG4 zuq@@3JnlnCL|1TQY86bu8VYJM(MEpwc-3LG19_p?&q|>6`X#83D37wn2_lMl{B1{B zyHbwBS;Jvo<7Y4EPjM4E0Lx8yh$`;wR8bo;?iN0bS&#yk+U(hqn- zL%(q%#60%e!;sPKTT~pg8F!N?w&6H7z9ha)O-+DYm?Yu3wCTRL#tN$c8^TC0%$`D( za*{-xISn-2mM}}J7F+1;cVfXMMB+Qtl6cQ0p{d0KC0_=(d;mPltzpY*>ENpQ;V)(2 zG-9IZ_K1LQ-0pZ+wH|lC9wbQ_Cp zQ`UuIihyJz`34oC0AU)YVm+;Z>f_F5;o-zFDRP)usYS^(|Jk^`wNXordfl&E!55_L zwRpkKm=bdS<$@U0WrTe+%c!x_6w@9xNzZW-QQsJ7oD-V}1oqa^XM~Qs8Hy;|yGu;^ zH6_Zr0k`GAlW%wz~+4!E5x1ri=oI+sN1CZ|?LU7k_E4~IaP4tZu(Y|!qT+ks; zPasmcRC`3a;#5-UuNg~d(yl~4>s!d5;Sk(e%iBLg4?;>xSukr7BW!sQ!m#2O1jcFw z_!I`&`ReXdIF{o+!7Vzeq12zmW?t}JE%fTF(cC40HKg{*QML{XtO{68U|YaGdYh2q zIlG+J(m?=GuliS)zAv3oQi5;rbv-k`P;9Eg*F-r8XREp(Lab6DS%+x(VOE5Cgn)*w zfK&F`D6D7|E&$S3ef@9dt8sE7?vet#@b;2skAY+NUe4dsPglYA`Y?>AGXyF{u5TMC zbuK`%nD!@9B{@NK$D4os_R?u8A~|_tcslPa;(R=D09U#<63vgX9x7&&!4&?9Yf0Lj z)4`ht6wlBO?y9kD#%JqG`7Eh^haHieme${w&*(7MAtOc^-b{qP7|RO9R=Nyup3IP4 z6L3fuLf&z6K2_Ict8(kA1${ZSnx@OvWzG_Zq#tej@)NI%MtDcxfsCHQHzGj-4w_yi z`@l%`zC=Z0G0$5~l3qYpd+1d6K@5)ucawJVd!e(XkcFZFALL=p7BOPHl9X0HVqi@a zkvm?y{vyj>f06j=`>SF)QCzz7qn$e4)*$+5*wp&axGv?T$;F4`egDCOypr=sSG5VR z6S3sWK3A$BYwTKj-WC03jm;leB>M&}1E2Xa6lE%fXJy^8td%@Vf=sTj|2*AA&!Oc` z%iYtEZa>4!mH)o~Z^tYSRpgI)6a`$*lJ@H_AB;^(t^ZwhC(C9Ix-Z z7!_|5W~yk+oLHE%)jM~vkO3Ak%~9a|Cx_`y1nRn{_^bo_Y1w!-nngBt==(q_PnDym z=E4-I@6o}aA&*^aNS=$42*4u)&m9~bqySd(R#^vkk$O?i)>J;-R{ykZr|BSofJu-D zj-PYJZ#JXj6Pd(qB~(R=aKuE9l*EI~jEw&_WnNMNWOXZ9wG>n>22YEs>9iB9sm#;q zvR}>At}*@?@yhp#xx}9HD$yUEq$wK)So|deaQE29P9tv-J-~1Ny zIwpttVOoc*Y_FZEt};lfB;UIgG0_McF77Od%$!cB^pT#7q`^XDR zWUs&Fm9G}a1Png-Jsm3bs;Yk0Eitq-{f;ZlC%^s#q)nSNUu=x=qmE{xbQ5f#*f}jV zyk<$%-1p?)9Vve(R~ju04v05K+mSC|3zH?83*Kx(T;-H zL8nmOf~8;yjNUx=#@J@p1l{5j4n(J*Uur|67&OFVp$7f3H{RBLjY5$ecxr@#ehNG= zn>4hFa~_}9a!!zxxMIL+Z&L3igOse*I$Ep$fgOsGOwhjT+fe1r>2ENl3n_c7O~L?)$(MBTW$^OY3sYDg zuqW+B9HDfq*%ypW841H^IY$`nu*9iY$%AenyM+S3vTlnt|3*EmqW6 zxnGjjP#OwRSe~ls4hZ}f5t)PI{Ur)f!XW!QGLqz|AkIZ&Sp7q2U6L1&j&YX-!J|%2 zVhfEPv$9rpg~mu5I@fBr%@nUBbnq=P>%>0Hq@|>ba_Gv8IrAv5q&nNwOHKsk)yN9j zuQMc1-=U>V|3OO&JKjxBq@)k0q&XrWXS6i5&57!C9| zI4%JSBdo_oWT&_Mi+ReB0!kvTw10l^l5LXi)y66PTu)7@9#U6Ex;l6k3-22y_1#%C zLD9L#E}&9>0|iI+lfp`l+Q%wXi_M-`PN2I}>v5%=WFYj((9Mj_q-dlA;LWiYexc zb@i%6kN9)jy7jAob_g%z`Sx&|*sCMIV4$*onQO=VqN{yVNUAE#f-3jPoql;wk6gX% zu=fIfy=zMua^bUpuT^-Z$kS_gZ!u)m+U}w& z#YpZHENJ9*C0^^A#nxI4Z&C4ds$}GV2C(+0+nAOl-vj-ZWpjX|N8YN)ARzS>-x|MGlslxmwW+h%O7K3>@s!EA|+RrnF8QIoQ!u$AT zNPZv$_r&B0v#TtBzHeX|xGs^2Gu z{PtR_LXX|qd(^_wYAH~4Ox>cF%^2-IEIdY;RHB)1&~jXTfG-s^Sf$ZkB42AifIZm> zZ(297Uq|s9&SSkl>pW7k9A64&74@OsM&qGRL!3PguYF=7&iRV3?e!{#VK~XkcJvLg z5JO#%ZDiP(b7rhB&F>@*-XLEa0#Jq`xil5PkbX8b{`|pEaN6Tva_jiUujvu+xK8ZM z-p_u7`HxE(@=+0Nlq~XQS*CWcHJ``aaVtF98Z9uXdz6)3YX4TWFD;|#Tco`-c6(1` zYkt&LsH31W(bSjJXu!e5Pb8sPsyl*P%b+=!ZmxLmikTf*R^KyeKn|VpP|+-kisFkjw`an5NSPHYD#!@5zBA+BLY;-WC3#| zR|MLBbF5|Xtf)@FY#Fmc4Qatt5=y^H*w1HGGECt6WZmi#Z-V@tw{HV8ED>}-lV-6$ z&?EJmT34r|V{VZ}91(*jKw!EHyR)pCfH>{ia5W{hB1HkJ;*P%OO8jnZk1ESaOYKu$Yj!~uX5%$-s zm&)I>V`%&a;jN`v0Vbj)6O|aJck|trW9VHmuYv2JS4c~l{>f+JR)rVM_o#|@&^^4S z>{o?8{H(z{Fid(QE4^Asm$s(go%L86n8VA4enTb*w0xwGwx?ui1ret3${6q0422Fk zUb{m;NFA{7Ww4X0_4r2sIVa!>k11NS19wH*Ks=qCvfx-3ivg2&OYI zwOiy;W*}x9ctC5W0-7qG9_}u$dD5pQ)60CIv9yiaFL!nOY^=aWL(jb)FL?s3J!%+^ z8ePAz^O^*vD`u^6RUgndW9Nt|R-_zO(!9!%(UrEoDWgY96*VkSufo$jPcmiWJYWW} zYG9!2dW-YoBy&GPaZM}cfpGCHDXmkE+w~)>v?3)_c|P~Y({#IIn!f?0+d`T+ ztU6vS#wV8-?g>+ReH*7ZQFoWT34&cnk1R&{XwP`~WZ+C>b}Oo@o@{_Bb` z`Th)OJSYBhzfAMPFJ68{%B5TSyyDaVo$t=$5(|xrz2#=jtVR=R8~o2Fa9|vkw~~Kc zRctxhJTWV3QQiRe$SnHaneYKLuBa3|#3A2Hk0iqC?PgvgIv?&H{UaOzog?u;cTutb zEMBQvTD74n7k^98TQ(!X zGP-SHLY~nJtDuFo(3e3c)EF@#R%i?L6|#A+_q6CWuWPgT+t3#+?O_>9H_p@Uav52 z03c+%sWC8w0)l%e5R8jm$zqQF0efM~gHzNsZlLR~RoZjLm-I&|D@lae!?!?#PHuDh z$*DUs@71jL*PiVJnLRv1qOHg;#UhfDhJhi!ND0`CSaoYXU?|B5BeE!G1@$$8liPfe z_B$o{sf5R|!)4Iq>pXt79nI09?#?T6o}LLsRrnc69`H|E_cBb&u5?XiD!}Bq0iF?_ zSmn|-;e}D$xT%<kCveG)nTRca*SjC>h*QdHfX+Ayb$bPsY+n6 zgb2dEH`_4Yj_MjHNfLEa1>}5IEd%=u>9~caq|@HEQ@?wyMP}~mRjiw6EiSb{xqM|z zvIJ;HAw!<*f6BgI{QWStXAlLdo!>ah%eN33JZ3|WJ+AP!-ci5Y8M}hpxMK?4j)Kjj ze^^+)G8z|lPE3hF6;GB7&Nc>1xa^tYpN0t8l7Ko!tr#zE97GvX5}X@3M@lcw=+T9t zI!?TNMfZ_>9J6_dQ@7w#qXICX*GfSFpUdh2n3(lCqLZ2=>-i5`15~ z4d!WE=7iXU>CA6W0ZGC|ARza|gL0=Ip}O}2^sz1Qro(M5H-Yu9_jGxUkQVY9Fp*sQ zzS_o`2=~NUt#IxouhGmdvXz~L6Ztwmmf)>8rfX7(&bxoQvEC!YwRo>H=g+K+8fIvt zfkyhhTaa&0+EsO~BTLhea1sVQJW@{qKpH%;$K8K}o#EILtcq*$Gz z7OIiPRr{b_AbHhF9B%RTI@ZP~LEvoEw6kp#g_gvue?ajQWj}^1>RFtThWm9(E5&Z> z5T_-~=jApXHdRK0pg~L^rNCDemQ1OTH*q8x_b~x3f&(uA8eAQ9%xOhG+JszwwK9eX z5V%Q55%TWCpDPleoIC(rL?Qndg1@ralsiO=iF+*{H^yo>dYspOR=SnQ&X|p|0+ng3 z+n~NTq_6(^linxYlEp<-xV=(Xroaok)Nj_;am%d6*~PjhDIgj+pi6^X8pOdXAqc~29WY6A{lKe1^B;yr0KorJyWYw|Y&js#Lp zAs=b;HkTT7elXNWEcGSIQ=$Yuy(ZZvW-2cm-hMZ66kNTXv=FR!SV_Hh zrAm>!l6wL%x9dQk;KRJranj#i-i70QvNilIe-Rvn@SkGgk{@vk0ZQ%{!KESZ9@l;Y z^~@>7j}n(Cy-@&{obYByAA*3|<>~&G=R#4kx51C)K$INE^-`<7h`#2UuB1VP4rQid zX^zgw%FdJAXh6`N%Uc$)OUcu&8qn_Ug5duuh%R*?J!%sw%`ycIpf$x_^Vc$=uxA!p z)()D7v29)a2TLD+(^Xh_D|w*V$6Po8Gtjcs`t-)ewYEtj%D`D^jEZ%uo9s7WON={|FaD{ zmZc`4L-uz*owf_2ypaGD6+Yax?5i0U*^eD0X4l0Ze^xS>bN69dpRMa`W0F*LQ&DzCNeYf-P5(q9F6QeFXd zFSbb)hRi>-6lMcX8y~OT9#FCv$XasNQmV40O{jGmcHj+xrX`5RS{1m^?b@82z)#Mu zMsfFL)1BHuBeVx%9MaK9CcX$s zDaB`OR*Aa_&C@d%jOIAm6Lia0qRGt(0x^Wy)v1y}o~vI8*}^YUQdRyNjwlxkzhJyvpLon zbqjkuB2cp)D{k|D{QBUyqGZ$pERNV4d)I{Ko0hH^?$vTwB6f4?+%*81RxncnKD)jXJDP}r=NU+Ud(Usy@@Z3Wp z=1LyElU^5Iv;AJ*PmRx}#&S#=S_Y>DYu&;;Ru5EKBW4EycckV9`m;K zj+e7B?{T)cYFBwy9JRhapVAaTOB`yOFTM%=TsY&7wy-qFeYotll%C9_dyxGyu5bN9 zPHcO2BLP_{+_VRAhqlrw$}8XE=73a}gpjkn)?QBzOkeQ}_Yhm=;3cb*;-4*Rw>-~X ziKu$aUh1KA|C782S2r$?3&N7MMbj1D$n7N~!{)3j!n$E}{-&)Vv&XzRYh)$dR%5S~ z9QQ5>lZ8Oo7NWELD*oM;d(U&8tU^6roiblC)6wYi*9wZUxFNi>ORJx> zDU#IcUM72>$(tvTsge}(VSHJ8Tj*G(@lL-CcFv#gsuwI*3j)w7j^d#{EF@5N zdRk~NZSY0c*Oi2Y4i3WU9PD(7UosxpAmfX-6b=R))6HUYCODM>BK?D#-%v-m*}W?1 z5+tN}pIOy++BUQ*Hhy!~cc;C#QjFgycQtlU>N)))>$e+Qd-^QDgH`OY02F{fvT!%1B5MaFFCT%<$$h407CZMFvvq^a{LQ)i1o0mw5hYy9!# z;?A%zp4TQ@Dg0_4RG5sq)#vg1?SMS&y056#@DDlLw zF!ow*T^1-zn<-NzzN&HVSglpsW+~G^vPTM?HuYJU1vkCGn1sc8sJvIb zX()OLD;$$)@_{|G^hYJjs&GA_-UTCc(s-d!<0Ea`k4xP5 z=BjG(nU?!&q}!vpO#`y|>QYk^0n-gv)U=A8c2#XXtTL*~xrT@!Z_v%8p2nkgOgxH1 zSCd-5|FL|W&t^w7cX%We8@n{=hW=`yS-_={t0{<3(k3F~W*LQ83Hp@@0C&ZBzY&Qt z1C*l?_UKYi^03bQg8q6$L47TV)Z>#Yx(eO4Kc^V@<$OLdG}tWbI5k2q@t%ibcLy(M zSaqxD=Tn33Q4JrUuamL&tpqlSY71v6PyC_+q-w!yQ}Pxkvo?rZ>2_8)?GUC=OFYWLpe(BLN|!sPk>TX>caFcG z2J3&k=fr`hViTL94!`yEf#{-6h%E(TXuG}B*IgktQkkEa|$XdNnS7Dh_lJbyE8zp(CoVshL~Dx+(ETpNSgSwQ$O3slQgZu1>92v-ru+q>!cG)z)j+TVFCQzcVQRdvg4r7qxq)F{RU?R+=yvFiN!HTxIefK`KF-I9@nMvobA z4Vd}(nk+J?B%OL1qJS^Zs(!gU>3srMCR5Yk$U6JXAeZ zT90HNo+iUQ){XdodHBEn>yP^f&yqOkm+JG0)4NMlLXp!@8p}Vw4g8Cb=Ov&68(i)L zj7k0+kpKC&1den3Ew=ZxlnKkpv(B8MpqG=DQV-acOsONhX?>&=)NeM4_6#n-Ca=Z~ zjI9f3{#U8Y12!;t63$CBf4#`RyYSyWyC-wX!e&yz&3uw_s&tr@`7Znq2@Oy{uLin* z4ilpNdbj@3wf}^}U&=7>G0J~ezP?+l@c%>z`|obWr}}hMqvLi0{($+T)N}yU;h2Se)!)H`@2tkGGASs&CY)KcYpiO z)BNW#gm~{6Zsha*Z-@Qe6;HA~!*#Q;xcGN}`_I$-=P~!sGReN-Q2O5v`@5lXCB7<^ z6sPllHBgW12q~uJDgX0o{_ZsYc}&u|MZs={lnvXrN-S4_Tlw#$$(ycf%m|D$9B6>Y60}5$FKk*+2ul`~A&_ z!+m8!PsD{c@1H+*%&hnGj6kx%1(}Lx=g#b{km6rb6k&DVgE|MkN|tIy99!bPAy478 zhW!~iZkmt{Qh&NZl%=)PDjS-1w>OsHO0U-O{=la$n#aV)L5sT2(0L?y*t{$hS!03XbluYZrhy|M6t|Hy!kOB~Mkt51f+9s7QaZ48{lx~d`#1_OUp4D5`I ztn5v#9XLHtJ_o)au(_#ekA+3Wg85*BZ!@m|_wO-N)o{>IR1h_=w&b~QXsvI=<6>!p zxeu1OizsktY2*Sr@Pzg*&AE^$Fa5yB{KZD+(N$a9J3 z(gjIEMn*<)J40j9+t+2k4F~>{xM1qwU?a-Q>+I~z<9wON+RlWRPeeq7_YyxZKR-8c z1-HGcmBW1(ZYz7HuQ&OApX)~U26kpP4rbO?jF|i0*SB_bkhpLG^PnF;U*~D$V)pY% zR`%bP1uT#kbB33X=MwLadjmtoG2e$(NTxZIk;acz&oeAKMbPwR8^3xB}f9)%Kt22d5o?Y?_>YIl>AHNzokw8iqyX%bu{q)t3dxM&@Wc%{|Xm^YtAE09p1IJb@WkD zHE7S358)eQ{-th?M3w_Z0h@~hGCod=ml2BzGX7M#_uf4U7xL6?iV@btZiu^T+fIP254bZ>IC=aN#ofXOlu<_Ag4PFn8l`qdvsw)T6sChIx2{+ZS2QHQ zg6-L6=vJ1sO9t(scuS{|(SqDcQoGS|yJpOPU-!RK!mEsx5t2v0nRsi88r8EQzcs1n z+ei@sG#WCpiuihDtO$>?d(s#6dYuMl%C!)K{oRF^HW`9y-^=)?oip~Qml*TX zL#h}dtlj5Jw%81``%p8|o~?LtNmbj%CneT18p_O={&@AGY>W_ivSOdnbc_L_a??+; ze2EM!e9zd{wqk8Aop1Fics1Jup);=afSe7C!zt}^lHGo%jz$ksAMi##td=D#NW;K} zMWl2rjZ=0aHd++bT!Qw(w?kRn9~iD2kIrvtQX3z=QCllT59LzNwv04wNc~F?YyET+XbO&QgF%zhMsCf3<-IxXH~Z}9oq9y zy*97=7;JN-SXrEXI7Xtp;XbZh+JtTJ(P;OJr2lZtP;5E9AOw`J$4;hTb?k+WUnFDlHx?4KyJ>SuB)9#oNA*XuQb7IN8OH-`~gyz7S=}?(t zf%$--AkuyPIW(bNrz5VZ<^!*Pkkmnm0(4uBA8mMQyQCqzGRa^{3}V-mi}Vw*pH>qI z$kHkMsMvE@&>(3N1J!M63|Ds&iBIIGwERJazj?rR659*zIGB9?7=G=D7i+d-h^?|X zsk)B6rTflove8cW6-YZY%2L0HuDU58*K~EP#AD)<%UWtO=cx=sF{`rri?$6T?`#Ki z55tJ=F|%qgvucJ^3#!E>rlhbP?Cm1oTz$C^Jsd77AVFs|_K{kD+mEtuYS6^zG@U*Y zwppKHd9T2-L$K$dl@;;4F{^}MJv##uhQm@%AOu}5G%@PPP}3rN-e>DWX9pwR-D%4e zULVpxgn{aJIt2v(H2&z$eh8`;-Lk6eQnPKfaIIZV$-f7TdS9m(( zGSh5urMI4~%yZARR11Oq46``H5nonWyR{peWv-nmTOEhcOIkYfCfg)6;Kx26JxyA; z)(2||Lqeoh4aX9}tB?IXDeBEQ%*#a`7tWvuVI~C+`ZyNL^lR3H_hzg=`pI2m>&unX za$l=w<(u0a$S;1dCo&lzG!~F*-Mv-nF0nF{-|A-#TaPLoty(Mmz@f9N3tc)3bDj^L zR}a2MHV58hh7yDrvbg_gEEBhaOLzeS-^1A(X#z9Cb~~4-NAm~P#u|C+!l6sP)Ov0r z0|iP5>cf%u!V90JJNV$AKjaYcJP*@zWf7X1igNZ7^W4lg?a9*V-`ojdx2+XHHV-Ki z3Y-dww%IEle;zMwZ!q}k?4h&gmO)lk(fd|wT1v6S5`(OPRaV5geB;Wfbk?TNpo?ZDWJ&ZTxbV!DFDgSBF z4fDxz3Wa^>bPR2s`~Li_yLz@R-7ai$L{2$FWPYP#Y->C)y{l}gWzX59Nus(%f)fHy zfc$B+2YN?9aXoHgmX*Gh)`E;f1iiPMx$d$!P#h$+zv;!s@gOn~wNZUQDMjO<`P5cf zbX3f?pFMe^zjbe^bhUpzdwLF_#>QONBFpqxlW-TB<3nKSG+K0jB`5n*dY6JW^v$rc^%Wr}2cPI+_ z;(Nf99p*aOE46OtaY)1)_T?FcZXD>Tzz9RM-Bx96KfS|GCQ9cx#{|i%&3;V#Hs=%@T0R~+8ZAha`?v5(lI8iwJZN=mQMM{<>hKAt$k3UpFmE70E4eShaNAsnfLe_a@qR>mtZW}lScPzOCWGpgJ>2gs;qGbHE*!5-0qV0VqRp$bs-@shYJyW(5Jq%EhERqjPIqK_kg=zS~U0I4ZN)Pf>7N{2^R?W7G4H z7FoW6{}Puot!z#u&TxZUs4lB~0nX#xzcFjuFl(Y(xWSKxOUP}eZJ-*3gio?dBU+Q)aZM z$3RN2Ssh)le#K6|xh;SSZzd;#*1X^hdoysC)f#Ghv^>8-SV+jk+#90B{-S`#r^Ojh zi)@W-P{7;K4Pok8+Gh`AFP*2S6XLn3;KHMpdB16*6d1o|keOOl1gg(WxKYoG=EIZf~;+ zngA`fnvG;NREjBG8Dq$F+z0!-e*L;+I!laG!*iqUhV2@AaxI)izFRmDR8M0z`1i>3 zGcyK?p=JvQf$i*SGMR2x*Iv=HYIr*uBDN<6@!IS~;+3N`yh^Tm; zxvo#u4L0pfnJ6i1s$60blijq3;mPHVn@ITtogp1ZxQS|Iu9P;mh$Y9zNZ_A*=Cs%^ zn;;v&xxvn^Ntus?O2uwXZ@IWE^tvqXqd7M;Ripv(Jcmxi4}!Ug4^Y{*6Pws=RH2zjYP8=3Z0>qyp7n``(BZ3g-0_o$Y zpT9e%oE2&(smuz#xRQUXxVA-XF{H(46S`bu%Nku$>#E~1%d#4Jj96irw;}qI?N;02 zF5W?6yr>tP`l7O*B^0eYzO`Mp+S$?iv0{6jGaABg+n!jmncSo9(##Wq(zESb(S~lX zG^R=)uX{`0vyfK=0$YtJoF^z{z8axKCnnq2EGR!6f$K`eqg_%Pd|ysVPqWk^j+r0{ z@Zc93%I>5ujt5BvI-9g+sUh8+=RU_vi*NZLr@iSMcNbT8r4HBu@8@&MtpwrGE$h13 zL87N@5Z{#Q?RM1sfJApp-(L7x9bvCKQjd- zB7-c-L14A_tbghy5-P`y;IIJx7I|^tIZdWn7_oSY?0$O3HsIiNkkjYEh(*ReX%ty# z7Tuj%uhI+f)s=uISt=jS>#Zh?hD|Po5r=3;m#T}Ne1UsOiB3F47gx?($L795q_{}& zW}?lQb6`+5gYET*BGj$YiM2+9{*ALn-ow3K@XF0zCJ(no0i&q`Nsj80^_G%lFXVMH zva|fA_ZBLr>Dy9njSr^7L7m&wx@WR0C0Q)xAMy0)*gJ0YIreBH5+T~!=N>E3(WJ}C zwL5vi`NcW@See+o9ub8wmwi_zs*N4t7-rYiwi|S3kqm-dLO%H|61=*w#X=z7F@3o` zxmUfvt=yKOnO`tV?73q!sLCcF4mtnaE)u*TS2o0{GNyfm70_3Xg> zR$8?wF&@ZmZ-u9S8bji-KwfykuWxln$;u)nVQC+A_3pzb-hfF)0}(^9&_e`+`z5O~ zN7bxY?sIl4?=Tj_DBX6ltLLLZkW_5CIx7S|uO09nZyLd%C$+XtE)^)XJrOQ2KlDI+ z+coT>V&uoII{IdT?;6t#xK>|OMny8OC&oF*7rIo=s}-Q)b28A2H8woGrw{-decIF< zz>oPDk$ft1Wm7Oyt4>YJGSu7?fZegj#F9JUw{b#7+!GFbluX z2C7TG2G#c0LPA0kQ4>Ml^lW`x_K)P(r<(2Q?@&7R+tzKZQZm`;EL9$Q-Fzh8RZ3;J znOp#MjP28aRTZFzZ5M;G8!8W|orlk&C03#^Yp!k63tDfL5Yh@5Ws?24l^omB#mRZa zY7j`=IOtDJM6UAXmz3o3bXg4m{>5wC@r!1MK*%j@yf-b?<)L=tZzU4{s$9J#IC!*d z;9l>O=gvIFkJU~c*%6On-hI!zn6Io2?F#LCP$6j~r)|?#lWSNHH|@^QbocCawe5}f znOb6H6(2l|LQc(r&m+CyL;T4_7KM|qN}a_;t+csx%C4wqE5+{-u+-O669>_0jkYZf zm4%6%dLsy^&6xr}Zy={bQ#|CZl6Au7^AQ~U zV7~(YPrX~vy$^&GfCY;$144r~A@bL3Fw19`z-v{t0W>u!3UALt<-qM~KuD5QCBj|Q z=QhvJYF!})b&7VYjWFwFo(-#9qhk}Ex0wUG~BcP0em?xEN(Yrmih0zS(DPOE8@2Pi;+i5a=Dg z9NDW0>hWOnVucdJCJFRMf8NUIZlO+w09v8I^N)|$R_!j3Ygv{WU1^BchHKZSGV>}# zQWPJKh2>iG<;f)nw}QZHOL|C{dIY-Sl9^q!=jcbod6b@_a=N$R|M8d~=ZEzylZ>Q%8B>CVfR4MNkERSvUx4$J0ZE8c`5fLm~2 zJA#eh=@e=9jDvuI1qhWMG|yc9Q#G-m@Ny$%>tnMscQH#>%N!%Bgw}cb19{THQu7&< zt9=y?i{;(oK!h$-aiQeHX$0|s<}8p*kbZu!&8v@^>!MuBZ1r}>m%CeJ5z%iv9gXWG zxwZ1a!Z8yOWvmqJy71Dcr{7vfOkB!V-~G^sy2~y66eU|K3Reoc(&lqO-y9{RY>vY+ zpEm3I$1~RevSg>`bw(|>PlPxu_OoPFZ}!i0<(pXT0sgbh?&hLBinTT<2%+sM?Y_5K zS6YP9`Q#jDs58w8$;*0VgrH_)pO2UQ>D&J;gXDFMjD)T4Q+Xke7aWtiMGEiCV9aU) zIQU{|=yTXc+g2a%@-w|bL5?zqS-81gnSeJ!M1pDb0$|Te>0r^-SXV!B{PPLCz5^f)Zvd@re zSr^`k@IZL%m?=a_O6Vf^S#+T=IR%%4ZH+ubaD?P`N`^UxiZ(4d>*JH^x|%)r1-I65 zSZJdMiT)JJK9Aty$_cK$>S2c10lDE?w9lz@huTI-U8>@tgZvF#cspGr6=ltftH;KH zToR|fAGoOX{Zpdx0oE8U2pli<7y^gI@gBK?*WcpZUyuN$4T>{lvbIsgVZo?0pYvW` zlP}Y9ODr8GK3ZL2GB9Wxt1;JBoNg8hvZl9pI0xjb+wzPWwX12Zt3=lKkaj3{st0b@ zz(5MacfEDrYBF8N0pcLQya|nxoBp_< zhk3-mYW>GF|5vU5mh18rh`vI|ziR!*Q2MW0|GA^_ueJVT59wcP{l}X5f3?fGjj0VZ=d?DcOLM5Rl`s<U}%mYXJKJE z)&1f9?;X6HcsxRWNIMYo%=8)f&va+*dT*{t9_8V52ftnDTb5nTaMrJfv&_$)@@Dxf zg8ynIy)r=W@Z^dXD=jzX`Z&c7!-cG^nj*x6fb8d)##h|_KxKMziTx<=6(WQeDQHQ< zeYfD5VCKN}y3=&8VY{bGeOtI<&vuw7w02ScFFav9#KFTf0I~F$`OpC+@b1+28O|m$ zt70`~&zKLnWRG(7?@1FfkHTZMHlEWDK@+oeDqL<=9Mn=Ihgy76T;Vy2B0nZU69T%5 zE7xCSNn5_y&+6wFS^K(4kGWc8v00zrc)q0CvCJG-lh!NKQ_z zMn1dZ91#_l=?VE_+220#gayP)lmS@b#qF`B{q{@s_zdnO*;NN~$MM$qj~Xdh@s>wy zkt{~cSxK6OS0Q#H5q_!~Z}{f#@Bk!1owDu)m)IeGrWWBD00~cw^(5yG`W1FTB3>3L zhPG3kW78KU^_H?YeierQ@lA$5CMZnh?`44~VKaRo3!cNX6G8qz z=JHMc=5NI*MhUi6>m6>KB9BFo02MCHAnVIlj=J{e9BBeUF{eTnO7>5;Won_rQA-)& zJ5!zB`Alj@?Xv)#^;#?*kaTlcCe1ggrd3I*x-}I``1>cE=v0bRIxgqu=cj+jyNt-1 zL6RTP0os#3G$$@|1oJ@ehzd;GE^H3lFFVkUBWM@^6u_&#Nc4M;>}@SoO0X9k)7z#b zwsa0C00h+YR+i)jR3QFJ({Bs+3gF7wwSpx8I=Q+N(gW0zkjPK@t8Pch-47i(K~V*Y zIr)=Tg0Q<3)hgOs4QfZB$Xii@jltI@?)L|HKLV&z80^c6m!9BhjCIfb8CV>*Ik*f0)0bE=W`x3_;=M$}mk zsz1;h=EbOZu(H%y0GjWj@6a5TnDTl=WeVu`Lh-W4Eg(%_D}^$=nq4#Tdo+enp9SuoRv}e=I4xXL$OjwEbL2CpPwB^?kZtT$SJQHEtLPIy<8>3rLP&4N42h0C+5C zcai??9y#|hsj7_P;-jvD$OEa9yYF3}|75{Y(i{rRLiG{cvcJfAS$GfVZ+mcCDQot! zaiSD>J3iMSn3(#gQM4c+d3THvig(n>uS9t(OO0uYYeGnQCbWLQTjdQdjT}bVeRqd#mTY?%5>`dA zyIig(+M<|X<;x-;ma!f_Z}4z)u^%WRT4~OHUZ-wq-6KW~gbr&VJwmHgf2m}|(Gvko z9B(eXas(5{2j;$r&M<%!+ZH!^SQOy#fJ>IJo|$pMUO zR?57KAmSf=hL+l5TpTF5HD02>WdxMC6Si8ltZTxd%c<4WW`s?k!mHy z=l3`&RFC~9`{H6T>sdclB>rF513E^<#-Q=(wt}1OZGgE_TBuS|-2Osy>iwO~^p&X{ z5)M+fdW-qU_skt8P0xI40~LiN*;#vvfT{*Hzm&OXeIm~jIYF}`@X6|}8?)}_YjuEm z3>Wh?OxM+_Wq*7;IY{ct=1Z5&Qi9U>$SYQ4kCo}ey%p^O?odc>PXw3j_Ee{R9&Z>8 zyD?rHU;y-N5AscA5u$s#ZHD`h0YIrYD^n{Jy0 z6wr-Yb9)NK)B%%E)4+?u(CMEwf1$!dP$7_&Nvlab(i(kbE69r=gI(b^0}c^%x%7rb zVb`ltI@j4rbxhaC#N5-{DcMkF2z>i^VAb{%A@airWbrEQ94&k`vCvTv5Rx=WO zylX2|`EWPFWo%4Ouq~-`V|vG$rWj(+TH_Aknd$Gj0tdK=avRqs0`8$=df; zf~Rg$CWHfJn@!^$mzW3n)LcCDN~CbilNFw^*ccJ5!M_k~-{6q0bmmRdvH8??psRc) z&vn|g?X?WxzlHEy_rZ#*%wFhsm*?v*Rk#{0v4q;Uin0nWce1MieQN5uP{)Yf8}v>t z3vHgDenFt|2*|0Y9XngITtUuTy(1UFcUp2K4ygX{CR-Lir>6v5Yn7>koeb@R1o;HB zj-*+!VCS&vorOH}vdy(c^K_}zi7jp6HyqW40ppVYNsWh~Ng$IKT5kFq#9>qL+M$8~ zChU&;^gvzhi>s_RdU#?uheEEM4q+xrvxat$9AlYOW=&N*1CXPkR`Lz=cHU_bSI87m z`5j>YhN!om$OSXGY(=5ID?F7mV+DI_>Djdm2YYp`OMA-+wh6ViH7kv;ZzagCB8rFo z_|U_^dbX#dsp&)uf+ic)f%;H+Qd8xeT8rdj(@cM%JkTES@mYFy+LFQiV7C3md+S4& zTjlDuO)g@sZEbm~ow-aaoNANc=dCQYe}$)f&aa@Ze=qG!E%z@B_u|0F{99Z9|86hh z;&A7*E}ef@Z8V`g9-hshIVnlu7RRiq4eKvIPRCYnLc%QahFK(&8QL`w61;GE`=DZ^ zVp(RO$Ws5^qo=kXxS8xfEEm?r+HS?`$)XPtk)1|wp^XZUuqmm2ao=T;zx>?DZz-PHgbB+gCyGdtV*_%G;(aN zMy$dweKJdqrcv~dd}X#g=(?`G5A^@}bs@4^x`M9(VbU0{=b?GOTBu%xkLpj;{oMz7 z0A%lPGx5ay#vzzX0l^5FLoQaKlIF)}5&}O7aBG*aNjzi}X<~$S`GCNAuXgf$a9Dik zBloRjEtOd7C8M8!;Slg+D$7Le2mMba?X zJ^qE`_c8%RFlT8$%6IyvHF1GNonegEjGDl4hC$f-;|xK8{+{BSF5>9Hb=!GGp^v0K zo(E#PC>97jqgryo=<(^0iFMVNWmG_1)LXI#m+v@?4TO%Zo;lo5F)IaB)wZuDERprO zI4av@tj#v)&ElIwVRVMQ{<>0({$xX_?PQ^PSQX_DEN~hM5Hfsp*1vHuTWNCS7_r~} z=DuA&>Q!69Sb~Us+Ip`jdbTrHCE9uO@R}6(84E#v#-g0kEfI8+{cD4|)1_JH{VA_- z(Zy!%O80n<>NQx`ugp&41;hZxDe>!>A0jgs3xb_sRDIK*s#3Q#laN#>_D)HMJC z>))Dz_QxG#NwBUeZ9;D^-2c$fX@0jJ?IHm4oIQA>j9m(tGQZ+s53$PqnxWmAwj1=J zukyWKGz$)J-MwNRdt8i0=)pPllhs_OqW7jVi}jl-(INDLEmG4JpXfz^%>}o+99#FR z0|9U4Mz(HcgTsJhvW|X!^WDTc>VT4+G=6lq$t10w)I}$xW$^}OU!gjxidn&Khh3T} zmkV~sv8=v-PcA4y;g>iCav5+OBVA_|e>wBr?P7#D;}S}^K(y+2=-I&9gs#?ja&oYI zA_>Uan@Y4V5UC{He{p(I%t)v^^1gmxrC* zmw7PP=;EI3T-#^gc`3W!hM^imn{&)ZtcnPOaABHM+TAva!X$p-laO*N% zyvx<}Kg7G0h60r;i7l6?Smc583mn`1d8d{z8LnVGH$FNjq7og54TPsjQC9F_nRhZF+7U^yu(PjM{1dbr+%xgCZ(@9XA?_O;i zEM2Yb6l!>GcOWt?<8yk^V0(>nb$mXH-9Ec4G+$Zla+%X2+*<<^JrvT*KVqiV+j{%} zm1&mjsT@v1d^rAcYpML4OFeO|F(p9mKbPRu~Yp#8^AOVIW=s0&KsR#l!GT z^T8BbZN9xc)6SGz5ih`25WHW#3rDhE$YJ%UsABtvqk`t|mbZbR0N5?LgIZM25@;uv zo7-h)IW_qN-teBe-n$1CY)Z2M^!y#4WIA#CzyWSJnD28+UQ)1Mz+r{`B`(7Q=>F*8 zJ|7$+v-zOC1pK_j!G-2kxFF1JZ^vslulT`+>*PvfM~8$l6?Gk*!BSdxK4yP}LG`L9 z<<91yzJCF?2zVk!GoND+>CmCr(V+&XmFH*8Z;BGizJ{ol*n?D{51_N8w~=D#iY?`- z-W1HH!2ID%Vcl&Xq2&Ts_cbuMY2RXy+il}nhw|A-C#dNH)9Qjfd4tqzrC-oA=QP0o z`G?cDej(Nmf$$38fTRG>B7=dJYr_M_f#yK2lXmNt#WfpeFQ=h~cs(1yYoBW+V-jW7 zsa6vh_Hyp7>!~Dvlj!=PrAo!+GY(^5vwgtd(Nc)sxVEJ0NQCJazw8qm>*TqxYP&jd zSy>(3Cbz3&J8RUI2o7fRn2y<+9CB8h>BwGQvTeGhr#!F>8#!>X-zgx3$q8NYlg$-f zNA&9gZ96T|OYIk7?rmc-5jpj&g>((}zcTl0hT*mEPsIGOzHbL{_izbC0CO?{m=pF5 z2}__Qal&8cAOxP6DH{Kx;XPY@KJBgpoVhn=APd&saUH&`iWVI+_mSyHQcU<30!P$g z@U0ifFBL47(ON&Nk*AtoVr{)*-pwUwo~t>P7*y0IxZd%`K5V99d+MbGHuJ3eiWh#3 z$F7G6EX(~Ki;#u@kxsb-#>y})N-QCiF%7aAD-#4rNlB+(tKEYAH3mJ+#fNn@)O(jA zg^&gBUAio9DoJn8exgkq(2@Fui(U^1fz%4QoX{_4eyrb1loK+8{Uq{z_cRC$>y`I{ zHwn2ZzI!pz7>g^PWTeDdAFBb6z6rE9UhcE&hs*`dJ-H?4n0>j1(?^dUe8%Wo_{+a8 zdKkU_TH0sROv`RfwmlmNAB=WX)qZ*yj^7dn9H%l=H!bd1;xBrF&gCEv%)+#+8R!^1 zHts)Nk}6wy4FqPcO?o+uRuz*;glJB4(}5&Q?Mn-L4OVx`Gx@6@NM-zz0(tnB1~8G` zH^-0vSk^BGAZ&t8AI58rrSs--iB${npn4PJMA|i$uKm2QrD8s5mK$^)*8z}E-Eio> ztE6;xwyhG{znoiFR}M4m4Mt1r3QiEkBGhb-sSx&fP*Qo8TT z6MwGMLJKdvknTuY^LVq%{_BpdPF)}ix9JpnR7K*OI;Uvipjcky2zKq9VM|qpvO;dp z(P}eXV^O3L@+A#Boo&nbnnHSz-%a)6N&aL9m4%$4%`Y1REGN_Me6eCL2?CiB!2ai( z(#)K%vY&ND9I868j0Q2|!nLX97Bpzh2 zRzj%7D@)S;2!f^6rovjC&;Am_eTD!$qM2*a68eQV-_bHc%8-wb#e)H9q4Ce@HfqZq*ruX1?S7o6 z%xRX!1mPjO({Fp|egTtQeaaravN+yBqF~1)@@@jy&X)R_6>-W0;be^I8ikYJ#h4*U zA3>^LX7|upDm;pYWo2N4RcBo#85{dy0QVi`YZvMZEtiL9m2bxa z@zxqCaR6NuXY#2Cskv(@6Dc2po?+`PAe3gmL4`?j@hz$Kvn9f&hsVYq?r$ph*v~H} zi~})aMotlfj>|0|Z!bQ@t3e_(Y^U;cciXDOZfmlw#CAMfQ~R9r^HNUa2ijk2FN{o# zkTLTgUh}U95C*(C1IYPuWgtwtt%trD$Gof9+%a8yIyBm|#kDP7diSOhjq8fFXJ%I# zrVUgrL;F^`NzVpE@)$KH>??Dge-$eVkCwcB(4SFbY`gkY>SmN)xVXspO4ypt+Fj)- zcoTamJ=9%We7mW`l@59D2iblc9Fmi;tt$Q|&76{rV@}BRE!|gL#Z%7M-39D;o#`po zds#2|lF&o>OH(@ft7ZqP`#W;_J zIU_aiXYTJT(bt_rp$hhg@t1;xl9kgjQi0Fl0s#{9VIAkK&q{DeMqXw`e4zbBpg|)* zltQNWtE2Hlg1mOPAd;$>1Rct#dTxIBL`X)m^-Sb779pgQmI8v$pt7P+dUw;d|3&=# zmCZp{d(Km48I5s3Hc$PW)2H}Zl6jgE)1fp+ZI=Ud`{yPDWpR3C$$izQsdTG_9}HTt zk70VR`Nrnb+k+K292yKh0QtOHAdO3hd6@xccBN<#6RqEO<@#a#;|hSTLbFpwzp)8B zY%fmnoCxl$9LfxW0y~%Kt4$`QS%6&*w8Tap+CTXAmxE5Al{Rt8IQBP81U3W$TNG>d zw%3WQ$4=d=MOj({puHX@NXtQbQM2{4_pjxZ6f~fEC=Y+`7r(6H$8vz4zf-{5H1e=> ziWi5(l3K%av4O3UTA8F#a-V{lpIz zA9>Kt2w^?Ovg_$ujoI=9u*@(6c(ckWm7ZTCU7&4Hn)E*lLDHH z<6j3{V1uzl-&~u~_oyP5W51dZpnLYre^#@A*Q+$ce@9bn97hdIVG(%uf)7yjhXP&T z+Wg8^(L7qm1*62U!?b}FCQ7eu7d0($=*2q-(?I#xK48~pddHf|3-eH zV7!ITdU!B=uiYQzc8n|Vh`D(c5-n6|Ax)80(iM`Eg_vEfJqHizkKpu=)Ch0@d4nk{ z0(t2gpfD#DvsKNyC-#b4OKtMP;E^0YApB7u_4-yHMLFlH9kuA6bM!jJjNy2Fzw@y6WC`B6vM~;%hCR? zUngB-LCyG^upcqIG_p_LU`&SvkkzOGc7~_TE&Wod_zU8E5nf1K3%(p2RRFv>!fBvT znTA6%WV`1CGJ4Y((@5Yg-xc#yKz@+UtBmJ!67af(C87bD`KHtwaQMUyA7iRElH7Vex%nce`FmY~f5Mzvs(n?fl^w%9>@0I-o_Ty-ez-w0wuX6C`Zf zUR2z7ueWl$$p$S+w99a{?0w+RuI8($XMS4##`xE;@Go8hi0;c)_io#P;Q`s~*vh=F zzqILud&>g_?$Gk&zYO@XX3!7?2G^L+!~c1Y4mBJ21iVAeZL{}6nd5w{Cn?iWu$XfT z*SOU~$j_v5TooShdil)}4E{-%D_6W8oeVJ)N(J77gLx4Q5P$mvtB?Vj8WK`c%r=XT zZ2ksv?cn;ft*!AOgVnJbJ|JhbW!e(W#?GFakT39SCF6gvuT#qF(dm%R>cyPbhpkm~ z9l$$68BeY+(@@F_r(xZ;`Z=|qEc>lsV+67Cp)}Z<>(`9Ve+cPOceG&{f!GQ7@c))d zM-2qH?4|oQK2hk^QT+bF`2TiLLT1BO8YzADCb2SVxz1Y&yvgD5Ltz2mFyr`GDc1MYb9One%L#%)H3-s~C z1XCQdev1I53>G#n3FsgF0=oI-wl4hRNnqiSUIc-_PhxD+{Qu!PfMFz%_s;)l_FotM z>=Lku3ky$Fbp9z7NI(xCl2sl1KQQA70SSccK5O*cg@4LVEF9dB6}o@M#V>TYpz!b^ z{Dj!3D)m2>1`@`&C(HkwkBlVufkj;JB}gv&=cL5KW^u>=htdoT^EyG!7{~lxNx19( zpcNMvb~Qw4C8 zC`Q~SKjzo+F?|7s5stU}gI$kVzFC}S;@BR2*P|ZavgigT1nje+-01X>~B#V{HcD?3F_?;z9o^IaKcaS11LM;Ox;8;`nEL zwG9)G0FW$w*u?W4>%E$AUGBjnNanvFRy5n&{bpa200UV@e!LQ0nJL%g?i0ed9?pl7 zx6;%-|1znE=~!rcb>dgw?!dT)yCp&4Ivq{(g+~*XUe5^GO0$jR+3)0q*vcMk>-X zv{k$AF4#DHvri;^IO3NG_EW8f7pO$g(e}?Dh4JX|NFDCT&p4AkA|v`(myS$f$-mPc zTM3<98U4`5!IW)zj+~rHS$wm^Q3CjBLyDNY`@CZJ}-5!XP-3i0^4hW(5A8>>)!Bi)$JO;+x$`0r9zhd z%;o5X`T@$xnG4q#$+FbJPlFS$ZQIpui#yD`uo$e+92*~>Sak}zJG~W?yIj9I&YCf~ z&?G#$ebs61Q_)x1lV>Dbnl9yD3fUD|K4!NY_3q#ceb&-Ii3jv~#do#jnYxgjbZ*~WH}b2s*qYhDwO z6rE8dC!~1c&s!!uv$#MTEeX48+={AR_UEmD(3hZfca6LEhGDx#BO^i?M)tCvQr@TC zhO|T8Sy!>|#8U(AwXpo#dbE%U7~i8{vN1H6|BXB?ZQ?n(mv_>8N-WON(sEMkxx5T5 zGOfQ5RvWq0GksP1cwt12F^3u(FYxx1m+fi6LBXubpIUUvjpmCo^H@dtw4BV= z?{StET!k47Wr)~!Nw~v%+?g+s$N_LsC6Ms?b)xCZ3sskKb7T*Pk)9(UED`&Qjg`(w zZgpK-nIb~O)@<@x&q7}x$KwFf6Hh_R+SxSS){Ml3Zl6c)R@uFIPJdaJjErnD0DGVN zeU^mVrDt@_+zliOa7Z=1eYX<=Ppt@gwChRgHL zf=J-cr#_l5=;8I5PN&^-goa@`Mk=;q*&Z zF#_iyk8*7&s!Nts{uNI!-*RIgRs<_U0Agg3XH)hY{nt`7zDZH;o!YUd9fULnX36i>;E|syCn4!Pasu zdP~|8GT11e_s#YN($BtQUKlJ?k&F=L3s;`AIt&?vWxIZ4O&-UvEmTA{Z* ztk%y7+bzTODA7XzBv2JWYnLW$Tiz~gC{=TvdhX$ne{b|!f-@KTEg6oS0*j=*%G=bQ z^w%=}4IPVOPoB(;`;r?b&^-MB<4{Q|*q9ssAR&@6iJ}!u!y3IWS)40XjEZ0nrX13B ztDjDRZB|S0v)4|~WgNHN<$6JR!tfU6X7|!){T{-T6thC0cL$9YHdE%_zV=5{!=zDr zjNzj2FQEZr9$vJ&)HDnVn^hMw3gWuuR*dP$p9@8A_ta7PZSFkrL1`}FdA z+*0r`m?3;(gD8=##vjm{;*kEr2X6a$GjVV*0(Nn}JKI^4A?^72vejs->tQiwTQhBG z_*-4N{x=mAD2BA$b2`R@#4q5DjR!R6^_Or{V6)r^Johq-w`vBx(weHR36yRY1X|;z zeJ0Yat5!9phwq8>J|r6=_b5!elVOMQIMAu+z1w{`lv6FlZ|-pT;y(Ig)=;_8ZeWbv z#Hah#nt&jCVc|x*d2(vLezLLDcljZWaqMLCtpr09P0uaRhFV$OA*r;tq3%P(xp%mB zku?))Am1h2iP_V18Mm66_RBr#CEYcSbNEz3(Rb5Nu;sFa*UJFFaiJICl}%- zIJ)8zCL@m1u_{HsP#P-R9`sC!W!M_T=KN|MZOCoL_6IX?mX9eAAQ7%8*u!Ne<5S<* z&ijS!nN!V?^@>7+_gG4u+l?}XFB@1_&vC~Yf)J8$)smcDW8JW3!L*%iBT1B$gh2W1 zMU-yUOTN|Ud1T)3CLSpY!+qlVcogTEF)EAv~j7`zG!_IZ*?@ZMP%-BWp|ZZ zNzoU0z%`wQFShwG6g|>ziYk;pPW8=(V_{3-D0$q22lKwz_&_G{NcP&J!&*JJC!#|i z$|O>lRZm^JMhfA#n7C)KO7KPxWs1&8@&A$bdnj9g8%V{-cX`ia_oBabyX z(qHO3@V2`3dyd3aY&101y0aYy4?Tp}h6%y(mn!Q-nXLn|tSd_+2Hg#6k4bXo4=BjV z`EhCGUaN}UDV#&?JR7)6MGAV0c&M^$Edz&7#H(fQ-{Br{RH-@uc6AMny+lgH8BS;E z*zIi*1i2rOZJb~km)!oSM-}9_gw3);Z-nrhA(hj0t&y|y+#dCSZ3hwobhrUVr*$5WZY&FGws4_7jvGEf!m||~U*SawO z05T-Idd-!tIa`$2FCc()e^=<@#qRK+%aR5GMlo5QTJwkV+a;F~W!M$2nL7|2>uFw% z7k&40=)KNS+l-;+<~XxM%9rIBxIZ$y=<_#W!;xE%u$zNzsxsv)4pbxOmjGaSYd*^S z)dv`ndFzX|&!?#%zQp40In{;6t_lhl_~!3bJq-3F?kl7>?@{8ZTDitKJCw`t={3u2 z%(*!e_;jBrs54^8+%-Fd=T7@4geIuIeUg(|#5L$nQEaM{t^mrT`uR)aqFZ#5E;%zw z{X?uca)UA&vKX;jVI4_%NJe+1eX?}=`Ob{&*RJ_37PQ@89eluNO~T+%uO6c% zGFN_>L8v?96|yxdyZY8#PrCWUDkaID;qIoLN9M-8F;xNmk0-m%pb#?tECQ%RRdr(d zrHahbIWytP+_@zQsNvgr>rcMqbpia+U5wYIus9%ZJwg6Z8I*N9{&IPb+@?^OYz^V$ z8)#UT+Hgjbp+Fon=WhGJjJKC^s_rx@aR`c@H)$F;v>(NDoOoG8JP^zugM34yf@Zk# z=@S58eTewtN782@`meH&$zSw5D6PB6I^`w_h^`98{b}ug#@FxdK_7pJ7^;_uWA2^T zRzq78vk@eoq=Ufi*kmf7KjX`*tEmAa!!F|xRN{qbJG^_kw#Bsge6Q?=4a^c59KDcN zE?Q{bNFF3*^#*mj(kdb$gao3WixJFGr^*HyQABy!YT5i`k(M=IH$FLpA2ndczn;th zdqulI2>q~euefm9^Y8<47xIGt0=S9EMh!RGr7{mcBrz$eJ}^csBxX)brLv{XQ;POb zy%C0AWgOmrIK-n@dRsQ=Y=UUy%@CpE8^ulKn=|Kc1kxA28Zudk37&Pdu13dl=@d0d zMCG1Ko5t5AVkQ0J@?i7gC{-Y$x<+6R*_0uX6S9_~(S7 zFgD#m1vv6xOGPqj?P=~g1_oZ>1(*fhrLBfk5Pf1LzT!$Cf)Ky~1Mg|FNRR{hrhZ_> z+y>-?dyW#K&ww`(RBfDEtBok_)Ir<4(NmZ)8+9l&aQzy;(kmMK8~(f#XsJVoz8aBGPFn1`o%;c? z!)JG^xOCz4HtvG7PiE*r8;@!2X|5PPv*@qr({|W)AZBa3N|gM_A|(S_t(RjHFJCHB zde54z!gAM%^Tfw0Whgzgta=;RcPoeJX{RNL33x~*!T%enHc6Sjw!xCGCUO*upEp;xL z=E0$P25a0$ef|H(-djgi*?n!J(xEhnG)jYjbjSuoN$Kv8?ygOTqDVK=(k&pJ79G+Z z(%m8btqnfUTj%@E`#!&M#yEd`|1cExzW2V@n)i(By5?N8gh*e1L9@k2Yko~^ytocy z(fphzeYL67pGi?G7q17+S1wi@Hv8G=GR?2iY!KiP7x8!{);Fp%mhs)TFnxt2%H8$Z z06N)J`LwpsQ}iVcv4evVKLr!xa&o_9Y~a2+$>l$mzVt%AxBC+KeOxlsLUHXuD*q3I zMSK;;Ul-+iMC0Yo4+6dgVZGd+@ftZhY4gg1A~<7&RI0KE+?1HY_mPs_gm?-&&+jNb zTHu%hY4uPH-)#Xca+59Ph&0wYXX_+!FMr%ijB}B4_UDs;cueQd_$f2xCF4NF>3)KR31zoo* zcdD(Se5HNQlkI|_bv)J7BE*>0mYCwnY7JvV_6nIL9ujuss5F6F|4Qk5lQs?ArG~J- zC4ZzU2X%_-ovsV^zOx{>)@o1}nUI>}a~n~q@7RUAsmo510=F*+7dc}m_U15|4M0MxOXNWi$ zr0@^ShdmXg2RdDm~{_5d5wELwXHlVfBK-HyM^h8Z7Exg*} z1xwv7yy5A2BFEC?+F-HsjL8&&l*!d$^rk|lAQA_&W;yk$#~ZJ}sLS=br#@di<8{^v zN!2(ljI!5or2H}HYYQat%*Q{zRuJ2tF>=qg6$)3-0eO~@eDl?aM8)$rSnZOFiIw=I&Zf33ncvVmyb|q$uv>($ref;f;EfvPfCcyi%^ri z0I>lCu`m+2?`NlbY_V0gv%2x79is2?BfT3vv_$!Sxz;&<>JF^*#Vb{-C6jlU<{Hhz zk+F3=C0|W18x6udnivnbJoW1mv&aaCvQ`d0Q2616(RFJKMmjfvxC$1C*#*B{dI^ik zB;FQaluq!nSCA|MCt-8BVeU$!ceu!%9no|&w6tDXCn}aB1^ueCaf1by76E5RIzMe{ z*Gz^V$}3PYD^tacx!R3_NuHHzde+o9@~`3z$ZzUG4!AbNm>6cI)*7@8^tE`;6g{^u znQZ>LC(!FFRk^QTDm$(G6NAa+xbo~SQ@q0!W>Bm|6F$$snUakAcKZl;=XbLf7aJ3~ z)48^sxl!nTNxtAcbj(V`l<8ec8sd!$^={e|XQ51~Rcax|7dCobdvFk5`d<&DS%OZKRJK zuXg5t?9ZT3Aby?{WIc(R|H1y|;?k-!-ePQaw$Ubu5MHVqfk~$z#%X6j)XDILBYIX@ zO=7$p;v)@MOg(oWd>)s?isTupn59R$YDx%2U)1pT5Ps+7``WAVg0u{^Mv1vY+qE$O%22S`6 z+kCN0BS}e;M;5~&0%v@3@#GNYIkU6Na9`Z_VTs!KsPP*r&1%rXe#zhm4iugjWupq4 zbPOl%XFI6g+>6f3JM71t z^*+(jsPn9it<9<1h8%pyYc0nVS-TM7u_WU_O_qVx8V(%kFI?~KmY?ZFMnvc*=TM1< zONscww>Ds^ldwT!NFj0kWq!H_KHlj*@uY$dL+z#49G*iG<77rZODowpZVmD`aL1th z2)-PDvV$<7^7Yco*M0l+#SJ7t8FOQivqVBA6ZAs`8iSPmnJG;iE=5kB>qHwGnV5|3 zCzmGzsn5nHOL66KJ8kieZy-e@wH7uw8fWE&*L37QQ+YevkdA?RJ-t$ApE50;!j<}d z!CJrb@Hd#)IJI_dMasEC}od9KQw)Go%s%mZ#|SSnxaHt=@|f(1t> z^rWm=cp#L+>Dz#Cj>k@uR;a%H>&Rg(;dkD54xEB8TcOj@X7S|HOJijVF>_ z6n-cAMVbXYuj0wVVXkoq*OekdGdoxlI4JK!Kjs|F6G2dR+CNN zR%x7?iQNa1H~X+mdJ>uOXnib7=3($O05C~$U*uCsj+udgpMQ*(2wg(|D{FjT;f&m_rR%E|S!_2ZHe7wT7Z!Q~Mb+vok9+jen8YBB_p z{ymO#$cmEHFn}?l`%mb`9)Xwj(*GzYCEF;>sQxMa-sYs-ezws06L?XlmbYF7t{pT3 z+ZjPcSvak_VTPO(kM_s6CW^LYta}g?>w$E_~_+e`$^z; z50CNX8;s+}-YX<}GZFx3C1(n+)~B0(dey@-qrarlV3fZOS@yCV7tHJ%WMXYJl8Yi7 zdW!_kb#jn21T2a+0GNC#Mze;!PCAz2bxf!)cNfC!+R{4MM`t%OUi3*M0$@amq9P@m@jXDM2W)hWU0Tv{o<8 z3n^yx4B|F>Iq=CF;>;@K$WbjNlhzNpl1pOKasItm*hLI4rOm6}PUB}+t6OP3tw}ue z@;ZfkAtXCy*==m;>ZzmIJ|#%(5+YZ!rR;av|s&ca5~#3 z)Is5M$#8bkKJMwQukx1Y#(>}A!VFm8+5aYlpF?6IBItW;>J&b3S`_gUzQh{)Nesr~ ztEHHPR_oi;{X#aMDN3v?GHv?3|MGO{WHyxZ-0^2Oywst`?_tZ4ni%KH%F#|5LLH;5 zONdXZCrJN8h>vrIbH1h~{u`v1h{j8sz6g$LP{P>S=2)+=AEX6!w0x=a#_yp)#l{Ku z);c*_*%&^bYwM+o8(?RZr1Y}YmH_*Ew_e3^`=vxJQS)^w z;sk~>8tt`z@kWVO_x8P9k|GE_3w8G?0&Q{M`Ng+6>T=hriYN2PUk!>!f_fn{B#l#{ zuJBHDLc#;8^Di;@iTT84*L;?7!%rp}zc_rtAbd_HkDJ|O`Yq^Q88PWP0@iWDl(o7T zB`zY&eA6h%JaYnm9&&p0k`f8ImwQ$Am%ZMe6OlXP=lR`Zz_QWEyeNiXZF^pc662<| zlNvYdi(8TGVB8hFO`RpZHlSGkLed#ah@swf2bXO1WP_slJvsV}*Q50BI)O`5*dTxp zTUSp#;?ebKe0JQXS7Efjl2*H`QtVLTSMUIWaaUWD_%;_e*- z;Mbw&k&5jRfa~>?dA1K*Exw6|<4%A2nY_tL3jp+l(?1ykND~}hwwPl{Z?YT{O7JH< zKiMW~&k8{M_;DcM8H_X#%ikp>5?NW>*QU#tZ%Uqh+dUg~X8iAJGsXc!JanpRPqL76?L)slZw{r&q3_oW|%#ldUm3NZY# z$fHBhdo!U@w(o_g=u1z}RfIzs57VtbKP9U%zH%Aqljq3`bKg|L z;d(VyyOL~3y|&R-ceGJFT-R2=xM*ZKo@|drPsHtDBu~|rxU||#&`p?Y^5N9n$EJQR z&Bti1+<3XbSIF7c>->19dLIu4P2!mVs72S94s5Gkt-*rWJH%Ik7jL>-Z zylqk+&Y&dV5~aC=`lU6J{g#Oqo&k}4=i#({+_szjwcq7>?Ke)1&qif(@|V4Nk_$|W zJMITBgo3zo=_ae=_m?_J-q(HmF{|9Bb!>hEWb-a~efCN@ZvbeST=T~9LH2g& zu|z;XpxLggEwQ}PleW|EXfA=CgZ; z3#!Q-@SuBNC5bbU!!^wFXp5&H=-@CN*>QT@3j5Vghxci4Ec;ms+p+;s+L?h;DLF)Y zK&0}C_W*Sw#IOSAiH zl3N_54E#Td_>XG=N**i-<_Ncxd7x?{J;0dWM*d9&$Lle`kO!RG5{P3PWk z8qF+cuBJw$?m38|w zrNU+!JY3x2^R%nDFe3SncuqU%F#H#TACovU>Nkm~k{)4+1vHy&J((!b1=yiF!7D)M z0~N$a08$F^$YBH4I}rFWmT!|hoflQo5uGEdIx z@hhw{ECv%Fwl#8j_D{C6q-gYsPi>n#1q?i&tOPdvl`Hz)=8Cc8<&_4P$hv)+*-`}A zpp0+jpZ;XHHBqU1U_DW;;jIjLdzR$HN)B9iEPHlW-fSRSEB*aR*G+5)@_Ei}$~k-hGEVP= z91_WiTrFE0+B4%czO`o7!&#!H9B^2v#+MELaB`Uzz2`J~OA%qh)M&g%S2?AP(6@Ga zO0UtEiu8FQbpvNdB%a19p~TH`5V*tNI~Bgts)!`=QIhs>#Z@R-$pY>JPk07~#;A@1X;=^ciF4k|tiD|T|Y>wz#^WkWYgI8NO%k0;h z3%Az3bhBzUNVsfH5p~lpic*ThFzwDYUtEmhr#53i{t@TjxZS)$p08V6XWw-HszSag zMGzw1OZNH}{Ln{-xjFKu{~PlHoW1JMPGns{zf?KL<;4c;{z{R?IKx-NNm!UdK3XSP zvm7msWzh54iVQ-$bvm~Jmf`}!tSK=_D-!~R(OEOl6|#7KXSYLz+BxZOH2`K9UU;+0 zn!cEN-}R**ygkd(>sQaPlCFRzA%i}c{ZAoG8G@92)$)BbzxHIieyNkGSU9gy=H%O~iFgxi=)Mg&WIq&_m&(%}5AlV}< za6F*rH6{GHWbiZ(HQ~Al1-k8@p&G{LeRrJ7(9XcYO2~Njg;3;`0BT1+?3Nd48#~C zS&1<0yMY@=jQG-LuH#eUy4aI_ zfX0`K;jZqkQmG~`(8JY2N8juWk)R-Iooj+LGiDt?xTf_VHq*zw_&z0x?e{W)0% z2M^G$`6EUic&P@yjs8KvCDAQ)#>IYpjsDW0vS=0|JBw7Y`6*^6$ehceJ;Wfgy#ovh zl*ym-c7GjS0A%k#n9||Ez3O~#SFlAV(D?Q*`&GV!K3KKkSsw_tY;(Nmgf4zJ`*O=L zCR1aqk8+5a5BKp#MWK_BJtP-Mc+`6B-ii}Jm3Xt&o_Bc}(_fq{PSu;r4L^C@69vUoG@RTZY~{8|5DV{?2F5RmG;La`L>K>+npic>6v6e z{hYjuH5E0Epe4B}^)4O$ukU(o4M+(ku}0|b%<2KaHPmpAyFAr7!XigHalm0qMU6=E z%yo0IPpCrm{J_#>P^J}uD#aaeC?@sxTC#{S2?Y5XnQyohLtzn=9P)h7cH0&{s3HB}vP+`@-)Rkn`D@kq`E7q#Q6c4{LqEOV~nFvu0 z?K^_V@N^5f?*}G>ISrR1%OAy`^baOCuXOyD#4C=JnZio%2`EOTw--0yYeV{a1dScE zb7pN)CpVuQ84D$6(+vNB-zgd1!k(umR0zhQ%trKR35Y9{vHwnZnEoB*UPl=IAKpRS zH7Q5z&bzQMHnEnFuwd29Ho}-kj6W-_5*^r~-CBxU4HhGBVSUX9JI1oQ3i^@y7r+jwB~O$K~GG(&p1v}+Rbw2Eo~L>G)Sfyb0XfeFl7Hjq6)u2=e_iMR~mi4fKcK% zavkLAIl5U5E0*!9XXEJLL3bd|YyDhDHw4BTobIip8P8r_j@Z}sjUf;yDh*~C#)o9s zJ5!3i-d_rpaVbnqAY|5kWo<)&v{Vm-No(uZ<6tq<7bAlvq(Cy%+xx3yw?A{pjLs6C zg=*-=Lxm7K=M+@>OuK3Fd^8cc19uIa$i;c`RwY1%0bCKMlq+`%c|83?JVWGlkpTGR z2zqs5?u2Uu(3}wGSFChL?nTqpFSV;vr&E9Pubsj}9o+zp8~ilsS#QsDQdxb)mbP_S z3+~K=RF*0cM{3GhT@b8xgYGzj6uTn{fL!sJG#_`}mSv`C&`x9JN7D~m094tUX9lDi zPp)(}QU#7?w~i%+Y~6gOf}BY8#sA>yuxKKLh3J0**XvG!-F`}qb-V9;4A>>jLF^nA z)p|XT)2V-&l8O$scfYpYu|8x2T&VPn5*15sPHOjN#H||C*Z1LE4X8qfM)Sy%cj_)N z2_)vB_m5us^)+88dY>;~jS`r~ZSpKK=*htl=pR&RVdP|hwG@XwLEGT50%|(UyC!&l z^Ok|YQ6fZFoWe`;T*)aylGn{owjt&AgRKIm%oQjxtFsk%uR1&r33MWfhbH-rEjodGa3*)jCGkHGqqsXT#U>G!-KniE6jgNr+-2ci17CrXM{(nPh}A1s&3 z-(VD}=;gUeH(y-US9ag~v(^vizMs2OVm4s4YlDIStNlWv<5qJk+>0Lg4b&kFCRSEw z72kv_S&AH+sA*}5$2soOyB~MtW{EkEnvx#e?*@m|J}0kdQmZPOa=Ua^Y_@?|P7~^R z(KKHiC;k0FS1@tiN2V-_!%=xwq=JGs{y;$)$F(t1K>l8>3lQX9BRouSG+;j>4BNs^ z9}j9P6evqF=oZzKNdQv%>rLGRC`&}fxz8xHXAj#{WJUogjVtaq){phQtiwspP;;t^Wl9+zO);tB#8x3Z$0C3HA<6@;hseU%I z&2a&r&c44Exp?GERgr&572f%paEPs(S*uBV26{5x&28|te#=HBg9%;4IPV~my#jcLFc^>aK%0Dw>2-Uj-MSXj7j7Z;Yy z(Kh<4`GW_ByfG-%eLhqS<#BjLEMy+lo%(b%dvywv-h7~@Y-+STyNfN*;@47>7Y!fZ zIAbrM&XMUOb?RL;HZFRA6H`76poT0R`QrK`9tcHC^kRh6_0|`)5Bh60N^NZ!@HFnz_#~ zQFOU?-NE{~Z_(&m=Gy>?8tOafjpbfg2}ys^{8Z5M_or$r!9f__m3VM6t2?@JB5~#w z#TTl)ldE=hl2*HVP%(Uo)xH$Z%{gK_^;rY5@L-;U^^el-6Hv~-8kIlT+p}jknxkZj z1&p2l4c-Pqar-maM(}}j2qu|rl}p7x9Orf0P0z|tl}AXl7%id!lr_G@Ncw^F*@aTP zf!P*dFV$AUbW*YMx>r)&H49WAeeHmjq0?CCBI!UlnK3LL`|SSy9x*#iv{*eeC2iBR zhaAtTcb9)`rCP`*K7UpgZ#sYlXrU2lTP~TuF;o+qnQpQj@WD&5^E?t?LLWuzcrawAn;tI1?+@LP>7n0@oQD&{`jxl?R zGq2VR@hF?i7KB#R5@@baUVm0|A~$o_x#@G*Ci}JHQl@|3@~lURd8}KmjERH|(X3Sz z?Z;p{{EkXvllS-!>nxlDFYBR?OAxDvPJ6%ev#v&m-Qk!*IP&>1j#Rl~&J68O;a^2@ zX~SEaa5T9pLtmTU6QU?9A06~Y1H_Js6^VTeEx5xf zo5|&qABA0SZ0^qXBs>J5fZa=D9KR`ow}CgH$@*|HleJbQ?q!mw+}X}1pz(sq-52#c zA1)AQ`GnKZ5JV9V7rxwk^`jWC#`YQx;Dv!*c^^llOl~Vj)C}Lj?Ue>B)ai~srX2(k zH7Y5PdV%esw1k&Ehb$Jy9s5RcS&ka7B`$PRT+@M`hdtGXJ(e8njgdsb1^Osub;v^A z!ymx}m7U{2yLpdx$b)(jUMgoyFY)S)W<^&LZPi% z5A@_#gqJEu2R=}BX$%vf$C|$9TC#UdOFd6~ql#k0!0(5~Xjx$$81GGKoZ5`A=sRTd z0n!=;8Uu`SQL98LC*dQ(UuA{gAvZ04e4pJDKm>6>_HS|=Wg+4+3E7;k=ZV-{ypg>M zQ)+?N3iV+EnCN2T^}LtwHRRKcWd4p{G9hZv>~nCtMZp*<&nQ5-eo|X|o<}9fF`>F@ zN}4(A9)!tZMcaL2mPRbFJB!>VDs}DCwaNd&Y@-O#X}p~A_+tIS=GKK_zcur-18p+V zbe~*$G!@HU{jk~+IeFv#WJ$lOv;AFYp$bH9qSA|AOZ0jtH*IM}&!9`51Jenx<9b#Ufhs_2({@L{+h zbXUu%ff$^zv;|)@hnr;SQ0XkA6eIM-Li~ zQ0xzc`*l(`s6hio=W%3+LZ9boiB|lU1N|MpP1F}(j~JywS#SvnO`l}vq$p-4kjDoG zzHm1b_IY1o8BX46Ca&r~8L};~8TFnevWu8I1`I+hP?$%rS>$zIkIBl)YG1FkG&-JY zUTRh;4C$BFW`_X;z&wO8(O!JL6nN^?fVEpn7<>YEb<(1FyK)Y?l%(EROF)h!h<8RL zKK*{9z?2jt%St2Fe(|C@8UnMeNCs>LI2u?3!PwYgJa%2Awyu@@gG9aO7NIwnzXShk zwiNFt0Eaze=o3gnv_p!x*1S#)5+_mS;-@`wFG0SXx7)VM57Etd;T--cWx=4>0 z)4vzqd3XDaft4i3hCNH}zLC#wa)@?AP&w_7q5ZPM7H-J}z-$_45pcHxv|zWxQ?M~n zV9)m*zsIQHL4YStx_MH;Rn*aTJ?M*M>0)mM;$Q~3)Ymy`MWjF0Y}a%LOFG#HGanB2 zg?)3u(#YW{!rISZk7m-!>rCJ{Tg&}AFx;;d2B^B!Q0G+y$50YOL+#28=_+G*} zKX6XxL#~@;+r^)|S~eF!heutM0k`3P&|s$w1KL}TItK&sZ!eh);_{TaX~@E#j%7dj zyI|3VKF0hZJdR<#eyJ2%e+!cz;>`I;N<3gdyz!~wpqsGEkS_2WSmHF$f#*5!2_6n{ zKjF@3p@54BFX^9kp=`MnxNBzR|HqIGXh6H)C;k-WTcGSNH*#1%Qi87s>d?e*PQp`7bZ|0=q`YefQhc z?!WcbZ*2G9e)v5Bjqud>WFM*glXw5Qjz12##slWR%I5#_HUCfR@aM(<#kT$%@A=O! zL8Joq`9yQ^U+9Ma3Z^4OJ>h+){HH(me_|AWEh?%QxQ71c_J3hYM4;atI2r>x+b7FCX>~ZU-9~j9Li%BAJE$j~ByN z_zAcMVy39>KiSdS+ot^gjpJDC@QpesNG3%7{4d$5wti0?m!D~`i7ZGU(b|{)h1I1; zd?c7ojsG_0?FZc96e}?VAxIh|AehpH_f597p zLF`f@84^VQd_{f1aqaZ>KRf2-|AlZT4~v-SqMiTqRrvcIq|~5v36Q-X6#P#D-R=Dc zihvj)Pp^pl&sTJg609hxQ#r5lKR0wre3)kyiTsNOy{TOPhd)rjIH39T=pPw>;D&#) zC>gLM1V8v+@gBSqV0Z~i%41A|e{Sgi*LD1dz5lpI-^(oI5%2P!;V z7leZv__SdpdKD%=H@7S?Pu&!~;a(I?RC4lTP-Lr}HC&WOa)ZWTjZbz4RmWezAQtRI z*gTSh1|`e?7iS<1oQ5>oAF}l3_SzTV0ep)~MrKI5^y{1W;^CT-`^8&60YnGgbp2N! zC7L`P7`I|b`JmJ*uI->w7EU*hrrihqpklqhGQ~Q8iV1$K(=`sXdUXAK77%g|$OEEm zo6luoV;=g1M*Ag5*v^rsCyjEkC(=?j1;~!66=2oJca{Vsz6*`)6Bk095Mo zUY^Q-i?68i>B=2ZQE_p!9UdphHLoqJ=6?iB{`&gbXd$P^VO`k_UWnFb|D6R-THlz$ zC^>6qPEV4ytA$o@Sa1|N0i%SJlvLbCgk0mjLhbyIqyld8$J>*pOpslTX;e*~!`UW7 zk2#V^j+gLI#DL)Sv#W8%lZ)Tq zEx=hn&uPc0S$jjW2wG*3RDN*|>!*A4r8*q0Dj3!a6Ps=9{FxJ;J5m5DQlm}M;)c9 zYS7(aP0=0Am(86@JL<0@@oHW_kPKEWKPsTg`LqY!kFwAjIC;gjYcwy_Z8dT4n_NXvl z$r$L=J$eQ!l}!8LXs&3<)CbC55=zR-9>@2r)PV+rRPT8-7^T>^brif~+8cu-)c;ULhZ#Gj^esMKqkFnSIPCoF+G%m37F^0dQ(4nwP6k)c=HT@ zqBC5K1Dnen%2MB*%AD>#O)16`^6tAN&xQHHTtH%K>A7Zguabb8j(fJi-tUDGwl(D6 zbq~E&X+1K%0G;Z0aXyvlUy{21+e#HP!1}8+ESTsbNOf;)7!Z(F@22?(SX_Ro2?s0* zl~~f~e7`he z!un=Pk9Pp^8%IWr5bl@zyM>oWMcR%O|fZ*`tZTGH+u%3!@NX(HfF?RHrtgNb@p3a{53c zTP}rLhE_J!ig_c^vb0H)+~<2`^+2Y0_&b)|x9p$f>VA0#nWo0Y#Nd0BH(U(71cMYb zRVV6>NQ_Q{m&DRLXbAPJLhc!qB%hxMa7{?Ib`=~mKFKo2yM}{6C-XR{+7gyN+nh*L zK@+&T>?c;fSx>aXMwgIPjc;s&i3>w-N%Ge{w3NY6pB#Ug7yF9Bl2OEsE6iM-p?vTW zCBm{OG53gm*D2@8_m&S_Hyt&9YxIa7cI6O55+;bv%KBPvDpxLWq%F=w!GT(HSNdX= zYJvDO=zbZ--V;3;X6f=njH$7T=zxc#NxV}Aux4%G5Nho{fg;uYg)oYYz~u{+_{@Gd z@}O|ixF{N_nv3FUg9TdmUo_Xv)tg8JYCh*7@>I>^*S$ZTV^g_$?Pl^ey^4O)r4*pz~`VB;3=ObQhyuWa-m0%PwKtQUq0&rd1I~!u|0W2KJ@G(jsFBf5&euq0gj3 ziM$FqGHEu&qa4RL%1)VA=aYy+4y}cax>fK_$2&rlTWQ{%#uSmC(gWCM6jmlThflzi zxBdApRuVs=1Xg%`8h@#)z(~0UZEtDlDy&g3T9ES*hIM zZtwDfzO=9?h|Mu|Vr>O&+|gT4tLn2Ve0>?@<&joGy;jH!6;P<1aON-G0EoYxw{Hj+jt+h7+GfPZb^XqCaRDBpKrLFaOp?>CAlK_HnAm2sZG(y>*Rg$Q7u=r#*=q~nD9~#8&;nv z{?1dt6g>tI;W+w8#Q$R4Kpy|dPkch~F^{%uvBC$;`|ip|2~d#X#Sb_O|Infm)6Dct z2z7U+oi_8?r=!q1P1_t(h>DIbHg+@_`oxoM)PdVN@5*7)-iAk;PzZl@NFYD3nUk~x zQ~E5e&Ztfb9w&$gxI@stO;U+#o}ZarASPa2-m^UYc$YPXskBC926UM9rD{62fca7( zWj#O%&}GTU+mcMI?Pf(VfDE6`)Xr9<)z@0H3c{S`t|z&gw1^8b#C|Gi{1|bsVY0QdVZa-+#WN<>Mij ze337ma$M|84^m)Dy4yK)fnX>-O=>PDDZG?`C4nGA20A^1yDNpH2Cqt3vDO>`-CAdr z;(STSY~4oPP~2dCTjTOkyqS=03hU215yJkG{tSJyY~_Hp|2K60s~UiYb|KY6_x}2A zyFJ|W+`>$~R=bK!lGK;){-9U`Q!z*dJzvDJ=rJlaU&?Y@&n()L!lGG;#eg!BI=&hl zdRbId6i~le$DXu$Q-bq0W0P!a`p1?h*Je8&5!C3*_T{}fkbM0fD0|P17qx5)TX9Z9 zk=J3Z`#@R|b$XYubFoj5qXOmdG!i}iXC~gN`Ce4^fKSAU*q2hQ2kBxSc}9yBC$gpD z%Lz|xk|Rs52P@m&>uy|V&U(Y>cBlKNOQU+mAr@1=1lJPzPvXE8h$)L`o7Sg;hzawu)o{BksDEIkt3$ z5xfB*YG1BOMv< zVBIto3)PR+!wD|Sjw43lJkSRnl_wSt1ii8JM-WM+xbvY^j^@j~AkV8M{FLF9!xqrX z3))4gX~0>$H8s2h`i>$gL6`fNSRBT!(z9@n>*7b-$jx(m4{8+~)Y;wz2ghZ$g#~Y8 z9DfTJ+BbV*EOci&={Ll+nzM;&*}HmY>>-mf)jpVN*5OmAN;K~LE!}>nv9L3YJ#Jb& zxGbKi{erA|n#FnOq}Xb_e0|pLWwTC@E6sGMzgtcI|p%F^lE zGgpNsZFgtESD^}z=ab&IBNq;n-WYp|TogQH5_yMFvg$6r*k1eb%WMpi2VD#dK}NO2Yn_5#XFpcz zUeka!AbijU^zWGS3i_WbOKMqSM;5I(t2p;3Q%*5nSOPLTqP}rjv}jfY(Hy;X_jGmCR495Tdua|lzZ;f z;K$cxtd~4m8!lM&PW+M4phJoB?oE+sK!YtIEa{|Z&M>rVBguPh(SMqWj?XRD^78~7 zQ8c-aK>f5++o|#A>*U0Z+06ue5y10NbNKC zfD+bLEJUwqJ(8|O#F_yrbLKb{jp8D)KQtO5kgbKGz}@e_coevK)e!G&6IEhHgH(_u zRJu>!&HQWZ&FgZ#THRdJ`L$eG(pZpyzuXToaIosp zu2%fc+k7UFOFl*8(WKfJbs+vukPxYWCo0eX$I{Pvip3UN3e8FL+4*Xh$nSScltzBM z7?71%pDA`QTMI9DZB0^iZkJ-($?+a-?|}HZ+8A3uXbHKxit{?uVOnX8XXRPfr$OY6 z21-J`FVyEv6c0shp(Dn9e#m(>R^R^v9r^-BaN;-?lxn#d+ru2Xn@zx)bsRC>`u3*X(ruhit+H=cBM>9ISSG>&@ z!=ENsDdI3m1?X!XmOpP?pC3Pc7I3Y{?rPo_$6Tm0TCB#pHkA=Tw!5=sHN4I>kl{#Y z%QoEhbNvw*!xOFNjo}l|P>n8OrvGZ7X0Is#^E-u+wn#1^o!oKXa4~4F=rV+7TM!F7 zWb$>}nlXGeZ*VNqw>J}_nvsaAKR}SFjh@(yMD!{-U5iz2R@H;{Hl9xJxKX2 zghA5BED6-|>{Iz}QG)`egS4`T)nrc%{4s2QW0>Sf{QAmnG4`ZclF4#&ykb;O)?AD! zbCpcBk@81wnh#5~^bdU3y1g@!rH)pN>6}joKFoS7DfO;$RV8j^^PrK84iA|j!YXAH zdyPxAqIGGYT%#g=rG2v1Bg83p3TTy8KYZ|0ByLCNSv&dh%^AT5yWx1+U zRjj3H(1wwb974+N`d{VivD(QnAW5-sXGDa_(o;LF@bh*Sy5SMi+wTZBfC9vPdb{># zkA@hf3_PrA{>(l*yPZ|qxZUXS;m(L2_mnz4_lORdQZo|MM&bUwDw|uKtu=6#Hk`ut zyhN+|*@R#ke&D`~=0G6af;7E6-Oe@kW$obcxN4Pk7TSfE&^gM}K0?rM;(_$r-T7GX zM4Jyjx8B#o(VxO3>7>Z;YqRNaLCo3JNYdx8=~qp$1B+KP6l;)o)t8^&MN^yhlDe=B zoO6_x3Z@qI-J9~NJIL)6Wh#R1SUzWJOkTHiC=GYNF+h%&l$Ai;Y{i%Lb?!&L?qUDs zQ)88r!T?5I{JQF-#X>UFKY}SY<>u?mA?v;$LNyM)O6aB^5_AQ76 z?8Y6m#O&`lw=S2+#`hie`_L;0SmZgL_IEPa?#y&Hr z2XFs9FJ+p0$1kelzvL|UXVhtn+_9KW5w2$G zS-yRcchH+?(}Mtcp9>YcbQAd_*1C^kzD8o6qa5%5R{ z<1=j9X2L~5avWZ6Yu8?&GhRt?EFeoEpX{(2OT||eUW4AqwSml_$>B8DZ>V+GZ6re{ zquJb!lg!l;2#!57oObQliRY8HGatQ3c`QETKaQB~-I%+oiKMd1zFQiNjKE2mJ_t_i z$`(x;nJG}FaMrILi}aI?y16t+ICa*mgN?9-s`@*pC;OhKYter?9p4m^sh1SrI zea=8TdqEkwovt)mQtoLy7w%A3WPn@x^$m+hw5oppIuEqhCjG@uL!s;3FvFBSLu1$w zJT1~){0KHGv56gp9k;W*zC^xciV1rJnypmp1vUJ=s{WNTQf$=D3{@*Q|bKYJeZ zV%=g=Zp0Kh64QZETPlwJp?v`IY0##nNC!AL{4iebi0c&PwsU(f1W$rX{*^yI0WveX z_DSRmr3`~4Qnp_>mkn%MzxJO!dk>jyBvm$FFhZ8{pF0w8v5qS`eg6Rqf{H>?{2jo=ZNH0t+Md*u2IqDkQ0f%k|7RCSm0KW{jEmu1PfBzf8;R9nz&F zeg-Sw9~!<}u*vz%k1Xdb@M$c?u9p1ntI4Nc{*3Nsv-@7&k=@J0&J%mh56cfK>|JIs z*lPTuaG7;ulL?});tZdP|DJ#28!X7C_=<(^im%E3=V(hmf`|0$NdGU-$nZXCjIZJH zLG99-)p+FRdH6YO(zBfE6La9DxO|F{C2(a3l8csk6J=Cley%AaOLZPyDU>gwU0BoE z52lryv{+{Z$qkmDYp)`M2%&g4di8j1Jnh)@R+;@Lv{z{P3U`cOUN|28MJNcrLDEe% zL3SrC&D-rTP3u}TR|+`J9wtBB{`k^c&tmdmsf!M;J4LMV*`;P|x?y~YH@z^EzL_%` znefJuBr}+Z)8&)$wC&!q&ci*E^s^6@md39+)P+_9zdjzS*;MSWPlOIWZ~KNiQ+}Se za_x`y&`pU%iOl%&?8pTi)+fN8E+=%2nLd#hFk|YyE99t)azXh9Q!G`#z$y^)t$W>C zw1d}{Wup$=-K;$0yGlKouU?~jQ}D>+x>Q*c*x8Qo-9MDl2Ii)+TI@JY~$eKEXj7F{>a1Nk=IP!;VKKz zZQq?1{l2soO?%#^S7R1=Nc4nKWA+iK6hlY#==8h}LRamlC7D`6hyO?s- z2ZxaTV(*p9Wv5Ev(kV;ImZ#ZUQ3RYplkNzx5ZxuCto&oSd8a%+U*IQ~-;{F-WFd5I z2%hD|JPCN?u-tCY?0R^rQE3wDDX*2cda3w{ngJs=vzpJ#lY_>TFi=xWf z;(xXGozZai>$?d-5acC^gb0b~LZXIIBchk6(TUzg8zlxQ1PL*SUZX@A6Ls_MovLmfA|Kpzq8~$@JgbfPNM{dWQRL>NQSJ)%u z(}A|&uE+(x`2=wb95VBm<*wH#wF6tBR?H2E!)h123A(jt?}xU}Jhe=C!W!gCdsXVm z?h+J~$EBTf^BzsqO70Aoxnd5=BA{a`PgX1IYk?(DLXD>0+=)yCV&Sw65_mFBVj52v z{!+aWi0n@leO0eX)5RD`b0M0rvShLTj^@kWP__9~o!Y`qZ&k4&%-oeXjeI&)aW%MH zM)*zTiSCbWm#8bAwy@?UQnx4Lpm5zFjp=88ztrmP@0`=2j!!yS=QyExH{Z-EtNf*o zL;g&%kbUgW9`kKdD!11cFn;Bv9N}UDaWHq^xR-p8s-^69)Y*eWcajLf35)m^*HZO%M)BNd4z1Xn5l{oquK$29Y_QyF_oF#u zM+)LiJSM^0D^K4{AdwyKJGSSx+)NXHz#N{;@b0X7Q??g@Jw(;2!TJ8nypZPQ_4 z`javE#-%F*3G(`O-P>W$_U4<*u^8VYj_*VKtPwMJ@DP6!`cZ*$ysF5EF0HG%Kp8lt z6YT>f%9LTIn#%FTJVeNF?&m@#XtAm*5~D|^x^2Gq<`U#{OmNzrA(PH&f7XMpmE>oc z)KdaFS-0<4(ND?1@Iy_1baDKP=@m+E{x?UiYxI6?lcFMBTlGGB;$S2Ja}a`41_hQs zV*rg=pw>dh!#E%QW^DBU1z1v>Z_h^z7^(1R3xTJlgg*s6DH^%D9)0WiKqRB_;RCM5 zA;L$k+cb~p5D}mn@WH3YIoapj2R)iSbgMoBz76KO{U0}w;1fvsF3wgSQ#WhAGickD z8_sa#0jh5YlX7fKVX969gq534X6188ZM+Am=*3Zm>?cGNhA7AE8e9Si(oMLvNpa6C zTExf2o;S+$(kK3$Ao8|0GW{FR5JMLSmVdAlKF8K;E{VSFuM4XG9GckQG`$TIpW&xT zU;0L~;}>Xprg8R1tD$^fA~6t~K+!GhzB&TWUjm z8qHe4_tGo7|_@kW_U#x&Nz>hOpj73sI!tV+P1@6bIUgnz+mGoNT4sIRa!?_2te&r)X(z4*tnzT9y?sviGmVIK>AIKu3ViW3VEo9^H|FL= z*EN~d>M4!wXIIsyuCjEttlRe0ojs(pj>B-h(IBmD`D$(>R45ro>baH9oYMXZMps z$UdEKhTwTN4`0g7oz?Y#rds23#0V0mCz&E{X~C;Ufe1!T9CLayV>edR+(Byh(HTwg z;8B{aSM}qsX9l{LX*fi*vxhVp?gtn7dx2P2x;hBmY`a$rI@^L+=gD%WtTQ{EJ!4v> zPHQ5~$y^tiOrK2GK_P4@i_|@j3qQoW5F;`0(5TCpVmvydTdw2BRI05HF1H9iEf2)& zcNQqlxlMd@MbBUb>zk5n44pSWx**&eO3QcV9_Lei_Xw64e9Ig%CIx%Fj>ojxm_>~; zbKXlNwpWLngUfq=WAe-h%!|JpdL5Mfxhrz1=tw@1fD(s})q}`f{rT_78&s+lO~;;m z`$mt?jINF$7aHA1wqdbhw1f2A9lCRFJllRcBRE&inhHEV@%T7TOn33n2ntK`$0Rx8 z>yK?vhH=LlrhU?~O+4u7<@Ind0oWij`GR`ACyV|> zk1U$sqQmsC9hNbCL!bQ|>zfbumqqBz(vcZI&ecV@S=HD5h>R!U5LD0L&kR1a9Sh2> z+G+~ihy@b-K3`Pmc8o;!YY)5!Da%KV%>^_Txl>=|KJ-YSUgYlGHunq3$--FiYofky zX>QdNPu4?yG2^WU9v-N`osF$2xrkEicvUKl_s8Cd5>451=5D3xqvhNL^&5qT;*}EP z+fygCYB&5h&mzs>R{i}qiRB;$!20JnaPPw{MG}3EFEl?OkA$d?zRU}!eiOuBV0!(LM%pP$s#(j1JqUWD;Y zMLv25eFm6YPMiUk<3N7Z>7$lz-ynj(e&zxVY@6YLJ&13o@Ewy^ZXaCy-%_q!;=RN? zT$&H`&54e9?5nA7T%GA$6T!4y+aBPmSpNwG{LpVSt7!iq$f}r2lGA;g&R3LB5ZJB0 zhpr+x{x|DK=)>WrnwcGRHTJz7%=joZ_X_tj1)ZbDL%(D4MeLB$F{bevxF6z>^;H;m zv}*m}!Hf0j#&!d#0hFEqL%XCGkZMab)E?XvSt{a9mqR%HJ5YEJ;HqGcL6fojhSMNC;-O zC(evS$VJ%BQj^#>o{@$39wnYRbDm&*?y0r4?fRSFh=;yHRulc5VW-Jo(+PeLRV(D@ zmsT%1PKa8pI17{eG!&k%I=6dGkaKNLw9;|BQ?IXKQXmYU-nF(QozdNQp&=+Brr^s$ z5nt(h15M>cM_rgrdvE&mP0U%H5-zd|7`<{{!+1v!5Q{AQHLE)7;pj?~d zd;2(wB)N`vV$<5z9X{?hX*$Xw?&OF^2wkvms4899$aJ3d_REQj< zCJ4k20PY{fUuHR=JSMZ?jCXMQePvlRh*7DG64i3aPS8eJ9L)WD`XdEoYGY->T2hg-@FA*x3~Xp_VVVgp3#pJY~E zj|mFZNJc&ZGfCeIOs27;1)3Cf{$N|pHL=}4y?!n#r-p#oCeaUy1)t-mz}qw6X%&Oe zr<0!sbUw>L(4u+rD_l(615_87N|hatw%6bb3n=r;;LopVOM?&m?y^l*yDiJ1>R(#c z`E2kn8N!^zhnky}g=fvNHAhK>5Fkb~CbDc)wGxlfjZfJexO^Tz*5X zK5HDzmFqAy9w7Zi<<0Hz7{L3_;>=&adr84CAMx#7gIRdcaEN;SDC~Hq4dFIrN5bIx zCBq{6`nX~%t>k^<0zcixkJgC-cG|vghXdE|6+WM?B|^L#!y+ZY*x!6D>ZVgqy)0Ii z&nY*6aDi*B(oTx+Q{5UK?^b2Wzi~xZcK}tH`3A4Pgw-XAjqXKqRRMs`bP9e>B{b3Q zO15g0m607U4HkFq=*8uGw)#}Lg7>DL5&UVUrfJ6g;1vLFqFR=t=!$An`=APkgsO67 zqwBg_$?0MNHQ{kiQOI1+NoRW|glXOnQsp#Q7({VWd&;vC5%2q`sg<%s0OWf%5$=|} zuw1c5ClVfW+gJUOT(Q+Y!7|IZhsD*dHc=9E?w%-jz)GOReGOI~6C+J{Ls*IiB3oUi zH~^Ud(0kwys5*0FY;2kc@?%uk}I+U__of@Ly2b1Q4o|b7ygl>+gTG&L>(dJ(R*YGH|K%rb(`{?+PJ-O_aDa9%kGWC#W$v5dI2QmexICv!5a1zLvN|)s zE!0NGboQ@L%BielTyLM;2~7>WK3;ET-~)5S=k9adIs3+RWKDVNTWIRF+E9Af z=f~xWo#JK_#~2Z0q-t51H3#lBVnTO9+&bn=}C-+jB)NV|7tqpCI(ssosL z@ZSq%dm|nDUXaq6@nK28(|Wtk+Z-m1JQAH|KizAeJr9aFIW`HFU>DvvT;0zOrFW%< zY5$b&s}t~6?IJ!vSY11<1F$umnKNvy@Bc;k_pqZ(+YhB@xiA9L^@!-Llp$+8+KU6m zY;G0k_^&eVAdg3Jt#BZzSGX^(ceRe1C0-VY&?A^7bZA*+TyT;>gEj;Gp_;4!ne^Hu z3$ZjCSQ`L6&xT#>6#53&U}9d^2Nk*@rI!>h@wlCO>FF%_uTC`CL2F_zx5H^U-Z1<1 zuWgJ~MU|LVP0ZL=yNu5la=u$gDK6bdkCvD@D{xHA8r1YtQO4wJbF{Iz&>LreMc2~O z)|UFZ@>snXH!8PFAl;&{Y0anE2A~cV01sH0t|z@L`GD_{A387waKeL5Pu1h)UyxGJ zPOLHmS@T}qIqABVNI(s9{7mav2ER?tM!XYV%r(z+T*y4Gn=nfnSP+D~+5Ogp(jGe< zGzb{Kec7cFvF(gEs!RFYdpJV!BjXKA50$t!Jrl38Bgoy1nxVfxeGlR`D<7=y^~)LNA%2cH@Kq8OFe7ecg(S!pWu)^2Djt^5*R-$-tsf}kb* zxVNsUZvB>WUfs91i+b?kDjf5gn(;%d!W;n=ZK%;Q#RLZ+?1f8dNTjf4nKPwe&X#V?t!}|TntG=Ckmpw z!%ezM$zqOB7;oMTqOr%G=@b&8)5^Nd-baFF^H>CO^40F(=-LP8dM|}07HHr|u{_6a zrKr@5rioyW6XIfHkYl=N!on@2(%|08O7XFREXDWl_T+V$%DMriqE$@+aS=S6*Req| za|T7;F~LRf4(Thun~m9jkTWLXI4pJNE(6P8!x?W;rn!YepK`v6#pj^cSDdP-VF9rp zRvwaYEM0Xi?HWlh*kwLr$gg@ZBHoEl<&3RxcWE(p9q(Q8OhN#jFYsium0$SVkA$cjFe^6@2fRh*hY-S=we*QfSm9BUtGoIdI6HaKxIy>M_Pmv+vJ zQXYzm<5JsS4{h#0ks)Z?HEgSnm45sg7GVfe;F}O}0lsBjy(zTUwu{{xc(6?;8NFfY zmAvi1ZC$L?qWwSXT$1;_NbXM8lk?f%n~T3MQs`m3Lhb zzB-+Hl(gjaBS&$tMUSL*7uuXYq*Fxr;hH!?DBHBvdFxJA<|Y4f%~y&UeJM(@G6f2V;+uPlNqIo7pC@R$zbd z6P+YnAIPjYs@o|#0H{On@}b%affrm^McqmWcLRO<`xFFo^-oKZ`vVUGx6zau}m&aJ*){ z!R8P5YtBIbz&NWv`5BhA_NLO~Rw(_NBQGRZ1e3m#;o^T-E63=i0F6}Wey5}^N}p~3 zMgn+~2}+OPHz5FDF;SvNltP8lWf7O-n7z0Btb%4a2F?UD`FjfkjRC9i1P`XD|d>PuR3?U|})&TuBHJe1dS5=O?{ zW*SmoY^a#$xt&~2Mhweh5u)dQ_EK~)k;Q0waWdEXb$2Za2>3epQkngv!*+33=&+NP zq{0Bu{bYIC4GQ09fDDytef#dquqbgY4v4#v%AxdT1(z*piFo;vK60kgzv7w{ zT5KIMCBJ_XglF;J!5|0_L5*~~2WO2i+ti%Rn}>-ic|FIPD`^8Q+ma6E1#sO@^aBfr zOA9YnM_grLqmO6wSO!+egqvjmXxEpRj+>4{O+O#%4Tp53ipQv52lcw|lYd(_dsv|P zyv5ypyL$*2@8-ed=@PMW5eC>KH}WpO>=@;xqJ)QG$)De$v?x{(*h!U9INc6K&Ky_b zIN|1|zP;RgTpB<(>?yF{Y+_dL-}!{TO9;6-g&^lPPm}6EGOul4F3yc9lwk;Fn+8=% zIq=d>g8Qa?$AQSSC1IDGYEmA=Eba=m&jb-EWKKTC+LP~NmJD46ip2WBE7xmxwnT9= zfp95H;!1py-`EBEBKIW)XyDW7THI z?K>}!L^8=7EVKIqI=O8y%N+T1E+%oR`n+FT<{-je>$FW|%I%cJ(9#gys)0(4l+j|P z6U)OL(jjCgdig`gUXaat5Bi7lSBe)-t-3000Tg-_DOP1p->^SruQzdJ12@qspy<3j!kH><3IUqdJOeC z_b*I-TJ)xlpGP*uew}7HSl@i|prK^>;`5Fpp5^3q(~s z34&v4-M;mc(n9n0rhJ&GzEdhMuWqAR6#0`%&-Sv9D#+9XKc|#=kr4y$PUWoIUi+px zkl6<(SBoXhZz<8PZzWD$!%a*A+CW^=JLa|*-BW=&AHT^7Gcn)HJabp7ZmAfZcZpl2 z53=%)&WH24iXn0;#_`L)+kTza#or5@1+%>rKO^pK`Gz(FCBK_JG{eHZ;=t=}`rK;P zE#J5&C${j+Z*BpOt9r;UuLHSsamKn-xeh)TrozSd)`tu~5ZpGn?Kr_Rna}rY)iXW} z_pQNWxahh4|3HN5hgw9nL|l?w-fM&s4s8$KXG7VQW(BMy<&f4uUDyu8gcE`GgoiO! z9(B1>U%9803yrOGg#b z&Xd(v@^%B3sxEjmwuukho5rK4z8ChmHS7?-JWzn(KbH32WBdgu%>&@wy_-3BLXgx* zL+$$HWden+*`fCkSI?Tzrc!sMp6eF)d$-Ze_XB4qj2qXY(I>X=rc)1P2iWp7jgxIE zcP5Aqqx{KY)?sE#klLlvdW}!>GI(JR03I)2@3TFpYRU%i?AVflT@4!B4~*-A*btM~ z8d_>I;wyM;zhj7hrfHL@CEM!1%Kh19&^rLlTZ{AU4Ga=|fo3g$xdt1tcZ_0q$DH~e zl7o=^IR{Lei_hBa+B!TR3s>#ryEO)Ml* z;$+-q$E~3KJ0rFv97WB4*vJ1`LxK|l3JFpzW$sUy*FH9cnd)#O9BUh2*qv?lx{O^( zWwARnB*Z}Jssuot0EioQvr2Zl$8*meCqBnsb20gzcm(2&Kb5S1#Z8WHKdso^cAGyR zY-Atci{aGg&9p~*ZwAg4WbRWSYZBDFn;~7JFu?*cD=>gAlByG*T ztXr8fK4rI+rb)Qg%gC~*FLUK}-rk_iS5IQA^`aoYsR(M8xDN6i#ypMAH2Ri| zk^_hyF8EQHNnY(1m3YZxwUt(dVhG<_vx3X&o11);#jTu)Uo@(zS z!x$x#d4*4bE%YQ6$Hd)$F^`if1Q;s=^5D7CauIe{*pYC*!?U5Y=O>3+o*^;;#gx~Oy%0}V_)nv#+_Ai=<9QfY4152NQEIwi~INH zwv?-2b;cNGQ|MSNCf}~`PfNkn$nQi=QQuC#2u$H zE@N?bG@g7to|39mMK3>_`vw2=h=`mVu*ZClWmmEVwmx#Q-YMRQqb9b>PP>H8guK8d z0b<}!i>2-apx#XgV&pM>m?GwM`_y$0*Ml{8b2xb@E8LH>*AjDk%9qibE{>YK#CAYV z&$XJv_yaOM+jO!cc-Lm}A)Lns{JWN58V8Bd4r5%obQ2EltB*?Yw88oY*FK%h6r0SV z0m(24fb8FGqgK?Xjd5x}l*lKl`>8mx6IcP@$acT+j$@$LQ1%N%wQ^DXGbkxXa{0ph z?c+t&e3y3jO2DR~geAbR-06l2*QF$UJ#ZMPGH<_3RL!5uR193ISQv>e#}(uj4PFi> z3P3qh5fd^_ig9KZ>QqicWa8dG$W?oJj3293oqU%aogR1p{s9HzL{GcEX)OLYkG!cp zJ|)wR>0{hcB0;JxP9ElYr{W0OT90_+mwQ#KAZq1_G|xFpS}w!F;%e?3Eb90R93n3H z-{Nub1R`+p&$;b0$C#*c3@k%3P=^cPm$5K#OB6P&|H;rlO+R&hW7CFGT`c~CQFitm zlzMsgq9~@yk;;=p#esI;l{0P}rKz*+a>W;{n?i+n} z$SyHK^u7|@?jl>f4s>s?`5y%URN?-K=y*iu1 zl`6hNdT%=N@w3)k<=8LNIh5|}aY6XFnR}yHOS>lg4~m`ZWE;Mt-IG9Px+vG8P zrHln2HznS9!6kQQ_o7sOF?h_oRI%|E^*q&tcoH%yWom|ot&Q1Y(r%Dc;-!oMwxR37 zY^z`|3S$_=Ljf}Z6}G1h&det5VXZqkJJ4c0oeMXjsVFf+jJ|sDG}k3rDF1=-O=0CV z4wGw-US88R_meNTrz6PgBZjcCvcw|=-;GHQfZ2Bna(CU_IdUFqN=KkCu@2F5pYq@r z&hGT3ibx6L5dP(@=c;%881<0NQUykhBX)Nue)BIOG7!sqMZ|x=o#C|S;=GM$f{8xS zjiXcxUFgU==1C7(Qe^QZK}}VH3?#fByyOmR5YexRI?9^(8UTGZdP~<4?Q)ey`uzdq*#{1` z@M#p4QP+r^}Ch%^5Fy*=J%Mr zN$z!v8lk@}yQho8s!gzbr??PWb12Az-k})ay)DTC&_P)$9(A_p@2FpXSCsFh7<7sa zo7tndIKM~w=GT4O;sJ2!Q+&Enk%4oZw;q{%GaLb`EcJ+&#;3{Sg>}9&6Y<3J#V(XCL zC{kWovOB^{+R31%#Bo8ouNUY#poll~rH~3%<1J0jkD<`C%g(A1SKtBlWigb_SIF;# zn>=9zgKHKqp(mFffatkZVxtm%J=lN!@PLw?k59AF_WfOn56BAAXh=4iN8?Mut=}{T zCkmMW@EKrVO+Le8ti*@pZ{G8NN?>c5xy;?+Smb$O6)niE{oBSlL%0!pdNg1@9$TcBd3Ax#SC8*(55ehqe@?{fKr_J0GaNs6hb>t z@gRGBk#L!(n^0{Tx(k?oV}BSJZ!xoXcPE1k$&(|wf8>X=KG)tj>fHIpejLAc>C&fJRO$^h4f3Epp2wUUaI=AkRTy2+@H)ub; z2gT2p(>*9sB00@%ufi>s=Z5YWpCe;Q5pi)KkrWT}RjZbACqBP+*UzJTzvUQDK{KX0 z+9J}hzZkrbjw1=?Zdi@vbGhG2ZSiUi9vX9+DkFG}OaP#^?s0gv>%yR#fJ${EYBp>D z05(M&hU){t45hqtuJl`vNkv#8glAv(O74TmG)K;0cAe@@usYed8v}NgX4fyyE{%+D zNqHrlCk&Bgh+>^fOZ55Ly87=%G*JxWG^ca3BMdFlHfCPQx6a0-@TP6#CP*+Rhxpf| z>iZqp{r{rcG?;a8Wd;ev6_6S7 zbbN~1*bVSf2rWnz+rz;x>krYJ%EUTv(|!BZ2ia`IrQNV~u0vn?z{>+J`6wd=ry8pi z7fidt?x=6KBT=N8eOa|K~-n7uf>s>ukf+FhWlMY++bGlZi zQR778HcqvSTxP@9D;wgrBHB5iH?;@8JjTKCNcgaw5Ys8^;|9<6!TVv~OqZZXU)VOh zVqL;l9KL@q8!8K|`+F(3`5LcW*8GK_r?vclfX1_WRP&w5YLY$I}h!>LsU`GEP2KwydC6O%UKLGau=@2@c*=OtJ#qBpKl3=>eFwD z^|x#QAm~GLe~f4#LJvL_^n9}kzfcOo?qc~@VM7-?m4%n{9v>e;s$%=)I&?KsIzvJ)ZAq?HA#uoLp`Dj> z4V?H-Zata)kDScRh1YR$2BeOt75{b@Aa>{$Ua1X26tdP>>m~iC}R^knrM!cLWb(;VpKo!FNu& z+^xyaYBjTDVXE?Qk1ec?udP1hB;nx7X|Fz?#zI19kOXDem(qs{%gga`5|?^G1ZEXK zR4x`R<~G4^7U(TLB7_Uh%aZC z`9AkL_Sm@Pai1Dj(9Gz4b=#4*5IgN&Jx`YYf|wxLk61vz-Id)WeU*DZYf=xmYF`=$n6*yzSq;iG(9*dVj2}fJ1rs@sed+lS+Mb<8X^#$=O1jQ_; zM*yaTO`ucz5l*7t)=I|Tu)~esb4Gf$0o;%8rGlIR#f0_-QLJ!+YF+A1HwNJ^T!+<& z%lz<4bjMX!g5gES)1t)XTol3`vYk3IUu3QnDGq7bm+)Nb2jE3UlhDGhPjs z-X{{OUHtRR`ZoYz%;4=-zAJV=Vah^d>&nX;eBX{&WG&=F=?j=N`pK=XGyqhkK~<5q z%(PqMR0%X2j=W7SCzhW+$!FsOCw#I)p_P7hpdPTRbVOrCqm3k20h&J?0gvq&GFDv= zn&MEZZSIK#mIM`dk2X;3+gFn3VnOqxkV$?6zyY~`DowC_})A<_HZ4Z3? zj^x$cqr;K)vOS6M>Y#AxlRZ1_jv0v+QHM_o6ut5Mj|an^?D~{_xk_MJ0=i6}&3QCk z`ko2csF~eT3qCQ6PLUPLw;x1Rghc^0e=er)1D0I?;k>))LtYJY5G@e4-_hqaj0Ger zl3SDm*VBDYOq--MfX!CESRZCbD$1(@&NiP(f`iEs10 zuI4DT@NU}b*2wbDD1qu9NtgKyzeDqo;jl5UTT7kQ_8&rs*RQ#M(dQCUWQtG92>SNz zn<_G+ah;Rtu4#i!#Bj;8+Dg&OaBn6FyOQU!Ajhl_*Li9n4ADQGl*Jit0#`zXA7nil z$Pv@aoH>VD>O0Z6a>qPvHE_{MzbHi}V)0n1(`pm&J5qkvB@h?6(3Psn9z4PP@GI*Z ztpOO&?Y1u+Yw%OuRTXPbZcLL42&4$%3o_ZK=UYH_0j9f>T+u9R!C^vx?cm{dF}%Sn zZ|zSHwxMI-WpdksF45oF@n<5W28X@IX&qANq4&O z6{Yh+NxY{hvNG-Aqc8l9ZKm+)Zx$o~_=$Msk|u>CtsUf0(tkvwjY(ynto<5+*88uQyRetLMRViP4?{U<|4X z1OE_?(|?FshJ(PV|MY!<&4*I~o_H8yi~}}y;P;Z;v8n9Lo4-QKf&11y$AFZIjV{jgxWI+3#;JthId<(o5k2zn4(Mr@(Si1jpvVVJJ|N68I z?5E@6tv{0X&>;m&y~(>gI=P<#f16G~e9H#4VYdG@@)9pUz$@6++8!&j9;`D99ItWw zIP-ga^!LUx-~=Jc9Z(JqpstabbBb&~T~G}^)k6PQh5D~**1uj20s+Zwn9kp5WcRJk z3Ti_Kqoc1&+&XO?l1UNe%X2IFi)Z%dNA((q0vzQDXIbC%PuHcAJVqrwe*D`l{`HoN z6Nr4i{!J}hj*W$+tgOuQL>jCH(2LbdO=~&47S(;7Vaho#Sq*?d{u#T{_l>Fgp)$jN z1X2HX!~fG;xd0%W$TfUR{M-38|dYz_#&G&J()Lc#Q$^&|NHNNc8Sa3g0fRuu{#R0l??Z5ej0W> z&VDqu6M1sXJbu4Pe#}SYpC=eNJpqkR^#AP%76Ia~<__1JA<&)EZ0ds+HP`FEU&n8! zTTe*#uLb3I#=`$L9{&BQD98Ny7*cIII6ZIQBS;$mF&*Yh>-mqL_2vaInYgpOl>hTs|Bt8t*8#Q^;Q8eg_LcqP{{EjX z>Aw%-Z{zB}597ZNSCcyM)tU|=uCVW5CJCP&*dzz-c` zetsEIettq38%qOYGkq{H@<{VYX>o8_wC)JcHnf~{BNS>47<83Bv_p-rkL~4AqV4lx z47om15!OUz)6juRM|a>8WJYV5nvH>yiN~D+&HA}!yIXT!WIuCO!!mwZ zYCCoA@n+>IV`K76G4{e&OfKOQcsPvp-giA8=^!$Awct9Mx{ucURwL^Mtz^`_LC1l; zQ<<44JSYLS5FVer-faF}p0i`JgL-!Hqrv zOuCZ3il~94Bp4-d4FmQfz!(e?xOxG6uz?R47(|pm7&P#W3Va08!TYy)tk`L39UUEM92saVZ47DY*x1-;-_z65(^CU)P}@3N z*nM)Mwy-7syOMv`BcN}qYh!F>XKZOf__N+mI+pf!Ttq}a8~W$(?|$k#8ULpx3)_DU z3m72n&nL8WH1BEusT(ND`SUKjjIooxnW})XIWRpy8{CY{Oq_qc|9_tRr^Wv&sq&wa zbj*zO|6TOI9{syo@LkW;9wsj!kaV})~1V1}_*mvKJU6A=nF;Utc!azG!sx5Wq$L!+X5Eu!J(cEa1PX>SqH^(%>*tO=M2E z7=Ne_sO~SR4O4(@H8zVXr||}Z1e`9k-oYz>W z_Odw8#7?ppItt+pQ^ipD@VgFjTfVryaHf#XTHA~)`0^RX%_;0C?IHSsh9J|+HJ+Tc z?Kt|Sjm_oTS%tYi2Gdt(Bie#+a$NNup(Dlkd{4Df-E+3W>7*m%<0!vdoz+QX5&3)! zbPE@_k3lYX{-iBIP}*#!HZ0Z*N6{m%5~7Fy=Nwp3K+PnaV~c zDJnX-l{@v)RA$w;$a?)u)^O^idy~bIJB7mG;NXCqlasUO*k1iQb80@4mfpszg2jd#b1`#c-i)!BZ|RWBzsL zujSfn7@TuawcZ0~>q*&RC>Jh?Y+-RWuR%9Fv6(`AYvk<5VS)_HOlSI>rd!{M?d4zo~`^TjBIcpTMKsieAl?A(?yL++$6G}4eoWln|4 zc&0+Fl&1MCL2qboJgv6Lep4HtpAZ6$+|s-~Iln*r=K9`;>*J+7I1uev)9v|>p}9(^ z!)dWZM&o?*B<2`mSBHTZy4NJ4QC}@qTKJ)n@Um4a4JRuNM-?W?36hwM#hm?!K^{kD zA4}ibI_AYutIPSFY0J%58TYlfd*gGRWr@erj@KM681L7ZU))`q+BOQQ$CJwvVbkB- z8!cG-5(tH5udaTKu1Ror%hzmlP{`-y6N?>CH}F{mjqY^yM_2ub;MqM{>mz0t@Pn1l@Oeq`Ajzs(XXT9;^aP?&)1!mf5?@oQ5U{RKi;yO5us+X)FQrm# zh#3ia)RoiF&@7P22s|Zp=3)6}p<%N#ASsE>lH25bCX*|H^<(C6Vcl^PzC^Qj#B9uO zC7^XANqSBISwwpxPh7e{K8NVD@dah%plYQ7of9=tty`UVLDznP=d%h<-@R2D$_V@~ zRT5$8OD8F8nq*O5!m#Z3w*i{Cnw;eB{iHgGX`iYrZTO>^=?ZT0!I@O)4Rf(3^W+n! zjH`CO(&sSbNF+p2Di*)>WpPt(^yteCB?6Pnb1*My&hhgL0d=dU_iz<(gyAvxH*q#s zbxM9^jnoQ$Rhc+_rj(c(kUOe9grmm$JeEU<YwdKy?qsi0Xk=kCMxXcG#gI6WU!tIp>#Z6%2BVihzzlkj%H^f5#P>WZa(kzN5GbO z_IRw?@b_zuo1;V`;C?&Ov>y6pH<$?nm-Svzk2OaG1uMJWY4wq2)D9t82(S^|&zf8g4vFy{=@IFcr z1U$K${n3LoY+g(@T}VV5du)%D`viyYozFIB;`sUb3mlf%(QelLlmcGN)ZW z#flX7_~3%!{KMyz#U^s`94UkAR={4!rg_0uVM-g$hNIaw2|$`0pt8&K*p&3W6UHK< zTj=jRciru2$+-~HINyr;W@jr#vi3TdwIyq6$gkdvgv$Z~CB0P7$c&X@cJSWK$Na$aGcGLgbcABnqgN=~2 zk*u)eMHKdQp{Zo<17mC)jXLRUuXHjmN0*fjZt>cupgLOgd|8fUcK1XKYAvcte5bw& z&U)KPY580u@6SYjAu#WhVPRlo8ZkK$(GnQ%fV~~o5bNQ7Z_Jk%5P>h}`E6x9OW2+| zu)<)NvO**kd#YQ{Z}eLxj1*S9gbr)v4|>@K(2O8{gFzJgr(>E+&oEP$JqW4-KBr zElR!KXxy#&z{+0kPfwb$VP1swnXsR&cvdWwYBmH?a0P)L}NP+t&xWZ&DWaey)?$Z<;uLmWAC$F zTN`A>351Z+U=PfIxb((GtSji~oO>gZ#dreqzYMl;+dE-Z8__l5N@L(eP;nbXW@nX~ zZA>f_Wpg!hUO0nUzK_FF-^I>4jnm@D#W!$gfUPAv zVtD72#z8NySg}!z<;vCWQ<-Eyn26vv9p%)#Y`GjUdfzrFNMxrGxF3-)APB-}qmb9?ijV`hHL2u%UDcstd{V+$wVxS4c>CDW1=g+Dzu8MRIvk zIn3jedD8igtu0l$y@(~@ASaq61RR!emi3M%O00=I7LHy?{Zs6-WL6CyAD=4TzOAi}dN+uzI&CFL zT#{b(w8}ql%cNl?Z`nyTSvWA&X`)a&Hv~P9wP~PcJnxprtcZN^3Jw(Hd(f(bHSSD)#2+2#nZX!$5EckfcK5K z(YA~W-m)a4y4`%-G@J@=o~5kc$L|;o#8GoRI$rRso6*x~jAAKqLMy`3(l$_3tlrp? zG<5K9#?oktLD{5n?cBDGj3rDO23CS})s}Z0g(ODN58wRKQwo&Zy!$}E$bB$ixMFZcO zpTn>qn?fVWfoU_>DVr!%S>rBDmK- zWP5xs@C`u3s`7k#U`yd}l#)orKh=pv1|=${_jHrk>@rvwny;~aWOqDx>tAY8giw-u zwG|R~D4^7VZr!egJ`%OI)^*dt65lVMCzqzxEV&)EW}f^qi=ZNO$GP5xny5RZmLnJ} zf|66VnQ~ERMQZw-7#db#4Q_mU-g@kZXGhB5{%i)L{vH}Or&0O*@ai|Sgo*jPVRaVc z>r}3J7X`TKBE_s@!8FQ1oyD43n0&W|5*$_Ry%1k0+nu4A3Q46hO@5wmEb~Q#SZX}1 zm>b=5jA+7uencVk8MPBZH$<5H4p8Z(-wr?f!*OdD9{~-gGIBgP5llL)p;t<)6<^7K zF#ettI^ug9WO;)8TeYUvmi?Kfw_}b^KDTYr+;ts~`1E&pYhbSpAqqZ$i^q`jRhv#{ z_Jm=Zs9 zT`Fi%UiO2qp|3knHu}{%Z`fJo)?#LAw!lT7cYMYQ(s%{V4WV1RGP=8$7p=$WYb+=e zDR_&lBbnz4H)m>*tgGrPx*Q7&=VC3+*1S z)SanDaCJs2^of0tlbtK%^uuB+TFQs#=JvUzMPJwX-uxnDPcql z*+%1;^G6_Bttl;Gk0Z_)jBCSEJv4q#;0U#Mscg=++H;=$^_Vf&L?KbKj|i*iSIC95w4BZ)u_kO=#Qnf#yQ!dw$+@?3?oA6WSrNl}E|FH> zb$DxEalwvlhd=rbcZ`um0MBr6=w2VuId~LZkyTxK7%qG7;uy(rM}Sf9khMmb$8xQ z|I0JFmpwQQ1(C%Eq&mm`2E0t8t&}o)bYmXh)Fn3YJP!gQ1_Lp>+gMar0g2JJ#ky6rCw}CNaim1voC|KwB+iG??1;E`IDmY;5>JYn^i0A{hwgIf#>d5+6rj zXWOn7hqv>$#Gm(B3Bg07HaOfWF@=q1)jEp#UTyp9z{10i%{zsJj1|6h=4e7Kv-Jm; zJ}HG=(Hu!&F`X@$1V?EqF$lwk>h!P{YVYU{>6@KZ)&kouhTv)KEyNi}V90Z_(A;E4 zvSd<#@6K&?DrTCZhR5L!jgn4#6Cl41m+xl5*&5c`+KM|8wB!EcO@*{mU*@h@l2S?a zo5;Gu#A;JX2V+wIO-fBlBJu5;pbbXPc5q(_lnuNKZwL>X6(oF#=^~{`pZ8^2FUM1x z?>E1wnbeUSZR|~(UhHT3*%;*x>Nw?^62S#RkeM%3jr-f`(jtmr8L~=(5>T7M;I!Xv ze|&A|e)2`3OshHS@&V~OuXSwXxVs>lOg>>kf3w@jqEl76NVyD!KYBO=@a;<{#3ZOo zgLb+){jB@rSqKzM4#wGh<@MmYy<|p|$bV!7yO9hi ztJbt!X`%Lvun7LNaf4eJ^l8Fmx;V#N8IF>-Yo8WeJKw~&x6O+;GmsV4`aaF@nJVC9 z?`D_qXX1CCZeZ$%{LS<&@@b!vRhsN59*O;>+(?!|=4#cM z0EW{4cthavd^p#rTxtsy!i~vbctm?~f7~iBM+g5F>0OWQ<1WLa0@*h%;c01w2wdc? z4t|p57TYA^bsG`B)H1Q*+3tnwgC+hAGO3tW2tfg6;?`?t75m(R8!aFaiHwWvtlO|P6IYu}JNNmF36Eqaldaw@ z9lnFL(N%tiaz*YgO7e#{%+T&&63d$1W_)-|r4)~tX1RaUjJ-0X(TF8(nWe$`*~Yto zt#X68LVK14XlR?duo6LFkEq`TG0W(FNq8f4w+0WW2KDr%9llynK*C1Gu@fRXjpxyg{L`-Es&i;uV918aGTw3z zzu2jjec_3ze6|%zHD$o=UE!RvO$tM}Q+^Zi^CQ{pDlhtau$~T>< zLP^uZ+j*UKKK7BW)sEx5pbfGD+oG`hhod>`aqp(Ep zcwg5l-zyf&@aefbTg6fld*YJpM6IEFtXO}U&`9r@WN_|6Twejv4nvzs!~iR^PXx{K23Z`x@6-o7oJZ+?fwlcqeRo;R!o3I8a<_sc`- zCfJ+juI%0W^>HAs2b_LKK<2+b{jMvm9(^0u5vioI+bWwwL%k7j@G#zIZ1CKZW*bT< za>Q_1a}4?5OB7A(^Kd+Vn)BGVJm=T(!H4|8ev@2yv3>aQ-R_!SAWpG4n>u38+flhi zy;AIv>~EwSJ#o4{dTB-wOpR9uGvF^c>u+axm?vGVdoKqRi#EH(?BC;yNqBnS-UPii zk&lURyJpcosZwxyf<>&`4LM&Z#&b`Ju8gi3u=TOx^?}n~+Wqr-9B3&a-WvLmIPM;6ODGvw?wcK0#W@OD8&b;3E_Bg<$ok&#a$b@Bjn*XOtAow`9DkM#xCMTJ8p+yYB8FIn zm4{RjG8%XukF(E5LA)s~C(c-))ab6~f>x)n4n6-buzlH5v5C17i4vDM%!Dl>N1JGD z0Z7;FbLxhpDLK(((sC{+yOf%RF&Gc)uU6TT^vBn`iM|>ny&S!7SH&GpWSo{#_2f&d z^qfL=z9tZWEWROPF;p7<%B-1W8Q>_DM$>%2--@KX*h+wMG4zF7hhz4X^TXYnv$_$v z@#k<>HlZh)-3412S#)<-MNqWx6W;CiJ|c$WTH7mW3ro{AHaCTIe;(zV=4=9~@cS*V z52V)k8qce1{Od!w==pTlPxOv70OS;RUsRu?fOEuQpEzX_dv&;wN8PK}o@iUO%^<_$ zi9(RJfXDA)8jo!@D0BBtOfw&2>DDoY&s{=^l~BH7 z0o7M?ok*lpOXK_KjE+n7Vt$@@JWbH8lG2v}i`7qltPDP$H|xuFuQq}zr7mpstUzvt zElecpHN^@5EF2=~yi2(;ga=XvS?e!Y0bjD$H8)&mlk{i+PL*4TfbZ;7KK)MF*q$>R zZN+*7GM7NOkvadZoxS@ZP?PJgRQ+~!C>-#AM_=PT2gu8krr{`mrOUAk{BQJ_el4^~5 zw?AF8%IFroB=D_deR{gLEPMm*mcU>bcT9_z4nW6#d($QF_5{UJ$?vWy4F#r6Wzy6_ zGJXKYh9m%IgBKB+E&`v6a+^o>?e+L^FMmNn2WUqzH>|MoBA=%;cMobL3!_kNb{7qg-H&4Ueh#>u6BB5%(b3=t?s?y7kEf6qYV=Zl3ZdP^eFuQ~>3P!dS%MZ8ksv>F zF1G5lCnCn#oRhQ6!FbxD;j?jZ3C_}BYgffG&n9wk8P02XZJDjiZTPiME*FCOMZ5b` z^wM{w{_-1e{jLs&N=chp9xI*>Pb6i;p3|9ZOvZ~UP{wuRklS<(TDUJ_>n_G;hEKwJPa=y7_cX&%b z*gitzZ9?jc)D%`3J`i+EiO=bl4%kB}O!qY}ctdRa{dq~H^YcwAlGM@90iX82ui=!i zrQsNIyaj=-F0t^`AmHF|(^Z=EUVWp3ep#nCh<)lmI~vq^xmep`HMSp!xn5X@85bt* z50BE>KWCD0x4kxW(_443H!fc!mq1tO6F`|nvh71h^PsjHGSKCGOD|I7Fs0vS6pMjz zwD13BlQ$Rer`nsiac|_p7yX_d^)d#p)k-|etdNg0oOo>3(igH{y{^7SHIzRc)36X- zs!G?_NUpQK3g>ph(R@DM!yQiP9ZZi`tIqNpqAc;Y@D7MJBlCyd z;rLv+N|N}unGZmaQ4g74lWHrd$$8yc(a8x2_`&8YHrRE)56m)uuO>oO;j17EdcLIt z;MO|i11c6kBj-f%f_7Ko)*f^V^4UaL%d$PmthzY?XF?8uemy980+ldCGdz}@Rp+-KK z+z2jP5CixHi2%#(?d3kpCaF60#UnOt-kFqOGD^lk%j5l&4siOQ(?&;RFKl}?YMKQ* zTA8)2CTAaqPx}KrKKYegoy;5GmB_{Q4vtnwg?hW&V700rk(H!39W6OF8`}utNyUZI z)Zm_lC%D46C+ib6k~jcpi=_k6UGDnRNn606)gbp!h8@`Y{?v&@1t=3^TjU(^_>nyt zU6=3~Hz+mN6F3l!34gS;6$z=Ir!-s97f)81&N)WyI9l39a?J)t5+J(!>NQ#5b#~I6 z#bvAQB4JAl!w^1h?5{24Hw-5y3l{ySGgE+1;74PYio5@0c1Xy$%hr4rQD?1wiGqP` zjUZFfyG=*L%fQ8~iFq*ix9PJ_7sB(RC71rnDys!gMNG47-A_wewZl97^mtz#wBrnJ zmFl=Pw#HBI)t#Ql+=xd3q(HRhxeum_y^-?Zs0_Wa(Po;)A5G>G zx9p%ss#Ophip}(4IXGdzsBT&v>WnFnX*qsBzFy zK~K(&l<1Uh1sL6nOk`V}bjj_Rqo2Ru^b(9CE_L(QohI{hwgy^L$koB}J z1On}0?@54Iknq?ET496fowF*m0@LZ$<^a5$h-7b+BsQZ=c5UPlj7|P*81>-Aw?3=yV$g@R}a2V&sK(vt@3q~T^D!S3DVzTMuCvGaH` zZB0DtIn^dDvU7XIx1tLU@;{(KV)gP^I&O-q|~CXO&zv^RokpqjqZurDlgdU7Lqe zqpn^F`3RNXz^|jC6a_-jFX~Z z+SuA=?X7>P9%yl)Ce>W2WLXDwDTNfq7Rij_a|x_&q_d9h>tL1!th>iY0Za03RF;G6 z6o0ENkg`aiZEW#4 zrHzv4&*a zGBb6BgFx)I;vxRx{tVrYx2ffY&Tg|>hwyMjS8Ea{E+NPRsR@;b<_gg!1ux>^I<3lV zD&4!?HU>fG775x%!7HJ%L5WIJ42R{BFI+18Vhgm@ZJIE=33Ggh8z%j6_K54kJf3EL z=g^E!VEwpADe76?^Hf6&$IW8@TJz2J+4^EI(u&2O+w zhZVJ>^VNElJcos3>tp$C4}_M>qwCU`gm)}o<5JXSTE?UaYxc$4L` z2S$LO{9&>4W^tYv`a4xKcF%S&uTTPx)mITZ#=YLqJF>2b2{-jEv~JC3*-jr%Kd;u@T2FCTE7^QoC=gP-0S z1o3vRc@ooS)_L4t@l>z4rta*dwK|v_7v!5=xT`fbeVP;+h^H<4Do?rYn6{$J2^~!t zw>)}$hC5xKFN}DFc)Rj!)KPa@5xi1+xKJaX)Xk~7y~2YFzj<3usg$2zJxyzNryKo{ zGC8ZN_9WB7K$SwU_iLzy3U2XxW6T6b3GGf{|EwKa%AI@QRu8kqDov2aK1?&j_EbO-0)X6en_h)R8X0+ z?6WsSe$u$W)MzS>&|v62bL|M|t1~P9#-|Ea4li2XT4dXu#Rhlvh0DzX`E|q_$%}`2 z<1wF|$y;Ukpzd?CgZXCl1z~Ed6NA374AS29!(M6JyoH91eD`Aa&GW5W4}+mZQRy^p zy2b@=I%!EDhP7etL{SONRJaKruuZKVY!=?D6tu}Bj`|4;gJYS7=;h@4=jii0Cz19N-k1ZmfC&|#4yT&Z?{=tErAkFa0cbt z^nvrD*MndXH&B(zA2fwT-CMTiqYWBcygi4PGG5OP>he}lWbNy`|H`A8~J$0K>f(LH>xX^PkoJnX?5?es*S@_lD(rFxA;h9$eB+%P=8 za;cjBnQIpU>-YY$VSq7(FfUwv_Qu^%z&`am)Gvt}AGKD8_SS6p0kD`{czAgm$9=o{ zpo3cjAcdlshCymA{}@`)F`r_R&P`!gq@?q1%!8*{th1gpL+&(UF=w(&<*d?xKg|&< zVXy8UQ>&da2_?8KJ=9>c?FUFCnVHxFL1Yy>Yx7NhWlb@^J#susqlGQ{G@&!0>{erMZJlv2R~d3^ zfxBCUDI~>{7k+9z$DurueCBLD=FMRKou;tkyjgGP3m+nNFDd6#e7&C*Qg`FTWM{V<@LLyvpd6P91YTWp4^um4`Zg+GNYS;W8iIzvdnp{~oep%c(rU zblS3!F0SC0hSRF;#43va;fv?<&EwsWkw|C$-I(S5SPR3&j{pCF0`gx@pcM-GEl9?P zS>S14(Izm-rnLtWyeA(VDTk605PVkLewFrV~1~-Vd{Jfjn76cg(wC04(WJKP$ zW)?T0Kd5H^Z8C8q69JO&#QN1&xG6V{Q7}Us5cthVAe`XEi(d)Nx-c(6@hgB|OkUn@8H>RX2p+!wi%+!5fZpcVV|drGVa)%3Db6RdFjl#JaIHx(dE-`WhLY_{(R%6Y zPyIao$7gR~>l}l8AmHY`acTB4WtBla@V5XoUm*Di?qEX&Gi@Wd81G{Ro-Vu>GVW| zbldlIqG9V6_h_-6nCw24(fJITN!i~aN(E?lIe|B29`Jj(U|%6*07110z*e_Z>Td87 zgoCv(a3{}#8-oAe-he@7qOKl9?z>_Pnnis9N$X914j+jbqmxx=be~%Ipv9SE*s}BE zD2Uq5dQgGA(LpcSV0_nl-7Xy4y_fT}q4sOnyr_i#NVH{AQmxPm{@`Cu-pMWOD#ymT z`{C)(ugpu^4h^!Ucj71>#wfurxv>9PK>@OlAWaCffIm_60|{P0nymMtH~*I4P6+00 z^b$EgC=LeU*TjT>?(#ms5X!vfDcwc?QwQI9@k&++82ys2^G|hPkn6%=-ibHXf@Qz< zg8#Wos0IuqljH-$uQ8W@?jrL52@YKm?_B);Fg4>qzQk*46zrdg48O_1@V-IeO(*rx z7=QOmcj-Tk1S$aoF$x;{eRVHjx+1{9nNBx?wSFZ5|EbQ4w+a}DfcR&q-}MfVTS5;= zVC4vuFJONq#Q!zZndrbk)QA{=GuXdsI3@l_pu99cHy0Ta@{U9-=5um#GC)O-L=9#~ z`)8Vey{sp6FrWPb1aMP5HmyajUwZRWHDujqj_n&b~)F>M?eZ3?+*cjUlH4 zY+__8_jw*bR3#EQ|JK@Q_4NCG2~f1XdWZXZ?K@1b2&)pRGKr8k5R?;5VNVIfSOUG? zh3uJTODFi#inPO7nSIuMi~DZvtEff{=FdQ8rLYGQ1^KSN1}={KpQJxR%|K{3^z^8BjZ!eET#76`be<8Tu)G{YsYvN^xrd&@;rYbRMx6}(dv!|S-3FZ` zJK3blaA$hYjLoD|r+^+?N8TPWic&J+uJczBphA8dGYHCEd$H0c-3G2^DswYtVH&g7^& zvRj>`&pG6O{-vn=TWPOOzIHnHPNdHf4+;GWRpmU0;ma#2Q2+;`d|RnJbhxv$nvl1m8oLW4DMJ<^g%h2f{7LuzJ8gibV_Ir$P}Gkdh%GSQ z5US`ep0mw&Utm_qaC1&%wV(>aVo9Y`EFrD6|1lK_Fn}=?m8CVx&>|zrHDHoEoO{o3CV4V#pbJg%Vc!wlbNr5<~2hKc>Mi&!+jc>$u*cpHFWI`{BSt=0o#31jZvIQmH2HI1%i3@r(@_8D5 z!BANIoCL!ohYNbGT=y3l0IS@zch&F97i3@i;@{i#6JxlhbKWptUx=`q6`4ZS<_36w ziL^_GX6JK%f5c~RjNvq4=kv{sTcWJ3Q9MsU3eShGS2og#Q`wRopI;SNWqhc3TF()` zIGAIIX4XIfvXbUpN)`Bklt;PA@;ChXMv+7|E!egkoK7cR+cYY?NwsE7bGW#;W-^AB z1pRopxF3L+8vXZh^xsJ{7$i5XcVAyShs&}>X{mw;q@2_DZ|(g4!NpPhXMLP8DoJG= zW3-h96PYC9-sr`{tu32y7(hFvRIVw8r$WGD3_K9@GU`5lSF(o__Fs$o%gdj0IJ`k7 zoxkA7wOMXRDUziHi#Wq*HW8!MUx=dLbZmP;+E-LD+sM+FQIfV^sOoj4KZqC*Aj~#_frv0O%(%OE1(yV;m zj`;bXI^QXm4G`F-;%46>i-9*no-uaio9U1yU`n|k^y$}Z{ zFiYQ#7*-GTR8XxpKwx8K9rF!9Qiz@F9UGHTdt`1TX{a&a7*kvZEKY;nzEo;|w0yhI z%RYI%StklM*N%VxFMz-IqmEHUuig2KB)k0`eDm7rxXdpFMrU)cV7Fgfl7dDDBC zSq@(Qb9ngm4C_z>FhlXH@fZJ@>t9w`E(zw1y|7pg`onww|0WO_&YOx`Rp%Rv!@p1m zVR*VKrfEYQW?=Oe*@8cjCxHa`h zf?2$l{U=lsF#%mqTtR>gn=2}x+cUQ|7(*kN+RsIObv^Y=akyMLyMC3=d~tM&mm{5) zdWVE9@#f8&3S&U=0N#E3y2YnYpU{wzKU#Az|Fzh>2at(O<{wBxKzVbmLpkRlny%8y zT33Jum^=_igQu?zWU^;MBM}JALE-#8G>?}zmaqhA5*M5OuYcms4(06CCUV`d=tkpF zBz6ZkuS%9Dd`x&e*FLb@?^Wd({J(wakAx@7;7kl2iDCdbcdE)+-1qf*tl#-gRCLyB z_vymw8fyJuv@X!NoU`lX55Tfc5+wZqa_wUJ<`Q5r$az)i?**{(3r_T%ZBW{g#YqSW zzdX$WQIW+mX-l!~R0(w!Ef{$CPTm9j`!dHC`xGE)oMMXX){@T4N)g4gdk`DSBZbmV)2eW+&Hdu0jod3gC?f2cyws zU+P<|^^IrE3$_sX!O9+|at$#}?&V6=W>xRcnC|~XE&*81kyfTw%KWZIo~*&{mfn7M zN|ocqQ_E^AQ#d{k4FnU!{blS5x|(k-T(oB*X$?XA3hg2{5IKOE!X*Cmv(I3VI&W8Z zck`DPakB8nG5@;5E#`fVk>8(40(Y8Xx(#cX^j6}l%z{FbiYzvd0V9bBGM$`yK@>@W zeF(->X(!9Y-t@Z?O$9i9C?ul$&v9uqhBdnoOn^zx!DXvRviq^SDsp?a%~UX}45S~% z=Sn9~jb0-(XGkQ__w&pEs^uC_h-6UPzd?5oltj_(OWvRPpxr;0avRSW=MZ{0muaGbAi`-f+3qY-2&Y-klb9?P2O( z!E$#ITr8h%Tmjp=)nu7?_I%i%{j}+NO%sOC5l*9BpLrNhW3GnHwFfN*B%RMKa0I>+ zvm}=ZEuF})1sxi^pLW`=N+Zv!v#{U0z}lP3qm4z*f(XTD`(U1Xa>BCtJd_rW&mr}i zR5EwAOxtv!{BNa7km|M7*UiB`i(smhgc}4w`JkUYkpA?jKeqAnpF!x&*_^(dO}QBi zIhNa|WilN|KMwd(+1Em+EQClv)6&*~z^quRBCGYlkUv$jJ1VVA4Z6SBeKUFu2)q$M z1e(07E~0QO)c{gNm>aB4qpWS~pA;u^W${N3r2gf+QnZ1lLR+PsL`2;SfF#B>!r}e$ zSw`bC1sg|cF}&6vy!NKEah)kY7SzJ1Q5INb*hwwX)Rf(}N8(6F%!&83q_nb0W| zRMc5&+dQ)q-nlVAJX`k&B7`LXCrs7e&QC3Fw?3$3QbZAK_7iU>paX|41K9u4w&heZ zO-^+6}DanY?eE}j`H`8(DYuY zJ?_IPKii^f%BVF6+dF$+xV406iOYH7dAi(}p<|Z-1AxVW;{HTgp(N@fhgNy21%|}-_ zy5H+Q%eB7nRj9slx>+HfukdJB)ho7og~Z~S5!x!_{GD#&Y;(kwN@D(U3raz%YsC{$X~%lE#&K7RfD_1)$EOzd=- zkFO;2dCKf_(3|lgbl3Z@+EW~kPn@TMA4Yl-=$(nshqS%st1JW;93M!Y`xqQ?r~W!B zcsY9?LnFlSBijOyNd(bqitV#lpe4jy3SJp>Juf7!aAaQ1U*g!njJ$Zf7s5%8 zC?qiZ%PM+Dh=1JLn`U&|m0_cln4`}zK5ltDdvy}lpy8w<;m&rpB8&b0#+9vOsAf26 z(*x)x3f37x$moaSU1f~k5x3GvPOb@(9^f7^?(XgqBv^vGySvMoBx~<|*1qSi?|J4AWcKXt*Q#pN zs8JV2#j@?Keruc%iq0ef_-yXm)OcLqRF%}O3Xi#<5fK?oUOwK&4et+T@MHjpmEm-% zwj?+UR{$lFC-VFExtgn-w&$_%lQ#Qi-}1f{$z!BgyuUa<#iaQQRegZP<$k0?z-FAx zJa2g=5m0S}_RZIcE;sdMOr;tE43geO9j-&Kk4U|;dQK-RA!ondd^DeUG2Pr@Ug7J< zN|YXzR{Xm7!>GKmrDej5AtIc{-}gq~nKkvZwJP09;U}eRwz97^)A8k%NUwHhOuBPu zD8%E=nVjrKl$NJt!D(0Y1?RkNSn=?3gq7K4k*(Rjf5sv+Klip(DuI^9*~LY?0esy$ zz-qo+(n2fHZ^M9HX0=GddeLGzw7MX>lrOaXJ~yD7?Qb zKWL~m8I)h=Oi@~s#G$=scT7zsmRG#$Su4DL+!_W;1<<>oe#PSX%_!F^R8Q!3y; zf*3s6*L>|N6Dp-@rD}iN>+?u-R^-dwG4 zGWn8yDOHGnRvQKc+d>pii#BB2`yQ%@*X+LhgEfcziq@ARKj_}m9}VMrR+4I=)$;(x zV*TsW$-#kZ0zmc>C~Bp7;c4rVR{cA2GW@HvXK0G0CUQShSR>rHul6V7BOagZ?uW5_ zcLrGBUbH49F&f2Qapj(w+2){+{V4qzSE4edm&&z_Vy}roE!(-y_1o4C`P*OM1E8e> zDM~=!DTLwk(GQ`#(AZzgT3XZ_a8i$CKlB{~0)(aQ>TS+YT{d?_5ca3ydQeZ7AnmtD za|8mBhFTEyax&X-r~FyQHq#ZW1z}2BxNLSK`7#51DY-1bSIWu)gg4-VG_01J4acnk zR&y`C6`Iukh|(z+tU`fI0pJ;>EQJ0!=`+&aK+WB8_Q*lB-8~47>~%Y6+@3W-8`!K7 z4Ptvv`9NNsP;A2w(NcJGQytUdu-Zm1;xBkA25bYQT|(6r zMpF0AV2a-4-gwj!v@A)R>ihzDiHtEBI~j^UK;=?O)(0eGS$+N$4SyBlIs-qw`o>`$ zX5~eNYo_%tO#<)?$Y)Sd^=C&u8PJodUtGictdc|leJX}!iwl=g+_|lGR%>Ahxm&A1 zJM@q8A=}z=Mz+T1euE0TIJW&7IROYJ3)e^Ij{!({#DQEXj}y!_{abfPp!40Rp1|Mt z2sm4dV2|$}TST>4XjLjSbMl4~Vthqoq;xQCvql;bDmq|11+vzCHUO?{(tk}!-W%ig z-5Tx5UrFf2icAMxm|Mpyp1fQTozaFvBlT5v(G(C{ylu%j`AQ4du>j{~|5rO69*?a& z;!@G*NeFCQuTA<^QTB)Nn81%4CkW~iKsJAK1hLgqW5wP0fL-@bVuT>1lY{|@)R<)Z zXVTCiRSEUoA#vxJy_Q{PfaiA%Dt>p@n^-<9mTw3zFWfh*{1EnRI8cAni`+=w3I)5&)%+YW`VIw8DUCuIC2Gszej+swq@woI(CS))GTRC&=pP8{pFf(DO!4cY8BN5pY zVrducbK*WF{e5130EsZr)8l)KXxjd;Iv7I{%kA!RZ@Y=4SpUt`IUzNVcjN=Zx9;qB z7lvk31qpU*I>Y)=Fa{dwUtEPdhErs4rpx1d&OTVH9HbU0R2ARBMF15^f5R>pFvQji z8`eH=Z2Ue(Ay~S*FFNIz=@NaKZWO8?f$u_05hXRaLiYHjdxZiJM#=@4dh)^RKep&O zBA)PvGPyhxHV5NEqJygn*>$V|2)83gIP3$hOz=tMg6C>x-h{xHKQXf^a-+jTeIsFg zAfN>&`E_$BMdev4bEQ*&LI#&d8FKLMBvL}9T(znDsPqDm{r4~AC*k31s zf8nd!Z||;8czA)$mwm47MwGD$sJ8_BGWPig5~dehYdU{vic<*;tC0E2qXMRHQO@?@m#sa6tcJYgNb zW^nsy9cWSXwGI|2l%CUBn1w+D#M6!-9q!{YGYJ`Dr3@UyJ#gsMIcrs8gu^z=`vgMJ zsZgV;f8xYAlg3zPKLiGvmdq3~D3zY(rFsUO6t*}%xqNFGJi=kM%+AbIfdq8jOf4$^ z1z!@f*W1SrCm~RR(lKaToQ~-WcgD7ar8*c3nY5A^4vg0cB(`?;CMcznnd3j3UzL5W zB}`{66HaUXnidiQ7e}QjuD%0PI)yj;)es)zd~;BWv%wloAc(`n^%dZH_AXG;0sG^n zmZGi_8GQ_b7opt_@Ly|IX@23MBMT7Q9hq?=EoJS(%LOrLlRW5jTbva?f5aWKy}3K0gy}&(&6!K3n>y zTJb))_p-i7qmuMx{)y6F&mUlXJ=U$(ne?EU%tL^gg_K&THxmmJst;)z&z4e;2~l(_ zI7emBDy;hfGO0q-YfOHHqL)H2KN(e8S^3`tf9y1{A}E)jBJcRjot{_!C;UHUhr{J` z%!PNtNAE(gXklTX4q-M35m zH0v$Ya)xs!S-0=d8e5$?lUTF~H+g13Rt-C2Z%vjfIXBW@k^Ftb9**S9?(CnE6LJ|fKyHv(x33#+Vp)hpI@xcW+)q5BG zuNKFT@9saA#0zM5#Cv+7Q%0`je(|g-4lb7ZJg?g2#A?&=<2yRbp7(*X2lijLJ?MQR zyQ|}-IDGsq5+!Gpv;JNSY1aa^%m%Gx)2Hwk)%CGc!C*A?M>nL;%~-s634sC|>=T!H zd>i@qO4NUdVZ6AovlO)j)rLP4j~HC9EqcLRX;bs&JXZ<#7fKRRbNT>_wy<*+)6Xoi zh%#cI^)I`$Lnhn6*DFf1onBY>LeSwnq`Xdme@tyYP5td)+VZ>sIrpwu$=p}qto3uB zC(j4w&cE)g+b?jK*47C%#GMd@v3M2=%_he!Uk_A*g~2?@C?8OeKMt!^Pzzc1=F4n4 z_ULQg-b)Ew&8>R1<;O=V=D#qg1i0;;rk*j8Xa!Gw-i!4PyE(`sMMRHQ>hF-;f*{t< zT{kzJr`Z(#0&y~6&sIR?PpecQXa|esbJ`X~{RDsk^Hdr86#xpFf8mH%=Ql#7Qy#f5 z+4%DIOy4{?3n1|Q8(bLzj#5Lbz8H$|XGZ_+U;p!vzX1aofKIv%W^4bizyI$SB8LI6 z?e90bO#kbh{`bp*=w8`e5*Sba$mW7L%$a+Z{%l+_opwt>z7>%^r#FuKw|smR4YSi} zkm4D9WA8Nt13`h`(mF#8utEIWo9hst@)=C_GK=b;Q~&XOfup4DO}hm5L&KXlujA4C z_00;|{|9RJLI5Wa6b|D!ks*@EmnuQTTLMU$} z00qBy@7~QFCa~G+x!j%S{m>^Bj}^VPuIgGqz+y7Uj2}svXhy)0Ting zE2QyWizaxS4uP`q2Asn{AoaBR1nVZbLKdI9JhcLMvdhkeeD8#aCsdFb~FXVIV zM^6^m^A4GQjGO$&5#ir$F`naXXzFE0+c{>XV=DFQg;A08>iEMXhLV zzOyR$E;%9$E$6EOo$1p)CaqFIenq|Aqm4T zwwaEb`lIO#0%c|q&tvIwtZR8cRisknuZpL7Z_0d20WrT^>*jCDDRm+ll1V1Fzg~W~ zJ=~adu6BKWYDnW$C_*J0SYA%=?(W{a8+!p1fLwpjeH!SL$QB$OUj<@7X1z&DSafe1 zdorL}<&~qqeQ7bdv+RM8^1X=GMGvfRqZgl{fa(9IVo z9Cz@ao=*tuzDZe~TL}23PiVh<60j<&32`?cU)oTofizp3*h25}wtauT4)bogL;PBr zHkM0*;p4Pvx>$#2#BH?CTLPTP1+s6M=e`Y5`q2ipmO4b1>f7RJl;&Hs?{8PX&u&Y@ z9N}#>+0YLF!WDxfAs^wFijFF@Pg@!@00o}x3Sx4*I8Rp zY8E2=*P7iyyA`gGQMI<3oO*#>@*CJ$%(to;DaO)h29Ss1NoY1Z#Lz_s1_rh^0vTl6 zqj#K6Yd-ZBBi*ZDZwECY-dtiaEz&{BYPEv+B;sjEtgWq!6|;yD9z3Akmx^)@>m5Sk zi7U^%$~ER>w5VDOZMu9W3ykSvc%hA>m`!IR*(kffFqGJ!r#fT^)>nUOr#PZQ$uU0M z%G%gmCb4G`yY8%zh$yOTl3ZU%Cyf&x)$ zvUfWHn<%8chNgxRi^Kgk&PNI#xf$!l$o`LCbD>`WQOH3L?Yi&c@9Cshf;!_nUYO?F zH)O<#z`x>7-s#TTU^8#JmSq%T0CA@b0EcIxQONwRJD4fVoy}mfO22=Yczz32XtLJ5 z9#IKVdloTr3B-GH4*r%vTEP|LR<=W8nF$UN>5tVo5zEvGfr-txv23#H_~RJd@^oZj06-}zD#%c zOQdhviY--5BEL@J!__4b`{3+tz7&|p>3K7mvQ^faOCqRQp5WfG`n9KhMTCRNR)_Lb zDLMZ=IHdsT)Js4FdDW`7*GP^qqDXr7Q`8wJg7A2T4Eh(8oudquN}5KSf!CqK zDI6>kg0fVthJ(A$IXAFNz`b**R`Z*u#Yq8RhY!r$&>}qOLI^qFs;H=( zak&I<+zp%*i$py3a`XJU@Y)e>6Dgf8R8BLSD&#vpK0eo58ufghrUmF6v|79LU4N>IU=uG4a}9= zJXjWhLRl7*@t8dASzAv=l8O*vm&V?&XLGE@5479`C%3|nYZo7P(ScA#P3spAXgBh< zy$aLYFNN81Thd;0pmV^h{fScG{_@=C^;j!f$@KoZV5U?86iv_V&DHFzFB1E{PwKt1 z^IAQP@-!W)x2*n>QQ;(RZK=I69IG~w9}_6Tc!&3MjzZ)1;oCqaU$v)`Q;!AmsIv1D zM`*LhP1+pMV6k#JHKPkQ8X(E!scp-1TRl3?^Ym~{WNb_k^G0qjI0dIVtC0emmw4%WM?omDv=lu+@lG;yw(nakbZBuC7P&tuEZog#7$a*y)- zyID@6yKSs|E+^2$c!J*vDTRuOeH8bEWZw%tRVtv%$$ozqNB)EVq)h;p#`|>XqMN!V zWl4%MiZpe|nu*DJxi#s|Ix)d{XUSC|PdO^T@$Q)#sSwC24f!DPL`xrWiUQfBFt&iV zzc6PM@OjF$Xfiza9#QvAB0rJxf=9&iDn9u>t+!5Xxx%bS9Cm!tpa4S+;(;)0Jx}w~ zLWo{5u6I~eJe$s8SyYlz<7|%S`n{vygyP2MrjQ@Q43@W9AC8$edtUc=wFNEmRGNn^ z9=XW9iGJUwxwr)FMksb}@?#Ug!kRXjt_ zEGO)E@lC3h-m>M?~I>CahV(*@eBGu!9b)NnARj|A{(UdK1Jm!GC>7=H+mv=JZg^jK{n6#y~%BK z(@f<-*ZEC%l%3rHta-zkWbx%Xc$3{)Vy^57Mhl)Q&YDmxwWebc_oX_C{1aDIkphTu z^2X8Qu>V95@#z?q{5oz(>wxhYLBS=-m_XtUfxpc58{k zv)%#R)$Ks^?P1zc)hX(z?e1r(_vX};8qvJeM3MCI8i5N#oo|0E^dIrncMm5qN(iSl zX*3&%rTumhE!S%K2vD?Qp6S{Q%yi=|x&>hj8v^v^&Ucj2z_<1=XmDu^et9PW?vdyq z>IWNk13x6s7Y+G}(KKlZs3>e!3(BCbmzfpMK`8`FpDvc6Y_pYOW9{|i8lw?npw93& z7@sx_A`Aw+vNPvc2#1$yB`+94(|Lo%e6`TS?}g}DN4)E6hLmQ7!0YH<*5Jp-13IHf z;(e%kC1YECWQ0~5DP~kcU~!c|v|f=MKifF8$@q13*PM<2kT@Tz=n&VD zjqLF?n2qe>0G$~79ktCT#8N5E`!NZKGRXuOb3q_U_8Z;%V0vk{sUvhm*J4UD&V7o%%BQGBc&U`MeOqSRBw? znes?7_*nY840m!}Z1FBDPX^N3-vB!%T>&PoSFz2Xjh2xR37p@y9C=H)JES_^smW_3oy3J92MUzl*E%g+#8h&k7 zXXm;UGb6W1F*Ip4o-dnpaMHKXfB6K34@5uInueJzSEWpHmCnC)dM|_ES!>;ZYS||` zKAB`Nv1oOz*YENj{#jl>5tj3(%hIfi9m(!7DUIT}qen?pDtd;px1}#i(>P>oJZf@E ze`3A!*{_WCgqprglBTI-c!pZ*S6(pdAlDnu%A=C&TC&oD3H^6YUOGGh3;E<)67akUFa!j2Ri9 za7J#1e9L3q_T(5V7I79GM9-24^Lz{_R?MTCx|r_beUj;>AaFl)FBDPqSrt)bWe1Q=Oy?mh!X_myKDEJgq2~#|BprVpBee%b^%vu|lpTi!O!D@OuCR zPCj_#cEay5maAj z2XdKI>jhNcUYRwRx+2HohIhJ4I{ zHDR0Zrj>B@OUy;Ea<$6EcY^_Ku{QE(6X@zOTvmrKyQPCjzCOL}gLz%ON5ZY_Ra-dd z@{lPmr?fEKZDY2fEpeOsQ($liO}n+6hh~}V1qxYKw_B9O{BqnRsf(?)Q>Hf=1XuQ( z{!~k*#b?mo6#e0JT5;pt?MALc5BpS}J8XVme9^5wPyR-1<@HFjGp??A#?ves1K$9v zeyY)xuRdD3f!nm3yA2O-2-B*F$wNzVVAk{J7GSHhgj1B2_jN+?E1^zac&EkUIHcYZ zc;+#8@dWfU(HadAe}{7wfvnm$`B{q|6Vc-HQNbA%kjL1vjjG%g=3j;$98@|zxd_VC#1oaBw=#J|ozQe%A-bOZ+g|xwpapm(zPHZ$7&L07S}Za+bP-V`S|RVn;qh77 z6?x}soHEWx`8oH-^Og9r15>%}`}|<+uME5cso>Lztvfhp{NOAX^1}vUd{1qap_xD} z%!Mi|e!?~UnMrR?9=#G{X92|8&ATaPi#MMSKumG*Qk`LK@xweQM z-u(;wGM&(*0`&FFijy(eS5Jye+&fR5)9-aST%g0N!-qy`aMIITbCxL`_?!I&+wW&$4*kG7lo;ZPxI%N{B>0@0yu}mBB&W$Cq-}jLHM`hP*S3qwz z1!Z5dkn?JkfoS{kx!#>o^l@t8qvrCteA9{XdB}ICwFawX^22^t1B0~T5k~j+@8rW+ ztyQ~X8<5B$qJ;6tAZkBsPV-?Ce?w6M6zg_CnWGQq2Yx?KR&%y+KdN~ly7gcbO85_j z2M-Q7&a%G82I`~$-7^DV6RfQZaWpzfrJGGJ`gu`lm$$;>e^#_VY2@h-dAc9e!Gq}4 zA?WTboAIukJ89ML?o_>V;L?N}0(=e8Ra=rbays3)V&ek-;C|#OY*wkmN)dvfh)#_k zupvmjA0F)Sw+3Shkm03?tl?W(OT8b4lbDivfI@ofc;gel?q<+l^eUEijj#hrG%s`& zIl9Iqu9>56p$~HW>9lE4HzGHC^$z_G7L!@*ppdefeLJD#e2^ST*lhKFKfzYmjL5$G zR)U-J1vVIjr81@Va*)6Pfxa_bmK$%!vx^%siAAQ=)f!*b;M>4wgFbcZq$40KE%drd zQ1ev(B512MG?A+kv7V;e=2v^%S-6<)Z|ctGF16I z&1pSETK1L?>TTw!IILV1gwK0;e96IR;4_~9YN26~yUDyRlCLM)ZuN z^9B{AJ%P)kCi_JwsQEp4B3h(JmJX7pG!1rfDCRj zc}>ewK73XqwXX`ST|eQAw96MLyY0=Q-$LEi0piOXV-i|riJy6Upbs9T@9d{=L2VKt8l_oYfC(b%9Aw&5>jc*z5y@SAAQ13}M!;*p2`n}o&KO^NQY4Jr0q=v_0 zE5;eVw~hI2=K;))Parxsvafh8mbpg(;?p@#LJmqg?Rtx&;rpWOvNt~K%W>985oNQv zDV5fL2Jkm3=+G~j%h?WRT_hYo3X?e(tF+)d3-pzLZadyWgHtk!2;t3 zVJ@l=u1}V0L;waU1`L5+K2e95zulI>#`cI2k01Q(HJ)cu-T_h&H?qU&xsJ0__rhjN z+$TIGISNVpye{y^x5KE}u<#4W;^#%PU_J0gLy`Ij{0QAH{INeve576y?vo=;d|3ps zy9?DI$Iwzq05oP>KQ4!$*Op#VhZi4vXw^SiRy)#anVo{1p);qTAFfR@ZYHoJA3yzF z*?v@fJTgZ44U*hD<$6gqD0>iISGjhF?x^p8eF4hQi7tm|r#4wc6?uSX~7vTd`0lD8+R#Mr`9j6voe9z`q( zzfDVm0Ott|_1EclH@Y=fm=}`BH!!_W;84tuSboXGG6)mDjHsBYr$z9s;kx;%Yv(3Q z$cZn{5D@eO9vMY(tuY0V-kvI_X4sai7BT&U$!}2}fO=Z3OX^1Ys_%r{8InR3}1iF7^T1>0)SW)dlqW3*l ztXV7``j7FQ66C72b0%*OsJ_c3QjQ%b_CU$cerIO~~>9h?U$= z4d4l%>@Cb^`Kkx$N92yKxOd1KFT_VHa=g6}HYqfPf+--#bwAL{=0NJ6fH0+YBjuE~ zL{OcBTq|{~?6t5Nh7^uAMN9wjImdMhiANL=@G+de#Iig6#m59PL^z*YSml5LW`au^ zA~F#_9n-T!HRhv|xFkFi%)ZmnvL)ojTH5V(X@ewI?{VSbP(?fHCWI?rPb}FCn48}! z|N1>)&>PnqQ3r$~WuQOTT+tDUAO(LZ5&VZAaBdIR1u_-$gu4ZhtO< zfssc@7VI>$r9Dq&_2h!8vi0IfaB*4{B3&VMyOGJu#B%zCRaI-O%Fa-+ujZlAxlm17 zaB@ACn!~S=uPrxsS#cLsy@Ss8`U!>tq;L$U59f?lwrNtrjFBJ`m3T^{1F-kej*g}u zy!mW=3jJ(S8m&O*fMZr*ABYGZb#NL*axUoqo&0hB?gG`FY&01UaHelV%hf_K$bXrM}WH_E#;YqMqtQA|m8gIAk9s2Df!^7}E)K_P+ zJZyt7^^AK&@q5u;n@-#6`lalNg3IYU<|kU{oq&@8{Gac;F(B|aTU?twJ<+sk(*itw z-JdK4ag2O0%DSWJbqjI&)QKYQi&7qtD4%$q(g?xjv)xAw?wwqC+0YPi-|QOH$`95+;>savezu8SQ2EZo^waO7z>-GXf?#bM z$vG+MK_cVWD1ACR=2Qx~VSHLr|05RCrIXN~Li+((8>)mCTU-PQx0$nP~sg;r))R_#&20MY*R&(66D3p@2D{ zol^$;P@p{pC^d%Tverp-ejMCEv6W_E!tsp~O-}uy?ifSZVi3IEZDRt7?)mzW?7$hO z5;m1=bBw~00dM}3z#HAVRe$J{=o#VgSdV@8Xclvfrs5~K^Atjeq$Ri?=s11>&IH4( z?8c=Kmntj}v%6I&bZ^DnqCbq`ZQ54B6a8LR?gE2El1}Y#8q*R61>T0Yvcf5Ws>oqg z`?!^ z&IR`^uboMTpPS8Xr*tYCm9;5|VfLm(S-gf^$}qIrcSlUtCi3=95cGre*AsFyJ;)gA z{wT?wSdcKbtw?uQxb3-lZ>W@`t2-XISiU$mwKX$z> zlB8RI#Oso*h7-( zZ2+YaU&?QG3rhnK%kzS&)x$zpt}SS`ko=3+V*$$<%ouEeQOZ!*70Tg-qFv!1U;KNIET zi*CZuh5J4>&_#)24c5HeITa{`gS+CD$Gm}w?0iBVNTARTy`ho2LYa0DX~1ulL(bkR zb&&;C1Bo0QnV&l@mqF)hp{LRB&M_l9JBPv-KV3UUwU9X-zu}{#38Flv&fy-?J>73q z5m@;q{Y8=}w%3oS|5ZPDQL95nk6>fU4k(x<@oP*6lrtk^AkmOY-M*ANMCwB>i@Hut zYX`^2Vd)k(;)3vouSj|Q8{$!2@-Ih(tuSXuVCWm+YM zo$^b#3fQ`C5)4cM_ZEKb$5nz#JV%SO7!fGD>rGR zLfGiPP~rTrowiGe=26MSj69$gkDU4kD4H@<*#i#y-p?%^qDv0d1SUw8fGT)lgiJD}y-tv=DWBQ`pWkkJNY09r68i@0@m| zOUz;=;F+5dKNDN?9(}DdczJ#zAC?BH?4>wAwLj4QyjJyoMN9NPc?V7<@IpJW_+j|| z0;}qf++!5Zg;_4VwhlwNBjAlGqedd`l} z#~}4zeK5ya6Z?W^K2>Emth#X1{O!hlexb7$(J6-W&_OzbU4JFCHvEL1LrXLY(Eto4 zlDCxPwDKNx@xzKlYKK;P0^7wZ2JqKK;?*)w8$9R=ru~FQ2m97}RhiZGE}Cds89yi< zTF0qRTcODQZp_1CXa^nKT7)oy#K@oglS80hCZVL}L@^J_-#C21f($0q`IRm5hTWXe zc$m~54ukOyf?uFV61vWk^SC)xxPok&_!WZ{ky+KfB3nM*%!ftX0vhJB8xpp5a_T?! z1}`J7albmjgx+j|ulE3kzkx38gzTm-qz;Ix@$tY^82YZnBZs-U4g;vdi^~tH7RkK} zp+V<`!TW5-uW7k72tC8yn%Us}v*wS0C~O5g20k5jt2*$=K&jOZXr|N3iaB*xHzSvv z9(Q1Qk|HxftgCCIGR3ZYlpN}BJUb0=0=}oX*OREllMzVs&n-?cT%x-*ezrID&RYy( zo$ADgiClCGfAHi+QLnM##@n*9H z`a6OQVqW}GlH-O8|6xG?^{-X`H~!dkHjN?wJXm_sZ~T)JbBF5xE{Oj$4V`envd~(! z!TjgJ>LmqkWe`iS{JVnw-=qI`db}{f-?c z?)kGLfMZ>NP&?g?VS-+r?9b~!7SNS+&KB)v%as52WqMtKcUXT?8O9;~hv%aPmA$U> zY3qQQf1Eqy6Bw>|{*g)|U&Fphs%UyXAJEIY3&_8~8#%rEPXnyaAlX{vTFZ&AM$#!C z0Y-+MI*)F*Uo?{lB9&HYVyVEp0nMs#&bASPAILg<+ILW3JqA z)r#KE@hxcP29;|g1cQbc@S?vfozQ|kKZkoz042NO>VlpSMnEyKU97V@AEyk9xzYT& za>SoU|M#vXY)2Et#j&bfu-DAhf4HtbF32#rY&-)*?tu(#GSB@)o&-g(JL*tb3hS1g zPA2ukJ!nxj0)yL2E6YPW%CW|7JX-+VleB?s152$H&WwXR{W!(>0NME%~KO?eY_{*A`g?$*fb) zq(xJ;YUv#A;^Z=E+a?75iGsgcRAdTV%5fy(-7QB?zJ?z)*&9iCKQ7z%*MaiGAog7o z3@=tZWl$-;gW_5p4&oXKIyLw_55~yaKi*y9@WFuNYU0c!Pehago0jQ~B zcq-Dgusgi0mTys}AsNqvHR4x)8>fZ%_w)+7fB;x{{h)06aC=3Q?w1>RkLJb>u0WG{gj775chsAIpU?*>UGSl{Mha~>umkbo+7aJSd ziluY;qnItG<=Pj7kLO=8ab!?yJkM5kN#cvfkcY)mY0jq_@8<@Oml}QwwDD2jDTk_9<)V(J6thuK=N)H3~1B-+M~s+(PeU8rRPk=iYqeDkbU#^;F3~ z?zr^!*tP$-SSdZ$Hb+Dvi7`)#?ai=RI){FM!C3rAs|kzs{N!+c`ops8c4AK;NyCvz z=qpnRxNHO7@Q*m@KsITx{7Z{rnM>CA>j6o~jrL)-qXWg1TdR^6!|guF zt>#QbbgHsfb{o(dvm#$B)3MRx1K&a9rz6;CIQIuA|_fmky6ndd|H z)Sor#M57kE#-FX`E%s~OiksAkE8Z+Vnf{%Uv%oj4#yUU?yGSyLgrut<5((IJL(ya; z*Gc>d1nlz6;i{$g8>A2MhTW*e{E_Oy!g5M}7ewguQv_ASW zz>QX|fWrn<&E_OUJU4X0XJ&Qy>b&)aqz06~)(baG$!ynq<<;9fu~{s1TIJ=C(%FIJ za2!w?|FaN<1mdk-NCFL$kCbB81Xo(%D_w&WIRyp+;x=W-R}>8!`(ug{ZWpN+c^J-M zAi>MnQJ!a$O%_)P8u;nnVwJDoE)(XM2`IfY-V;a7rXoix1ll#8N?*9aavqN84LZ;> z;2TXUFlPzpZWnMtQ} z7`FRG@Z1SD^W3D?TF)rY*ICj4WeMcl+}-ax342xPkn?#x-*+$tB?$J66AI41TUf=| z*ZGBTbVKl=O>jcFMdPnu&*cKX;B-ij872M21R3Kn6_yg{rOaZedSigB8Hv^z(>B@C zz_rqrQfoFb3aa?FH!WZ+iWL7!FKc2%A^J*hf{uzyEx{r(|8T)`IXNjnBf4~Q745--40o$yqSSdW4|lQ*#9jnE zX3^{8rG79b6|Yy03vgzhhI=`|K>tQI)q$3S%pzBxE)9Q>NctE@{rJdqXMdm^a{=FE zsQi4I^KEZ&a5L~s0cC5lXu|G%Qw(h$HJzp$(i@yWrrvE16jm-=h+($eY5r4!EM9b6)*4cqbAz%?Ih!2>S|~EmH569 z^$$TW>Ziej2wq(^fNF_^I6{)6GSvDh|7F#&0Jv#OS6aLHmUwtJrfUbGbtu-sY@axX z)CX(~AuI5Lw~c&%!Ukk>=+1?AzPiwI7h44x$$SJc`n*t{%PtRi5i_Pp2p1RgQ&Ic6 zr@Kb8QcP^h0L8Gz6R5EDkpaK@B^l3Lq|t^34#^n>jRhIilT7cmIcDyuVfa(i6L$ia zdCc+P_$&3%eC_W=$UBla^>;~(Lc`t1IWRd9cs%7|$(Tc@x&nFfc@)DIJ9|t$=1ch73$LV&^IutVHn>qFn=Tp*PVb6ZgyU;?^aipKNOSefkOWx69Z) zrs1<|0s$xl=B9;1!)cCe)J*Mn8FD0AOj*<2brHC;9T~aeabFSfIVdTl)1!-JxT#iX zUgrJ6IWdINlY#GtJvQPWlE4-$wHpJ8h*f-)&&WS|zv59t>-#4g_TPaah#Hy;HOnY> zG}T33Tb}!6T>=IPDFN|l!IaxOyc#sfn8azFE>=2MDyGj~4#UA9(flGo$KDR#%G|V_ zWO^a_3Ek;y62}G4y(%Iumq|B-PA2?;vmI38DJ`Tv7yw99}c=;pW;bm;Kq>dOGlM%frY4s=;?J5*?NNf1O7q%I>$ zH9YuGi9n#}lZyialQof06q4o7Ue*!Ay7r4>qYmK*m%wXFDbMEv7ue5^wEqe%{?1uY z2Lyhwto`i(N>_jNFm?%6ws`Y5(=y__ZE1_0^&fy<14X(`tVmt8=@16f2He^dax!GL ztRddO{!&fBsLL@S)g)S=@Za6&2~DUtY~+5epKtf=yby4Kq#zM?t>1ufWLzH=uGj{!2<5+xYzj-DNOo>Tnv<0%)>z($h=9{Zr{h zdYkJzG|c0Ev*|KpMDvCGI%jR4TPB@fItq{{M3?2`gb z3}1JLR(v8-G59s~^riWFWr(GU_K!2gdq{M;Sd&Ipwq4|n8CoK1zkf-^?)mI9@#FsP zPOK(hD(&Z@rH&DcAL6i8fQirCWLI(mq~rcDR?XOw?TaB6D(hJ4=c%Y)a}!NbJZs;{ zTk02rXU<&<#D58Z3fNE3NSnZGM4=gp*RW8!cwHJHxnDx;&{2Of6(0c z?mK$5;XwvDMn{|lM{#{)#vj8+XoY4n(Vnvb>2bejY+C3mQNF#ewBAf`c87uib$xYi z&B8iQb$8UTqFFMCj1V`yiO-*>8&JLFk5*LWO6j#@(ie)7PG254GRe)HH>#ZfH~eU% zcvBIJQTEl`qyih;gR!M_q8&UdCP$yG57rVmCb(a{yvLImnKVSaFIKIRsa!vb;Bm6{ z`PK&`;SlgMlvm!a?N*001UnoS5O|UT&Oz*+y4z%A|rsmG|BoVWEJXBE>t}D{U7$;Iw-Ea+ZM$o2@;6mB)Ge~ zy99SgfW{>>t|1U4g1Zykg9nEMr*UcA9UAvW?qctA&feMQyZ1Y<>b*Z+)vZcV9awZP z*3ae~bBr<9W9zi_>$cHrgUJmLfr8cjeDuXjIG#|fBXAvs^}Fn!en3G(OVYWrXOMiI z&<@pp=6jo%rS)}toOmbU<@I(5bnRT^7B|o_G|cMcc{xoXuxX}k8#H_C9=x-7!y|-) zQeQO4em_j^#F(O-=O?#|y;-VlNF(){40ML|G1)5d^SifdzkI7b>vNpf^@cbWp5TJR^{wSRe$k&JA}EbARCaN35#oSneEiOB zN6z`~hVW-2;LU#g_~CwO^sxh?>I4M-w-QpbmlupS`nrMqT)Fl^UY%t5oFOmgh$ESa4{LjSPakw9@w5 zh#X{~0EC_>e0(n0<16M0Ot;Tjw>Kfq9ztyS4^bTF*XzIr*?Jo z0rUam@ib)7EuC||aew|T?Tr539!DKX%^mflCrPUWbq0XBr+pN+{#y9kL_oEQ{|pO? z)K|LXe$Vem$0m+BI5@C0R*PfQrPM5p85U*+AeY>mUov5maN=Uw`$-f2NmTKi3KO3) z;{AJs<5K?=uDB&#kBfshm~IsIqLVBDaCZ+p74EqZ=+7(Qg8G4++@RT6_nt&o%GbKE zz__2I(%K&S9>LFt=OO35t&xL~TkeD}4|rV>;Be};wPO(ep8T03xywv7I6!^o#8dFB z_ja&7aR1!UiYahM18mCof;`0je0Dgg2=J)juo$erM^<#ts_y57gf*AKz1o7~$e|+S>c<29TZ|mQV<8<(gzeY459wptY+yVal zNBnlN!td+$?`!x!Uzdl879Zr-X-85|yk159k7@7_X;5%Z9>8r#OT2ob_$p7f4}l52 zS;ufHw@U#av98{ZU(C%F;v@6)tG;vB{fP^QprahE4loV6Za;wuSdHYDYj`eWmYr6D zdX_h3hVlT_clYZSFK8*=;{N{R`h(v_4Jcnx;sOOaMrXDys%U`UR_A$I=u*gAccK&} zDgNu{D$wlOzH9*iVJx+jrsVA8L(i=`XQ z6G$x-zdRZ#H}sN=XD(s9xgyeSs*yI+b}QycP@$%@Of6%4f?V)(@H&%fh;!ot_0amet*3_;5B%P zTlrP22k4U9y=paT2Kal`mHZO_;zo4$B-V++uzn*Q$^pVVrO>RA9(xc;~d@r9pb_aEe6v#d_tQb<)bx7`#^7m z!XjF*5j^TROsFK?Lz>yJ-t0Ec?a8#(5P;M)N&(QTg}zn0bxXWa6sND%tJuoFBPqb^ z#bLaVSaGGb=5&R6LGvuB_2o8^wR2tA>_mxnZK>d~vjU&*av(tU((MSiz7Kx47HZ2N zfX62Baoi_v0(P?qBK`|BHX3vJjl_w>N;B>y)ZNNi0BpAn!x}XO>{NDn-AG9&C3T40 zkliu-IJ_qr_$N2Ako{hSd}ejeH_1H%(B;*P2NZE6yzbq_xeD>hMnLjwQ0F8CAc+NL z!$asU*5h%Jzl@{ph0^1l`7wBnI-Z26+W1}djM?b4_$$8P(5e?+kg%Vtr^40kjiX~~ zxjPKroo$+Vbn-@P!MrKl*bm;nMe3;5_+EUhO@X1EG;gl@P%OEn8q6bQJON^{6bzr{;w*>ttj! z9$sPafzOK7`MCMrHZ9XWM!H%eUd1|Sd+*rCXFU=RcM*E=ITNX_K zG+Q8&Xb|-0S=9QADnc%OT%AT~f;A5F3zUBz{Y!j(@aT2nJnhA#-PI}`-isH9z9uYP z3x^a&B=#&$dg+H+?eGxwOgrRnuRZOM<8&6N)UstuH!wM8CKk3pzxu;REtDHz3O~h# zyyhFMf~0;s{zZ}Q9{cOijY(=}BT_iHEPcc)WT6NM!gg6q;kSy?(7+)Kd>p{bp)T}x zkx#AAOpbuxG9oLjI!aAqHRG!;cwI*-j4G_Qw@9ntE!x9y>rF(+PjL0i0JLpJdtm_TM?b}6VI+uM7l8 z({ZrbYIQX17bXc)ACriuDis>I?KBY{IJ=+gbUDi1FEchVlTcxv1^6N|{>UL%KOu25 z?cpF3#@wEGyizLL+{sg=WX@sVtPhm0!zCe~i~xWd1r8Sha)m@}ec(JA?2&>Xt{h%!5Fa%R_hL zCf5@6d=AAB&vG}1OQ{9)-AtZZ*ra`<73he&Z$8mmC`A)^l@!{?(~aqOaAhN) z{lZ5C8egY(|xa7@{7yri~7ejosxVm1cd z&JkRG#6Pu}$bW-f>4pCW0gnT%%&4JoX(g@)JSc3leSm%+7yz|$_ZmqkD*`%;WC-X!o{eNKt*fx2G5-`o0LDlR@|OxU zPtNf$HA(k5%)y*9<+c@>uC=p4V~Y2=sV+I$qyL!%Sg1`y9vGLs8D*5fCWf4N*{#ZQ z;@51T7e!dEhYO5rOdnw^57fTI5uW4Sb0E0Ujf_RojMFsM%i(%)JSzw*-jgDCj7WI|9J=};@b?emjI zFU@vAYf5$NuNEhFCZUhT7XcIkuMnnLqBp+EnE$#YNwoVrsN_v9r+Bv5Bmc<}V+%dE ziS`MM91b-LQwdvwyfnr=+nE|W5Qtk)CnBWEZf9b9SncO(4gud47DXvJrM{zM2qVw{ z9=s=LXM`&g=H4Ij$`X7yLbc8tXx)kqeb@k~Ky+WlAW0_eYnQ4m(FW8Fa1U0EP!@EV z0Z4f+w(lYpZe<7CubBr~>yrfx2h4=mM}6zQ^JBP9aYC=lziAY!&O-=;gVpxl&rUG^ zQSBk0z!jxs@ADM8YZS~3u-I>emwJGB>?gZ-e?lx9+D!8RE8PzS{Vy0Lez3dqNO$3q zVr5Pd<`0ReNF=_rn0)he^l@Q-s^-vv^}#_oQQFN5gQD!E(Op+%bQHR=$00d%oP%3M>>)2s2WIn;2O(!&ZzN6V@5!P1?M$l zdwj2o2KyzB@U59Yppy{6?+l9#gUtwFashl8HkL4vVk5h`3e!;6&Yg$Upezb9?4OOg zXFrdH`su|>mYPR$+ry~0J``F_^7PGYy^^L{uS%2+9VQ?=n&3rBf{2j56t&r)e(P2e!j4lxC7V1I zAQjiS+u3jVqN=Wjj$J}55K?AW!ju2}aV{3eH7+&cMim)OB? z|9VgfNW${CBOle9_Ume0jUAdF~UT8UG(=VFJa0)7@=_-yPzq?WK6l z{-pgp(|zKaf@{QN&ZYQ$PHht|0lE>WZ|E~a7~}IeGRsa$Ix{W5)u;q@dXYvCExrcB zuDIwl@-xN?btQm$ccER16LFLlxcn4${LOU61*m;X(jV+bv8{C0?JfUTbffyjo4bAYl0sj0TRt#K`w0zZJ42q3G;|L%4S>oW&j)C&@1t_aPCZS%j+d_!s zm|=r6U|Th^Y5T*EDiZrASMfrt!N4ml3p4?s^V{K&zv>6wDXVJxXz9lvdXrpilu{$h zzOtsVb%l{|^hklxFOqkfikHTaTvS;FuWOz#>&Su^s@OIP3@dZxyzAEn8(u!gZGJQ_ z<9BmYdw9f#wQxBMtJ_c{wh2@cB@NPI(&u+&0k{wK=U)!;%OC7alv2#4?Yyd7hr}tl zfeQ5Df0i#MMG^RVXV>U5@JY{ZUmsey{SJ{ z#2_mA%I0?rZhWi}4U4YP&6!iN zSFe(38MM)gBU;~SXejgSZBHCivf`*?JJvQ79LOf%byn=WdsM701n=BUl#16mg-MW4lS2r118_t*mwo|0-i3`M!Pa( zzNBIcm`;89Bry+{TP938Fm!jMAX<*F$++X3vp}85L2i`_FfVa}Quh5>r6EN`?90N7 zPWe`m!UqniZC-_wX<N#J-MuA-kTdWJ)Mbdk>Sf_UPhJ~!I zu-=%hQ4&owKp^^tb5x+lP}|q=F1a;eGuCUguZG|8#(rflu;7q4omBGJnE23%KqY0XBF2a~%-fh?Yl7ERi}% zf0i*b>WIlAH_76sOqZVt1`8@Z`rLQkY4ax?^FL}x{xV97Vu4A4;aAIZsdvk54Rz|X zu-f=J1w;6||6CdVKO_;5ZJt;ykMMNb+>>wpCuJ4^QREY=w+qmp48OCfL!a_l8?*#3 zSX6_V{<$UoEpq%TK@dPHAIYMgf4z?NkJRD6F8S-ldm@0_J1hF;@t+Vm1aH#M(GQaL zzT`g$hF(a!3jdw@>)#aw5Tv`-i`KvXTO7Nc8|n1}uG*i!s9yh+EQi&5+$&1{&A)?g zOi>B{IH#6pIjZ>2p3w^n3!l#jhyNo1{;O#BSM|W4w=iP3*Q8! zeEuKQCqx^`5&BW4F*#$<%Pldvc-!j07VSK8c!vtGbMlRq@_#eNz$C!U!xUxk2O+^$ z#h9kWv6P*!AaVdK-IT4ExGgr=xAI%G{jW!D;PHEDq!N^*o?qX+@T?b`!AGlXJqa%< zgltIBd}{t=0{tJR8?FULYcv`mW>pkAmIr9g`NJ1or}-N0Zw)7>r?HHQl|5gFRO=j< zKFmI7c{(Sd8~z)k>95K2w|iTD;xCDbkLff*K1(2IMH(lIjB!pirgOp$f-n}S=SBAU z$5Ya>hJ5&n8uU9m=3mWbUKIo+CF_>4s7{s=6jVcBT0Sd-Ou-1%fX+q3Xlf--{0B^{ z@*xHduKl!fZ-9Pa_6Anqf2#!{pTK+1y0WrjS`}{A6D8OCgpP`pR+ZVf`9QVFauFfA%QiM++VrEj1GbYP>>=e^`!p?i|>c%qL%xQz>gmZU*9hwJUl$cCB0|SXG4KW z35~M<6Ya}kB!Z#Q@=9&5*YA7a??sM3mU{^Pz0@GIEcE#wxWWHvw&9Z9>twV9Hsrs`Stg2E~5a&#COX!%ToV-7nZr#aQxo~`+pzo|KDcp74Ck4=QV>!6Rfg7L#y(_@L0B8E;~ z-ozv$Mc7Br_x4nq&#^TzYqX7&8#I_i1++bk0D86d0Eg16@!m+Gh8QM&t-<)$-rnA; zKR-TP7o4eah(9<;xSVT~0=V8P-abAQhT%=**JpN9b>O@vS$0r2txB!!7A;Vat@l1T z>iBv3))m)99ZgSjA!4YZI7T525cwm#rv20i?d z#tTpaqNutkB%(qtBkTf>bX6puO|3cD2pQuZin?RUB&S=E6-2AnyXXpCyZRMEwxn*FxP zrmK5w6Xl^%l=#Hy)n-2G&J4TtfKi?lU`NX{qs>AZ&$NFY*VlDhgU#0WV6Y_*X5mT? zp8Mf_!g9IO_qenp%r5UKf%Rj@>aS7=A`aRz(d;=gSI5iS5HsyGzOB!A#)E7afXATKmuq) z#?||1eP?PmjRkOWXMcO)SYT9A&$k!!fE4Ig6kTOCk^}?#%k&&Tje)ivX9;#YUBJgt zNd$!~uoOXD>h!}C`R$Ty%16(LJbi$^I8MNy`+jIB;~hob+ZImWkz!qS83MH9U2!a5 zhuK3HV%*Q#041GDsNU_^`{NIu8@JQxaanPtIEe0Qhp)iG@{So!M*#$tm1v$0>aQcet83&h&R=X}?2L?pM+mQ+>1s^S=28+zxw;i9N zRPX$B2E`mULamL{1U(=wD5$7v`JoTA9_`AcPXKUMmC+^9Ymqdtz7lD}g(w?A22PDP% z1CTp2(7Yr+9{e2pn2~^qxBy6Od%>^S0xv#jg zHQ=FYhaYjw#t%My6Ce)G9Wc^~+VL0!Tp?bs1A76}WOcWdz;3VkrKzh-9y=VZv_&IW z4(YJle(N|cK2W&1V(r&+SVvU3>eD(>cdZX9Fc)TCl z$t(ewzszhPN{ZW);G_l5sbh{VwYO6xf&4|vnVG3f_~Sztg7 zg#58d_{~_tz&i(}`FdGFT|4&BnvxTbOgG9l#8(TpPmvFs%5)pFYU~!Mf&PzB7^B(` z$2V3J*#(Lz2f2@4TvV*Mb*;#~9S&=`yOd!rj8~|4-pcW=J5mtsRF~&2AK@E_>0W z6=q}wKsM@B$DFqV=tL8DmF8v_A<$L1rw)W%&d;8f1OzuttO5Eny|PQQV)8oQ zi(Tt$uKBcbeKeBux$_~FY0#r69tR@=cFXT|c@A+b;lp0P_V32zqQABpX1R`$TCsVu z*SEaJJ%z!g{L!A9RgS{%_S*hT^2ySje7-Ol-I%*%JIQ~K*>MtE z4Lep|^6Zw>+2#-tMy`)U!j9m@XCEAmwlre$NA4KtMj(}{D<%E;XE~6RE)BjT_y(TS z*&g}n*TsiUwxf7-V`dqYqpYTKQI~R?<9*8ga}#2hSo?w-8m=rvOSL~&XVVr0N$(wd zr`#AI9^adG!IfWYBN~vy?F=YqghOAQj5<<$r;n z&R90E+XdNb0wDAmaar=owLX84)eWtBeU(Hu!DT0Hkxr{SPz0+`3HO7IFI{=*uqb14 z;bQyUu01~`w0XJ4DM;o^Q|#ysbVyRiiO0y?&r455-59sg>I)3TSK4g#CzLO?Ppuzm z)a3xI-`#-zp+#z<=+#y;vt*|^IL_a><1A= z1_e=yp5SlJ`x8pJg9$IaoK5PKVbf}jI`6vN-aie=h0)n?QDjurBCW9kIBJ< z_dJFMH2@mhTc17=n(q1RE1AH6J93TPsPtRC{GQy*Tg$@$QGlU;+0-@{h!V^@r(xwY z(1sf~Y9EY4_RM=WG5tZ6uIBgodbwB@F!H1| z8!^12`4JKS)>N6(x>8bpn$^6m1eUf(Nv|#J=rK3%XF`^crRa+Y zMgx5Ks66nk$-_(#YF$gFsrRmjv$_<$eOH-!(u9(+)o9pBQ3Ym0gaDr7nAi>mP7)y5 z($71qZ|8cO;ZgO8tO!~hi;RwwAZGhWBOZ!q73g&3a#I#5Nm%w(I6DUac z^R*YRVu%IZuDQ%eZXGCUAGLF7XLedY{P1&73>jkGsEtl|$Y)d7h0m((3NH+ek76 zyV))nrAI$q9UToVFg+knK(`XrT>uECJCx!&hv5@{n-Z}=-^(Vjef&U>71b< z(I=h9Ps^HNwKprinxeYW)^SfJqg{FfM^YRMiP6b#GL!Tc>cMoS<(zO_0!^lp!>xRc5`U;??R!Wc}PDgI>dlSrApDDOX1Eu zeka3wZor}!Qfq&*sZE-mojXyJ2lGX3;(&g{9;mNX_d2aWHs}A&<#6lmRlN^$n+KFZ zT<^aj$LNjN9!7Pz4uQY*5bC_?)xEUdNCTJlyx@gG>7ndR+kPtcrC*4FsC*X2iL8we z3vAa@-udum!)vU5p~C!g zv{nV^()V(IFsuvI)sN3)Q_};ft618koE~_nU*%rjZ>IYBUHVt9wjiq9lPUUWbM+bQ zpW6skw~8V}0uxi&v$Hk`l6|+E@2k-)8j-o?r#R3xYbZsVzbUY0vrz)T(@0huv^$QCu}AW zFP?z(cyu+r?oNd3v+Ce$j)#5vqtJa6DA%z{UmAajUyCod7ngO->ey2XoW$QgZH*k|SeBd6s?OW!z5QhbzSTLG^x)uTe4D?E*g%=RerzX zkUuE3R<=wSia1uXrN0Jj_El?nDG;LY)YwCst7&RLHz*&FYKmU9aJPsIPaC?Vuez~j zf83Z{U(KeA#9wgsG~U==+hTvf73;t{F1V(j+Wo0@GM85klf>9C05B%MXZn8`pA^Atu*SPPvIQUB(%po~RtBK3MG( zU%YGb{!^@pri0nzk?viU%3|lA9!xTBJN>njk8(bnm|a7c^u<$^jbaZREzX@w4k zB+eR3ITC4}KRUiiwRPJ&lL@%OGP~LzHP1<`ltmwv-~&NRFWa(Z$ozhy>757&)6t2n zXo<8CW)IsIb@iW5U!xwc%{S~vMym+x+F$P&f7w9MUhIQ$A_j9$DEtF`s0%Lj&b01V|DXRkd6myIaWa>>PNQQV+(>vTz)+Jp^nM; zjVH|JgnPc5;lCeu??rk4IPZ?$w%nYn4MP%EtJ0!Ijx_XpZML9;J-z84EUH)6KuP3^ zx8A5SVZ=n6ZbldL5T>IQiKgAr?De^vnd&m$BJuhKUT_K{Av_S~Mb4u@uNhi{i04PN z&z8t~i^OFmVITP{;C65!m$a|p(I5^j#P?iTJ;|;h#rOO<=%B8`HtD9in3ef8b!#@V z+-ZF(Q!qAZgf7JmI)b390b2TI#t&{LqTDr)Dn9Kvhq%X?YAwqy=Wgt zPYT!Xny)M7B>M=r-X{*gm&&ZDzqE*c9mxBJT$0JjzB-PBwl z^S;O=G2vSAW;ba?IIcfd{JtEi>Z(r-*I+{q*K9)Lf6ihAxT<>99V4Z9d_Ji|^a=#*CE!+S+BJOY~LWRUa&>6I$>rET>Su$HRRh`>jxGiQ)* z2m}_2_=om{MMAO195|=UliuYhZJdql^X7eYf?!iWluw>66HF@qF>g1(Y+-!6SN&wI z>3m^duY^FN%_whxK(kiaux{yUN700#*EgL{Hz8G#Ty-X?+6It0r~9!DpjmS=s4oa8 z8$-n;+%t|@`TS_C&HQsvD^jNG%-Gwcdh++FZ1ZWGgD;lag$<_;1pWO z>3*J!qT>$JF$c444@W9^x2KCNevaDxq%7|aMt^sfO$R$u!SC*!i?;F0ZBh}LOA9_e zhLRV6m_LqicAu_otk}kF0#?UZ=F#lK8`AjQV}qZ|xUZ9n?5yge>r+>4st3(`WCHvN z+q3^SG2rv~=w`j#mO`rTZ`o?qgi&tJ1BtRNj{S|pd{&M6C0cp%im>&HsTj#oKI2*a zI6A)dDmj&Om>}cWO`M0wt|)+cUTFh;sE(6U^c#MmOrh0OWx7v{|1ct1 zlf0qLr5DcXCh-I1QFbXQD;sEOCGvDVfO;iQ+P-SCo=t?xa8Ol!nE{$PuRaGePfsLA z@$-jVeN4pgSSRCv3BIg1K%Xb$3h*ZLxh}U|NV_u{W;fx-Ez|ah&pS)Oob})#37Pov zs-Mykt-1+*4Mid6eE(Rvp|!EB#v&$tFm6CDlYs4A`MVm<3=Wa6amXj*Rf16iIhl!e zNpy!dI4gz$V}z>1ViqK{(D&B7N_{WpUAsuQbz*SSP1Yl(pQ*Y2VrjX3)t}50uOjV7 zeBxM}v>WNTzKBu(3vc(}*995GK)YzI-lnuVUF>FlXfd=#gQK;q#9U7SD#-5Ye<=}A ze47Mnn0+^6H&W|h3_phY!&UXan{HooDN`$CBbl{@6>JFqgqV*0cx?*zfrq1$#w=+Y zS+#Uk6{pA1jjf}6Z6wQ^C^gI%{W`ZbEOO!^@EjMC$^-R@^(pQe$`zw&s;fm_7vK@0 zz5GI_=~~u5>vfqkz|C=7;3uSMQpzec5x#JzYJyGOFYeVDqc*yqiLUfr2AOqWA=p#! z#!H@~fb&Jk!twm^X#Su`|6!GtbYa}ES6__NsE1*d;k&6d?wt*Db!p`mfhsGsnZprI zastNVad((A689ek0~4 zpqfVNH_zJPBCk3al~MAj(kL(xnnzKZNLI7($~j&eoD}WfHlB}5ExH>j?HH+;7<}Gj z^;y~85}AvDA-AtHF@47T@N{Ncw7;eU-+X4-7{;I4q{wnTW)H)WegngKte4&3Uhwi=CvM(&)cyUOR-u(gf;kBL7>KZ?5-Z9v6$G+5g zLagR=hv!G!TEgy2tg&L9>XB*)-{wP>CR)#qI-?GfVk^wtqsc1gDD2s^=^YKIAkh{7 z+5Q5JdcWq~e)C;(7kMd2fDiE}2Skvrpupumudde4-*MeYcS|E#^gVBKGcpCkW7nd#b+DzPW@GfK?sRCFtS`VAhpKG}AA>K_ObR4oJ7BcRC5-R!7 zRZ%Di?Qt2~6z3I3%OphNTMn_yZG7bbU)NI&SvkIElFoj+EG9$)bvrxrrt7K0eD+oC z32xx9%;Tjm=ex`ygHB^3vA8Qu$g^9>Z2=Z(m<=C43gEYha~q9HR!(Mj zDZKH@5WBfzUoNRNNE9N>7+$yWC1h&J<*~aW9sa_@^m)^)f6I%KgF#(79Fvr|T7WLV z&%kxc+|{UVbJLP&a||-_ttuhm1<{W)9;o5#v;LaD=im3q#05U>xTw;n9_!FDsPwwu zbq1fvV3FVP8K|$=&A##&!b{_@VaAr@QFX1|A+HHrhH!y*QCgMB{LV`TuaY@8g%xuf z9mQn*6Xi8+WTiNuO1w-C3-){|wIV4>AI?hDC|)lUT?`@()w$AZevZZB;5?}0-MsBp z3-*F&c7|WCyyQ6liF#&jqJOm+DI;EgG=JmrsAX9`Sx9wsY|1S?yt66XNK?SV-uGFw z`hXld=V@+^8B+C5zv$A?ON;KWJPS|MOr&>aw0X?)ep>O9iSh<4X71|K;6pK6Z@5xz zWN6&)=3}Dh9gx+MmJXBX0`k_HeA5mp>Ef#gKo6{Xl7g^^df(q7XUm+EI`z9iljNp( zbdhK_b5uA(a{QCRyS_v+$)LBOpX@jwb2+pehmo+JZ)i=#+o(z-bMezeVi!B`Ofe=2 zX(pVlX&WcjDJ$bKHJmKoocDnTMI6wBPq%$Ybmkq9;*|+#_iv!=JA=YIw#SBsa^9%c zCmU>D0|v>u%grTw4d+{Vbu35j#QE3pGF?swt2a3F@!$bI{q1D`bMSz$ey8tkUFw32 zis6RJ2;{LbfkPMCI>StzJ*VhK%;r@)3fX<)A6I&eJ;s~(;wgh>)p499S`s%+H_2u~ zk#-pyVuj?^+ukiJT#dm@TCsUmU=PmqM@?l>L| zuWF&39DsgokPiP9jJ;!TfJohM5c=tX5N`=0e4<28p)4)0I~eGG#Y{hGbDrnNo3p^V zDPlLxsjU@L^lKQM(An>_8oC-Ta{GOaQJ~6Uf35@cW0simd+vrWY+QRrw4$tK$5}YZ zPw1vaNK~4{(N(PVhe???_a6E>--^U7R%-2UTD5 z$>z62wn*#GokHdtv4_lF>$}Dqv6wFQ1QtZ8`kg&7@8X`G8Y$#$^&9WFAByC>E>pNJ zVIJ)}wO$q2Z|(z0XmBE{eoSoCDU;qGDi0vhffkik+a?Y4EzddIBU<<(?z=1r`vC%_ z;^SWTcp>mvR&<52$K}(3(TF`Vzaz|W%m|5TT3MQ=D1C?9q;ukzw^y+pYli$T&ziQU z=pL^6gbBETde_$JcS=DBgP3FP=X^%#HdEh-@x8~$zj8C7Z^n#2IOnn%lG%8+Wr?JJ zb9Gk9!xaC_X16Fw4oc>+`ZC%;J2v9=GNY z>9^Ki4~5qso#_M^kbNb!Q^+v%8Q0{tEF}0)q@>G9a!q#A7VK&w#9$NeG2gCycDt@m zVSs4bpW%KpuDurOcdPy^*~H-UI+IyU+}<<&G{e4Gudx3?}OV#D$8jmFoVcf%W9T53S|7wl}o<+{TL&%{ZhvO_c+R z2)~ScVZ!3}yB@aGwOVI%VlNTqKxCoGV0X9`Om=Z=`~J{2wCs#p_M3l~YVxf&sn_aj zqLW+eS>8m`51$EXeYaZf%KfV!LcApa(P}IJl~u1%bLo7WG9yfwN=&3vN!n$_3bZlV znr!5^kq~N>X{mZf{r#=c{wiIxk8kcN7aT6=$_*~H0<%1y1n8Fyki@}GVLBPVP58X= zs7ZBM?lJmD{`2I@CNxYJBXYvuU`=3K?VwYoM&h!&^KK!25D{9jdF+?uWFAQ;Hs;-m z1rm-Ix#Tju8n1LRQHjF}+np+Ja}Y6RNb#`nE-_8?L$na>_X{_*aW+vypVmtRoY1jJ ztT*g+YrGQ$Z`<*YAT8-}GW}+&&lB1j_7w|qE=z~EHOU|t8Z5^j+L;yb?DzpfwT$~)T#uk7)+<0*B#L&u}gQs;Pq_#a?W*w#AzxgzL!;Mto8q7Jzg{=y5->~JUHc}bDl{Io;q3s z4a6#sl-Tej^EJ5lyd9R?J9XKFF`H%|w^(`zV~uRWoo1gKcPCS0tW^yvIp$~{2CMh zgUyvIh!v~4LW6m-{#A`#?xUq1Zn#WKCFk*a%bge1(94_BomoDS$#4GOMAPY*j`NQb z>uQ;mRXb6VQr00B99<{}$}u%#W(9NJ`j%9PB>2X*5=Ig411mJF4Y#r zF&~WsRY(U80`HPhbN)r2^QN?b;oGaY*fk&YN3@RggpR!MS+G#t4qU&_q@%M_zN!9{ z(oLmwb5=;XhXYoeQ)UE2Wc7+I&#MisDx3%t@wD}j zF&G0P^yKOHRU@(>C1%Q+$dvHXpHNT$I$PNVUDnx56#4qq@!Z&M!h?eTdB*AD=SM_M zFUsl)6nsljk?%9&7O>dZ7Wq_>{C28FTHdrEa#pp1hbh))YG#)W0CE*h+v}sM+srUl zQCj%t;O%dBvgJ+#$HX1>n?&|EteEurj-H~@@Sg2y6A!u^fl`0yDRllY9@bl6gz^!j z)Jb`h=x>0ALu+sP)0b?LvP*i)l8|dnXf+J68lcE2lkU z((49sbZ{?;EX-m#)+`1&3t1W z7Qba3?S{qN^o14|c;2#r#Ug@hNccfRX|}-wFW;P|)B&%N)G#8&3<}6E?nst6fQ4gV$)GJ-Zf$zB=Q^i zMm1vpJt-7L@LztytHqMf8~(HTpUe2K-0}X^1B{5*>hA+l{~4P99rhRPxxa{gfEe|+ z)bsZ@!lfk_%>Y`2Jp5a7`j0Ds+lqQjuKNGhJLNywenWWnLzLg(I$Kh+n0TA|grN&5 z7-y~LdKjnsYAZcvMZ2wl;y%&%`(N{4|5dF)6(7idDXU)N7ZE8efYrSc{ATZc&)Vx=_lj#>OHMldm7JCTQ^@U<$xP?;iDHR=4e|d~ii&QK4d%G} zy|fnTxyqiVPyh3MffoTu$9NnsLeRh{@LLJ|Q#1keV(APlYy$uFheeXmDwFWbp9K6> zD1R62|J@1W|Kx=Ge_HT=T7Us)f%3EB#hU`suV2e5C={zf4I~ORN}k6uYes%HBPaT+ z4gC9|!9 z-cs=*qWdn|*CACDE%o2*=VumWag@>3r_Y5<>V;~N)6;yiCHk5!riiHGVk#at)ph^V zY4O0AacqWUmAben72VaXV$%aZD6R%U_;{(u3or!fNhj;~fOa@cx&hfGG_lu`KiD-Ox~rFOtUe zkydZ9thl0c?G~`3Qd`s=!H!P&6#o`T{&ijN=LswnB#oa^JRQ*r?o@a(@(q97qP}vU ze9i>1D2!?OBx6YA?=SH$2Uq$$u0@%YF&zc-$X8i9oo+~COw6o{A_a%#llH;?dZ7?L zUjjFp_|cuvl>60z_wz@NQtIk3d%C-6qjU3DZT?>7{Oj4Yp(EzcO~E-bE&E139k}$D z(ohL=_$AbSiMUWWJ2atV)L@=I1j7hlj*3G`f;)@Y#g?^$CBK z(63uO(!`(;9C`S;Qw4v{&yJjggn5R)aijY#X#KxG5jX!sry|$K%<`CTHNX>hCak~O zB<_8Kr|th2ncje`X^0s!QOG~DDY|bXk%DP%zBy>Lp!J_b5}(!f zt+8V5%D4)b1*_;5l9QI1|Fn6S-aw?9*q;`tuYqhDAB6iVzm~)}`!B z6|oahaz$8>BxjtF4yO;C6Hx*<`_LA_`wo_Mh~OvGVFP_1#2kD}n+@Lu;y($cNQ%DVN0uc^U{>3AtIiyDtK5vbMU zHFvp@X!O0tcJ5b_+|kid651yEMmP4kdcPO-%P624P;E6)K`v!gZau{Yq*&@rq%EF@ zDKC*Q?hLKCc`VQ$*Poc1t#XYPTY|M)-UYX^-HZ>qpRa9+!Ois__If%C{`kI-S_7f) zNNOUsg~r9t&o+t2>N0sc(A}BQcRxX;9|rc`xOQ*yF9lSUv?^9xPsN?s&dp3vq-$52 zh1!6YcA#jyR-tN_LIC*w{Xv;_nMFo+ULILb4ig|@s;{Aa0b&kbrT)!jo3C-l)r#+u zT+5{2qNC4=Ie*0MtfER^@|xgRzT(T5i*DC+@QFd*n_V8;S(y|8XSxN+l5pj&fuwE` z*JKhB5>wB|$=>joz`t*z|1p2}vp%3dT%21PucM|)%gMPis8uR$Cl!4R3x7<-onqVO zDCRwm0?M{7_WE~s*o4mOaV!A>Ll*GnU}WMBxM-8;^!n5(_2K z`;E;_4;R7%?Kev#kEuV}nQGCFrtK;lSPgtntS~k|Js?(F9ZU;67q;Wr-(_^R(uG+PBAGA5O6iR=w;ic%_C# zc_{+m$cvO(MZD?wpJ|gOu`h*-Q19yu-umsvdG%nJ-?GY*ArwjrQbEF_#xG33yLRa9 zH7aKFuXBis3$*c?oq2QJeChT130J{ARaJ_UCgs`G>vRS0gC~tbS3mdetZSE{BqIj2y&vIkxk|hdnW7h0v4SL;4J7vJLR;B% z%=#>K5{q@G>@pLmru2Lz+GyoNwHLnJ1dBO`{4ZFpr@zjB?Md zK}0}6z=9WqpcFP!81@NfAnC^YzPF_LB1y`1nOTBCE1hW?5=8jOrtz1B_Xzwj_FM*Q zd%Pf;aBs@+9jGv~W=MpF84Mc&H#}TR+gK%FkD6rFl~o9RI4Y{oA@r9M|DQ%4_jNi@ z!k{mAFbCiiM}_W)IG%OVktEkX;`wBoDa*1>VIu%VXULu8T#2@G+R3S~>kV3L{CU>o z(|n$(`eN&As@X@$itST#8-?P%nZ_<^i7uAvb7cpmgY+)jk*0bRGqc%ViHs(O<~qTN z{*g+bOOKh|yoxtvm-%TLqNCmgMH)!F94t?zfQoPwxB9z>{Og>4UA668U#uVbHT zww%+uNSH9bOLCMRG%b89aTCS?*2}m}2|rmmK{=}gUh1J|H62)(W5qy$_z%_#7*or{ z6R8AUyFC%Uw5qvR40$OYg?bJ%IXq*lJzdn%eL;rmkDxQgX&!76Ll57@hq`%YHy!R+ zQ}4R&%|8Rcj4?A{SnpS2(JF0DeL>ea%hqf7$dG#`bYo3P#3A*(nK(y5%f+Qe2!O_1 z!aKAx#Gf!KR}PizX*)Vrd~sVq9`nuBEm^w^Jwl#;v!r0Mw%)uP;aQ0{)Jsa8-=`y= z_DxqSBIT2*vFLd>)99K8INrcqhDS`sUEc6n9OB=eeYgz6RYULROn(qV?{Do;XO9q4 zFh0ym;8KhW9qa0;aaan5S0Wz_$&M{{NZcOhvKelJzXN;(c;n~pweJCv^%m1F&Md!S z%E}c!17=QFjBz~@aO#GOPQPC95N}xY;-*?F(kRh^sCzv2>@y^kCRahXW_U6PiN51p0pyE6}GAgNj(D`%2P>e=iLn_)M zqJCB(_-z=X=od&lk*IDFKv`Gh7z$f&n(AzO7!*0%Z+i^%mBK2Q>eWZdHo|Z5@`#TL zqy(K4j&IfP2r0G9hCOKQ1K{7Q&EB)*wQ_)8gT*sbX&eoZG|ymM5;ze$h`$w?dJJ#q zUXY_#9xHo$E2$>eTy(W0@^EGAVpNmjPLJSMM%M+0AYdqxqSaLCM&%dHNW<#6+gv-z zu?h4C4hN%k4#p!)2P+*x3m)sDz?h{3>lsB7@sp_v7t9wHZuv8i9gp;H;Z z2%QyOBCRvRaR3-Hs+{X*=FLlV2zLFE8(ci~<|XztZ7B9zvw;NqywuS?L>L1ofzBW2 zb`-#0+RMA-y$iOZYNf2i_)YM(9PmKKaz-B5VdXPiNoL*~E6bQhPAgUM&@$7(c|pMc zx1X(onoYa$E|`b3^Cq;fV}Pi&BlH?Amwbyi~=Pc={Ii)^8jv7 zeb2D=W_kamEIlW-+r)-u9sBd2T75wS$=pS4j{3u8KDRX0A9)*;zl*Ujl0jRicQ$g{ zjca+NjE+@n742G}eJ5dcQa7=!l=K~J>f)R=1|Hp-9Fe0^DM zZPJKGdS(@L8y=tLRk~nmtF`6vXiGfD>g6ba zt3~fsEJsUcTj^D(l}0X?8+0XrvgHaHCnLX0rO+{Y=a|@Qzs(!}xux};amA-J#I3H3 zhdo6s^z5hLey!zLa?pv-Y}NJ?Y2Pa%h1R1ZTk2hJ;j_Nusd|k2i3ShtJdyjg8|6VX zJcfR^=t^FL6S&+z1GD+mofIFi4ov2N8Ml2LugFdU41Hrw`;gWeA3c*-cMy{O+=4yA z-Bmv%n*|e99A}RPt~z)Pla@7YDTQgcj{4IL?I44->N@g`I;>$|uakK^;Wp7O^?DjK z&5r4sL#lh_DaUXW=hausTihOYmIJ!oey=mUrx#G|#=kkGAtXw)8(XyJlkRH-O>RUj z7Go?FjI?VDJqgjBp7m((f-4f@`#@NuObq0x61CtoR|5`*f0VClt4D9HA$e30$etAd_~?t>HdyB7zJ-xY>N9JlsW#!QZEQjsOr zDI!`Y`ymzYF0O^*0uN2%@hbXhESG28>%HJ?;&{1XQ{RO+|rb7;W<%5`mJbXL;ST&b!HZj&eiBBU&h*(%T}` zdhTZ%B5~&iPHTpCWjDW`5s-F&myNc~gSK2rx$O7yAcyr#VHqR&Wv*kmaC76X9^I$X z9?<8w6X=bTF=Z)qtaKkR?SlXFlgL)auoOI)6u8 z^>m*ZOTX{5{^*qsOyVbg`ab;!(bh!TBj1kG%y$R0)IvrUj`9 z<(%-SGBq>B-XT2{Xm;}kN_(YOvfRj9;-y#y#1~jEGr3gTx$-0vr_4(84jddDqY_4q zwkvW<306_{1MFktCN*1F`y>okR((nJJY2-dUno$fksigVpzLzK7Rbr&MRL;;38dzr znk_?Iu+i;!=qa7OeGSoxDN7nd_1sbUMvs?mR^N_`i0VBGmx$g8<4b1;)}h5FH5Yqr zw&TV$#@z4Gdy7r|m@g0MY7`THbu8@7RjXGiXvtQ|sUy4GiT8ROsqC(#QSv_uM@HWb zUnh*(Tq@)anrNRa$U9nG8)&A95kJ=qk0!lkALE^%yPp2iW)k6{t6{tLWoRP^-5?jw zoK~wX0Y~SP8p`ju2uR#sH=FIxY{;!jbWQJV_I*negsf-Vdx>AEUw~;<#WlT3FP{zC zopd}_@1XC^9s?zCs4I%@bCLU)`V5=Go9ZhT#<>Y|7Oum6r_U6tpmFlR6vW0$JC})A z%~|KHt}hN)R!;5NJ<9P#aQ|CR%xMttw(Oy$?x#_np27=|wa-tV2 zoJ00rYz&Tq7(xaY_Nye!3ULKD{1QAe)cfK_p{_LM>g9`qsbTi%{`{hhFc@jReY*4D z{EO<@qc|eY&crtPWICR07Ecb|85=U+x!f8W+MvUeq&oQ@82VL@w8E35WG83cD~^(2 z8=rbu&h|y)XNyUQ0_gG*3MCngvcTiT34C&s3O+*!FHS5MgYQ@q_pJI>{Baa4s|cr3 zok|mTf}KG#t*RT#S9+dMNaBL7X5BfaM>-f~F=nLnBMU-1P!(LTpeA5&&aPThR<4h@ z$Z*+b_v*(iy4}4F8;n+rzta7cGl-+tJ313hvAbLEx=1sKrhg(B+NKEjC0XEtc~qPK z;iffIu0*GLFPTe#J#>s~`DdFbwM!~?^Hl#sm_$**d&q1hfIO4;1zNUXsopgy{UXZO z0t{mk_9+4`OvC#Ck$jW_^vr7T8kzRmzI|30wZJI)<$A=vwh`Xck;Rj}6lV5%icNpd z>N3;kXeDTGZEDd?)#)8n(5_Y8!v*m+9+V^kunwN^tByGq;LQs$!7jIz94Ch}4%b_+ z=+|0KM^ErJ!pFyr#bfsk$hk9Y5Q~gsm_=O5(aDca3vZxo-M;)LefRzyff~O+S0H-1 z;&Yw(_ywyjN64tTK%YF<8`xTj*;_B2}P zw!?b&+nHADMvFR?rK?k`&BU2ZUIeLXQE&oHLGYvQo+I3_tqX4F#^jBK1(B%= z3mt)hMtUANOL@VWxG2K;9B`mD`JIfQTzew@*jX+tX>7+zSCv&l$lHR@f$?~@sOZwm zv}DI!X#mL1Sg}>v<+a~woG>u>^5qR8M|Do*u0_$kXu1c?n(_Pc4Dvb8M_f{XroN+> z2{$=l&5fprK@f-a`oO5&^wWDO0o+CHiZRP4c7%+2Kcu$fx&j_WrcB9d3S?rt8yv=C?0TprTChzqQ|tb?f)D7`0&9H z0we;ai+)BYx}pR{L!qH5{MN5}st&5Xv*TF}nj|$!4K`*=RL^ZX`xByK)Kmpr``Iry zca~w|KxEu#hJr7Mcsgy5Yd18gt|J-PT%t+`}#_KOuimUbK)h3tpe z1iR!qQppl;NE6J|xMi}o$2MEaW*ClTTzZ-eqFrb9=ZHMDoD9Ay>zsc}Gu`||`Fco} zQwO73SdiybPrp&$*K!*CRbMkl3Z(mPf4SuXC6QD3@}7FZ=V!b%syZo`yht6!835`o zVb2N4vE@K@pcUeVG!m|MCZzq-H&fpFDMEBQsL5o4Lei@AtDF+Y1d`6oIW!cax1of! z;`v{*+MjycaxT^_Vp{Obsem6SNR2|~SrUYITvUUZMW5R2#}LzbA3z67!}`zwFg-sv zuGs@wQY%k%GBIUwg*`L)v1P6DiNd5&w1-`MU~I?ZrcDz~i5~U$`y`k^2ldn=LtmMol{|Tc@yf^bo=ITz-Rze3#H-{d z$EkddrxAOzb=_w9doRhUGq?uyM$QZh$7Kkoy?f%7Ld;t0cv;cvd22@G*J7@yAGwk` zSG$u&ou6q84z$R2qH_#InLWl_IynjGjA!msUW~v}6n;v=z60O(dCj1oYr7Ld7UF(u z`p}#k)EQdC3T~-HoqHkY5emyDncncrAZ#_R#;y0M327J0KH%0R%)|;4Uzd+dj&|C+ zn@RntY@@q1BNf9Yd&MaiEej=sb6KEUx{0z?+u_4SuV#q6FYXS)X1g|j)a0w(;!Z4d zMP4sh7|zcjnx3{-C|o=fy6WzzNlqwrWvE9@O?jW0r}@IK#@7yBaE6CqTWt=eFd}?U zBfA=++%h+Mk~gog^62NBd}#8hM7$(nNm0j?Jl$*aZnyv70=U2;Nd8gkIgmMG)bH)v z+EvXm?Qdl0r8^cr5U5(D@mbiV%==sy+By4#dnB=St?be7BHGit-3u+9grAb46wMBu z^I{@f8mO3kYstAOyb?|-5Ft z*lFaFAQaM_MZF8a8}NRtswZk=D^oOrTK zG5TW@{?u~W8h*@~Hu$7x{((^0M)}(hj5`G&Z+~uIM6l7^nGSTL&tvhT1uv}0hC};m zZNyZm(Z% zUDuK-5g6j8lKB{o;e9PAc*G|4GBn%ep$RN80eQ7V=ZWM9_erpZxe2-Yjsob>(R67a z?1)Mspw9&MHWJZsrbl*W^mZ>Dc%LsBdIf;A?%uW)KbtQkal(4CJHXH<5|qo82%Uu5 z8ybd47@TZ(W!d(WX&QKgxQv{ds@JpW>QBEBNcd<|^4Q%^S?e?eLwU8Cb2K6`xD|VT z)fO+Q!Zv$}F3^HN49;jB7PqUP_@~NoDV)xCxN##op!YS=@{rppDAa>+KW&aW5bU{IaAt2qGvK^SQWQ95y)Z7JJ?6Nu;ytPxWs~U=Mv>r zI>v95>}~}lEnJ2hY1Yko`TC}yhU{rc_#!$O^02az8=BFqJL zX)8*yZ2y~nTDe!E`w$3hTl2P4YX<0-+^ye*;5nXI>)5fh7*HnN&GnvCyc~|9LQj~Z zNd4`jJoJZ7>IXgFeoQblTgeM|V`m#jRx^C68d1WQM-x!Tj-RAL1Q7me#VP|$Ep)0a z#h+2nwK=ziJ(AYt0 z0NYcfG%v5p&yziHD~{F+9DSaES9wJGK)rp!`*T5So!6P8cC%TDbpjN}b-_L8duQjl z&Vx}7qE9x@Hg&=%xLY?)1pQKnh9CQHe0eP4cQVFq#F)ZKPw&f-pH6wUtz2z&h2y+C za%k<-Q2y{Yo9V{Q__h=J=xochB6^^3rhPtuEZsI4FOV;IV|1#mdY;$ToBG+pnhm<4)&iGtu5sB7%YBmtcKz-qJ81>UA5#U31WB z2scvNzGZf$$-9LVtv8vDc8?k_P8xFF^+9Vj!6ru(a)ilKk^7GX?g(Y|!ftx85W>Lw z#>jWNYHS$XEe6el_P=QP4U3*s?9GrF;981GU=zp1tY3Jk$83`E9~}A{1FQ!uZm(Fx|Cwq3OZL4jsO`j5 z)mFCRs}9Jvraf2Nu-=0oLXNT_*DvVf=F0+2Sx$!X=)-M{$-atm`HQ1UHmZ)a+7sgh z#}0ZaMnZ;Y%okI=FKCL1UhXpXFOYhof}-DEPilRi!OBm%Q;)UF3!bFOtd-$vuJcKG z7G8t0cvkfdu1ZxM$Z7X*OZe`f``*Cp6IH_|rex5?NeU94qSB6OGC$X%zkPSE7473M ze0AI-?zpvFe)f^n_bQtO%}^D9h4N;<*n6pcI8g}?!53O=ar(Rk0HJesTN?9J^A`vv zpfA#PUs2`Xp^Qxs1Lao}q~K-aAL#hoWzIa#F!|&q;8JXDNYEd@8a%zp{*~SQHu>|B zk%`y0*o<3G=NUUB!i87C?#DY5Ii@;^`Y7Yaj1tItW6~%80;Bkc;ZDATA#m68(hfFT zZzZ626wnXUCc~%pG2bTN2wfBePg?|Yc^9J=L8zP=uEaMPfXpm^d=)4txJN_74zR<= z(aXmNG+1g~IxRkIj-ALIW7sNT0$l?6<@lZ>yu5o#Kw<68U_sd&fIok}mwR_f@s=`t zAXWGAAhc|*o~ALIhU^5auL9Ess+gc8Uis_xc9^6?S2qWJ?Kj&b9^0r9vwLi|0`;-3 zjpq%!IqzOCRbw}!caRG+GcBZKa~uPF4t^2|2?^9)D#46Z=0FQW=~X4vOD;es~PKWfv6&w zq&_Eg$tShtqh+wb%$&G+Sdl}6;0*U*bLIS$cM&I|3O(u!zze=<#((IGOW=npiEPsq z02BX+a_^hAB!0jV2-D=Tp6x&1mRB2kuM5=a-=k!&4_TGRhn!`b&heiW5QSk1DF4Dg zI3D+k>1((g(e zp++%)yGAa4Dop)d00~5RlFUrNe!uCQ9{nfjLp;Q@epX zKVr4lP?)_3_ygG^wDC1qA*6C19v&G6pzKAGKmk6=*k=$K?@|f(Hv>sL@f*ze@v_nY z{m9$j`{f_R5+3Bwx##0eHdzd@o6lKkA9OHdZI&Fk9tyPA4eDoX3|2j$msxw%A*>Z` zy&118Rlc#{0$p|J}>HIkhe+UlC>L=P!YWCh-Cqkg;`zWs^5xB zCa=C*qZ{ZSNjBOn9?89#WII#DJqj za4j@)f#`w03_56g>nm z@2XMJQFLrpZpFkMpO|0!B0&%`#%11Eh%3Q!B}wmkP#is^3Wmnp}OnS{+= zzP_99Ftz;hw_E3bf4;IG#%sKB$=GFgN2cE-0{`NR@ZQAWwtFZf`MV?YkI&>(K8S&2 zt-vh*?N)7|^r*Qt70-txBu|fbC&*HinHxNgRRoD||CwM?_QLQyfmcTd*v(hH0WyxC z5n_Afe_0H0|8xbstqWFWO(=^hOf60^cl;JND=@ZdbgcZ_Sqe6u0nK+#s-VV~imxMB_kwq4r$8kVVxuNhb`C z-}#@v3Zjg8vcai0{=wNosteO-6W}VYGiya0Hyq=+-MEOV9$yTp(2m|uKdYmzZgymv@3IMhPwIQ zj<~P<`HeG-bHR)&JDI=hG3_HrQ4n#wEQwDIueV;RZq6v*+1Ad)zGOw9aLptKjeyCg zqTI93vCOaSmw@ciTh|_!KW~~t8IW<+u}e9{xgQt+yHMQ2G^hu*ZVaENnOC(5h!p5 zs&NDfeC|Tfp5*G{1i-9IjV-(fgIJoRXGuL6v=HxBmHJ|JZ;3 zt9|Jg1Tkt6xzecUbpT}&QCFwsjx2FCnLSzx!BVR9yGKG|vn*?42nY+pKm9#!spbFMx5z zvWkj|SGf-)1zh*&T0x?uCYGah<-kPLapNfp(_)~6!4WpttopR!qolNEJm8DSG}i0` zh*$5ZM#d>)%GAGYxj+AnQM!qu1vy}GsQ?JO$fpL;00v6Vz#vtvK;?A{FtX?!*4Wf) zQ%%L4Vh5mt)lQE1LXLRG};1Q=f1a|UQ?CjgwAA% zA#9fM_qdN=F+(r(14;L=qxp{q*>6%hq;L0G+kc68)(VO@zrM^q+MR2Z9PZUAlQOKr zww%Akq4(6Q>x)^X+4f;Xxb z*Bgs8)`gQuaOWEujw;-d)_wKLFC{uR2XFk5h?mx&z?wpVL9-5oFgY`oa_&F2pu{wZ z$zoX^#R3QCfd2YshDdB zu*+3?E(bXb-5hEn7j9MkNuo+u$9rRk-&<2-e#pmt4UVZ;|3wORzj}R!y8{|mFy>PU zNoc=?J+l!?!4KQ8e8n{>(HRDKzfp_dDP1*RkLW`TjlN@cIe<89oPRC4Rl>2rn3eGb83D_?+}I zpT0K8G5Spwa>xSg_p;?vvU4EOH~>8{crK|Pp=sc$euX+O!t&z+Ec(3%>TgKd3`~e= zfI~2=%ZtSrWXWZ#>XY=G#+O5?24G^Sv<9@EeISY3*oUI1gXT}m`7eKooslvTkTcLf z+cE&^ZvqifLO25vzvzsT0q*GLIEk?&9>z~=Eu~GEw!P|7q0#Ed!w~k**mlXwp=L96 zIF`v9CwU~DG=@Hxv2@=VyC1~s!(EF2oVUqFp}NcES0&NN>91PkTt-HaD;<2>i{vTMl?MO`U#_>iFcv(W z5NtsI!-qbtQ97O>b4pzx>*Nwalm?hS#^NWAbMW7e(=e^ zwE_QAWMQ`;Yus9@aeiFqJPtz<4j3;6=U`e1l`Ez9EV?F}cb~^@vM?8+HrSN2A{5Iy z$qLOD?$c|jwi*Zn$?&Y~Y8m9T_g~FdXIAu7bS@|%turJb?_V_JPfc!fc)CnoY&n}< za33bbrfG7C&ZAF=s3I63<+2}Y;NJO&aYy4vLrv8qO9Ny-et6`sqz{*}XqBf^P(i%UIi&_itoY8`{fmxTAbmKN23SKgt5erALgMSqV7r zS-5fonw#XH3UF0To&f&QuQ3nVbd2&2*jD$sl4(JfmpAy>{_r2(KOxvc1pJ#v12hsU zV;xpn!wIWB6A)zT6y|jfV^Rg0P#?=jiN=3M{V|VkUZyDj+uCqx-)G{-$fYwdGD_Fj z%Eto)9%=dTCc8ge(d7WL;U%nN*H@Pd5r1#MYzux4h>GIJWQ7TUn}4DO&TK)tE&Q)` zynjVt5h3MEmaVprcgeH-<8P+<;V){W{42je0>HovZ9B`c1HA5$TP78MqURxNs$#xV zV@qd8uA-Mz%D}Du^lSfdn7_{?PUPl5#smv|HE^O0iG0dPbld1?=Ju2v;TjKc^*6J&>>=zq*0Os?g|6) zN;IQ2jV}99{K(Co)g1X(JJ6IwURyhKsa`Y3y6x5{G3^ImxmL_Qt@2R2h8jwd$XDs( zn5SMb6v8-cI2c|cz3s%osw~_$MQC!Qh9G^A8)@N=KP6W0%Y!})Nf(TOjWF-V8Ub*89#9K8vfX~%+-x;f$l9zVIB`P6s6{e5xcy(dX(h$d^)P`(Erw*; z&;|=J^VRid9O?E;WffLWjC$Gbh|zv%lhtpOi|cXIE$47dupSv1QK@${ZIvGA>x%{k zZk+1V^gMX>?Ad6QgRyp#N$}oaPw;x_%oN`9;bKe9f`qTMoaO`gvL8@JG73)5gD{$E z`&NiURoOH#&e3YGB6hHJ$Hq2(u5@hdI6G9}-dArsLz_pQU5YRUEFnlp?)?f*0EA|s ziJ9qxy_J^ywzXfuQzfk5ffWkGv=_U7Df7{lzdA6n;9w22(0L1}NrAoQpIv(;%W@*k+1?)$vXoWGsL;Kr~Os$oOD-<1w=S z)cC|k@I{+v*$rX>xi{$m%73)uLRbZAr;m08;*HWX&$l58X)h%J7YXiQW~);hC(qt8 zUA+g8IK`GoU*BFqPyG1izb2L*b+%Ao9!@Q8*wdfDX}WZES+i7-m;9ulpunfLXS!U% zCxvgMy5+4ucJ6a=-6^mkvCrv&G{4hUg#N_D1)Fo^S;}+eM%Wcv*awGTJl+}izJ{16 z&AAWpWbXA<<1TU}(;bXNzo}RPIl90A>?MJBDZ=2h`z zM6-@QSkosQTtW}l8SLv+XB!9IEEaO$W*-Is5XrjTf@D^g zV!9O0SNo0)9`<$GN$*Ln2XDA? zp00Ws^383deoP+Oa#)|RjNByCnIW~9%?>7{cp)}AFtmqcZ!Kf=Jfn}7QBe4@``vZF zx8~Yn^hOTUCD1+G>cbDb@uS_bDNKRgdJOKxx#V})Ck-y!EblNfV->`ZKUbb^x^xpJ z?^mM_;6q?cIaRS+;ks_p0)UE^lOVU7+@F(v0meIlR zV+oTayiagZioFAo#qiB1j~JDajd-a$vHt4)_38yGKg^hSn?(?&KE5MEoB;o~pAh@) zo0nck`(un-rLaU_W4<)v%gZe~BqBNPfWvU$`-;flL>8hYdd?oocq1&-UXCf4t@L%5y~5vep85HF47d5ogje><9+yhYax}Stzs5O!l-A?5_^SVMmLj zt%io2=Hr$eD^rI0ml(psw4ZL{pIX%}Iz?NHwQEB)t*mdDzy=jOA0$`mAzV%OqijSW z5A~tfb?Em;7T#Lv+eV+TtqyOm*H3Q8BipW8a5Sz?P@a017sC0`I$b`*eA^L&s6gxx zjf5}w-lAKg96^K>OaSj!aP#W?QcDNf{1_xZwYRw7BeKb^rF=tgDU0}Pt33YP z75WU-;2>t4EfBQj@_f#Izpzh%C;zsOHR-dG3;dX%p`gZ6Y|=(2 zxCxoF%~E>{jlZ{2t@YI43Bm~8dU@4|aqZ)>BpMEQdXV>6y<;c~W|H;E$y{ejPlx3X zK9?8ZNTQHJS!Cdfe8LkH+MOe8m&uCr8y z7?f}Jj)41bNa`R-YwmXgHnCrH)GXmdRtGviCPv`h7uN>0nv!JG z8k%+0ouQO7{1(Z~nXQ*Ap4(Hk;arY=W!uB0%|h2loQFR&4HN6L85(UUW(A}GtR^?&5kC!}t>1UjCHO!9$$4BOOpDg)FyP7ri5>t)MT z4*8^C?)u|UTe%qbGcFUYz6Syr=uG;GX~`YF$re3e=c4+-#!b;DDJ7*I3>)+{H#3KW zhxku3f*6U4O?vKaQhg(M<=bZ6nKUu_!t+Jl#=GyF0_7t;QcofClFRun#VcA;O+Myd zIX@)_9#J$ZbzEsvmOQ3+FjURbaek&*T5O|s;NkD0MxzQa*WSEEFSJ@kYc;hZh=(b7 z^V8)Wx)q03=3}4Bb8G0>UC&0-Z%OvKGr|ELwzJa{kK@fCK1?cf^LdQzDYXlwsQ255 zlsl6X{2!M0QHz`ttFAk*ys-;1ZV`#3@{PES%nQCxmyCZ73a3!|dEq66*9Ja|D%B6| zdaq*ju%CLNG0D@|{?}Av5%>37%23-xe$N_OH65vw{?h}$yueLR(so<1;yGHqTgY{d zx6d+21*hQg`u%SbYd$5(B556h`=5+&B!Q_Eqs0_S+K~Izn);^Lfp6dcoDlFX5|LP) zxqp|oiTwO4MN#d;L98Q2ec%1+LtjJR{SqeFugS||sSG!UwDm~H*mPI`zb<<29Hl88 zVh?h{Ax!<4XG8mu3wMNqf+#hV|LuJ%N59N)fz5m|e;QFCwa29?dF|ZzZ?lFYYk@Q; z)l0P>PF1XD_5}yZOa)IX9KfG7y}X*TA1S?baJ@^4FWS`TiijLNZyRsc^R*_m`Hoc??sDB^Ybxp;ywbv(9^-78%N} zeBy%a;?YiaODz)3hKaM<+lzTar<@ByzMM9%^w){YKk|*;G51*TiazKRXY`8gjom

_thi(D!_Pft9-+l?M%ss2i4nD_BstwnK5N?qq3R=h^uI zXXeijO|NYMhLWkgogtc}1mgotz(u~W!f?KsBumOye-MV3S}#oW&ON^w53GqpQM zRWF~*t?92>z5z{E7lUGyOI4H3Tz;*evFp69J*>O>zS-R@ak-Qjn&afJ%MHddkO2iX zCfx1sv)#hu^ba`Zkp6v5x`LGp*9k=#cZK&@lw)vbnl0VI?rdktwZ2ST`;SZ<-0u$4 zS8`RZ#s$bE;pDw0y(aWCc(+&Kb5%%5B9=SJLhqdYV3WHgA*o(o^L&-g4hqXqac!Zu z4#z#7>yhM^5yVB4umaBouM_&`Xf%gu!-MkGhcUgp-c3sqB96`!g!av86&T!fToCDh zs&I0wbH$c!Ah26Rhy^rsI*wLrJQ~-c1^GTjQ^?Q?-3s^UP@&Ov61%FR!$e5C9?KO< z*B{Q>4(m?ln{&?UnNAkO?0h~$R;)fh*a&hNS5N9mzOF7gv0HV7k)rSea% zbP8qZ&50pz81vrs#2{a>$TDN;AzuhC&kO=b!%pYD=`e0PG#9+x^i#c7IKyuKREm1-*R<8TrmU7+MUUo0B>{2QLWXRvjsfUo0sPmSialRPNG&aMY; zo?~Ap(Q~EQdly@wkoTg@*~k$w!BO=bz$?jsTQgo?mi%(GSSDMaK`=y2j6^t?F^@6#q5>cu^tr z{B2k@jFtI{nHaP^udDq60wf!2EZK;J+|;T-`9rC!z2pZL6M27<$NbXb#g=QGt$V|L z!T%3k@D=44}uK778ZQ|8TWtdei-5 zY1sz7ixO|0YEDw5*4FCmyW7(lvrWh=e_*g4{#l;@lwcUF#m#{9RYSyM3$#PmW>PhQ z`h&vK!w<8!&_;sjvN?jwX-3SY(c#ljs3Ovtq}hn612smxpi_4GJYUIPG~`@i{pyLs zdSH1z!E6%8sO{ujmuV3qn?YT`g_fareK-|KSh{o?oN0$}_~twbT2Q_F2=S+3&Bgbt z!5Ke&rVFbsK*e;{;7_fOmkzj%;xBF50Bkk@<|DV?8L|TkZ(obfA66j~Mr{woIMQBL zjbGJc?lf=3u?ygocPa3>aq)UHyCCYd@Gud%Y07yZ+f9m28UI1_+Yns^|J<*n_`}4v zED^>Qs(m}O-8aiBWg$RKl;lgKoaIKH^RQuc)9r~->*q(;#+qUoua`wvxKB=u|8gw; z@y-HU-v;c>zH9HT7{WcoA(d)yFfAs%Khd(-0}4$_cIT$r{T8pOFdf8XB|})BLm7Y~ z{YF7BcW^%;#ZA|clJ!-N0Kl@}UjB*1dyFONdOkd1=v#kh6d)voGgeyq9%cO9WD)Xi z-z}Z;Cm+{*bxy(i>ZD$^tw~9tReskIVrEV=%A_=@JSGH4f`w zn-mLx`W)3av#!O=A#Zg;Lo5&XVt z%{Jp)Q%lEgl}*L28c}cUawjSCctm=$^+H_T>iSWYzx(4giMZcibFN#Vu8##EcueLu znMU_q2=|6n=!}!zKMj^9-^_EakwgoLXc-Nr4r}3CJ$J{s`J>AljV9~zS^)*^cNJIR zz?%V`(st2+pXCSDhw+`?Yt2ko;)tQH@tDVcw>QFgs296l6UbzS)2ioG!LA1MJ2P)- zJsu=MZtNbK`=wa&)C}ghafuT^>us0#9Xh+q=dhjnpp2J5X*iZx4eB0L`QrUE%m4Kq z1sS#rZhc3nPH)F92A6%9B$_IOlS!GC4PpfFOC*;UstxxJMTQVq4-K=wM0V`>!!T*+ zuei((L3M_d9s0}~wwZhI1%QDf%=I+?y52r>B5VG#1Qf+P^*(VSg*NsNL#FjWY;m$X zM>geqBAeBb;*J$KYblAl&JC;RhoPF592ZNS+|g9_$0dSW?N}1jE4OGWE;La$Zq5rP zjoGbvCp?Y~%f}ow?c2%lDCTd%rZ4V=Hjk=*VYKtews_~>{#X8I)d*vBqB$(uwqyY> zEtZ3=iarG04iwM&9M`Nm46Bo0$S?O#kVJz;%$74X)qXISJ9wp1fW>V%15Grbato0) zHpUa_I<0ESJ3#T!6AGw%h}P?(rc%08Y^{Ti1Z;>kUM~`N6x?b|72c!}L#CJbfS~n% zftx_`u)I#|P=sugIZNTUAw*!lqGb(^hkH_z43$!{w9#uzbtH=`~y!!2QHEShWq`xBd~_o)ZYKbA?Ge}Aqe<>|C?GzE!(%cv+MiFrI9 z0k8c)ccVW-3X$-S@+vsVeo!!HkmJ$r<&GpE4^})369;hMB|0fbKdVyF@}LqP`&%s& zoZ8&zzkve|2V?D8U4J7R|JhAG)F_~%4n(am(%^QB*6`@WxE&$O?E<1@!XIZ)|MaKN zorKQL)$Nv3pJgrQY;o@(5b01t4_>wO{{j~cavS`?)M_*JmN27Fz#6!UeG~h1zMJ+V zg6V&;_m)v{ZQIspf(3#Gk`NpML4s3AaDoO6PH+fNxVwj-37X&(65QQggG1r&4uu6M zT;5{ubI#pzzP9g=_v5|RJ{pa-peR{u%{k^Aee~Xk0&D1V%F~WX1@2CzBzm{@x6W{Npo$D2t}h=3Z6z;|X}LaSh|txjGNH(nijF$j9)Zm3n#YwqhjPSPY1h5m z3?o@1OM1tt*>1U#^ay$x=($imerObGiHDHve%iE!Fig5veEmzJ=fHb0vJ39EH%s$g z;M_g>#^tJx#+E)@*UFuv=$;eyhi}nuEe7~j5iFPbt9KH=NYz7s+rKWMz5L|$v#(FO zA<_jBUa$E+?TTyy=Q*{0n;)rt2E_@XMWfsD5}x+)QvsT~y(5?3r`Hx9>M$AtU?<96 ztAR6NF%uI1d1x@WS^IVSf{O@F6+!I~t~>v=IX-m}g(ywGl9yb*$L;1B%`;Khe%yO% zjdK^4KYz4Xq0b@eb|2HMqZpgLDY$L6grZ=AyMHFA zKrgiP0COLs$wPjCj}+l+mO&YpipRoIr(O&k&7xRx1Ff)d=LrFCHfka8SwHg&6B7JVLW(++P49N08m@g zOQ2&7%j7N)3}diIX!KtCr=%1&L9{szES@Yh?8{`{SZ(yjuK`=z&tGu=Jb{DykPgFu zrFlQF&i@VL9N!qpG5PP8{DZ`j0(RBUI-(8a-{(@t8vwj#4U59OUkd*4E$S=e;0N&= ze#4CY&k#G1uK#}lw#Jp%T#|6KxOHnpPI**%aJAtbu~Q)ZTOj%^!v1Ns_`_dH!-NV> zYFy=qsV5ZH|9xH15db-f@K=2L=b7$3-?__Awr&ArcB|GLF17m#kZap{*n}7vNkzwO zCUBH<{wtjddW3YeHprO7;}CR|#BMeu|5^a9><2Fg_pEG53}sVEMRh9xyFw;lg@a9P zJpR)a2NWGtIQ0Bh3{l}D!PJ1Q3@%_uob+0bsWFo3+foEht@~NgEbQ#)2zOYUqFQ8b zUqT;1d)7AwAf#s!Rg?lYA-kltK#7L@7T2ZJoC|=1#cGHW?=Fn(fHd25?1vA42TM8K z-c+X#0@AUsv1%XATw$su4m&eHcaI06rSnt@Uy?y@lmQ_#34D)!do(*z-@0L$b_P(y zgm@VjOnYr?XNSJ4FzLbVx_v$X=_{8_cvGdVc6fepC~Q3W(dzd|aV>!)^^}>3BTog} zxk@AuyQjJ@Ml$z%W`@-s51aL^heQ%*p@!sWXDG=m0Bbz=(8JuBj8w{&>q#Nvd~;e~ zvtnFa4!ntmP|S5M*Ea_)KPY(Kk{V^+vI|cVc9FPSpUobOX>us>ZIrg@|>Rk=t{l z0;39ZO<$hnEyCuGt_M6C5D{e36)2acRaguQ0}3uf6u|IW;HAC5#fLBwUhwJWNNYP6 z3T6zusUl<#i0QrEr3U@dPWEo{?&0T##>hC>)%v9FI-r+|2?3OnQD}Jmwne(Y z3w>Xvlt{SRJ?^DftdXC>Xa?Nrdjc?tj7}4=wXs=eUt};u2sQ&SlDgCG+;$Zf`hD0T z&q7`6|0cq+`o=n$4+sVi3An)(U0EQb-YxdHXa;q*do7X&d|+}pto3+UBIWqNn?>_` zjtv$%7S?mVzI3)H4-g$qN3){g-q-tMPEb<*wQLUa#NGnTlqi9^1fi6a$by$$Wq_Bq z_y@bEHvYfe1#)pzsv*IS6w4W9!ii#LNub*$z$}Xb9FuD-c~$b15fm1z0Ik)l$lD~W z+za%9>t`KR>F9}|@SPiJeG|k> zr^Ey87)*RsjwYd(g6w?J`^?@Vh_u}F7~EBRy!C^kZK;N6NTen)RYYg9RgjqkwWCEV zuGJSAR0~byrw>%7E!|y8Z3lB`*Et;Z_VKS@!eMN8$Iw^70a7_C=~)Z0??d;d= zK{M|>qTE+}MSx%W#h=4!O5Sdxn~n&sQ=CVuT)LtJj=5+;yfWIWbIb~Z``3v*#^;1A zT&_s}R%eiqTmmTNGC}b`jU?XK#mv)7%rJe?wae7m=Nfr!uR5RykozX~mJXL{yB{-P zREwYw6?-&ayF1qt8{v2rz*@=Gm*7IRo>x`VDKd>@`~(fJ=f5ntaE|_tXnl+kqV`mM zPbm1dU5A=QXU~O|pNmiV59!cEpotC<|xVzJ!MOhHTUuvZ1;iw&G%hY*k zm~mpt_&Tp!FYVa$4)q=_NCIqjWO&KjDb^s4gWN6*K53~KS_~1v-$>hu`53WZ`aNM`d!DE>T2@-u=#@6QeCer*%$_Gvqhr``>V@% z{2oAj&&_AEbODsto|iWRMFVij(WvXO;rM%?K7%Sz=s>OG>juB499;L~0?vm5=m56h?UdiA>yhU%)Onk2_ULWZ_43A%S#qqNVyohz6^pdY zl4Ax>%Cqnpw5T3VBFN}|K0fit4b(z!pau{Vn8S?eOmjaaGXViQWN)&1!eltJ!vXkcbm`#8zqZ2Y{u!t3vmAAC|Eqol4L)?*~H_xMN2YM8CkvHrHMs?1-bU0Q{tvSo%^C|@Qj>7zE>T;JCGDa{LRHr}uAWKD_j?xVQ=P$)Sj zSGBUv)>zNj^6#o7DTG6hFM0YxSUO*E6b@Spc0zV+zo<{xt6Zx$P&K&R#ytL2dt=uJ zs1y6`Yc-ZjFH8{@^He(mPI9^7KzXM^;+wY#E9q&rS2R=1cb^L9t0rdNb2X-PF%Yl@< zPcJN&w3Au%KL~zyM)IQ&->=Ba@}|XOdP?19-o$Z&xjKDuMdqCo1W3BtSFMd*+S?D$ zoEPR?*ABdI(VWqkonYXX2q*H`m!Cd8AUN0X&ehJ3xzE%{Tp91qkFlqVmcJ~wVz>Lz zuT}cB29r{R>|KmG z?=St10S=qsQ2AAMTD}n&f3qAICc^8yYcg@;;c2wcmC}83W=!bw$R9O&w9?*~+hZ-K z0FZ|z+W6vgywJ%z^l3HEyjyw;7UvY+2!Xs&XfMG0wwb_hF2H3q7d33q{#|nw8JqO& zdSCQ23@K86H<{!j<(`U2HnFJ?9={LmLX>SavZD>466U7M8NW+bqN?JmLQTlq{>()$ zbNa^SuPi3_CA#v?NpnDa6Cv^l^l*__U=G7hWBqqP#)9HODIm|=n|1CFSqCb=rh}gZ z*H(T8+sPS=-K9fEfgPuP-5lVa7(ZtcihaE*$$Np zutLL|luuSA>Mjg$CUgl(9%@t0^$2<7xiv4J|22NdzX{2eIY0lCAs78Fq>+qHvn~Y9 z@_L}n|1|GUcpH#kyMzF=gk=jB99@@P9I6A?o znb#$48#xI+@2(D=`iuj3Mk4pN{S0O|hT3oV+n$$jg}(dDiO;BR5hh~t$it?wL^_r^ z{*^GZP=$J_UG!r~f_}#;wt{^L~!z@;X}G( zO&8BS+Yo;y^EK`)l5t0j>=`8Y=8#K(76Yj{1${19$NuwFaNcq(Xl!vjZo!OOfRfbTH&zLXM5pr1= z>QH%WHO|x-b>Z%XjN{Aot4auv`1zObuH);n<)aP+TuDKw3#YAslp%incK)odAn&({ z+G6nP0Tkaaw{+Hd(Yu(G0V1owJRoUMT`ds~aQ|Z%blUiWpKPGKbW_Ik{di8EL2XBr zAs4Mt=e(UqDzLd0_jR-Sb2~M`4}QMQUmoJOr9l|JpSD(ivrz!3eSty%by_C*9c=g9 z-Rm@w#o7av>d>SVBQk;7q-F&L4wG!;aa>!=9c8mWwJ2R6D{xDW0U&tJLitv zSj9aIDtY`S`^F`R33WM=qVc$YAMm_PpqdW~-ZQf{b9v;lCq!ij?`*AovPy&)R#M{r z^zAJvhVt(PdZ2rrv0?cBJjWBbO&197OJbqnAoI3BJuL#ZIL44ZCw%0f$-XZ1K@yz! z(;Vj$6IvI*Rg7IyF;~y8sz|Fb?*gYGQ)`+{995&rqgDy>j!B!``(ZYlIU-b@Pq#jY zh3x5C6L#5-o#byg!r>Nb!$fs4z>1aU*KPW~$6Ez)4!);e(D+SC6JXL?R6o7EjR0iY z`x|WB4;e@G|v0u-q zkWgV@Hq!e)emXYCUD)qxrdn);n`?Ce^9n-o3{eHqhEasS!7i3kKU6!B;2m|E8H_bv8%H;0-VBVUmwi(z z^^AU}zg%a7_#HWqQ33=%#vPRPEw+=b-%7lj%^Na_%BKb%Ot8#raYoS}e!SM~eG>;i zO@91bfg|WuT(nw~g?bkSjxA0M=IO8Olmr`ti<{#fbI;2-w*EtL9U@dvNr8H~$ySOg zm_#=)ocLQc$5TQKP}ky}UKP0o!HW5+@3b56cMg3*zy`t$etisnraz=rnDbSI#SdH( z%t`BOBl26CI3?V2ixIw+z*Bj!WP7$f#=a{F$F^B7Y+9Ve5>_EW(~sM(9q3DjsX>$qMG zZ${_i<5#cDQ(3PyPI=~6{PvA(Mm8E28mF)ID0nc$t{JHq+KPz6qMSf8!~pObT~<)} zikb|&TizxZP@DTT0FHsL+|T?QN0%<<%f!&b;jG(wTbkCcb148Tb9;Q%$dinYR+1g5 zTwG=1%ZF4jE`HmKy9#O#FRAyT196whiQ|0c7||PFaQc29=>MXe0Fs9#5~Ic2dF*ka zL|m&hx4>^`dUGcSf3u?Wj+Q z;u8JSIlgBAxWVst-$RN1bxMDzqWw>)=(j%xSt5~ssHw#x1iZtkzgnKP!hR>Z{pH{O z^s7&o+ylbL6;XkekDglz3x5VGEHHg&*XqCS-+%I1~U|iSV^YMphR$G0k zu0Cr|4)6N?{Qh&=|K&ia;nf37WR2eT8ANn0F2J|Ju;)Af?u85SKVQTSO@tx&ADMgw z{3SMcFI;2+`}`h0E^O(jcquK)Pig&JNyuqHC08In&kziW7-ML00bC4okI>%g$9wOjuf;x;|?u%pJtfCGR#gx?A$8}=y1 z5gi>#z5G%U@)s29kGJ99$F@E#Nkj5zXlR@-2SSM^U$Gn}_?bDW3fv2qOWtLq|_aDE^;Q$^Y`namem9HsQ^$55D~4 zos0|D>`uoIli2^1bpH!X2KZZph75W53iASG)=KYsh`R@?- zuZIq4(WtzlLc0uSfs%1-Cg4nZFN}#+(+yP|MZ=|v(48!dEZ-cI431%(Cyk_ZcLFpp zA%^{N3JnbnzoD9d=3yG3odQhAI)3Upf1sD|J)$l;(_d*mxwchmAO~jychf>StoLc_ zU13@MNnFrU{t|C*(~+9e22Qj0pdey3*FaYe zhI&~{{>n&x1N6oO%2nXjMJ&L5-nos%wM~>xt*D^FbWukx@s0lJa(pbkv0S#>KIdRE zKg}ldo9fLX9SbJ+Qg>%M#hMZfLN?I_w`18{#o97<>t7y;&BaswiIaa{6LI(vO2um= zV;JHA0+m8t?L@FIV7reCDMF{wy)T+xP3BiY zJZPZBylAbYx1w?;&Bm z4PxozGh%#3{j?6nnrZnSjkF@Yn_WTJ+JQeM5&|N_?n2vL%$LZlh@*MID2xmGp826! zT$lZzxdu1!kYHcc2#-PjuHQCdLnFA}QymyZv+9qno33xmZ5aHl$qnrq9H@UNSQ~LQE)* zz$iS(vELjd;db1KDgeyNH@r{dksdwbJ=MBIACo>v7?4F;^kUX4FgNLJiO>#qVyo1?zQoCuFa$ zuiGlCKdwtnH`2(2{4Ae?*VsJj82Rj&uLkq;p$f~dcZ9_dDC<@jmNH!3xFQ5*~vwMJ^0`lWohiEg=ZN;D~R zQwFqv`<|oHrA}V*oLNT(c|scS8{}o}L4;G5PX;zoY)*E00lKx)l}o;!EeBo~r<==J z>y;F!Zf_KmL9!Ye-p=B8CTPNQD8DiF;Tw|OGM~+rK>LlFzmZga+kcZ{-m5+IN*pfT z4{}kJ$LaKGk?03j}9H40p?qs-45*GXcUx5{l+BccgkBWqA>^18dpY`tc!DIvim; z6$`o^&{~vW);vDZ+`Lkl-9V^`y&a5g`n35L*KPB*-@DjQ;7A$j`W=?Lx!$qy%1&Q* zior98fey48-682oEK4mJulhZ^FLi-oA&kwL9+~I_ls52XKw9NIj(QSG#zD%tAh3OJ zJ*il>_a^u7sH@D(1bLVwj9Sr%Ib+W_*1q1$HmbJBZ?0xTc+bDFW8q_PUw^o2bXLjz5bD+cr-}qeZ z;#v3j0Yz;7y{RbwUR93|;v)y%;HR&Z-zBh{F|01Qs$Igp8RcB*Z4e+fNz{qUk05LF+8B@HsFa>!RLqw zJ;?$~Ff>N{d)|YCL2?(7s6ZM#K0@hOrcB?QOrxz5u65IA_Jm{BOZzMY*PXCVypfsd z8U;#IxQFy~wRH-E=4GJ@@n&o+bH4Krw_HQOApB@!fZi7cgZ=DezRW26Wa03@d*mF= zPLtm;Z@l2wJLu0&GJYSRD91)Koem6mOgt?B!KH34)U{@g0hDJ=V5xAP;cv$@je4DOiSlj*mPr?~aYt-C0(s`GOU!Rom9)%P{H#7%+$P zCJ3V@N9U_bo)yhgr4P=X{QC6`01CUj3j7w(q96LAa7XiZqX<71W5@X}=_qGcn-Sw~GA(^-F}CPuF8!UM z66uk@>u2?7z}~J#e*%4CLxho;Y=Lmu77dsB`w))taB)96Xl#}ya&|S$T8kFPcO`Ot zJpK;H?`&_;+6tY*Pw&3Doir@pAy*M=7<@iUS@034zIYqK6FACr!@Z9~Qwam|MtBK#Zf>w-$FaVgSDn@Cv^#F3Rp4+V8~j}K6s@mv^( zwzH(R?Xd!IN}PD@)`FH+2Nm=6AS%ea0PU_16D}Sm&1rK;-nHoHoc7{~vka%9uUV7& z3m&h#VdpFA2Gzf%xIQ%!`U+ zxx}do(X!|Q=4olJn1Y|Myg0jeR$APYbZqBRUqhOxsd`HVn{8*sQSKgp-%1XY{fglg zW-n1;CsWL-^o>xlst<$vVv-H*O(h^H$9S5;aJ%D17ti`{FMw7>bumbR9e6W*Srig9 z6H@B=T9G13vt;9}basQAIf0L_`{A1ImC>qLmE(T?j-|b-m3F;eF(LB=O&FPVgKXXe z>Xozq97hQr&3mDQ+xO111zc!K4p2Rd zBKGI&dK$qlsyCkbDf}dz@5_%)#KYpt!7~)d@UxPIUE9^>J4;ZngGQj7C*V+_O;C#2 zf8~6cn?0RMke+V-72M?sGK=azeVq4n6IA%tYyj6uW46lDu(b_&P}+Xi-v_cX_Gttf zh(&WcS<|dFo6CTgo0}^TXu&Y>3ue=FnItCi;2{!@(Et4Sk%rXv(k9Z(jM8M3w{^Xb zdAH&@>SR4XeBZ3GhLG09{y3Ct+A-1l)YV9P>}$T!0qG=fCw$P>(k;98dG0tx)F6RV zRhP@A+vGX#0Tvg>3jt?N^;D?aLrI8^hmEy{vNrS3_2R7sS!0gfE^Als4K`BImzAba zo1_Vf-imdj0$Y-gI+td=+Mw3sqQkX8-%N3jG7EK1^{Rq6Fs$$TW=Bl1+K3Eqjli&6 z`=$BB_g#*1qt$*gqtQfNBiN;X(O%tqb`Xc|$&;K)-U}z9IQ5SKVzcp)Oc3zhOQpp+ zMGaEt%8ECacE{7XD;l0xF^*;D*_%ce*4A|!Dr=&lHB?vX3(1wk2Gttn*;1kz4vkB6 zyt?7)ftirgeK_e2);K;7#te#5xzYS>+T5Tk(}$WNFwYirIOp49+*12Xkn+sqNPne8 zov3m2kxNgOBZzgP%Ikr06j6sb^2Sevt%L_Hq0UvIXJ5n)po$|Ga-oo@s5bI`!N@yX zWXp!hW3Qx`7_hOU#bRsaJM^@!j*hQPM0P7*($u+=c-_IXTmFgzonvl1^ZjD>Bu?_o zZRUIUBw$(QMDyT~f{mH|R2GFrB=w5I#gc{SSD7N&Np?p)8;<&nsj7^cJ*(mT)M^Qz zVLTRz#S^6l5(G}CEcNfq2gmYMW>IWOIUbgvGuKXGC~&njO<)m*C@ER)6fsT-aDYzK zLH!96?|~glF~R;mRk*(Np18;LXoIVLeeu-P3)A?I0r~7O^B?k>C7ug*qXTK}>)W># zI>BJOah7QV!kXd5P>oflOtIxq@=NDWx3a16+HStS;7HR^sG^KR2&{4tW>`STVa5PD z#YW3&6@m|0vYU;)E-mu znV0=*U`o{t( zRaEQjxyp)gNvj>5Y8=l|Z`V=oWy5DpY6)eU{MdgvbVplkzF#ta$15`Iu1rJh-N1KozUt(CyPxd5#}`8L@@4*P`m9<>mt&Os*?YD5=6>~vxpk!BuJ5`! zQBelP4q$gan7qD9zCLK(eZMbhl-7bMW^3w%c1r`yKGb{?);rjfxyNOuP2`b^0c!SDOncYRdE!;fyB5 z%dGi*#e#oTvrN`!XQgT^>R=&re{GLpF(=!>D&k3G-2sH*s^P8(6DOZ=Z*YI2X&~ds za`VZ}5Ctp8i}bzvgXVH|&P&hYX}^8h@}zy%R!7X&4C-|qSh-muQ>LSqq{d7P=2y@p z=NbD7=GWVT+Oo?oH~bkKV<$HwoTpI1y>cuc$D^UhU9l5%rlu(rTx<(0|H~E{#3~J9Kng^#!vedF$&x&;&^VOB{I6 zL|)Gqjb;9<1@W||h%KIO6N9&l)VahPkT$-I%$A8+&)WE=qlImh!teeZC6?6dgq6r; z7=yU6M+9@(8lp+dA{m&8Z*W(k^7>UZ?CV>^t=bqA;BG z_yd1fas2{{p3v$!3q%g5GA-LV&zd zW+L3(ljw$fROW|}taa3|MINAFm`&;XfY&iFpE6Et(rBZeCGwg_Bttggq*`KWGiUZFR+_B+i+$1;ASj>~w6=Pe5|x<kW2 z?0ivriX0ngPWUGRIU5i6brwaL=Zd+ejRy|~JgFf)jRFd^SGym}GAeQbV61QNM5Efx z)=B)6_eNYuN&P|N*u8GiA1xhAE{dQa24vIXZqd%J`hnC-}0kMC10(!%(Uso zDhhLM3&;I(+V--}iLlLY!ghpWBXJ^MO`ks#jau(`6e>77ed+AO*(GY7X0lk6l$7m_ zy%k}W@RrZ34T*?lqGeiydJ10T8ZMn+nhxJ5^*&LU27i`(&wnF0X=57>NnJ{2@hNQB zb3NtfcUuy2Cmy^ieycQK@i^0T2zF&HF^#c?EqF;ArP7uLg;SU03Nkm%WU6Ud1(w0) z^Q()03T(dG$Hp>~j|_N#fJ*-9e|`vwq4|j|iNAN+o2j(RCP0v3#xe_yJ*uk*jbaoZ z1%{^zo(QhMMkX+e7S`rmJ1=ZM4Zp(O=(Oo|fZlCH~st@D)EezjIrg z_1pCp%jwfi}F?z^aql2>0m6iri=_ zU?1hJ&YVr)T$s(7+<*6_aIx2L|N5hOXALuyQzVMp@_ICzC-RlsLX~T6|HU>hhW7Jw^werm8E%R`+bIW>~o#{nso$P?=MEGHnObbZ@x&w|;3vt~cro z+_1VXJ?IYGm34xs=Ns=qiCj>;fzzN~i6R+AADMkM@c zx*12vyiE|@C1I{%(iwtPm#$YFA7=2-fkN zK;QgHV)m}Nnf*<1Yx?=jukSI*&lOMGQ@n5J3NALzFT^FGl_nY zTBUb2wm2%6C9RI!|9MX-+_NUvceFv>{;K}6`D~uqjneNHYfS%v;|CE-Ih-DMo?5RP zTx6?V@w2=1%{>ewF84u;GchNPvs77M`AZw?`u+o08~Hj2Y*JpocW|MmyJJ=EmEy4@ zsWwqk9<~pw)|J5T85(D(H0~cVzvOplM!Pi;>dgI>4cl3KlVFEL02J^;C4zWzn*7rwibLow4C$VQQdB)8qIMv^n53m?sjNGId zTP%UsQx2wuzFzSdaW_)Bmls^P`^_6Ro+4T7gOTcjSnagSD9O_Kc}Z z%30|lX1P78uPTS~^ywVlZmouE#e2*iBVzj-t6`*jJ51%EZ7|(M1}0m8v=i(5IqCPS{Xa8J-l5qAvH@Lfq)os8B{Mo0+ghmNp-6l-% z+3u8|!|?WxX%dzb+22Lur0BtlwB6wxX#^zhr@N&Dgl^aLYK80~hE036ujM@7gvVd$ zZgI*9?m0lzj{#GGsoLr}kMiOou?=n!#LL-i6moV=iEuTLWN#YsZ1%p0?^m@r3nEV_ zl*>`ZVM@M`%)Zw&yY@4Nq$FG`a8+QB`4eo1xXmy5%n9U>JJCH%(bE7a$1cnUb<+Dn z2}a}sna5h@SRy|cWkqKtqVg5J^_7?PI^UoI!RPPLO(5t4}=N}E|GdM z35nU3>fa<|H;XJJ0e&1DS14%HNRA-Ss7zI;Q!(vi-YE5 zMZ2o@#}YdUrx-DUHH4zTyT+|n1lvW;;i3~kk&a5u9QE2CV(OXB zEKO0mA;r!5AfDS7SAhgN=Ai?^qZC#NoR(&0V9ctwBlJaeBjDogho;}$vrUDR5xIcE zQl>#zpk8X#`e|&+3Msbj@!J7esoA(x7zch zB|R}#EEy3KUp2!%4tl;e`hKlqR4%%6L-^V>JNfmZ$5mk=c1B_708>bR{GR3P(FrBbMyV9+a*l|r^q{xzpmp$?J*3oQbce;EQ zZr@z3S8Ub!%w|N-e_|B9a(jRb06$|N-h@X$`{j!?dRL>#sm8`tnYrvhTrt|F<1MnZ|ZssR~CU%;TFkmm!{Jn%WN7T zUd(0_VkZhF3hRmmAz9yXChzz+^NE|W=yTWNcqn=d%NyoRH9UDQ_@_pMDbKf`oT zX2s8FfQ|au^%sWKcOqH3K`y!6Gt}>nsYWqcvmCV>W@mbIzXqT%VCPSblk_|tQF)AC@aTHhC*S$?OkKnli|Gp%2lgnA)~6-u`!!&{ z0fD5M*qrsx*zr#sri$8gw^<|z&nJF_R@tt0T{Zq7?iceF(twBtY7;r^l3xuikFSJy zM$xU@4pCx54z>k9TXt^R71pli@5?DGM-jXCm!7^Xh@@C=@_9zDnsCWUuN_af-}id9 z0;N%aj8)j7yP}V|z8_^NTMj}^FB=NNLZXb+)ga^}y57)%)CrsKVnST8%2o^Y(l+ zoD(qqiY+?&X`Iqm2Zzasn^eENLUk0Uy}F*kK+h9w=9yDV;&HST{{kK}Em84RN*K=M zV)FQPfvRq0M#>%kfl~HCKUztDJZ~3xJqgrrn8$AVGD&tw6!BXsr>8fm>z2Md;!o^! z@g4>|i?Nnp(!~uHh?bjiZenzdiiTs|*1JPlgnYvmAj~mCuu;$I2FlaMTwz4nM>|Ia zSdM3;H!~HSKF{r&@TlbuFF=Kxy9b-4^|@!+1D-CeKxg<_S2=#-t2Er3^b~h*S>MT~ zgb6aY<=Rb8#v|VMAeV|F9Lzr>HxGP{o}%`(3}9xJ>=q@}UnigC7dNZ!vi9Cs?tVVL zd!-pB*t+=9)%~2eN<6^blCU|c@wtg5p~f#{hqwxPP0{gpxsfB%W{^uJ*{dW<+n&N# z?(-h;@L|i5v%0g4&Gq6qil0oel}b&V)2txF*{sY|D;|?(Ro`M(4$HyAS?gce(61=z z>>tty1b&)oSO+|>Yq>@~wse~P zgR=*Rv$BC<*9N;&FZ=B6s(P)P?^F$&KqAa~WRGRbn;hZADc)71gf-^?x@5Q|Nh2A&!I+VNwq#NjhVts9twNylmU{vVk~PgI zH)@IDea6py95QOzsXmY}?DP#>hBCWp4W?z8pWrr5u|&k@FqmdJso z?%MZ^WP)jjtw!>VnWv3!t8IpbFAmeg3;dJ&k~-f3J>PA-2rGu6>p2HakKpsvWj}^gZ4>1Wz;>A@=8EJr>O2o3bHra?Cs5Kk%%I}A-%Ehe(mu#{t@WcFZL!sd2XN--?e(jC>gn*dT5W zLSUuAq;e6RNXdyCW9{)q2yTJWnigeKRt>KzD3D0-bk(f~*^>W)E#T17|F&j(W0=3S z-DFbtrn#8lwT|VnQF3|sYJ84kc4k+ctO=s?bYw#Z(&_wugA~KZa|6Mkt9(CpCX`od zP~5)j78~0AwY1&nAX)opQi(<~zjabNJvsX;II}b(uDm`<~X-;bizlCjL^$^YVBoSzKr~`F8I6yby6ITP>f3qkh=B88#T9Ua|kxi+M++JP{WUPYm75T-ESL)u>j6oUC-^&xxzEgU#xEEXTEc z4zsZ-FweP0*6|6#xwf;rPU7h#m(~UuuZzt$5kOI%o1L=Hsw=q2W1*_0m1tsF0pzJ^ zmEMUIBNgRX(eQ+xs$o|`q+zEoJu{}@fQ}K0boSYHwX2h3s3_TG{bcTN+RZ(JmAkX~ zBRQ8o5*)BJdUHuw*5}#mBM{tr>Y9>koGlx8F(UNE`G?Kv?zG+h#U^A`^1DW*`7Fg^ zgJ7&umRxkX3|KCBW5CFlV8546`3@LOby!M*Pzh50A^42Dutuhb z{h%OpVpv+Hz}%MyA}iEI&;}2HSe3!pxvq4Zy&BE$7Oqg&9hD+kGX#|g-#tD7WyS|B z$d;#%b>^n0w--5Xk4$4BW{Jp>npx(#E^?%6G&j#dZY{Pp1OAp^*Ptm&N?DaL&tc^; zglESR5K1z?2v|)zb*r{Z55U}uU>YPzNca63$)ev+mlIf)Hk%yM*B zuPZQVUDJa_|2&H80OM*`m-Zy6Q}f!5XhA|G&8z~&XPb-~&6CgkCY*YpbL90$9=Z)D z`^Ckp5QiAE;Y!24-fbft>(0sBub}s^@eT+>`t|NW5kp!|jVPYXj$XODoor$9N>vSt zWd_)zY~aI8G!dVDTFq>64m1n}uVO)p(f*qzb8jXj*zuA$r_yY^7lp#Xg)W;(#ob=b zD=ODKQ^c1WUmMXfJ)`e+Z)Qf9bIIgr9UV`GN=ep3>;V^ASm%|}M4H8c9{LtE>ejMi z{<{B-H<4+Q&;WR3DXEwOz3(Uv`xL4S7;egnYc>GO$t2~uddy~b)!#M^g)J0hHFS(P zF!#sAyXZ{G67BiDR4v9`XZ8NU*0DD6eOGu)2S{DEIjDyq$DD@9#7BPtJ6s7Yfu=A4rK|)VSh<7v3W1Z%>Jk9;U97qpCtq&tItHkh<`fu zKb|7+Kn~7B1g>Xo9$R~&flVV6B_^mycs2o2=o8`V|HsSxQsw)1$SysWC}d(Ucr>Z$ z|M-u<11-z`1zs-hg?`!Y1K5MN{-1q&Ne!%#5 zpZCv)pb_ZjmZwTM{N*kGe90i?(+q0ogA@JTm;d_UXSuh0q5t=!{~M?Ovx5IyE&qRe z!Lzb@C%ngxsY*+2mEk5|B_t(ffRi=rTf&>aVl@6^m%WX~;3w8H*HGqu!ZKB3pR=^O zDr2?HGi9+7W6F5Y9D)x1xrmb8(yVydnbcef;g3v+0V`yR8Nsf+T~lz8Qh$2XU(O?0 zW+llg{p&A*xeR0Z>T%W8nvvQ~X_km7hN&qnOSYU*!M##n2AOVhlit2th#T^jh|Ex zF_DIFY|T{2ad2=L?KJL#@bl>gG9Ad8g6uO4!M zX;%Dv`TV(`JaoA6Zb8_89_oL2g&0jSKVA~fp-CBVfIQ>d1sajYBFpZ+N6d}l|J4L> zoNtFDm~BcJ(q)0$ab_eWB%}e0GX{W2SyQYi>c9O=;2#0eJ{<~NpVLdDBP%}?6O)qC z^4B1Z=0!l4Y5)DG&i#-3?pv9Ue`TNI;eR*6o+QWc7?ODokNs5AKjVkCZX4 z91tV@rjir-V!Y4-D{3M(e$6aTtxz*{J7BYHw$8ctcnfK4(XZA$StiNB$+)6f)-=#Y z^#JkZ9zNgu`MdqEfI^#G`i2BQYw(r!OZpm_(hebusj|WXUHEY31-`pp!QYKxv~22> z&x6eNp*UH~20|*x8$UkAPER@u8ZScSo1aeRGr6U|Fs13BlFw@I#QgXy0Itpv={S+j zdvyDt3s*Wnow6^obV_sccjsQHehcKXj-_T)W7-2kQq+h0R@3EHtc+?bL_c|`&W166 z@5uFtr8-3^46kqABtC?0J6Y6#8I2E;*dt3V%Pf)Q@0_f9OAa!AK6zR6id4pORxz?J zMgNWvy_47YhDMqGl3`?nl`b(^h;(7K=5RKM^h>c0(u#Eejc#~&_ywb&oSnVBV1u5Md ztybnRMeVI~r=Ruhf=LbL%;2B)o_~LhZ_p#NNzdHF>O;voM(jx@(yK(v_&ssyI;+ux zcVN$-*hRPc`*5wJLf~FlU>)z|jfrB`WI?C0U~YZ5`4|JR&rIo^w7GfNT^WIg(myf! za9X!`$bdl1F*0Bg+^lJKMs-c!{Zk5z&qLqveWBmjODia`D({{wJECaFM@e}1_V$L; zJl(;AfP!Zt#&M$`mkCsASkPh3W-zSnssXce9lg7IINQ-eMp`=j@M~)wMe80PKh1A8 zFyCE#n!{+u6qZFsbHv|`?rvQ9eL|gFJuhF;P9L6o8 zV@CqrI;3Z7zhpmspJ_Q2Nl#4UvU{@By??ReEnO)yzz9YSWdzjkZgSoZ6DKlHT|aH< zl!4QLUeeRQtDZdy8?%x<5(Ia34g5>OO9 zlZbE~XxvQ)VLB2f*`9;#X1OQ2zK!KCe}xC|!|#ezfoD6szM!h(puvwlcV_b7YiHn| z<;oez?UR<*za3Jd!5<|_^3dg`2Kr!cx5n@Hg-?PnjMc5O%LT3l;0Pik_m1fgxX|pj z4E_Wjw+4&$o}h+G^`B9=egs6!x<&zE7J$wPci()9-loAw&;G$9^cQ5UuO86_@AwAs zZ2~nNhwV|BqS~K!>vIiIOJpSokmR9at-lO1GBpjb9Ljww?s^py2l@e9aZ3L9QJ6;z zZhArio~R6wa9sazSKy{*(W&NQ?!tIe&%35_w$$)`%}t8?CW^7RMy=c?wz4CHq&uIr z$tcIV=E_L}Zc>FK9HWVVaQomK&yHU9&EgAZ!|XIWK&2{!mG1f6y9wwS4C_kRn_p;up#<^#l}dm3H=W_YAIf z@SQjr))dp#fb+2N@}cYm9yG{nRlz|;#9_xVV0W@whWwC@!@Cc}$w8m$}*)wNFre{R&0clnQ4+&t;5bZsHk?^EsQBtj7?Gax*B`h ztg<8O#$7X80lNJbLq1@uc5i;7cj)f@9{T|yWQIoAlb1uYsX|ZpdsDBT$Y+P+#ZT2_m{o>YHLIh8 zN}Au6kmK@SOZ?-ofo3fp7E`NcLeH4UMA!JfaMH(2OL<*{^Z~7Q)<1l`2|pMRR-CSa z(3Y~7X6Du!#s6kL7+_-X+eFf@54O{}A%`rkJL4u@pmf|FwWnR{hH>EC4q=}RPe(0B z&EqnpmDAF_GLxUCbI{$hTHB0{^kuxm^F))dXyXx!2-{NIGGXt!*#KQp?OIEXnz%24 zK(+H#H1>+g?#!bA7K`wiW-^NcCLP_fw3ShXH}u1#)no697e5bw^rUz_B}L~+av~zW z59gV_m0EoLcq~2B&7pp?e<0$c&RJtET2kEPF$Uc0bsmc8-i*vW)=^l_n!rj!63;gY zcb4t*_N^UMs_eP&f`!&HJ1f&2-t%^c`G%9pR0M0&H3P2DWgs~ND!FPd8egS)V>-Vm z`VGv5W9TdhAmjZ$0=E^f5b zJ@>>heqWlDL`FKeUl(!pfXi$N&C017J1RClo~{jX@uUEJJiuh{)ea`%Lz!)$gGnz| zVMVGJha1eDl+N{M9%wj;%59RX>`25_;&xejFEe`951(Z zo0arRGvcl@?zGwG5WJ)zc~aU3o$HH6i`CW=RZ~|#S6?iz$%*640G`8ls}Ez}RJWlF zQS1JvX#CcbY-gUE?^TY|LLGLd5wY*-=;*?~spco1v-uVWgZaMzO{@s{W6f9Gz(kyP zB8n^fv}wnNEJ6iW-k-T178f;x8ZuwNcms=ds`|GxqH4V2B8Stz`;rP1a&L~7X5@l% zeW7Bo`+BQHX1Ze=+*w|ohA+RV3FD0?+ zbt}+R?@>pVSq5Q8x)#r`WI|t7>IPHiTh5ogBD^^*a5-TeX8%t7@{9t*b|he=r&XoF@|wgT1Mo+JQe0Vwp96#qNA3V)%BtZY1SU)u9s-ouk=Sz&|ui@ zNfPyBgP@keq&YaD*rV~RXo%{e?6zF+O_|lj@mADkfh8ctS;=KRH)FDMdj8WgW_Y*) z)mOkYQGOzEJZ`CBishneG_nxDBOC`b^{a6z)H_x4>?N0BxPH;%-hXQ!E@`?H8Kvh%I+JRw(an!ZNhcBb* z>s;!`A3i1Dl7d5ca;%Qut0fU>M*i?`>2xmuJU!*87Wj9=l#2&Ct4mb0H3JMB!W#iQ z#u+t)8?)5%gE_{*_+eAr@{goBAr21D^gzXhwR$%r5jN!w7eDSBI~9Vkwc<&S4Zr41 zn`~1)?w;6Ns|PI68+8iRD>PwVcWw(%&NtA)o9v3lF`Z$ye=|di%Kmy-739FTB|7|b zt=9-K59`h5&v-eH_K2%Gy)%nD%E7JUf){y&s@!DOxjD+byz05fW24MmTj{`mW2Jth`a5KXITkklN5*UEX~OsR9R~ zMO~QAisw-{W=g{OA^RRh?-5Dq7wv>+8h2&P#zA%}adQ3H#+4qQ-*hTB(rurJ(L1Xb zjI~kQj7%9hn?XekKQFDU)GFu$yt0*Ewt>rAoq?g0{1CTYcHEuD9TC@~tT>4P3HKj0 zrjP|HQ>{=lr8g?X`H5?}JhR)$H#JD>t0ar!#vX!_!J{DLoa>IT>r%^o1ks+pJyRjz z(0u_ueTw1@pninO;uzKFiRBG8OHO_%_n>o%Y1^wOzln2mI<}9QV(1*S@}R+DK-a12 z{4Upd4rP|t)wvT!HQwhGvO_tZ!M#e0k#QEaV9ynA1t`CJwhXoo1LMg&f-UvtF;DX% zle2eOxri}`0mzi%M{M+E?+Y?z#*C9yG^pA zpa3G>IomFFM7j;>oDeYCM7;+Hciha(2v5BBlyTBtZW|8MIc;?WDk%wayDH;$!ehM) zijX&c91ZTrht*!Ijit#ZFOpf`cx{RF#s=}NSd1J&96E2xx$A%7TTW}#>Qp0zpSbh4=IFRR&>+3_E+Q~>^r+e zRDv?L2DP#jf+=X^R!t{3lHczi1eaO%p(qYsyQZzCwlL@wo<$H%H-lQX$&1?WT3rmI zD`|5cD;gCi)8fHIk?xh9sAT?ij&1LpKpeSv0q=sPtm0Upyj?oy4*DQ@Ln;~p2s^y+ zc_~UX4&8AY;&f_q2dzx?;acrYT4^-U^`D4oY;i_!0dUi713x48g1NT_2xS>LIbP9b z_R5uz6U=1Sb1;v7i9wsx1e;-A9@s90-fAA`nMLd|^9*c6J?x0U^#)=?d8|2e8AZi7 zZyLqYBPFia+r>I|Lz35o1PR_(6%&&_eKW2H+HFNwyNiltjuxSLhV}`Ch5*L#fEooh za$VxhSeiYVXD!>*AIP zhj^|kP<-M7B2%?jZKZZil;*w4)54**L0pTHTGsX%PQB6iXKjTZz8B}q?1iz+nKivU zgCa>MT^9$B%*efaNgRaVIxS_&jBm7Z;3mFOX&SMOoLs?}658Q~IfA(fp zM7h!w5`HNkWve2nk&XxLN+GW)vl&&99JiRfGWudYE%|NiD`Q!oyHtNidl_Uz89Z~s z#N5b&r)}TCq zd{-oK5|nXTHlFIs_-sPQv(p^oeiNxcwCbLkc|q6h29R;`$n{R!<5n|nsp;w(peqzk zR|F-^&)%GcCFdL|Ik<+9a0{LHC0kPmth~)s1;oQo`NF0aJ3>xeJa@crEKpf%eSnUC z_bh<-E1kJ&H;&W(pa*!}a_S3Gre9%fEg~d5mS!CmmP|*H8&kKG-K0LR#lgpsd))qs z7nP2h6BGFD`XEl_GC1y~*gX`bnX4Z<_T~pf$=+D#+PoeGht#yl&Cdt?tDErUBm+~q zv952wNIS@bgNl?US4|H@c5?y_n5J4Sv2qq|>F3X%nO+U&SyK;xn@l5nahse51l8?h zk-69#=Xs@WU%9o(IEba-)8<*8Dt6_^i~{5#%6T#l&7e*CX=_JJ5CB8SU>7pNvU?CV zCtnDeC`$Hn!|xw|>@yt?8Hnc>cS;ab`dlNDmx0gEYmG9KBzZQR&22rMI26`X#~&LC zNxkCVi8x5Pw?S&Dfe;9JVZZDfk(~4}G0~BvRxQMOT+&VZ{G(;cMO~pJ-0|x5*Gk>*Is9LpfTybkFlv$*>95-+QQ9e0?N!=JH1e2F4lGB#TMTu;u_qY64FLFw4uYA zyqZYbysZcxMj05l4IFa7p$-$ntLqDQnC3cFarD-g=Cu8Q$_X6D4+1LXae_CwI;-}S z>@E2^96xH{naF!LoI9PtPLpl-=0$!uFh-fKaxQyx^cZCrmqY+W5wl0)P%mE>Ugo|m zggVL3PJl85XN)a=Pvtyo8}Q;KjaxCrKFV9iq4dqX?ILaUXUIr&gV@#-fHc&z?2ToO z8&MQiO*&`09tZ1lygD2zv>0mD&+xv`DXZU@P4ZkxNDtHB5k{*(73|E>_M#PY*+j*!-6-5Ux&G}L=pQF` zbj8g&!%BgATx&WLeH;ihY`efJZ@7CqQpdOUQ@v#lF}F!T-f95|Wg`eG4wFi(35__w&q#`iJV$$#Ttv#{;}-46dVZ5 z&1!)dyVj{HLsB#Qe)pw%Q{QuRtxD$st31uC=0R=Md;$fOM~>vXLKaOZ4MS0A(&=|D zQ>VezCOv+(pb>c$TpIg!2dx{EUGWr|y8@fj{e|o48q5NHiRg0W#)XMs$~nQH!im;V zLvyM+JGjutmzp=(24O1ob;t>UuZcJnE3;1$o#U#PT2s?bI6RXF({u1Qd*ZS^1Ex09 zndNBZ7DY^Dkx|xgM_ZZ(hZJ(%?Leq#m3Sxf)3d;0gi9ZMN-#UN)?{v!?Z~xUHLQ@) z9M)*|Q9>=Ove%(e1+QynnH4V5*lWUzaJi9M=h~$DQiL2uk15yF;Qps^nb&2_D!fOt z;@M(N%362X1_c{|ukay_pEuo(j(8mk-0MwYt1#>;h}%{tKc zqn|p=6tO>e6_e@7y-zw}dpYosKrQjsFmT}M_(DZHLb+Q42L0X&7-^^SEPcld_Ov7^ zx4WYbz-D8B^acVQ!lklSx8oh2lj7Q8g1vqSxckeMT2>s~p3_~?^eT7BWh0EYr`WYB z@ul>G9k6VrOw_WwZOlJ>l$V5;zn(#x{aseIRY|{hKkvBc0-zq97g{f(N|Fm2ZEk2BGjOp6rgv24M3OL(R9PN_jx3WKt2+V^MBRH=bNMELF zMq}cWVXUp~11nGxK(z}eZdTYQt8O0jC%rrH&__}{nAOGKoMC~B)Qt24Q}U`#xT@WY zR%P{uYUHyXYh9If1u?6aVB)>))x|l*fKL|F-toz*!r7tZk&uDVRsp$)x1~=WYs@}W zjHTaFXb>MJ46V|51qqn@a0dkDxPZG`>cG0KwHrkP&0l-aU=ZYTi=YQ8|4R#C%Q^H{ z1b~zb(6rZdR%xO!oD$_YtB`{zF*td%$qYa?km^t$gjCd6v>`{>x5UNn*aXTsAeZ)l zvrkR&@|`l#^|IwgxCc&fGXl2Q(S4LHBHM{W-uFJ3S(4MNJlSJd<_R$|`17o6%)JLh z=pJ_gZaN;Um;31=nw8h(8PVAV%-iF5B!Qk;^Hhg$<0J2!N3V4UA|_6c#Zi7M9y5xj z$4JGrQypp9KL#$YKd$A}pc&wuwaYJ*%pkRxEb+bE`O;cmcAvuS{Y+D!sE2hm=*I}v z0L_(Wv)l!fZkYr?FJ#JSyqQy|qnzC2w_gHK+hyW){Ne?Ocz(IhO(!YD0i3(1u=C(n z@EC#*D(H0HDA&A>w^k$d?nk(5os+9q9=c|L@$aI?AJ0>X%#UzR0jN?K6;#&F|GLb< z0XglU*OF)gH8Tm+t=cDgfmw-tvOL5-bS#i&Ra{wf#y4VtMsd>Uo4p7^2Pr6o&a*7a z(+6yfWmu{y{;)A~H_9PaL+}SguUr=gYy|Qo7OF6pC4P@z9D6ndcmY@2`PB~&XDU8L zcB{m~0**!+WBONxm_poP2IkY3RG{-DWAm=e>1Q8L_}3npSzJ^6V6RilI6j8gIPI%v zEA%sk8E><4!6i}c@51N>dZOK%BPdiN|DW?_OOj3-P63qNwo!3G!v&}%s>?cPfaYa1q?Fa1=W}7x(M|r8xN)X(u zbl}`=aZ^wJnQ@Zm)>Rn#d#($!9V->6$AE%h!HiWDxSW%=ZD-dSC=Dm}!6-NuVjpwN z8yyy;D7kFup{~tFniEV&An_FEfr@jT%k?b%Cq8fmNudDA1(WW`EDqNm{Pl^dVxgP9 zk^PxqR@o1;5;cpJS_LgRu&@&G^cXY=PP=m55FYX#rqSayaopNQu0uKcQJ#Gu{Bt5V z*=ROfFgf1j-|sesU2LiAK5*dU%z+@)o=T2QY?RpyQJY3|r%vT?msmRe+PSn3k}(lw zL$!h@mwE;vRHk03tNMD)P!-(K;XHNLZflcwsh)hjqwlpe2!ib^dpUnoz!Pi70Adji zqIyKQLN;F=XLQ82Ywtci&!Utc`%V4EMaP;_m{L_C=!BqPIe~bibY?UXlx=(yagLjk+K7v)7xO{gi$(ivFmm=blin)F-?HiqN8M`<<%fdtr*bEgvX`IX9 z1N>VS+@~bq;bJ!NE)Dux1w+%a(Si0e3c92IpwfR3VE5)u=I<{Zsq4m8LXZIZzkWgB zll2=lSy^)t;9$l*D1PlGNdYX6zzV0UWJl&%;kbOY8|nMEwp8UeLD3zLael)+l=pfyQj?W@@f{Paru&x zXRREtB0jlZ!HA3G1Nf0(ihd>VTqk>~xA*#BW5bChtaze8htbgMg#1=e&^M~LW6t;* zioLQPhhPI9Ke$atK|MZ>3Q`;5$L$RZ&_|tV zHaZWmBp7^tl|NSP2ZSQ?66S@<_Ii%W z3E7V~)rAx;a`$!QBXiBf=gQ-=y!GWPjZ>V@i;qyQr3#-}SnRSl~NUgqr$W^$H*%C=<&9 zBwasTKu+>S)doK~ zp3z%P=t}@t<4)TXo%U%zbi)3)s!4T4fYHLumHr*3MWcfm_VgpuqQSw3WiG<72kx6~brDM-vEpZ+IsZawkMVDs*IE-rnlm+&ef(SdY{1 z@JIgEtPU65T0X4bV)%q94_OvB&~9;koh}Wb!2Sjq;8XIJRv%@`D>MJKZ1X)omn8#J zyVhc^IpZvPsZW_k=8-CrSPL+EczZNVlMK?w1z#`=izo70uxK_d>qgCHw834gwoGo$ zjo<5TX;jIli(NbgbVVYg-}7~tq0T6=wf%G}ZoR+K$tZ}YhsbcaDi8pdU8QqrhSah;BjcH&$ zf)xdxNSQ`fh-^k&!)(`jS5lO4i>2P(`rm` zeoAtAY$y&<_JtjXn2>v*S+i6d*!*#i>A3rq-<2Cs?iGH6P#X>?uC(=@C9CU0o8S@~ zDM3EE*xlA6Y=Qpt!gZk(cWuPUZw7%C%ae&s3hh@Fh70A0_`P;*)9HQAvkscu!n%O7 zZF!4VH}01jOB~FTX2i5FT=eF=xBo=7GpoGwXMy($agN-)$fu?kNv@44^KPcq!ZbQg zNOI@t52lUhpE#@?12tZyS>{t;{E}bl=SNxEpS;HV5*&husKpw^k{8Hx7QC)*af(Hc zV*Juel0{#}TIE+^G!S@=o`S|MaY> zDEFvZ63W?E1Xsjaxi!ICh)W4e{#iS??!bPjnD%qviH*6t(^Bonj{^RQ=rpgvaFJS_ zZ}GQ6+>xc+sx%EQDHjD;3D>ASyiEN8UwfU?t;MpXoV&*IuZ088o>N9hiVBgIxSs=p zIAKaqoUoH#@7hn(4H8$f`@%};W5XE?;Le zb`G`Hu1hg(jK}Tdah}uWckNR8 z5?Vx0;&ZlAXYI)$wA&>vvN}Pl$*hw~d1|ck;ODPBwDbk`!Sx=;=T0;1CDkJd}}N4@Vkx+%?Kw z-sa{L=EKG#Z8y5{E!wd*3b%jCJW5z_C! zdWeRQ@RYa243E}fR%eJi81zQRjw>h*)J!$<<&gBOrtu*&c7D(+O#`3|rToa~86!Pg zr_ommBVNdvfyD4iX_OchYMzO=ZP55AD6eq|9$8m zpt(PlQ(`p#1rD1|;HqRv6U&?Cx@kCD6!d^HFw-A&J zCGrReX&%?Q8vj&cEQ&2>KZ;!hAxI%4%|KZos$i1|a8j^Q0^G)T7EGW2!lh15{(%Z} zl0@5|!!k9T#HlX-TOacrNS=qlZg*10_{)H(#)^=Vt4%W>?0FLi4QAiw6 z?PU0#3Lp$30Z;muIG0JnyL`36*TRCdRc0k7f1n9D8J8Yic~USKt!}>9M8g?B z@exGxC3VKm{%>p+Uq3pf#AeXThQcfI;&_#*+d8k^@N?;qnY z#*g{^`*&&O59tnD!>Yr>%EnW6*JiA=<~+fF{#KF%jdtC)&0o=z4d1YvSsw+e+4Bkgg?fBlJF*i@dyZB0!di`BOCt5 z|NhEBv_tD=VfW*}YmoF`fwc=Zgc!liAON66P7#ud_;LAmY36@sa>0gZu<4#-mv*7^ zZ*C*_bsKaXVhMt_9f20=|2_R!_saVXfOfGz{<@bgl>Fl+0NM3I`1xXqCmx^ezhCn8 z?JKC#4bT7b&y~o0ds!Rab%b5Di8$19RCU?#odOdHF_?~|2oC)u;?VVIB7P0XbrX4B zUZRR$&c65$NG=(gZ+*ScP!l%zPq`g2V?t?g1T_#*6!hgR2ps$SqjmT6*frpEeu>j_ z(XDmd+7JMU&kf%dnr?ms6uHKLsR0mA*6q6G4pN=lq^5!-UA9w27R!K~xv~^Ojigl0GwA)E>x}FvI64W^`yKkdK8(SX=p z*K?a+=zqXNY4Et1buOFxI##sxt+zOO%H9-enQEMl`lVIuBy#ineI2mmcV50hSks3n zq*lM^2^j#!SD14>xqD{1A8pq%Qjq5F??M_lZ2ur`Aq3qrsrhRZ_~1H#vgV z1Pgl$l;7?EQdM{Ee;|>CJ;Ucq+6x!IgHA*;q_DLCZyxZF2d;tPwD?-HHT4h|r|i-~a9n3UN+aF(7s77BB8 z@%{6X`}b)9xTQ0GJj()~LBK)?P(sBV zcQGAx!HvkiO@_T|78`1^=I@?g?h94={M!B_FUis#&NlvP$k}=vOlLMs#5@&0UM$oE zQEoM+N&Wo!OBxy}LYCu)Glx49^VbWTlQnHc$Rdc=g?7FgWPPxx0g#REr~uLYF0=iQ zzcCd1;7tzx80rDMWdZk-tr*^U3KqPZ6sCde9b00D%^`x1gjOx2!eH#_>icF%X(J8^ z=%)2?;Dv0cOwTi$jMvMfuYqc@29Lu0Foi5^&eIZ-7?IH!V_=#B`N%VtsaerF8Rwps zM-xISM~XK(L`X?#Z82TW?F$9)RXy~y$xPf9<8+Z}D$|CBo_{RaKQ^j=+O}^HQEqN( zNQ#E0W-a}XJ(YG?=9FReJ!`Juj_z{Xf!4QV*u#9iNfYOr6n#SzKc=Z$kD6Q8tJ5u{ zdOxk|>3?JqUxu?vbtTojj%Y4dsBqnH>m)0oVvDKjr{qlHEAxt z?JlO17n}xRv_DF}zud*Tg=&|J^&g?PWBSud|IgWP#|IYu2UJtEb2f+_H-DzqVpnQ_ zn@Xew2c~8vh*e^M-N+}N32p|^7f3V4zE=7I$3-Ullw?QCPPUtzVVs!kDXv7B3|v}x z2U0UYdSu1A#@TykLbJ|9?B=!;B|z)mAK$GqZtDo4n4Li(AClWe9_}C&O%MspfV&1k z{Y-MX#EgVPFpeNXqkn6dz^d~1Kke~;@>0mJpkVV!k;eI0k{F1tErs7xu4y6&`8o@L zTAg!GCoOzsz673A-susw+!h)8fxm-K=P#L^3#LOZ9_vtzQCtu=AD zd0mEs4@t%oON+1-l(mfn#M=I7y+O%q z1dFg8@5@&|EjoMKiFB8o3z-v$0bDg!9YCXRimaaG<2TsdlRQTaf;(|3m;jyX2uwU$ zpa=KEzcscV+DBFudOdQ3!e$w(9wkU1?XMk>`U-e41ZJOENe5u=y-7Zy7Fld5x#hm3 z+@9-W>JT3(Kd$~Zq^2KV)r?EV7OH_MdV+kqD(-u&qjBF(6T$jiv9%sRq)6<%6mWc! z=?XWYI7lKQK?@2Fj+*znnN4W_UFP>6HYWCxh;P)7_XmD?0z@_@Q2PViD(Rg2d~Zk} zaY0FO`V9OiM{B~$=`&vW(1e26s@T9T^xLQ}>9Ru^ILVDyK#|kdp;5$QFq^9dS_zpB z8m}7qO1$GV>hs)qFS4Bi{wtSg-6S|;m~!y*P(>jolw3dt*x*bF2maRF1ALm(Na`_j zQbWAtXE@E0e7+v+@v|{aXBAP6;4ocuahE4@vTDN^Jr|@5k{3c)jSxNbpxtcS45>1! zD>vX&3+Y^W{vVr{i^INKMC5BvQr0KBzl%A3of83HeE@epOEM_hlsvw-xVC6!_Q{hc zFQ`Obm6gF?kbQn*ukijZ7jS%~yv=x(bk`T!D!|*n3l?bNFq-CDb(Ti6N{ZS$*`%l+ zq8ht%&uymaZH5#!J>4WDHYry$uv=|4b}6hbLvYXTvjW7cGoQ}hQ_RI+%K+lPABE38 z=zLrY5iv2U>x$9?2Fu@6sr2p_cj1kTeZ~7qPexdn|CRD00QHE=EaNum$&V532W=j| zPI~|w0Xde{)jh+e%5EVg=KuvLKB(B5EEP|2Iqz1gyT4iGJg@7z5D{?a*nsL^zMoC? z12ZZ3HRLb;5(B(B?NPbyWiO{i*VG#@j9V<@$O`Z>%z3%p`^lgYD$`pO1xEk^E-E2` zUgpaemeS|MF%5 zaa%H+fL8W@pWb8=f8$}mZ~b--86@~k@!KwUJu{*h}7Xz;ma&h-X5QGEVi zBs3iLU&(yBMjS&zVq%%y6`QLUc60wT7dG!7m<>wZ5E_{w+s+M}yZ?CLKmY&K_g6l# zj@|lN2q0BdJ>>h~!(}}#U(Uz;Z^@K}LHxm{qeE+vE2QEL`e@U=Kf7_j!Xw+h6Y&E* z)mg)8x?Y0>x`(K9T4xyIw)l*svJ?8ZQ5Zif5f;_s;N&z09QKD{YUnAJcmB1%{ZC9W z_z0t}Iizf(dL=lHNrcOv|H0qwJ;04Nm`r*#Gu#M?x4tDL425ey*#B<#{KwPzJkT&^ z$V7IyO@sdPK>GLl{o|Jb3qaHFn}3Fb`{!5tlk12>2{70L2HX(|f42sKXNko>cvOvf zz#G{1S9kwEp5@#2#-|za<3QIw`!6r@pO=qT09t+PCHBwVzx7T4{^2el9$)2_eJ7yp#4PLKjM-qeN+-@fP_ULY z*EE-=tU5p1=pA}P4!$6yb-^3%Soi-g6NnM*E0#sZ0OEvnfa0Ip4N4_*HD{pKYJp{g zLFqdu>@JH^`!oeHc6>K9G{i%y$hq$!?BFU{k(v2o9a&fPy}d(ilx1pwie-=^D{E~4 zlp8XjpR0VBZ+XX~k`XD`v8Tp!`^r7fzz_X4<>SXO`=YdrNUfH=&j~&U7qmRzn|APi zE^Yyuo}AdeK~HjZ@?%HyRNfrAYu>n*1A1{(TeU*h7ebljBfmmi43*ofCtkS|N9Los z22IXKJ8Q$0vI({sL?6Tv<+k^S9bc1cB0PnGsJ>Yx)fy)9gouc?>EI>M6)W^JK4Rces{mOjG1?0EC3Vj67!JbRYG5%yhe?A z%+_$Dj^Gf?7id~FIq`;^U#vC(`Y3zLyU;i3`}bN&9(8>$mh6EfdJpvALAJ$b57s38 zy;e@7e@UV2M9$0z9k?4r$)^aY4v&lohZc!n9NV>=t=6qHoOh6xx!&wN5<#*M(%{_o zl|HCa0c83_(>qKQTtsheXc zK0f}Wq%dM$c{QOa?@qf;XRn&MvWIcZ)NKsEA2Y+a=M*Gub%;l1t$dVa?^lL@;|s#I8?WFljQSfSsffx=O zm2^(wK*kElh*T)I_xCMs?`F@-DN}$DWgSLSYNbQ$G_LW>Nel~~xxc40#eIhg(@aU? z2IG*RdVM56&dgy7I6&^LqKa#zfU?ud^f3@REH~haI_NyLVczB3+p#E)F#$o(H5ho- z4uPbL2R?gWuCCgib;SM5{?-_FJynSS+4{9C0@33Tzd~}n$+jWZlD!tRH`D#%2 z<;46Vj+3t3p&h46EzI8^hMVv4{RVecWJPOqSp;e)9x!z@Ipj0!jQ zzGR_XU*ILdZ6AZTz#}5o$xA;-<6#6`+`Ywa_HeoP0c+FdijImzTc^-<*K<4LI2M+6 zM0gI2$M3tsuDYIU)@7MXDT7C)%ou}eQa&H(jtHiI+m){ZCHi##NTn3P6{M~1WNm0v z8kuXJl zXJi-+sUO-?tVzQ|HCS(}pIG$_<-kMY5A_-w8&|tgZpXCb{2y-dHY`1{_r9#LGbUL$ z4G~G(iR|lv7B_CFRRrQV@T#z)&*Uh)!eH>wPZl&>k%w=n9T9#aBCnUH{~`B`Y#aA! z?NV4jtDZt)u9G(ZSN1s3?|@#EMNo^J<&ShpD^=O`RKtr(NQm!?=p_7K?T5OUd~IAp zr|t7q^Rp8QRO&+62{#9ebZS4VMmZ$mNhz2S3GGc9X0x1ENMhY*E$AWc@y_ z(sJ%K;kr-TF}dLI=Ht@+qT$s|+2RYhBEW26`DVW!Aq$UY#6`|aM1)r6ZuxR?os z+0E>G`JB990vw=oUi$a;&N`-SQ!ie*=?chm0&)tz)rox8;`-fmkE0_8ge3R;TR}$- zVcggx5`o)k!}Z-C^$0g=M{OumP(!)x&m^ARVYHV1`C}v~@7LKMB&seuD^P*(c~NlQ z;kE0_5Ty`5h~aBFuR%Bvc+wfd8Dj0$R5P@99M?Y%xwATx&iy(9J_aYcGE(VW7UO^t#zLkC! zjX^f#%X1m~cy*qb5LzG3dNyXTMD(Yw;;hgUJ3hjn}Xc0Fk-QWgY^@3^j9$|u<9aCR!%aQt{o$rYl+*f3K?zpi0lV<}^Z zm72kJ*n&#ut|!q85L%UHRAyCgZ5LTpV}Z8w7^Zi23)-sz{yS3~;MU5{i+GOieF!4% z^=Ic60$)AO1kq)sjhe%h@0_X7HgLR~$$UfGg(5`tKI$QGD0@USpt2zQiB09{B(lmI zriri0bJv4)ju+0FFjA^A9{$FuXGo@LXnZgZ1DW4hrbxeSM_ z*Z_A4k9aN@x=1M&W306)fab}x7M>NeTNOLNSozh?#ZfoB$4yz2k>W9)6GhU|Z z5ayI-IB!no&9R4UrgP2PuOL8hri^=%<-QMIT|Z_FRKYd|omlCFRNcXEqbU-^LNU5@yZ} z@)!?qCw;sq@Q^v|P zz(R-Cx_sT-oj!~9h5pg=x+7ew_|)bb9ps&qkAv8|yZ&#Ac=rgXvHZr|Z;;UJ9xH^n z**&RS{l{eZ61&eN=@|Uqh)*K#xP_(YH8p;jO-_jjnWbqGj}m)7OPOi`?#64tCq@4jF?hX2Ubj}Xh-sz06IE@!JOw1Zm%P}m&%?Qu(?UY^Uo*H!0^|1UWnb%c=-rt;O){o$w1Ywo!&wQ^<1M))`|$w$zb#SC0BBlQr*TB zCN>4!3@uYLE|MM=H1NL3?dkCB`G|3X9(|JH~5q-a?=~y$0 z^ggRv&XGTMv5F>Xq#_PUrYzKOzr-uUHqiHxLwUIT;~>)a=muwjL@B(YT<^EqB5}tj z=L+ht_^=82{m@dQTg0)`jCM<1wb-y*YL(ssT{UmXiYd}-X69axD|3`Q6*3Wis%ga%Xzl2c(sea?srLEm|HrgfYYS*)Obt%Gb(i1A?h%ixjO zhp#KB!U92bL9G}EpD#M&^qcQ|R8n_g%ZLgDKP3CG@EA+O>}PSqxjFevEixsc`x(=V)>*FM zlBi`abS&Z#N7#?@x_dATo_ubx`ys#*2Vnl;9lvt)p+F|x3bE+PptPi2Hb zgH3X(3=2YjVo^aD%gL7U?+k*EvlwOR7o!Ou#Ad>$4KrwnaQZLR_9T>`iDKyZnqzQ2DesDR+;JbJuivFkkFL#B*ek4S{{ zsb8PC>}FpJU>RX$zi`Pl(qt&uZJwV^Xi^3PX=VrtC| z7q2BDlJ7;S$VWa3*Ybw(?#DkUs|k@UyhGRc4VEaZLqh0=sX19h7fDjY(<_ZiTcr2! z6lc_u$M&J{gZT1dn3sbGb2#AngjU{<{jRJWL^G1HT*p|Iiqe8bD$WuLB!glRMD~_I zm2KiiDgC8I1Z|G1kO^PUhv?H0u`#j#RQV7?sq0tbLDxR^>|`3fi`d~zw*AQF`iuoX zNG>{CDr}N4juKgIpLTeBL{ zffGY3PE+BVoIi+4?s3ClKxNy(Ji@bES6(n8DBl92b+P%|5fK_O9UqM-gmt2!;fsue z;~O~|n*pg?cisikmU7rrW*sO9!I%*)npnUcSy=fuFD_3d0(6oNN9bDUvG7wK`mg&S z{NrDn&dBeUnFvY1;`a|0vx1YK2gkY^yL7MDUxdKIF&=XU#-DF~Vdj`pd{bi+59Ed5 zcZ)2A^hO7Gua2P++u-`fiZ(obRn#KSS}Dj#GpgIkh^*kZ5A6e z@<)=4vyI4FA*D`^=o0OL_UEsRHlCN=Q=gN9Y|n1ySQ0Y`L0P_jxiatwddFDa8l4Yf zqvqGje)Dh6d2DiIGf5x667;o+!uTjiR``c-1c8CeP(MhKO=RR8eL+SKI}s`XoL$f5 z!BDoR$YbeGx3!`3<&@UzKJ#?P=Un5g;$6-->#W`vvtHUg=+zAB3-98M{4b)v5hsYs zS}fJaHV#+?oo*^zM>XwARa#HC&RsL%tV}I_o_}|!!k07gmTRt5(1A>mFv+o)KFpbA zus({yKZHO$N2ePV4Q)VND$0KV86o7TWgYEC7u&HzcP=$Imnfc#pxFL119#fg#8N-P z*TDwL!*N6kFdU&08cAt_9WFfcXTMTyJA?|y_l6dQAR^K=%{8&zmo^>!t&cH1iqvOP zkdA(WgwbKjlV4?4zfdC)o)PGZeORVD$R$T(?Z6j*P}xKkhUf%U29t)9+JC#KQ8a6@ z#ZvbeGj&J0xa*w0fI6XPWgY(xf;aQ}Q2D;DmW=J!#z~veY|_;-M}P+;FGLK*#=FXE zdqtwp7c74BPvG6YjLgP!P>a9QsJ!8T^Wv%Yr^hEIqyGvqOrFH^x1*n8rv}1R;6=a8{B}R{7kKHn!)~E! zQ1k$74;S&3?}C!CH95lK_`2;rNYDb%+IvbZGq2MX%E(-{uvZm=(?QHo%v0FGb8OmcjMLK1fRDz351WI-}4{XTh9o##%t$-FfoRA<+7k4j&z+Q6%v3GbIRbqrFBAF3=f?? zY189_O9}b@qF6`=?P3QB(dv9o_-4@nm(BtU8$Go$4idhOXLCq2acLn5WjSyR7D>ZIYz^hvxk|zK2wh)4I=;KON@y6E@e*i z9z7pExbWo|E)vWw?J}v{eRxaZJHg32`*Ke52ysa&-3j7NNbubz1zKXNN zx*DtSI8W7%X~fD1bT=q#&>6OKvJ-OGwbk>hjm!HPnqe`ud#^;|GH&ErVH&HjS)OiW zdI`VVUD2l32Psd9V$cjJ7Q9(yDkI`G@}Ez)$-Wp)bY(|p+U`FAGFcbkz6=N!jH5{S zvqB}B>qx!qI)^1bnIIlxxNUC{+I=h0TfR9f@XDxv4mJkeo#R@;^4Vh$uqo4P)s&te zjLVpK;;D2i!>bW%28$S#v1kvbN&{g1bUud>}LK(o_qiAG?=omF#Ep zkZ;|8gt3Ln=Hk<-WY_6UZX#m~;E${v?0%9UhxLO5?%tnFkUcirMsecaT%^UQc$db~ zD1^9I;u3zi`0aHuzVQ_r{o z-|=C$jI93cLaT8�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 IxY39I19mT-^#A|> literal 0 HcmV?d00001 diff --git a/mission9-10/infra/s3/policy.png b/mission9-10/infra/s3/policy.png new file mode 100644 index 0000000000000000000000000000000000000000..65ac248503b348447a2dece167792db057033fb3 GIT binary patch literal 208287 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ìpLRD9dwqQZUp^SJIoA6o&?2s97A^b{ABb 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

A*(Fi;4q5?8M44`tJI31o@lp>($c{E0&hC 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 Date: Mon, 9 Feb 2026 16:37:35 +0900 Subject: [PATCH 04/17] =?UTF-8?q?utils=20=ED=8F=B4=EB=8D=94=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mission9-10/tests/articles.auth.test.ts | 2 +- mission9-10/tests/articles.public.test.ts | 4 ++-- mission9-10/tests/auth.test.ts | 2 +- mission9-10/tests/products.auth.test.ts | 10 +++++----- mission9-10/tests/products.public.test.ts | 4 ++-- mission9-10/tests/{utils.ts => utils}/cleanDb.ts | 0 mission9-10/tests/{utils.ts => utils}/createUser.ts | 0 7 files changed, 11 insertions(+), 11 deletions(-) rename mission9-10/tests/{utils.ts => utils}/cleanDb.ts (100%) rename mission9-10/tests/{utils.ts => utils}/createUser.ts (100%) diff --git a/mission9-10/tests/articles.auth.test.ts b/mission9-10/tests/articles.auth.test.ts index 70aac9c5f..f2df46476 100644 --- a/mission9-10/tests/articles.auth.test.ts +++ b/mission9-10/tests/articles.auth.test.ts @@ -1,7 +1,7 @@ import request from 'supertest'; import app from '../src/app'; import { prisma } from '../src/lib/prismaClient'; -import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; +import { cleanDb, disconnectDb } from './utils/cleanDb'; jest.mock('uuid', () => ({ v4: () => 'test-uuid', diff --git a/mission9-10/tests/articles.public.test.ts b/mission9-10/tests/articles.public.test.ts index 458eca67c..4c8b3582b 100644 --- a/mission9-10/tests/articles.public.test.ts +++ b/mission9-10/tests/articles.public.test.ts @@ -1,8 +1,8 @@ import request from 'supertest'; import app from '../src/app'; import { prisma } from '../src/lib/prismaClient'; -import { createSeedUser } from './utils.ts/createUser'; -import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; +import { createSeedUser } from './utils/createUser'; +import { cleanDb, disconnectDb } from './utils/cleanDb'; jest.mock('uuid', () => ({ v4: () => 'test-uuid', diff --git a/mission9-10/tests/auth.test.ts b/mission9-10/tests/auth.test.ts index 62266c90c..acc5bd9f3 100644 --- a/mission9-10/tests/auth.test.ts +++ b/mission9-10/tests/auth.test.ts @@ -1,7 +1,7 @@ import request from 'supertest'; import app from '../src/app'; import { prisma } from '../src/lib/prismaClient'; -import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; +import { cleanDb, disconnectDb } from './utils/cleanDb'; jest.mock('uuid', () => ({ v4: () => 'test-uuid', diff --git a/mission9-10/tests/products.auth.test.ts b/mission9-10/tests/products.auth.test.ts index 89d66be78..c80535280 100644 --- a/mission9-10/tests/products.auth.test.ts +++ b/mission9-10/tests/products.auth.test.ts @@ -1,7 +1,7 @@ import request from 'supertest'; import app from '../src/app'; import { prisma } from '../src/lib/prismaClient'; -import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; +import { cleanDb, disconnectDb } from './utils/cleanDb'; jest.mock('uuid', () => ({ v4: () => 'test-uuid', @@ -154,9 +154,7 @@ describe('인증이 필요한 상품 API 통합 테스트', () => { }, }); - const res = await agent - .post(`/products/${product.id}/comments`) - .send({ content: 'hello' }); + const res = await agent.post(`/products/${product.id}/comments`).send({ content: 'hello' }); expect(res.status).toBe(201); expect(res.body).toHaveProperty('id'); @@ -217,7 +215,9 @@ describe('인증이 필요한 상품 API 통합 테스트', () => { ], }); - const res = await agent.get('/products/me').query({ page: 1, pageSize: 10, orderBy: 'recent' }); + const res = await agent + .get('/products/me') + .query({ page: 1, pageSize: 10, orderBy: 'recent' }); expect(res.status).toBe(200); expect(res.body.totalCount).toBe(2); expect(res.body.list).toHaveLength(2); diff --git a/mission9-10/tests/products.public.test.ts b/mission9-10/tests/products.public.test.ts index f97097efa..f1aeffecc 100644 --- a/mission9-10/tests/products.public.test.ts +++ b/mission9-10/tests/products.public.test.ts @@ -1,8 +1,8 @@ import request from 'supertest'; import app from '../src/app'; import { prisma } from '../src/lib/prismaClient'; -import { createSeedUser } from './utils.ts/createUser'; -import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; +import { createSeedUser } from './utils/createUser'; +import { cleanDb, disconnectDb } from './utils/cleanDb'; jest.mock('uuid', () => ({ v4: () => 'test-uuid', diff --git a/mission9-10/tests/utils.ts/cleanDb.ts b/mission9-10/tests/utils/cleanDb.ts similarity index 100% rename from mission9-10/tests/utils.ts/cleanDb.ts rename to mission9-10/tests/utils/cleanDb.ts diff --git a/mission9-10/tests/utils.ts/createUser.ts b/mission9-10/tests/utils/createUser.ts similarity index 100% rename from mission9-10/tests/utils.ts/createUser.ts rename to mission9-10/tests/utils/createUser.ts From 68ef73358be9c2286b2865bae65a900a7eef9da6 Mon Sep 17 00:00:00 2001 From: Minsoo Choi Date: Mon, 9 Feb 2026 16:38:59 +0900 Subject: [PATCH 05/17] =?UTF-8?q?gitignore=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + mission9/.env.example | 5 - mission9/.env.test.example | 1 - mission9/.prettierrc | 9 - mission9/coverage/base.css | 224 - mission9/coverage/block-navigation.js | 87 - mission9/coverage/clover.xml | 6 - .../controllers/articlesController.ts.html | 376 - .../controllers/commentsController.ts.html | 172 - .../controllers/errorController.ts.html | 223 - .../controllers/imagesController.ts.html | 211 - mission9/coverage/controllers/index.html | 206 - .../notificationController.ts.html | 184 - .../controllers/productsController.ts.html | 394 - .../controllers/usersController.ts.html | 361 - mission9/coverage/coverage-final.json | 1 - mission9/coverage/favicon.png | Bin 445 -> 0 bytes mission9/coverage/index.html | 176 - mission9/coverage/lcov-report/base.css | 224 - .../coverage/lcov-report/block-navigation.js | 87 - mission9/coverage/lcov-report/favicon.png | Bin 445 -> 0 bytes mission9/coverage/lcov-report/index.html | 101 - mission9/coverage/lcov-report/prettify.css | 1 - mission9/coverage/lcov-report/prettify.js | 2 - .../lcov-report/sort-arrow-sprite.png | Bin 138 -> 0 bytes mission9/coverage/lcov-report/sorter.js | 210 - mission9/coverage/lcov.info | 0 mission9/coverage/lib/constants.ts.html | 163 - mission9/coverage/lib/cookies.ts.html | 169 - .../coverage/lib/errors/customErrors.ts.html | 223 - .../coverage/lib/errors/errorUtils.ts.html | 124 - mission9/coverage/lib/errors/index.html | 131 - mission9/coverage/lib/index.html | 176 - mission9/coverage/lib/prismaClient.ts.html | 94 - mission9/coverage/lib/token.ts.html | 151 - mission9/coverage/lib/withAsync.ts.html | 124 - .../coverage/middlewares/authenticate.ts.html | 175 - mission9/coverage/middlewares/index.html | 116 - mission9/coverage/prettify.css | 1 - mission9/coverage/prettify.js | 2 - .../repositories/articleRepository.ts.html | 256 - .../repositories/commentRepository.ts.html | 178 - mission9/coverage/repositories/index.html | 191 - .../repositories/likeRepository.ts.html | 193 - .../notificationRepository.ts.html | 163 - .../repositories/productRepository.ts.html | 280 - .../repositories/userRepository.ts.html | 142 - .../coverage/services/articleService.ts.html | 499 - .../coverage/services/commentService.ts.html | 151 - .../coverage/services/imageService.ts.html | 151 - mission9/coverage/services/index.html | 191 - .../services/notificationService.ts.html | 163 - .../coverage/services/productService.ts.html | 604 -- .../coverage/services/userService.ts.html | 721 -- mission9/coverage/sort-arrow-sprite.png | Bin 138 -> 0 bytes mission9/coverage/sorter.js | 210 - mission9/coverage/src/app.ts.html | 178 - .../controllers/articlesController.ts.html | 376 - .../controllers/commentsController.ts.html | 172 - .../src/controllers/errorController.ts.html | 223 - .../src/controllers/imagesController.ts.html | 211 - mission9/coverage/src/controllers/index.html | 176 - .../notificationController.ts.html | 184 - .../controllers/productsController.ts.html | 394 - .../src/controllers/usersController.ts.html | 361 - mission9/coverage/src/index.html | 116 - mission9/coverage/src/lib/constants.ts.html | 163 - mission9/coverage/src/lib/cookies.ts.html | 169 - .../src/lib/errors/customErrors.ts.html | 223 - .../src/lib/errors/errorUtils.ts.html | 124 - mission9/coverage/src/lib/errors/index.html | 131 - mission9/coverage/src/lib/index.html | 176 - .../coverage/src/lib/prismaClient.ts.html | 94 - mission9/coverage/src/lib/token.ts.html | 151 - mission9/coverage/src/lib/withAsync.ts.html | 124 - .../src/middlewares/authenticate.ts.html | 175 - mission9/coverage/src/middlewares/index.html | 116 - .../repositories/articleRepository.ts.html | 256 - .../repositories/commentRepository.ts.html | 178 - mission9/coverage/src/repositories/index.html | 191 - .../src/repositories/likeRepository.ts.html | 193 - .../notificationRepository.ts.html | 163 - .../repositories/productRepository.ts.html | 280 - .../src/repositories/userRepository.ts.html | 142 - .../src/routers/articlesRouter.ts.html | 169 - .../src/routers/commentsRouter.ts.html | 118 - .../coverage/src/routers/imagesRouter.ts.html | 112 - mission9/coverage/src/routers/index.html | 191 - .../src/routers/notificationRouter.ts.html | 133 - .../src/routers/productsRouter.ts.html | 178 - .../coverage/src/routers/usersRouter.ts.html | 157 - .../src/services/articleService.ts.html | 505 - .../src/services/commentService.ts.html | 151 - .../src/services/imageService.ts.html | 151 - mission9/coverage/src/services/index.html | 176 - .../src/services/notificationService.ts.html | 163 - .../src/services/productService.ts.html | 616 -- .../coverage/src/services/userService.ts.html | 721 -- mission9/coverage/src/socket.ts.html | 214 - .../src/structs/articlesStructs.ts.html | 121 - .../src/structs/commentsStruct.ts.html | 115 - .../src/structs/commonStructs.ts.html | 148 - mission9/coverage/src/structs/index.html | 176 - .../src/structs/productsStruct.ts.html | 163 - .../coverage/src/structs/usersStructs.ts.html | 229 - mission9/jest.config.js | 33 - mission9/package-lock.json | 9108 ----------------- mission9/package.json | 60 - .../migration.sql | 114 - .../prisma/migrations/migration_lock.toml | 3 - mission9/prisma/schema.prisma | 93 - mission9/public/.gitkeep | 0 mission9/public/socket-client-test.html | 37 - mission9/readme.md | 163 - mission9/src/app.ts | 31 - .../src/controllers/articlesController.ts | 97 - .../src/controllers/commentsController.ts | 29 - mission9/src/controllers/errorController.ts | 46 - mission9/src/controllers/imagesController.ts | 42 - .../src/controllers/notificationController.ts | 33 - .../src/controllers/productsController.ts | 103 - mission9/src/controllers/usersController.ts | 92 - mission9/src/lib/constants.ts | 26 - mission9/src/lib/cookies.ts | 28 - mission9/src/lib/errors/customErrors.ts | 46 - mission9/src/lib/errors/errorUtils.ts | 13 - mission9/src/lib/prismaClient.ts | 3 - mission9/src/lib/token.ts | 22 - mission9/src/lib/withAsync.ts | 13 - mission9/src/main.ts | 12 - mission9/src/middlewares/authenticate.ts | 30 - .../src/repositories/articleRepository.ts | 57 - .../src/repositories/commentRepository.ts | 31 - mission9/src/repositories/likeRepository.ts | 36 - .../repositories/notificationRepository.ts | 26 - .../src/repositories/productRepository.ts | 65 - mission9/src/repositories/userRepository.ts | 19 - mission9/src/routers/articlesRouter.ts | 28 - mission9/src/routers/commentsRouter.ts | 11 - mission9/src/routers/imagesRouter.ts | 9 - mission9/src/routers/notificationRouter.ts | 16 - mission9/src/routers/productsRouter.ts | 31 - mission9/src/routers/usersRouter.ts | 24 - mission9/src/services/articleService.ts | 140 - mission9/src/services/commentService.ts | 22 - mission9/src/services/imageService.ts | 22 - mission9/src/services/notificationService.ts | 26 - mission9/src/services/productService.ts | 177 - mission9/src/services/userService.ts | 212 - mission9/src/socket.ts | 43 - mission9/src/structs/articlesStructs.ts | 12 - mission9/src/structs/commentsStruct.ts | 10 - mission9/src/structs/commonStructs.ts | 21 - mission9/src/structs/productsStruct.ts | 26 - mission9/src/structs/usersStructs.ts | 48 - mission9/tests/articles.auth.test.ts | 170 - mission9/tests/articles.public.test.ts | 188 - mission9/tests/auth.test.ts | 103 - mission9/tests/product.service.unit.test.ts | 175 - mission9/tests/products.auth.test.ts | 254 - mission9/tests/products.public.test.ts | 275 - mission9/tests/test.http | 210 - mission9/tests/test.js | 68 - mission9/tests/test.png | Bin 6066 -> 0 bytes mission9/tests/utils.ts/cleanDb.ts | 17 - mission9/tests/utils.ts/createUser.ts | 12 - mission9/tsconfig.build.json | 11 - mission9/tsconfig.json | 24 - mission9/tsconfig.test.json | 8 - mission9/types/article.d.ts | 34 - mission9/types/cursorPaginated.d.ts | 4 - mission9/types/express.d.ts | 17 - mission9/types/image.d.ts | 3 - mission9/types/like.d.ts | 1 - mission9/types/product.d.ts | 28 - mission9/types/user.d.ts | 11 - 176 files changed, 1 insertion(+), 32152 deletions(-) delete mode 100644 mission9/.env.example delete mode 100644 mission9/.env.test.example delete mode 100644 mission9/.prettierrc delete mode 100644 mission9/coverage/base.css delete mode 100644 mission9/coverage/block-navigation.js delete mode 100644 mission9/coverage/clover.xml delete mode 100644 mission9/coverage/controllers/articlesController.ts.html delete mode 100644 mission9/coverage/controllers/commentsController.ts.html delete mode 100644 mission9/coverage/controllers/errorController.ts.html delete mode 100644 mission9/coverage/controllers/imagesController.ts.html delete mode 100644 mission9/coverage/controllers/index.html delete mode 100644 mission9/coverage/controllers/notificationController.ts.html delete mode 100644 mission9/coverage/controllers/productsController.ts.html delete mode 100644 mission9/coverage/controllers/usersController.ts.html delete mode 100644 mission9/coverage/coverage-final.json delete mode 100644 mission9/coverage/favicon.png delete mode 100644 mission9/coverage/index.html delete mode 100644 mission9/coverage/lcov-report/base.css delete mode 100644 mission9/coverage/lcov-report/block-navigation.js delete mode 100644 mission9/coverage/lcov-report/favicon.png delete mode 100644 mission9/coverage/lcov-report/index.html delete mode 100644 mission9/coverage/lcov-report/prettify.css delete mode 100644 mission9/coverage/lcov-report/prettify.js delete mode 100644 mission9/coverage/lcov-report/sort-arrow-sprite.png delete mode 100644 mission9/coverage/lcov-report/sorter.js delete mode 100644 mission9/coverage/lcov.info delete mode 100644 mission9/coverage/lib/constants.ts.html delete mode 100644 mission9/coverage/lib/cookies.ts.html delete mode 100644 mission9/coverage/lib/errors/customErrors.ts.html delete mode 100644 mission9/coverage/lib/errors/errorUtils.ts.html delete mode 100644 mission9/coverage/lib/errors/index.html delete mode 100644 mission9/coverage/lib/index.html delete mode 100644 mission9/coverage/lib/prismaClient.ts.html delete mode 100644 mission9/coverage/lib/token.ts.html delete mode 100644 mission9/coverage/lib/withAsync.ts.html delete mode 100644 mission9/coverage/middlewares/authenticate.ts.html delete mode 100644 mission9/coverage/middlewares/index.html delete mode 100644 mission9/coverage/prettify.css delete mode 100644 mission9/coverage/prettify.js delete mode 100644 mission9/coverage/repositories/articleRepository.ts.html delete mode 100644 mission9/coverage/repositories/commentRepository.ts.html delete mode 100644 mission9/coverage/repositories/index.html delete mode 100644 mission9/coverage/repositories/likeRepository.ts.html delete mode 100644 mission9/coverage/repositories/notificationRepository.ts.html delete mode 100644 mission9/coverage/repositories/productRepository.ts.html delete mode 100644 mission9/coverage/repositories/userRepository.ts.html delete mode 100644 mission9/coverage/services/articleService.ts.html delete mode 100644 mission9/coverage/services/commentService.ts.html delete mode 100644 mission9/coverage/services/imageService.ts.html delete mode 100644 mission9/coverage/services/index.html delete mode 100644 mission9/coverage/services/notificationService.ts.html delete mode 100644 mission9/coverage/services/productService.ts.html delete mode 100644 mission9/coverage/services/userService.ts.html delete mode 100644 mission9/coverage/sort-arrow-sprite.png delete mode 100644 mission9/coverage/sorter.js delete mode 100644 mission9/coverage/src/app.ts.html delete mode 100644 mission9/coverage/src/controllers/articlesController.ts.html delete mode 100644 mission9/coverage/src/controllers/commentsController.ts.html delete mode 100644 mission9/coverage/src/controllers/errorController.ts.html delete mode 100644 mission9/coverage/src/controllers/imagesController.ts.html delete mode 100644 mission9/coverage/src/controllers/index.html delete mode 100644 mission9/coverage/src/controllers/notificationController.ts.html delete mode 100644 mission9/coverage/src/controllers/productsController.ts.html delete mode 100644 mission9/coverage/src/controllers/usersController.ts.html delete mode 100644 mission9/coverage/src/index.html delete mode 100644 mission9/coverage/src/lib/constants.ts.html delete mode 100644 mission9/coverage/src/lib/cookies.ts.html delete mode 100644 mission9/coverage/src/lib/errors/customErrors.ts.html delete mode 100644 mission9/coverage/src/lib/errors/errorUtils.ts.html delete mode 100644 mission9/coverage/src/lib/errors/index.html delete mode 100644 mission9/coverage/src/lib/index.html delete mode 100644 mission9/coverage/src/lib/prismaClient.ts.html delete mode 100644 mission9/coverage/src/lib/token.ts.html delete mode 100644 mission9/coverage/src/lib/withAsync.ts.html delete mode 100644 mission9/coverage/src/middlewares/authenticate.ts.html delete mode 100644 mission9/coverage/src/middlewares/index.html delete mode 100644 mission9/coverage/src/repositories/articleRepository.ts.html delete mode 100644 mission9/coverage/src/repositories/commentRepository.ts.html delete mode 100644 mission9/coverage/src/repositories/index.html delete mode 100644 mission9/coverage/src/repositories/likeRepository.ts.html delete mode 100644 mission9/coverage/src/repositories/notificationRepository.ts.html delete mode 100644 mission9/coverage/src/repositories/productRepository.ts.html delete mode 100644 mission9/coverage/src/repositories/userRepository.ts.html delete mode 100644 mission9/coverage/src/routers/articlesRouter.ts.html delete mode 100644 mission9/coverage/src/routers/commentsRouter.ts.html delete mode 100644 mission9/coverage/src/routers/imagesRouter.ts.html delete mode 100644 mission9/coverage/src/routers/index.html delete mode 100644 mission9/coverage/src/routers/notificationRouter.ts.html delete mode 100644 mission9/coverage/src/routers/productsRouter.ts.html delete mode 100644 mission9/coverage/src/routers/usersRouter.ts.html delete mode 100644 mission9/coverage/src/services/articleService.ts.html delete mode 100644 mission9/coverage/src/services/commentService.ts.html delete mode 100644 mission9/coverage/src/services/imageService.ts.html delete mode 100644 mission9/coverage/src/services/index.html delete mode 100644 mission9/coverage/src/services/notificationService.ts.html delete mode 100644 mission9/coverage/src/services/productService.ts.html delete mode 100644 mission9/coverage/src/services/userService.ts.html delete mode 100644 mission9/coverage/src/socket.ts.html delete mode 100644 mission9/coverage/src/structs/articlesStructs.ts.html delete mode 100644 mission9/coverage/src/structs/commentsStruct.ts.html delete mode 100644 mission9/coverage/src/structs/commonStructs.ts.html delete mode 100644 mission9/coverage/src/structs/index.html delete mode 100644 mission9/coverage/src/structs/productsStruct.ts.html delete mode 100644 mission9/coverage/src/structs/usersStructs.ts.html delete mode 100644 mission9/jest.config.js delete mode 100644 mission9/package-lock.json delete mode 100644 mission9/package.json delete mode 100644 mission9/prisma/migrations/20260119073239_add_notification/migration.sql delete mode 100644 mission9/prisma/migrations/migration_lock.toml delete mode 100644 mission9/prisma/schema.prisma delete mode 100644 mission9/public/.gitkeep delete mode 100644 mission9/public/socket-client-test.html delete mode 100644 mission9/readme.md delete mode 100644 mission9/src/app.ts delete mode 100644 mission9/src/controllers/articlesController.ts delete mode 100644 mission9/src/controllers/commentsController.ts delete mode 100644 mission9/src/controllers/errorController.ts delete mode 100644 mission9/src/controllers/imagesController.ts delete mode 100644 mission9/src/controllers/notificationController.ts delete mode 100644 mission9/src/controllers/productsController.ts delete mode 100644 mission9/src/controllers/usersController.ts delete mode 100644 mission9/src/lib/constants.ts delete mode 100644 mission9/src/lib/cookies.ts delete mode 100644 mission9/src/lib/errors/customErrors.ts delete mode 100644 mission9/src/lib/errors/errorUtils.ts delete mode 100644 mission9/src/lib/prismaClient.ts delete mode 100644 mission9/src/lib/token.ts delete mode 100644 mission9/src/lib/withAsync.ts delete mode 100644 mission9/src/main.ts delete mode 100644 mission9/src/middlewares/authenticate.ts delete mode 100644 mission9/src/repositories/articleRepository.ts delete mode 100644 mission9/src/repositories/commentRepository.ts delete mode 100644 mission9/src/repositories/likeRepository.ts delete mode 100644 mission9/src/repositories/notificationRepository.ts delete mode 100644 mission9/src/repositories/productRepository.ts delete mode 100644 mission9/src/repositories/userRepository.ts delete mode 100644 mission9/src/routers/articlesRouter.ts delete mode 100644 mission9/src/routers/commentsRouter.ts delete mode 100644 mission9/src/routers/imagesRouter.ts delete mode 100644 mission9/src/routers/notificationRouter.ts delete mode 100644 mission9/src/routers/productsRouter.ts delete mode 100644 mission9/src/routers/usersRouter.ts delete mode 100644 mission9/src/services/articleService.ts delete mode 100644 mission9/src/services/commentService.ts delete mode 100644 mission9/src/services/imageService.ts delete mode 100644 mission9/src/services/notificationService.ts delete mode 100644 mission9/src/services/productService.ts delete mode 100644 mission9/src/services/userService.ts delete mode 100644 mission9/src/socket.ts delete mode 100644 mission9/src/structs/articlesStructs.ts delete mode 100644 mission9/src/structs/commentsStruct.ts delete mode 100644 mission9/src/structs/commonStructs.ts delete mode 100644 mission9/src/structs/productsStruct.ts delete mode 100644 mission9/src/structs/usersStructs.ts delete mode 100644 mission9/tests/articles.auth.test.ts delete mode 100644 mission9/tests/articles.public.test.ts delete mode 100644 mission9/tests/auth.test.ts delete mode 100644 mission9/tests/product.service.unit.test.ts delete mode 100644 mission9/tests/products.auth.test.ts delete mode 100644 mission9/tests/products.public.test.ts delete mode 100644 mission9/tests/test.http delete mode 100644 mission9/tests/test.js delete mode 100644 mission9/tests/test.png delete mode 100644 mission9/tests/utils.ts/cleanDb.ts delete mode 100644 mission9/tests/utils.ts/createUser.ts delete mode 100644 mission9/tsconfig.build.json delete mode 100644 mission9/tsconfig.json delete mode 100644 mission9/tsconfig.test.json delete mode 100644 mission9/types/article.d.ts delete mode 100644 mission9/types/cursorPaginated.d.ts delete mode 100644 mission9/types/express.d.ts delete mode 100644 mission9/types/image.d.ts delete mode 100644 mission9/types/like.d.ts delete mode 100644 mission9/types/product.d.ts delete mode 100644 mission9/types/user.d.ts diff --git a/.gitignore b/.gitignore index 035af03d8..592efc023 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ public/* .env.* !.env.example !.env.test.example +!.env.production.example \ No newline at end of file diff --git a/mission9/.env.example b/mission9/.env.example deleted file mode 100644 index 84d0269db..000000000 --- a/mission9/.env.example +++ /dev/null @@ -1,5 +0,0 @@ -DATABASE_URL="postgresql://user:password@localhost:5432/dbname?schema=public" -NODE_ENV=development -PORT=3000 -JWT_ACCESS_TOKEN_SECRET=your_access_token_secret_key -JWT_REFRESH_TOKEN_SECRET=your_refresh_token_secret_key \ No newline at end of file diff --git a/mission9/.env.test.example b/mission9/.env.test.example deleted file mode 100644 index 0a64cea78..000000000 --- a/mission9/.env.test.example +++ /dev/null @@ -1 +0,0 @@ -DATABASE_URL="postgresql://user:password@localhost:5432/dbname?_test" diff --git a/mission9/.prettierrc b/mission9/.prettierrc deleted file mode 100644 index 503a5da40..000000000 --- a/mission9/.prettierrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all", - "semi": true, - "printWidth": 100, - "endOfLine": "auto", - "arrowParens": "always", - "tabWidth": 2 -} diff --git a/mission9/coverage/base.css b/mission9/coverage/base.css deleted file mode 100644 index f418035b4..000000000 --- a/mission9/coverage/base.css +++ /dev/null @@ -1,224 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* yellow */ -.cbranch-no { background: yellow !important; color: #111; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -.highlighted, -.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ - background: #C21F39 !important; -} -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } -/* dark yellow (gold) */ -.status-line.medium, .medium .cover-fill { background: #f9cd0b; } -.medium .chart { border:1px solid #f9cd0b; } -/* light yellow */ -.medium { background: #fff4c2; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } - -.coverage-summary td.empty { - opacity: .5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/mission9/coverage/block-navigation.js b/mission9/coverage/block-navigation.js deleted file mode 100644 index 530d1ed2b..000000000 --- a/mission9/coverage/block-navigation.js +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; - - // Elements to highlight in the file listing view - var fileListingElements = ['td.pct.low']; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` - - // Selector that finds elements on the page to which we can jump - var selector = - fileListingElements.join(', ') + - ', ' + - notSelector + - missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements - .item(currentIndex) - .classList.remove('highlighted'); - missingCoverageElements.item(index).classList.add('highlighted'); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: 'smooth', - block: 'center', - inline: 'center' - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== 'number' || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === 'number' && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - if ( - document.getElementById('fileSearch') === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener('keydown', jumpToCode); diff --git a/mission9/coverage/clover.xml b/mission9/coverage/clover.xml deleted file mode 100644 index e9a8bd4b5..000000000 --- a/mission9/coverage/clover.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/mission9/coverage/controllers/articlesController.ts.html b/mission9/coverage/controllers/articlesController.ts.html deleted file mode 100644 index 4b10f4f60..000000000 --- a/mission9/coverage/controllers/articlesController.ts.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - Code coverage report for controllers/articlesController.ts - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/controllers/commentsController.ts.html b/mission9/coverage/controllers/commentsController.ts.html deleted file mode 100644 index fbea65de5..000000000 --- a/mission9/coverage/controllers/commentsController.ts.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - Code coverage report for controllers/commentsController.ts - - - - - - - - - -
-
-

All files / controllers commentsController.ts

-
- -
- 35% - Statements - 7/20 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/2 -
- - -
- 35% - Lines - 7/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -301x -1x -1x -1x -  -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  - 
import { create } from 'superstruct';
-import { UpdateCommentBodyStruct } from '../structs/commentsStruct';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { IdParamsStruct } from '../structs/commonStructs';
-import { Request, Response } from 'express';
-import { commnetService } from '../services/commentService';
- 
-//댓글 수정
-export async function updateComment(req: Request, res: Response) {
-  const { id: commentId } = create(req.params, IdParamsStruct);
-  const { content } = create(req.body, UpdateCommentBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const updatedComment = await commnetService.updateComment(commentId, user.id, content);
-  return res.send(updatedComment);
-}
- 
-//댓글 삭제
-export async function deleteComment(req: Request, res: Response) {
-  const { id: commentId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  await commnetService.deleteComment(commentId, user.id);
-  return res.status(204).send();
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/controllers/errorController.ts.html b/mission9/coverage/controllers/errorController.ts.html deleted file mode 100644 index 6e37e6a71..000000000 --- a/mission9/coverage/controllers/errorController.ts.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Code coverage report for controllers/errorController.ts - - - - - - - - - -
-
-

All files / controllers errorController.ts

-
- -
- 24% - Statements - 6/25 -
- - -
- 0% - Branches - 0/18 -
- - -
- 0% - Functions - 0/2 -
- - -
- 24% - Lines - 6/25 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -471x -1x -  -  -  -  -  -1x -  -1x -  -  -1x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { StructError } from 'superstruct';
-import {
-  NotFoundError,
-  BadRequestError,
-  ForbiddenError,
-  UnauthorizedError,
-} from '../lib/errors/customErrors';
-import { Prisma } from '@prisma/client';
-import { Request, Response, NextFunction } from 'express';
-import { isSyntaxJsonError } from '../lib/errors/errorUtils';
- 
-//404 처리 미들웨어
-export function defaultNotFoundHandler(req: Request, res: Response, next: NextFunction) {
-  return res.status(404).send({ message: '존재하지 않습니다' });
-}
-//전역 에러 처리 미들웨어(400,401,403,404,500)
-export function globalErrorHandler(err: unknown, req: Request, res: Response, next: NextFunction) {
-  if (err instanceof StructError || err instanceof BadRequestError) {
-    return res.status(400).send({ message: '잘못된 요청입니다' });
-  }
-  if (isSyntaxJsonError(err)) {
-    return res.status(400).send({ message: '잘못된 요청입니다' });
-  }
-  if (err instanceof UnauthorizedError) {
-    return res.status(401).json({ message: err.message });
-  }
-  if (err instanceof ForbiddenError) {
-    return res.status(403).json({ message: err.message });
-  }
-  if (err instanceof NotFoundError) {
-    return res.status(404).send({ message: err.message });
-  }
-  //프리즈마 코드 에러, 그 외 known 에러 500처리
-  if (err instanceof Prisma.PrismaClientKnownRequestError) {
-    if (err.code === 'P2025') {
-      return res.status(404).json({ message: '존재하지 않습니다' });
-    }
-    if (err.code === 'P2002') {
-      return res.status(400).json({ message: '잘못된 요청입니다' });
-    }
-    return res.status(500).json({ message: '데이터 처리 중 오류가 발생했습니다' });
-  }
- 
-  console.error(err);
-  return res.status(500).send({ message: '데이터 처리 중 오류가 발생했습니다' });
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/controllers/imagesController.ts.html b/mission9/coverage/controllers/imagesController.ts.html deleted file mode 100644 index 220f752e1..000000000 --- a/mission9/coverage/controllers/imagesController.ts.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - Code coverage report for controllers/imagesController.ts - - - - - - - - - -
-
-

All files / controllers imagesController.ts

-
- -
- 50% - Statements - 10/20 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/4 -
- - -
- 50% - Lines - 10/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -431x -1x -1x -1x -1x -  -1x -  -1x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  - 
import multer from 'multer';
-import path from 'path';
-import { v4 as uuidv4 } from 'uuid';
-import { PUBLIC_PATH } from '../lib/constants';
-import { BadRequestError } from '../lib/errors/customErrors';
-import { Request, Response } from 'express';
-import { imageService } from '../services/imageService';
- 
-const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];
-const FILE_SIZE_LIMIT = 5 * 1024 * 1024;
- 
-//이미지 업로드 설정
-export const upload = multer({
-  storage: multer.diskStorage({
-    destination(req, file, cb) {
-      cb(null, PUBLIC_PATH);
-    },
-    filename(req, file, cb) {
-      const ext = path.extname(file.originalname);
-      const filename = `${uuidv4()}${ext}`;
-      cb(null, filename);
-    },
-  }),
- 
-  limits: {
-    fileSize: FILE_SIZE_LIMIT,
-  },
- 
-  fileFilter: function (req, file, cb) {
-    if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) {
-      const err = new BadRequestError('Only png, jpeg, and jpg are allowed');
-      return cb(err);
-    }
- 
-    cb(null, true);
-  },
-});
-//이미지 업로드 핸들러
-export async function uploadImage(req: Request, res: Response) {
-  const response = imageService.buildImageUrl(req);
-  return res.send(response);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/controllers/index.html b/mission9/coverage/controllers/index.html deleted file mode 100644 index f4c6a8fdb..000000000 --- a/mission9/coverage/controllers/index.html +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - Code coverage report for controllers - - - - - - - - - -
-
-

All files controllers

-
- -
- 28.51% - Statements - 79/277 -
- - -
- 3.65% - Branches - 3/82 -
- - -
- 2.63% - Functions - 1/38 -
- - -
- 28.51% - Lines - 79/277 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articlesController.ts -
-
23.07%15/650%0/200%0/923.07%15/65
commentsController.ts -
-
35%7/200%0/40%0/235%7/20
errorController.ts -
-
24%6/250%0/180%0/224%6/25
imagesController.ts -
-
50%10/200%0/20%0/450%10/20
notificationController.ts -
-
30.43%7/230%0/60%0/330.43%7/23
productsController.ts -
-
29.23%19/6515%3/2011.11%1/929.23%19/65
usersController.ts -
-
25.42%15/590%0/120%0/925.42%15/59
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/controllers/notificationController.ts.html b/mission9/coverage/controllers/notificationController.ts.html deleted file mode 100644 index b2919224a..000000000 --- a/mission9/coverage/controllers/notificationController.ts.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - Code coverage report for controllers/notificationController.ts - - - - - - - - - -
-
-

All files / controllers notificationController.ts

-
- -
- 30.43% - Statements - 7/23 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/3 -
- - -
- 30.43% - Lines - 7/23 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34  -1x -1x -1x -1x -  -1x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  - 
import { Request, Response } from 'express';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { notificationService } from '../services/notificationService';
-import { IdParamsStruct } from '../structs/commonStructs';
-import { create } from 'superstruct';
- 
-export async function getNotifications(req: Request, res: Response) {
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const notifications = await notificationService.getNotifications(user.id);
-  return res.send(notifications);
-}
- 
-export async function getUnreadCount(req: Request, res: Response) {
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const count = await notificationService.getUnreadCount(user.id);
-  return res.send({ count });
-}
- 
-export async function markAsRead(req: Request, res: Response) {
-  const { id: notificationId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const notification = await notificationService.markAsRead(notificationId, user.id);
-  return res.send(notification);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/controllers/productsController.ts.html b/mission9/coverage/controllers/productsController.ts.html deleted file mode 100644 index 698f62d91..000000000 --- a/mission9/coverage/controllers/productsController.ts.html +++ /dev/null @@ -1,394 +0,0 @@ - - - - - - Code coverage report for controllers/productsController.ts - - - - - - - - - -
-
-

All files / controllers productsController.ts

-
- -
- 29.23% - Statements - 19/65 -
- - -
- 15% - Branches - 3/20 -
- - -
- 11.11% - Functions - 1/9 -
- - -
- 29.23% - Lines - 19/65 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -1041x -1x -1x -  -  -  -  -1x -1x -  -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -2x -2x -2x -2x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  - 
import { create } from 'superstruct';
-import { IdParamsStruct } from '../structs/commonStructs';
-import {
-  CreateProductBodyStruct,
-  GetProductListParamsStruct,
-  UpdateProductBodyStruct,
-} from '../structs/productsStruct';
-import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { Request, Response } from 'express';
-import { productService } from '../services/productService';
- 
-//상품 등록
-export async function createProduct(req: Request, res: Response) {
-  const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const product = await productService.createProduct({
-    name,
-    description,
-    price,
-    tags,
-    images,
-    userId: user.id,
-  });
-  return res.status(201).send(product);
-}
-//특정 상품 조회(좋아요 포함)
-export async function getProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  const product = await productService.getProduct(productId, user?.id);
-  return res.send(product);
-}
-//상품 수정
-export async function updateProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const data = create(req.body, UpdateProductBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const updatedProduct = await productService.updateProduct(productId, user.id, data);
-  return res.send(updatedProduct);
-}
-//상품 삭제
-export async function deleteProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  await productService.deleteProduct(productId, user.id);
-  return res.status(204).send();
-}
-//상품 목록 조회(좋아요 포함)
-export async function getProductList(req: Request, res: Response) {
-  const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct);
-  const user = req.user;
-  const products = await productService.getProductList(page, pageSize, orderBy, keyword, user?.id);
-  return res.send(products);
-}
- 
-//댓글 등록
-export async function createComment(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const { content } = create(req.body, CreateCommentBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const comment = await productService.createComment(user.id, productId, content);
-  return res.status(201).send(comment);
-}
-//상품 댓글 목록 조회
-export async function getCommentList(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
-  const commentList = await productService.getCommentList(productId, limit, cursor);
-  return res.send(commentList);
-}
-//상품 좋아요 등록
-export async function likeProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const productLike = await productService.likeProduct(user.id, productId);
-  return res.status(200).send(productLike);
-}
-//상품 좋아요 취소
-export async function unlikeProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const productUnliked = await productService.unlikeProduct(user.id, productId);
-  return res.send(productUnliked);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/controllers/usersController.ts.html b/mission9/coverage/controllers/usersController.ts.html deleted file mode 100644 index 64d2b0e41..000000000 --- a/mission9/coverage/controllers/usersController.ts.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - Code coverage report for controllers/usersController.ts - - - - - - - - - -
-
-

All files / controllers usersController.ts

-
- -
- 25.42% - Statements - 15/59 -
- - -
- 0% - Branches - 0/12 -
- - -
- 0% - Functions - 0/9 -
- - -
- 25.42% - Lines - 15/59 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -931x -  -  -  -  -  -  -  -1x -1x -1x -  -1x -1x -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -1x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  - 
import {
-  CreateUserBodyStruct,
-  UpdateUserBodyStruct,
-  LoginBodyStruct,
-  ChangePasswordBodyStruct,
-  GetMyProductListParamsStruct,
-  GetMyLikedProductListParamsStruct,
-} from '../structs/usersStructs';
-import { create } from 'superstruct';
-import { clearTokenCookies, setTokenCookies } from '../lib/cookies';
-import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants';
-import { Request, Response } from 'express';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { userService } from '../services/userService';
- 
-//회원가입
-export async function register(req: Request, res: Response) {
-  const { nickname, email, password, image } = create(req.body, CreateUserBodyStruct);
-  const user = await userService.register(nickname, email, password, image);
-  return res.status(201).send(user);
-}
-//로그인
-export async function login(req: Request, res: Response) {
-  const { email, password } = create(req.body, LoginBodyStruct);
-  const result = await userService.login(email, password);
-  setTokenCookies(res, result.tokens.accessToken, result.tokens.refreshToken);
-  return res.status(200).send({ message: result.message });
-}
-//로그아웃
-export async function logout(req: Request, res: Response) {
-  clearTokenCookies(res);
-  return res.status(200).send({ message: '로그아웃에 성공했습니다.' });
-}
-//내 프로필 조회 (최근 등록한 상품 5개, 최근 좋아요한 상품 5개 포함)
-export async function getProfile(req: Request, res: Response) {
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const profile = await userService.getProfile(user.id);
-  return res.send(profile);
-}
-//내 프로필 수정
-export async function updateProfile(req: Request, res: Response) {
-  const { nickname, email, image } = create(req.body, UpdateUserBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const update = await userService.updateProfile(user.id, nickname, email, image);
-  return res.send(update);
-}
-//내 비밀번호 변경
-export async function patchPassword(req: Request, res: Response) {
-  const { currentPassword, newPassword } = create(req.body, ChangePasswordBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  await userService.patchPassword(user.id, currentPassword, newPassword);
-  return res.status(200).send({ message: '비밀번호가 성공적으로 변경되었습니다.' });
-}
-//내가 등록한 상품 목록 조회 (상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능)
-export async function getMyProductList(req: Request, res: Response) {
-  const { page, pageSize, orderBy, keyword } = create(req.query, GetMyProductListParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const myProducts = await userService.getMyProductList(user.id, page, pageSize, orderBy, keyword);
-  return res.send(myProducts);
-}
-//토큰 갱신(리프레시)
-export async function refreshToken(req: Request, res: Response) {
-  const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME];
-  if (!refreshToken) {
-    throw new UnauthorizedError('리프레시 토큰이 없습니다.');
-  }
-  const tokens = await userService.refreshToken(refreshToken);
-  setTokenCookies(res, tokens.accessToken, tokens.refreshToken);
-  return res.status(200).send({ message: '토큰이 성공적으로 갱신되었습니다.' });
-}
-//내가 좋아요한 상품 목록 조회(상품이 꽤 많이 있을 경우 페이징 처리)
-export async function getMyLikedProducts(req: Request, res: Response) {
-  const { page, pageSize, orderBy } = create(req.query, GetMyLikedProductListParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const myLikedProducts = await userService.getMyLikedProducts(user.id, page, pageSize, orderBy);
-  return res.send(myLikedProducts);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/coverage-final.json b/mission9/coverage/coverage-final.json deleted file mode 100644 index 0967ef424..000000000 --- a/mission9/coverage/coverage-final.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/mission9/coverage/favicon.png b/mission9/coverage/favicon.png deleted file mode 100644 index c1525b811a167671e9de1fa78aab9f5c0b61cef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- 74.06% - Statements - 454/613 -
- - -
- 46.55% - Branches - 108/232 -
- - -
- 66.99% - Functions - 69/103 -
- - -
- 74.87% - Lines - 447/597 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
src -
-
100%26/26100%0/0100%0/0100%26/26
src/controllers -
-
70.68%164/23241.93%26/6268.75%22/3270.68%164/232
src/repositories -
-
73.07%38/5269.23%18/2663.63%21/3373.07%38/52
src/routers -
-
100%69/69100%0/0100%0/0100%69/69
src/services -
-
67.09%157/23444.44%64/14468.42%26/3868.8%150/218
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/lcov-report/base.css b/mission9/coverage/lcov-report/base.css deleted file mode 100644 index f418035b4..000000000 --- a/mission9/coverage/lcov-report/base.css +++ /dev/null @@ -1,224 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* yellow */ -.cbranch-no { background: yellow !important; color: #111; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -.highlighted, -.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ - background: #C21F39 !important; -} -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } -/* dark yellow (gold) */ -.status-line.medium, .medium .cover-fill { background: #f9cd0b; } -.medium .chart { border:1px solid #f9cd0b; } -/* light yellow */ -.medium { background: #fff4c2; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } - -.coverage-summary td.empty { - opacity: .5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/mission9/coverage/lcov-report/block-navigation.js b/mission9/coverage/lcov-report/block-navigation.js deleted file mode 100644 index 530d1ed2b..000000000 --- a/mission9/coverage/lcov-report/block-navigation.js +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; - - // Elements to highlight in the file listing view - var fileListingElements = ['td.pct.low']; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` - - // Selector that finds elements on the page to which we can jump - var selector = - fileListingElements.join(', ') + - ', ' + - notSelector + - missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements - .item(currentIndex) - .classList.remove('highlighted'); - missingCoverageElements.item(index).classList.add('highlighted'); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: 'smooth', - block: 'center', - inline: 'center' - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== 'number' || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === 'number' && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - if ( - document.getElementById('fileSearch') === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener('keydown', jumpToCode); diff --git a/mission9/coverage/lcov-report/favicon.png b/mission9/coverage/lcov-report/favicon.png deleted file mode 100644 index c1525b811a167671e9de1fa78aab9f5c0b61cef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- Unknown% - Statements - 0/0 -
- - -
- Unknown% - Branches - 0/0 -
- - -
- Unknown% - Functions - 0/0 -
- - -
- Unknown% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/lcov-report/prettify.css b/mission9/coverage/lcov-report/prettify.css deleted file mode 100644 index b317a7cda..000000000 --- a/mission9/coverage/lcov-report/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/mission9/coverage/lcov-report/prettify.js b/mission9/coverage/lcov-report/prettify.js deleted file mode 100644 index b3225238f..000000000 --- a/mission9/coverage/lcov-report/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/mission9/coverage/lcov-report/sort-arrow-sprite.png b/mission9/coverage/lcov-report/sort-arrow-sprite.png deleted file mode 100644 index 6ed68316eb3f65dec9063332d2f69bf3093bbfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc diff --git a/mission9/coverage/lcov-report/sorter.js b/mission9/coverage/lcov-report/sorter.js deleted file mode 100644 index 4ed70ae5a..000000000 --- a/mission9/coverage/lcov-report/sorter.js +++ /dev/null @@ -1,210 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - - // Try to create a RegExp from the searchValue. If it fails (invalid regex), - // it will be treated as a plain text search - let searchRegex; - try { - searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive - } catch (error) { - searchRegex = null; - } - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - let isMatch = false; - - if (searchRegex) { - // If a valid regex was created, use it for matching - isMatch = searchRegex.test(row.textContent); - } else { - // Otherwise, fall back to the original plain text search - isMatch = row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()); - } - - row.style.display = isMatch ? '' : 'none'; - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/mission9/coverage/lcov.info b/mission9/coverage/lcov.info deleted file mode 100644 index e69de29bb..000000000 diff --git a/mission9/coverage/lib/constants.ts.html b/mission9/coverage/lib/constants.ts.html deleted file mode 100644 index 9e18f9c6b..000000000 --- a/mission9/coverage/lib/constants.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for lib/constants.ts - - - - - - - - - -
-
-

All files / lib constants.ts

-
- -
- 100% - Statements - 20/20 -
- - -
- 50% - Branches - 4/8 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 20/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -271x -1x -  -1x -1x -1x -1x -1x -  -1x -  -1x -1x -1x -  -  -1x -1x -1x -1x -1x -1x -1x -1x -1x -  - 
import dotenv from 'dotenv';
-dotenv.config();
- 
-const DATABASE_URL = process.env.DATABASE_URL;
-const NODE_ENV = process.env.NODE_ENV || 'development';
-const PORT = process.env.PORT || 3000;
-const PUBLIC_PATH = 'public';
-const STATIC_PATH = '/public';
-const JWT_ACCESS_TOKEN_SECRET =
-  process.env.JWT_ACCESS_TOKEN_SECRET || 'your_jwt_access_token_secret';
-const JWT_REFRESH_TOKEN_SECRET =
-  process.env.JWT_REFRESH_TOKEN_SECRET || 'your_jwt_refresh_token_secret';
-const ACCESS_TOKEN_COOKIE_NAME = 'access-token';
-const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token';
- 
-export {
-  DATABASE_URL,
-  NODE_ENV,
-  PORT,
-  PUBLIC_PATH,
-  STATIC_PATH,
-  JWT_ACCESS_TOKEN_SECRET,
-  JWT_REFRESH_TOKEN_SECRET,
-  ACCESS_TOKEN_COOKIE_NAME,
-  REFRESH_TOKEN_COOKIE_NAME,
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/lib/cookies.ts.html b/mission9/coverage/lib/cookies.ts.html deleted file mode 100644 index 7c2e7eaed..000000000 --- a/mission9/coverage/lib/cookies.ts.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - Code coverage report for lib/cookies.ts - - - - - - - - - -
-
-

All files / lib cookies.ts

-
- -
- 42.85% - Statements - 3/7 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 42.85% - Lines - 3/7 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -291x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  - 
import { NODE_ENV, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from './constants';
-import { Response } from 'express';
- 
-export function setTokenCookies(res: Response, accessToken: string, refreshToken: string) {
-  res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-    maxAge: 1 * 60 * 60 * 1000, // 1시간
-  });
-  res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-    maxAge: 7 * 24 * 60 * 60 * 1000, // 7일
-    path: '/users/refresh',
-  });
-}
- 
-export function clearTokenCookies(res: Response) {
-  res.clearCookie(ACCESS_TOKEN_COOKIE_NAME, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-  });
-  res.clearCookie(REFRESH_TOKEN_COOKIE_NAME, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-    path: '/users/refresh',
-  });
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/lib/errors/customErrors.ts.html b/mission9/coverage/lib/errors/customErrors.ts.html deleted file mode 100644 index 98442b49b..000000000 --- a/mission9/coverage/lib/errors/customErrors.ts.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Code coverage report for lib/errors/customErrors.ts - - - - - - - - - -
-
-

All files / lib/errors customErrors.ts

-
- -
- 38.88% - Statements - 7/18 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/7 -
- - -
- 38.88% - Lines - 7/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -471x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  - 
export class BaseError extends Error {
-  statusCode: number;
-  constructor(message: string, statusCode: number) {
-    super(message);
-    this.name = new.target.name;
-    this.statusCode = statusCode;
-  }
-}
- 
-export class NotFoundError extends BaseError {
-  constructor(message = '존재하지 않습니다') {
-    super(message, 404);
-  }
-}
- 
-export class UnauthorizedError extends BaseError {
-  constructor(message = '인증이 필요합니다') {
-    super(message, 401);
-  }
-}
- 
-export class BadRequestError extends BaseError {
-  constructor(message = '잘못된 요청입니다') {
-    super(message, 400);
-  }
-}
- 
-export class ForbiddenError extends BaseError {
-  constructor(message = '비밀번호가 틀렸습니다') {
-    super(message, 403);
-  }
-}
- 
-export class AlreadyLikeError extends ForbiddenError {
-  constructor(message = '이미 좋아요를 눌렀습니다.') {
-    super(message);
-    this.name = new.target.name;
-  }
-}
- 
-export class AlreadyUnlikeError extends ForbiddenError {
-  constructor(message = '좋아요가 존재하지 않습니다.') {
-    super(message);
-    this.name = new.target.name;
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/lib/errors/errorUtils.ts.html b/mission9/coverage/lib/errors/errorUtils.ts.html deleted file mode 100644 index 2087af67c..000000000 --- a/mission9/coverage/lib/errors/errorUtils.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for lib/errors/errorUtils.ts - - - - - - - - - -
-
-

All files / lib/errors errorUtils.ts

-
- -
- 20% - Statements - 1/5 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 25% - Lines - 1/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -  -  -  -1x -  -  -  -  -  -  -  - 
interface SyntaxJsonError extends SyntaxError {
-  status?: number;
-  body?: unknown;
-}
- 
-export function isSyntaxJsonError(err: unknown): err is SyntaxJsonError {
-  if (!(err instanceof SyntaxError)) return false;
-  const e = err as Partial<SyntaxJsonError>;
-  return typeof e.status === 'number' && 'body' in e;
-}
-// Partial<SyntaxJsonError>;
-// 얘는 SyntaxJsonError의 일부 프로퍼티만 가지고 있을 수도 있어”
-// 라고 TS에게 알려서 e.status, e.body 같은 속성 접근을 가능하게 해주는 장치
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/lib/errors/index.html b/mission9/coverage/lib/errors/index.html deleted file mode 100644 index cd59b19a2..000000000 --- a/mission9/coverage/lib/errors/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for lib/errors - - - - - - - - - -
-
-

All files lib/errors

-
- -
- 34.78% - Statements - 8/23 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/8 -
- - -
- 36.36% - Lines - 8/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
customErrors.ts -
-
38.88%7/180%0/60%0/738.88%7/18
errorUtils.ts -
-
20%1/50%0/40%0/125%1/4
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/lib/index.html b/mission9/coverage/lib/index.html deleted file mode 100644 index ecde2e77e..000000000 --- a/mission9/coverage/lib/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for lib - - - - - - - - - -
-
-

All files lib

-
- -
- 74.46% - Statements - 35/47 -
- - -
- 50% - Branches - 4/8 -
- - -
- 37.5% - Functions - 3/8 -
- - -
- 73.91% - Lines - 34/46 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
constants.ts -
-
100%20/2050%4/8100%0/0100%20/20
cookies.ts -
-
42.85%3/7100%0/00%0/242.85%3/7
prismaClient.ts -
-
100%2/2100%0/0100%0/0100%2/2
token.ts -
-
41.66%5/12100%0/00%0/341.66%5/12
withAsync.ts -
-
83.33%5/6100%0/0100%3/380%4/5
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/lib/prismaClient.ts.html b/mission9/coverage/lib/prismaClient.ts.html deleted file mode 100644 index 2e8063c3d..000000000 --- a/mission9/coverage/lib/prismaClient.ts.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - Code coverage report for lib/prismaClient.ts - - - - - - - - - -
-
-

All files / lib prismaClient.ts

-
- -
- 100% - Statements - 2/2 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 2/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -41x -  -1x - 
import { PrismaClient } from '@prisma/client';
- 
-export const prisma = new PrismaClient();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/lib/token.ts.html b/mission9/coverage/lib/token.ts.html deleted file mode 100644 index 372192f34..000000000 --- a/mission9/coverage/lib/token.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for lib/token.ts - - - - - - - - - -
-
-

All files / lib token.ts

-
- -
- 41.66% - Statements - 5/12 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/3 -
- - -
- 41.66% - Lines - 5/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -231x -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -1x -  -  -  - 
import jwt, { JwtPayload } from 'jsonwebtoken';
-import { JWT_ACCESS_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET } from './constants';
- 
-interface TokenPayload extends JwtPayload {
-  id: number;
-}
- 
-export function generateToken(userId: number) {
-  const accessToken = jwt.sign({ id: userId }, JWT_ACCESS_TOKEN_SECRET, { expiresIn: '1h' });
-  const refreshToken = jwt.sign({ id: userId }, JWT_REFRESH_TOKEN_SECRET, { expiresIn: '1d' });
-  return { accessToken, refreshToken };
-}
- 
-export function verifyAccessToken(token: string) {
-  const decoded = jwt.verify(token, JWT_ACCESS_TOKEN_SECRET) as TokenPayload;
-  return { userId: decoded.id };
-}
- 
-export function verifyRefreshToken(token: string) {
-  const decoded = jwt.verify(token, JWT_REFRESH_TOKEN_SECRET) as TokenPayload;
-  return { userId: decoded.id };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/lib/withAsync.ts.html b/mission9/coverage/lib/withAsync.ts.html deleted file mode 100644 index 2e7a603fd..000000000 --- a/mission9/coverage/lib/withAsync.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for lib/withAsync.ts - - - - - - - - - -
-
-

All files / lib withAsync.ts

-
- -
- 83.33% - Statements - 5/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 3/3 -
- - -
- 80% - Lines - 4/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -1x -  -  -33x -2x -2x -  -  -  -  -  - 
import type { Request, Response, NextFunction, RequestHandler } from 'express';
- 
-export function withAsync<T = unknown>(
-  handler: (req: Request, res: Response, next: NextFunction) => Promise<T>,
-): RequestHandler {
-  return async (req, res, next) => {
-    try {
-      await handler(req, res, next);
-    } catch (e) {
-      next(e);
-    }
-  };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/middlewares/authenticate.ts.html b/mission9/coverage/middlewares/authenticate.ts.html deleted file mode 100644 index 56eeaf857..000000000 --- a/mission9/coverage/middlewares/authenticate.ts.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - Code coverage report for middlewares/authenticate.ts - - - - - - - - - -
-
-

All files / middlewares authenticate.ts

-
- -
- 55% - Statements - 11/20 -
- - -
- 42.85% - Branches - 3/7 -
- - -
- 100% - Functions - 3/3 -
- - -
- 52.63% - Lines - 10/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -311x -1x -1x -1x -  -  -  -26x -2x -2x -2x -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { prisma } from '../lib/prismaClient';
-import { verifyAccessToken } from '../lib/token';
-import { ACCESS_TOKEN_COOKIE_NAME } from '../lib/constants';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { NextFunction, Request, Response } from 'express';
- 
-function authenticate(options = { optional: false }) {
-  return async (req: Request, res: Response, next: NextFunction) => {
-    const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME];
-    Eif (!accessToken) {
-      Eif (options.optional) {
-        return next();
-      }
-      return next(new UnauthorizedError());
-    }
-    try {
-      const { userId } = verifyAccessToken(accessToken); //디코딩 된 토큰에서 user id 추출
-      const user = await prisma.user.findUniqueOrThrow({ where: { id: userId } });
-      req.user = user;
-    } catch (error) {
-      if (options.optional) {
-        return next();
-      }
-      return next(new UnauthorizedError());
-    }
-    next();
-  };
-}
- 
-export default authenticate;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/middlewares/index.html b/mission9/coverage/middlewares/index.html deleted file mode 100644 index 73cd09812..000000000 --- a/mission9/coverage/middlewares/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for middlewares - - - - - - - - - -
-
-

All files middlewares

-
- -
- 55% - Statements - 11/20 -
- - -
- 42.85% - Branches - 3/7 -
- - -
- 100% - Functions - 3/3 -
- - -
- 52.63% - Lines - 10/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
authenticate.ts -
-
55%11/2042.85%3/7100%3/352.63%10/19
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/prettify.css b/mission9/coverage/prettify.css deleted file mode 100644 index b317a7cda..000000000 --- a/mission9/coverage/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/mission9/coverage/prettify.js b/mission9/coverage/prettify.js deleted file mode 100644 index b3225238f..000000000 --- a/mission9/coverage/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/mission9/coverage/repositories/articleRepository.ts.html b/mission9/coverage/repositories/articleRepository.ts.html deleted file mode 100644 index d1defbc06..000000000 --- a/mission9/coverage/repositories/articleRepository.ts.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - Code coverage report for repositories/articleRepository.ts - - - - - - - - - -
-
-

All files / repositories articleRepository.ts

-
- -
- 30% - Statements - 3/10 -
- - -
- 0% - Branches - 0/8 -
- - -
- 0% - Functions - 0/7 -
- - -
- 30% - Lines - 3/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58  -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { Prisma } from '@prisma/client';
-import { prisma } from '../lib/prismaClient';
-import { ArticleLikesAndCount } from '../../types/article';
- 
-export class ArticleRepository {
-  async create(data: Prisma.ArticleCreateInput) {
-    return prisma.article.create({ data });
-  }
-  async findById(id: number) {
-    return prisma.article.findUniqueOrThrow({ where: { id } });
-  }
-  async findByIdWithLikes(id: number, userId?: number): Promise<ArticleLikesAndCount> {
-    return prisma.article.findUniqueOrThrow({
-      where: { id },
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          //비로그인 시 -1을 줘서 []을 뱉도록
-          where: { userId: userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async findArticleListWithLikes(params: {
-    skip: number;
-    take: number;
-    orderBy: Prisma.ArticleOrderByWithRelationInput;
-    where: Prisma.ArticleWhereInput;
-    userId?: number;
-  }): Promise<ArticleLikesAndCount[]> {
-    return prisma.article.findMany({
-      skip: params.skip,
-      take: params.take,
-      orderBy: params.orderBy,
-      where: params.where,
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          where: { userId: params.userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async count(where: Prisma.ArticleWhereInput) {
-    return prisma.article.count({ where });
-  }
-  async update(id: number, data: Prisma.ArticleUpdateInput) {
-    return prisma.article.update({ where: { id }, data });
-  }
-  async delete(id: number) {
-    return prisma.article.delete({ where: { id } });
-  }
-}
- 
-export const articleRepo = new ArticleRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/repositories/commentRepository.ts.html b/mission9/coverage/repositories/commentRepository.ts.html deleted file mode 100644 index 9d84f7d08..000000000 --- a/mission9/coverage/repositories/commentRepository.ts.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - Code coverage report for repositories/commentRepository.ts - - - - - - - - - -
-
-

All files / repositories commentRepository.ts

-
- -
- 37.5% - Statements - 3/8 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/5 -
- - -
- 37.5% - Lines - 3/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { Prisma } from '@prisma/client';
-import { prisma } from '../lib/prismaClient';
- 
-export class CommentRepository {
-  async create(data: Prisma.CommentCreateInput) {
-    return prisma.comment.create({ data });
-  }
-  async findCommentListQuery(
-    whereCondition: { articleId: number } | { productId: number },
-    limit: number,
-    cursor?: number,
-  ) {
-    return prisma.comment.findMany({
-      cursor: cursor ? { id: cursor } : undefined,
-      take: limit + 1,
-      where: whereCondition,
-      orderBy: { createdAt: 'desc' },
-    });
-  }
-  async findById(id: number) {
-    return prisma.comment.findUniqueOrThrow({ where: { id } });
-  }
-  async update(id: number, content?: string) {
-    return prisma.comment.update({ where: { id }, data: { content } });
-  }
-  async delete(id: number) {
-    return prisma.comment.delete({ where: { id } });
-  }
-}
- 
-export const commentRepo = new CommentRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/repositories/index.html b/mission9/coverage/repositories/index.html deleted file mode 100644 index 0e2a502ec..000000000 --- a/mission9/coverage/repositories/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - Code coverage report for repositories - - - - - - - - - -
-
-

All files repositories

-
- -
- 32.69% - Statements - 17/52 -
- - -
- 11.53% - Branches - 3/26 -
- - -
- 6.06% - Functions - 2/33 -
- - -
- 32.69% - Lines - 17/52 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articleRepository.ts -
-
30%3/100%0/80%0/730%3/10
commentRepository.ts -
-
37.5%3/80%0/20%0/537.5%3/8
likeRepository.ts -
-
22.22%2/90%0/60%0/422.22%2/9
notificationRepository.ts -
-
37.5%3/8100%0/00%0/537.5%3/8
productRepository.ts -
-
36.36%4/1130%3/1025%2/836.36%4/11
userRepository.ts -
-
33.33%2/6100%0/00%0/433.33%2/6
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/repositories/likeRepository.ts.html b/mission9/coverage/repositories/likeRepository.ts.html deleted file mode 100644 index 426f98a4e..000000000 --- a/mission9/coverage/repositories/likeRepository.ts.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - Code coverage report for repositories/likeRepository.ts - - - - - - - - - -
-
-

All files / repositories likeRepository.ts

-
- -
- 22.22% - Statements - 2/9 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/4 -
- - -
- 22.22% - Lines - 2/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { LikeTarget } from '../../types/like';
-import { prisma } from '../lib/prismaClient';
- 
-class LikdeRepository {
-  async findLike(userId: number, target: LikeTarget) {
-    const whereCondition =
-      'articleId' in target
-        ? { userId_articleId: { userId, articleId: target.articleId } }
-        : { userId_productId: { userId, productId: target.productId } };
-    return prisma.like.findUnique({
-      where: whereCondition,
-    });
-  }
-  async createLike(userId: number, target: LikeTarget) {
-    return prisma.like.create({ data: { userId, ...target } });
-  }
-  async deleteLike(userId: number, target: LikeTarget) {
-    const whereCondition =
-      'articleId' in target
-        ? { userId_articleId: { userId, articleId: target.articleId } }
-        : { userId_productId: { userId, productId: target.productId } };
-    return prisma.like.delete({
-      where: whereCondition,
-    });
-  }
-  async getLikers(target: LikeTarget) {
-    const whereCondition =
-      'articleId' in target ? { articleId: target.articleId } : { productId: target.productId };
-    return prisma.like.findMany({
-      where: whereCondition,
-      select: { userId: true },
-    });
-  }
-}
- 
-export const likeRepo = new LikdeRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/repositories/notificationRepository.ts.html b/mission9/coverage/repositories/notificationRepository.ts.html deleted file mode 100644 index 196af5b36..000000000 --- a/mission9/coverage/repositories/notificationRepository.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for repositories/notificationRepository.ts - - - - - - - - - -
-
-

All files / repositories notificationRepository.ts

-
- -
- 37.5% - Statements - 3/8 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/5 -
- - -
- 37.5% - Lines - 3/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -271x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { prisma } from '../lib/prismaClient';
- 
-export class NotificationRepository {
-  async getNotification(userId: number) {
-    return prisma.notification.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } });
-  }
-  async getUnreadCount(userId: number) {
-    return prisma.notification.count({ where: { userId, isRead: false } });
-  }
-  async create(userId: number, message: string) {
-    return prisma.notification.create({ data: { userId, message } });
-  }
-  async findByIds(notificationId: number, userId: number) {
-    return prisma.notification.findFirst({
-      where: { id: notificationId, userId },
-    });
-  }
-  async updateRead(notificationId: number) {
-    return prisma.notification.update({
-      where: { id: notificationId },
-      data: { isRead: true },
-    });
-  }
-}
- 
-export const notificationRepo = new NotificationRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/repositories/productRepository.ts.html b/mission9/coverage/repositories/productRepository.ts.html deleted file mode 100644 index d9370bb0f..000000000 --- a/mission9/coverage/repositories/productRepository.ts.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - Code coverage report for repositories/productRepository.ts - - - - - - - - - -
-
-

All files / repositories productRepository.ts

-
- -
- 36.36% - Statements - 4/11 -
- - -
- 30% - Branches - 3/10 -
- - -
- 25% - Functions - 2/8 -
- - -
- 36.36% - Lines - 4/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { ProductLikesAndCount } from '../../types/product';
-import { prisma } from '../lib/prismaClient';
-import { Prisma } from '@prisma/client';
-import type { ProductRecentType } from '../../types/product';
- 
-class ProductRepository {
-  async create(data: Prisma.ProductCreateInput) {
-    return prisma.product.create({ data });
-  }
-  async findById(id: number) {
-    return prisma.product.findUniqueOrThrow({ where: { id } });
-  }
-  async findByIdWithLikes(id: number, userId?: number): Promise<ProductLikesAndCount> {
-    return prisma.product.findUniqueOrThrow({
-      where: { id },
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          where: { userId: userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async update(id: number, data: Prisma.ProductUpdateInput) {
-    return prisma.product.update({ where: { id }, data });
-  }
-  async delete(id: number) {
-    return prisma.product.delete({ where: { id } });
-  }
-  async findProductListWithLikes(params: {
-    skip: number;
-    take: number;
-    orderBy: Prisma.ProductOrderByWithRelationInput;
-    where: Prisma.ProductWhereInput;
-    userId?: number;
-  }): Promise<ProductLikesAndCount[]> {
-    return prisma.product.findMany({
-      skip: params.skip,
-      take: params.take,
-      orderBy: params.orderBy,
-      where: params.where,
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          where: { userId: params.userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async count(where: Prisma.ProductWhereInput) {
-    return prisma.product.count({ where });
-  }
-  async findRecentProduct(userId: number, limit: number, type: ProductRecentType) {
-    const whereCondition = type === 'myUploaded' ? { userId } : { likes: { some: { userId } } };
-    return prisma.product.findMany({
-      where: whereCondition,
-      orderBy: { createdAt: 'desc' },
-      take: limit,
-    });
-  }
-}
- 
-export const productRepo = new ProductRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/repositories/userRepository.ts.html b/mission9/coverage/repositories/userRepository.ts.html deleted file mode 100644 index babeb8a89..000000000 --- a/mission9/coverage/repositories/userRepository.ts.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - Code coverage report for repositories/userRepository.ts - - - - - - - - - -
-
-

All files / repositories userRepository.ts

-
- -
- 33.33% - Statements - 2/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/4 -
- - -
- 33.33% - Lines - 2/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -201x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { prisma } from '../lib/prismaClient';
-import { Prisma } from '@prisma/client';
- 
-class UserRepository {
-  async create(data: Prisma.UserCreateInput) {
-    return prisma.user.create({ data });
-  }
-  async findByEmail(email: string) {
-    return prisma.user.findUnique({ where: { email } });
-  }
-  async update(id: number, data: Prisma.UserUpdateInput) {
-    return prisma.user.update({ where: { id }, data });
-  }
-  async findById(id: number) {
-    return prisma.user.findUnique({ where: { id } });
-  }
-}
- 
-export const userRepo = new UserRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/services/articleService.ts.html b/mission9/coverage/services/articleService.ts.html deleted file mode 100644 index 24a14424b..000000000 --- a/mission9/coverage/services/articleService.ts.html +++ /dev/null @@ -1,499 +0,0 @@ - - - - - - Code coverage report for services/articleService.ts - - - - - - - - - -
-
-

All files / services articleService.ts

-
- -
- 13.55% - Statements - 8/59 -
- - -
- 0% - Branches - 0/34 -
- - -
- 0% - Functions - 0/10 -
- - -
- 14.03% - Lines - 8/57 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -1391x -  -1x -1x -1x -1x -  -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { articleRepo } from '../repositories/articleRepository';
-import { ArticleLikesAndCount, ArticleListResponse, ArticleResponse } from '../../types/article';
-import { AlreadyLikeError, AlreadyUnlikeError, ForbiddenError } from '../lib/errors/customErrors';
-import { commentRepo } from '../repositories/commentRepository';
-import { likeRepo } from '../repositories/likeRepository';
-import { Prisma, Article, Comment } from '@prisma/client';
-import type { CursorPaginated } from '../../types/cursorPaginated';
-import { notificationService } from './notificationService';
- 
-//객체로 주면 콘트롤러에서 인자순서 상관없이 적용되지만, ()형태로 반환하게되면 인자순서를 서비스형태와 동일하게 넣어야 함
-export class ArticleService {
-  async createArticle(
-    userId: number,
-    title: string,
-    content: string,
-    image?: string | null,
-  ): Promise<Article> {
-    return articleRepo.create({
-      title,
-      content,
-      image,
-      user: { connect: { id: userId } },
-    });
-  }
-  async getArticle(articleId: number, userId?: number): Promise<ArticleResponse> {
-    const article: ArticleLikesAndCount = await articleRepo.findByIdWithLikes(articleId, userId);
-    const { likes, _count, ...articleData } = article;
-    const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined;
-    return { ...articleData, likeCount: _count.likes, isLiked };
-  }
-  async updateArticle(
-    articleId: number,
-    userId: number,
-    data: { title?: string; content?: string; image?: string | null },
-  ): Promise<Article> {
-    const article = await articleRepo.findById(articleId);
-    if (article.userId !== userId) {
-      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
-    }
-    return articleRepo.update(articleId, data);
-  }
-  async deleteArticle(articleId: number, userId: number): Promise<void> {
-    const article = await articleRepo.findById(articleId);
-    if (article.userId !== userId) {
-      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
-    }
-    await articleRepo.delete(articleId);
-  }
-  async getArticleList(
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-    keyword?: string,
-    userId?: number,
-  ): Promise<ArticleListResponse> {
-    const where = {
-      title: keyword ? { contains: keyword } : undefined,
-    };
-    const [totalCount, articles] = await Promise.all([
-      articleRepo.count(where),
-      articleRepo.findArticleListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId,
-      }),
-    ]);
-    const list: ArticleResponse[] = articles.map((m) => {
-      const { _count, likes, ...basicArticleData } = m;
-      const response: ArticleResponse = {
-        ...basicArticleData,
-        likeCount: _count.likes,
-      };
-      if (!userId) {
-        return response;
-      }
-      const isLiked = (likes ?? []).length > 0;
-      return { ...basicArticleData, isLiked, likeCount: _count.likes };
-    });
-    const response: ArticleListResponse = {
-      list,
-      totalCount,
-    };
-    return response;
-  }
-  async createComment(userId: number, articleId: number, content: string): Promise<Comment> {
-    await articleRepo.findById(articleId);
-    const comment = await commentRepo.create({
-      content,
-      user: { connect: { id: userId } },
-      article: { connect: { id: articleId } },
-    });
-    const article = await articleRepo.findById(articleId);
-    if (article.userId !== userId) {
-      await notificationService.createNotification(
-        article.userId,
-        `내 게시글 "${article.title}"에 새로운 댓글이 달렸습니다.`,
-      );
-    }
-    return comment;
-  }
-  async getCommentList(
-    articleId: number,
-    limit: number,
-    cursor?: number,
-  ): Promise<CursorPaginated<Comment>> {
-    await articleRepo.findById(articleId);
-    const commentsWithCursor = await commentRepo.findCommentListQuery({ articleId }, limit, cursor);
-    const comments = commentsWithCursor.slice(0, limit);
-    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
-    const nextCursor = cursorComment ? cursorComment.id : null;
-    return { list: comments, nextCursor };
-  }
-  //like , unlike 둘다 message를 반환해버려서 이게..프로미스로 타입 설정하는 것이 의미가 있는지...로직 수정 생각해봐야할 듯
-  async likeArticle(userId: number, articleId: number): Promise<{ message: string }> {
-    const article = await articleRepo.findById(articleId);
-    const existingLike = await likeRepo.findLike(userId, { articleId });
-    if (existingLike) {
-      throw new AlreadyLikeError();
-    }
-    await likeRepo.createLike(userId, { articleId });
-    return { message: `${article.title}게시글에 좋아요를 눌렀습니다.` };
-  }
-  async unlikeArticle(userId: number, articleId: number): Promise<{ message: string }> {
-    const article = await articleRepo.findById(articleId);
-    try {
-      await likeRepo.deleteLike(userId, { articleId });
-    } catch (error: unknown) {
-      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
-        throw new AlreadyUnlikeError();
-      }
-      throw error;
-    }
-    return { message: `${article.title}게시글의 좋아요를 취소했습니다` };
-  }
-}
-export const articleService = new ArticleService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/services/commentService.ts.html b/mission9/coverage/services/commentService.ts.html deleted file mode 100644 index b00d0ec11..000000000 --- a/mission9/coverage/services/commentService.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for services/commentService.ts - - - - - - - - - -
-
-

All files / services commentService.ts

-
- -
- 33.33% - Statements - 4/12 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/2 -
- - -
- 33.33% - Lines - 4/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -231x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { commentRepo } from '../repositories/commentRepository';
-import { ForbiddenError } from '../lib/errors/customErrors';
-import { Comment } from '@prisma/client';
- 
-export class CommentService {
-  async updateComment(commentId: number, userId: number, content?: string): Promise<Comment> {
-    const comment = await commentRepo.findById(commentId);
-    if (comment.userId !== userId) {
-      throw new ForbiddenError('해당 댓글을 수정할 권한이 없습니다.');
-    }
-    return commentRepo.update(commentId, content);
-  }
-  async deleteComment(commentId: number, userId: number): Promise<void> {
-    const comment = await commentRepo.findById(commentId);
-    if (comment.userId !== userId) {
-      throw new ForbiddenError('해당 댓글을 삭제할 권한이 없습니다.');
-    }
-    await commentRepo.delete(commentId);
-  }
-}
- 
-export const commnetService = new CommentService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/services/imageService.ts.html b/mission9/coverage/services/imageService.ts.html deleted file mode 100644 index 6f8b0cf18..000000000 --- a/mission9/coverage/services/imageService.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for services/imageService.ts - - - - - - - - - -
-
-

All files / services imageService.ts

-
- -
- 38.46% - Statements - 5/13 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 38.46% - Lines - 5/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23  -  -1x -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { uploadImageResponse } from '../../types/image';
-import { Request } from 'express';
-import { BadRequestError } from '../lib/errors/customErrors';
-import path from 'path';
-import { STATIC_PATH } from '../lib/constants';
- 
-export class ImageService {
-  buildImageUrl(req: Request): uploadImageResponse {
-    const host = req.get('host');
-    if (!host) {
-      throw new BadRequestError('요청 헤더에 host 정보가 없습니다.');
-    }
-    if (!req.file) {
-      throw new BadRequestError();
-    }
-    const filePath = path.join(host, STATIC_PATH, req.file.filename);
-    const url = `http://${filePath}`;
-    return { url };
-  }
-}
- 
-export const imageService = new ImageService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/services/index.html b/mission9/coverage/services/index.html deleted file mode 100644 index 02ae16e1c..000000000 --- a/mission9/coverage/services/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - Code coverage report for services - - - - - - - - - -
-
-

All files services

-
- -
- 19.26% - Statements - 47/244 -
- - -
- 2.02% - Branches - 3/148 -
- - -
- 5.12% - Functions - 2/39 -
- - -
- 20.17% - Lines - 46/228 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articleService.ts -
-
13.55%8/590%0/340%0/1014.03%8/57
commentService.ts -
-
33.33%4/120%0/40%0/233.33%4/12
imageService.ts -
-
38.46%5/130%0/40%0/138.46%5/13
notificationService.ts -
-
33.33%5/150%0/20%0/435.71%5/14
productService.ts -
-
28.35%19/676.25%3/4820%2/1027.69%18/65
userService.ts -
-
7.69%6/780%0/560%0/128.95%6/67
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/services/notificationService.ts.html b/mission9/coverage/services/notificationService.ts.html deleted file mode 100644 index 92c271ff3..000000000 --- a/mission9/coverage/services/notificationService.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for services/notificationService.ts - - - - - - - - - -
-
-

All files / services notificationService.ts

-
- -
- 33.33% - Statements - 5/15 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/4 -
- - -
- 35.71% - Lines - 5/14 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -271x -1x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { UnauthorizedError } from '../lib/errors/customErrors';
-import { notificationRepo } from '../repositories/notificationRepository';
-import { getIO } from '../socket';
-import type { Notification as PrismaNotification } from '@prisma/client';
- 
-export class NotificationService {
-  async getNotifications(userId: number): Promise<PrismaNotification[]> {
-    return notificationRepo.getNotification(userId);
-  }
-  async getUnreadCount(userId: number): Promise<number> {
-    return notificationRepo.getUnreadCount(userId);
-  }
-  async createNotification(userId: number, message: string): Promise<PrismaNotification> {
-    const notification = await notificationRepo.create(userId, message);
-    const io = getIO();
-    io.to(`user-${userId}`).emit('notification', notification);
-    return notification;
-  }
-  async markAsRead(notificationId: number, userId: number): Promise<PrismaNotification> {
-    const notification = await notificationRepo.findByIds(notificationId, userId);
-    if (!notification) throw new UnauthorizedError();
-    return notificationRepo.updateRead(notificationId);
-  }
-}
- 
-export const notificationService = new NotificationService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/services/productService.ts.html b/mission9/coverage/services/productService.ts.html deleted file mode 100644 index 56fdc37ce..000000000 --- a/mission9/coverage/services/productService.ts.html +++ /dev/null @@ -1,604 +0,0 @@ - - - - - - Code coverage report for services/productService.ts - - - - - - - - - -
-
-

All files / services productService.ts

-
- -
- 28.35% - Statements - 19/67 -
- - -
- 6.25% - Branches - 3/48 -
- - -
- 20% - Functions - 2/10 -
- - -
- 27.69% - Lines - 18/65 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174  -1x -  -  -1x -1x -  -  -1x -1x -1x -1x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -2x -2x -2x -  -  -  -2x -2x -  -  -  -  -2x -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { ProductLikesAndCount } from '../../types/product';
-import { productRepo } from '../repositories/productRepository';
-import { Product } from '@prisma/client';
-import type { ProductListResponse, ProductResponse } from '../../types/product';
-import { ForbiddenError } from '../lib/errors/customErrors';
-import { commentRepo } from '../repositories/commentRepository';
-import type { Comment } from '@prisma/client';
-import type { CursorPaginated } from '../../types/cursorPaginated';
-import { AlreadyLikeError, AlreadyUnlikeError } from '../lib/errors/customErrors';
-import { likeRepo } from '../repositories/likeRepository';
-import { Prisma } from '@prisma/client';
-import { notificationService } from './notificationService';
- 
-//인자 순서가 옵셔널 다음 필수파라미터가 들어오면 컴파일에러가 발생함
-//객체로 묶어 보내기, 이러면 필수인 userid의 파라미터 순서를 바꾸지 않아도 됨
-export class ProductService {
-  async createProduct(params: {
-    name: string;
-    description: string;
-    price: number;
-    tags?: string[];
-    images?: string[];
-    userId: number;
-  }): Promise<Product> {
-    const { name, description, price, tags, images, userId } = params;
-    return productRepo.create({
-      name,
-      description,
-      price,
-      tags: tags ?? [],
-      images: images ?? [],
-      user: { connect: { id: userId } },
-    });
-  }
-  async getProduct(productId: number, userId?: number): Promise<ProductResponse> {
-    const product: ProductLikesAndCount = await productRepo.findByIdWithLikes(productId, userId);
-    const { likes, _count, ...productData } = product;
-    const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined;
-    return { ...productData, likeCount: _count.likes, isLiked };
-  }
-  async updateProduct(
-    productId: number,
-    userId: number,
-    data: {
-      name?: string;
-      description?: string;
-      price?: number;
-      tags?: string[];
-      images?: string[];
-    },
-  ): Promise<Product> {
-    const product = await productRepo.findById(productId);
-    if (product.userId !== userId) {
-      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
-    }
-    const updateProduct = await productRepo.update(productId, data);
-    //undefined가 아니면서 기존가격과 다른 경우
-    if (data.price !== undefined && product.price !== data.price) {
-      const likers = await likeRepo.getLikers({ productId });
-      for (const liker of likers) {
-        if (liker.userId !== userId) {
-          await notificationService.createNotification(
-            liker.userId,
-            `관심 상품 "${product.name}"의 가격이 변동되었습니다.`,
-          );
-        }
-      }
-    }
-    return updateProduct;
-  }
-  async deleteProduct(productId: number, userId: number): Promise<void> {
-    const product = await productRepo.findById(productId);
-    if (product.userId !== userId) {
-      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
-    }
-    await productRepo.delete(productId);
-  }
-  async getProductList(
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-    keyword?: string,
-    userId?: number,
-  ): Promise<ProductListResponse> {
-    const where = keyword
-      ? {
-          OR: [
-            { name: { contains: keyword } },
-            { description: { contains: keyword } },
-            { tags: { has: keyword } },
-          ],
-        }
-      : {};
-    const [totalCount, products] = await Promise.all([
-      productRepo.count(where),
-      productRepo.findProductListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId,
-      }),
-    ]);
-    const list: ProductResponse[] = products.map((m) => {
-      const { _count, likes, ...basicProductData } = m;
-      const response: ProductResponse = {
-        ...basicProductData,
-        likeCount: _count.likes,
-      };
-      Eif (!userId) {
-        return response;
-      }
-      const isLiked = (likes ?? []).length > 0;
-      return { ...basicProductData, isLiked, likeCount: _count.likes };
-    });
-    const response: ProductListResponse = {
-      list,
-      totalCount,
-    };
-    return response;
-  }
-  async createComment(userId: number, productId: number, content: string): Promise<Comment> {
-    await productRepo.findById(productId);
-    const comment = await commentRepo.create({
-      content,
-      user: { connect: { id: userId } },
-      product: { connect: { id: productId } },
-    });
-    const product = await productRepo.findById(productId);
-    if (product.userId !== userId) {
-      await notificationService.createNotification(
-        product.userId,
-        `내 상품 "${product.name}"에 새로운 댓글이 달렸습니다.`,
-      );
-    }
-    return comment;
-  }
-  async getCommentList(
-    productId: number,
-    limit: number,
-    cursor?: number,
-  ): Promise<CursorPaginated<Comment>> {
-    await productRepo.findById(productId);
-    const commentsWithCursor = await commentRepo.findCommentListQuery({ productId }, limit, cursor);
-    const comments = commentsWithCursor.slice(0, limit);
-    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
-    const nextCursor = cursorComment ? cursorComment.id : null;
-    return { list: comments, nextCursor };
-  }
-  async likeProduct(userId: number, productId: number): Promise<{ message: string }> {
-    const product = await productRepo.findById(productId);
-    const existingLike = await likeRepo.findLike(userId, { productId });
-    if (existingLike) {
-      throw new AlreadyLikeError();
-    }
-    await likeRepo.createLike(userId, { productId });
-    return { message: `${product.name}상품에 좋아요를 눌렀습니다.` };
-  }
-  async unlikeProduct(userId: number, productId: number): Promise<{ message: string }> {
-    const product = await productRepo.findById(productId);
-    try {
-      await likeRepo.deleteLike(userId, { productId });
-    } catch (error: unknown) {
-      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
-        throw new AlreadyUnlikeError();
-      }
-      throw error;
-    }
-    return { message: `${product.name}상품의 좋아요를 취소했습니다` };
-  }
-}
- 
-export const productService = new ProductService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/services/userService.ts.html b/mission9/coverage/services/userService.ts.html deleted file mode 100644 index 9923c4656..000000000 --- a/mission9/coverage/services/userService.ts.html +++ /dev/null @@ -1,721 +0,0 @@ - - - - - - Code coverage report for services/userService.ts - - - - - - - - - -
-
-

All files / services userService.ts

-
- -
- 7.69% - Statements - 6/78 -
- - -
- 0% - Branches - 0/56 -
- - -
- 0% - Functions - 0/12 -
- - -
- 8.95% - Lines - 6/67 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -2131x -1x -  -1x -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import bcrypt from 'bcrypt';
-import { userRepo } from '../repositories/userRepository';
-import type { Prisma, User } from '@prisma/client';
-import { ForbiddenError, UnauthorizedError } from '../lib/errors/customErrors';
-import { generateToken, verifyRefreshToken } from '../lib/token';
-import { productRepo } from '../repositories/productRepository';
-import type { ProductListResponse } from '../../types/product';
-import { ProfileResponse } from '../../types/user';
- 
-class UserService {
-  async register(
-    nickname: string,
-    email: string,
-    password: string,
-    image?: string,
-  ): Promise<Omit<User, 'password'>> {
-    const salt = await bcrypt.genSalt(10);
-    const hashedPassword = await bcrypt.hash(password, salt);
-    const user = await userRepo.create({
-      nickname,
-      email,
-      password: hashedPassword,
-      image,
-    });
-    const { password: _, ...userWithoutPassword } = user;
-    return userWithoutPassword;
-  }
-  async login(
-    email: string,
-    password: string,
-  ): Promise<{ tokens: { accessToken: string; refreshToken: string }; message: string }> {
-    const user = await userRepo.findByEmail(email);
-    if (!user) {
-      //이메일, 비밀번호 검증에 대한 에러를 같은 메세지로 던짐으로써 좀 더 방어적으로 설계
-      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
-    }
-    const isPasswordValid = await bcrypt.compare(password, user.password);
-    if (!isPasswordValid) {
-      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
-    }
-    const tokens = generateToken(user.id);
-    return { tokens, message: '로그인에 성공했습니다.' };
-  }
-  async getProfile(myId: number): Promise<ProfileResponse> {
-    const user = await userRepo.findById(myId);
-    if (!user) throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
-    const { password: _, ...userInfo } = user;
-    const [myProductCount, myLikeProductCount, recentProductsRaw, recentLikedProductsRaw] =
-      await Promise.all([
-        productRepo.count({ userId: myId }),
-        productRepo.count({ likes: { some: { userId: myId } } }),
-        productRepo.findProductListWithLikes({
-          skip: 0,
-          take: 5,
-          orderBy: { createdAt: 'desc' },
-          where: { userId: myId },
-          userId: myId,
-        }),
-        productRepo.findProductListWithLikes({
-          skip: 0,
-          take: 5,
-          orderBy: { createdAt: 'desc' },
-          where: { likes: { some: { userId: myId } } },
-          userId: myId,
-        }),
-      ]);
-    const myRecentProducts = recentProductsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    const myRecentLikeProducts = recentLikedProductsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    return {
-      user: userInfo,
-      myProducts: {
-        list: myRecentProducts,
-        totalCount: myProductCount,
-      },
-      myLikedProducts: {
-        list: myRecentLikeProducts,
-        totalCount: myLikeProductCount,
-      },
-    };
-  }
- 
-  async updateProfile(
-    userId: number,
-    nickname?: string,
-    email?: string,
-    image?: string | null,
-  ): Promise<Omit<User, 'password'>> {
-    const data: Prisma.UserUpdateInput = {};
-    if (nickname !== undefined) data.nickname = nickname;
-    if (email !== undefined) data.email = email;
-    if (image !== undefined) data.image = image;
-    const update = await userRepo.update(userId, data);
-    const { password: _, ...userWithoutPassword } = update;
-    return userWithoutPassword;
-  }
-  async patchPassword(userId: number, currentPassword: string, newPassword: string): Promise<void> {
-    const user = await userRepo.findById(userId);
-    if (!user) {
-      throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
-    }
-    const isPasswordValid = await bcrypt.compare(currentPassword, user.password);
-    if (!isPasswordValid) {
-      throw new ForbiddenError('현재 비밀번호가 올바르지 않습니다.');
-    }
-    const salt = await bcrypt.genSalt(10);
-    const hashedNewPassword = await bcrypt.hash(newPassword, salt);
-    await userRepo.update(userId, { password: hashedNewPassword });
-  }
-  async getMyProductList(
-    myId: number,
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-    keyword?: string,
-  ): Promise<ProductListResponse> {
-    const where = {
-      userId: myId,
-      ...(keyword
-        ? {
-            OR: [
-              { name: { contains: keyword } },
-              { description: { contains: keyword } },
-              { tags: { has: keyword } },
-            ],
-          }
-        : {}),
-    };
-    const [totalCount, productsRaw] = await Promise.all([
-      productRepo.count(where),
-      productRepo.findProductListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId: myId,
-      }),
-    ]);
-    const list = productsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    return { list, totalCount };
-  }
-  async refreshToken(refreshToken: string) {
-    let userId: number;
-    try {
-      const payload = verifyRefreshToken(refreshToken);
-      userId = payload.userId;
-    } catch (error) {
-      throw new UnauthorizedError('유효하지 않은 리프레시 토큰입니다.');
-    }
-    const user = await userRepo.findById(userId);
-    if (!user) {
-      throw new UnauthorizedError('존재하지 않는 사용자입니다.');
-    }
-    const tokens = generateToken(user.id);
-    return tokens;
-  }
-  async getMyLikedProducts(
-    myId: number,
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-  ): Promise<ProductListResponse> {
-    const where = {
-      likes: {
-        some: {
-          userId: myId,
-        },
-      },
-    };
-    const [totalCount, productsRaw] = await Promise.all([
-      productRepo.count(where),
-      productRepo.findProductListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId: myId,
-      }),
-    ]);
-    const list = productsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    return { list, totalCount };
-  }
-}
- 
-export const userService = new UserService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/sort-arrow-sprite.png b/mission9/coverage/sort-arrow-sprite.png deleted file mode 100644 index 6ed68316eb3f65dec9063332d2f69bf3093bbfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc diff --git a/mission9/coverage/sorter.js b/mission9/coverage/sorter.js deleted file mode 100644 index 4ed70ae5a..000000000 --- a/mission9/coverage/sorter.js +++ /dev/null @@ -1,210 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - - // Try to create a RegExp from the searchValue. If it fails (invalid regex), - // it will be treated as a plain text search - let searchRegex; - try { - searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive - } catch (error) { - searchRegex = null; - } - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - let isMatch = false; - - if (searchRegex) { - // If a valid regex was created, use it for matching - isMatch = searchRegex.test(row.textContent); - } else { - // Otherwise, fall back to the original plain text search - isMatch = row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()); - } - - row.style.display = isMatch ? '' : 'none'; - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/mission9/coverage/src/app.ts.html b/mission9/coverage/src/app.ts.html deleted file mode 100644 index ebbdc13c5..000000000 --- a/mission9/coverage/src/app.ts.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - Code coverage report for src/app.ts - - - - - - - - - -
-
-

All files / src app.ts

-
- -
- 100% - Statements - 26/26 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 26/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -325x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -  -5x -  -5x -5x -5x -5x -  -5x -5x -5x -5x -5x -5x -  -5x -5x -  -5x - 
import express from 'express';
-import cors from 'cors';
-import path from 'path';
-import { PUBLIC_PATH, STATIC_PATH } from './lib/constants';
-import articlesRouter from './routers/articlesRouter';
-import productsRouter from './routers/productsRouter';
-import commentsRouter from './routers/commentsRouter';
-import imagesRouter from './routers/imagesRouter';
-import usersRouter from './routers/usersRouter';
-import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController';
-import cookieParser from 'cookie-parser';
-import notificationRouter from './routers/notificationRouter';
- 
-const app = express();
- 
-app.use(cors());
-app.use(cookieParser());
-app.use(express.json());
-app.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH)));
- 
-app.use('/articles', articlesRouter);
-app.use('/products', productsRouter);
-app.use('/comments', commentsRouter);
-app.use('/images', imagesRouter);
-app.use('/users', usersRouter);
-app.use('/notifications', notificationRouter);
- 
-app.use(defaultNotFoundHandler);
-app.use(globalErrorHandler);
- 
-export default app;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/controllers/articlesController.ts.html b/mission9/coverage/src/controllers/articlesController.ts.html deleted file mode 100644 index ee8c380d1..000000000 --- a/mission9/coverage/src/controllers/articlesController.ts.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - Code coverage report for src/controllers/articlesController.ts - - - - - - - - - -
-
-

All files / src/controllers articlesController.ts

-
- -
- 90.76% - Statements - 59/65 -
- - -
- 60% - Branches - 12/20 -
- - -
- 100% - Functions - 9/9 -
- - -
- 90.76% - Lines - 59/65 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -985x -5x -5x -5x -  -  -  -  -5x -  -5x -  -  -5x -1x -1x -1x -  -  -1x -1x -  -  -5x -2x -2x -2x -1x -  -  -5x -2x -2x -2x -2x -  -  -2x -1x -  -  -5x -2x -2x -2x -  -  -2x -1x -  -  -  -5x -8x -6x -6x -6x -  -  -5x -1x -1x -1x -1x -  -  -1x -1x -  -  -5x -2x -2x -2x -2x -  -  -5x -1x -1x -1x -  -  -1x -1x -  -  -  -5x -1x -1x -1x -  -  -1x -1x -  - 
import { create } from 'superstruct';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { IdParamsStruct } from '../structs/commonStructs';
-import {
-  CreateArticleBodyStruct,
-  UpdateArticleBodyStruct,
-  GetArticleListParamsStruct,
-} from '../structs/articlesStructs';
-import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
-import { Request, Response } from 'express';
-import { articleService } from '../services/articleService';
- 
-//게시물 생성
-export async function createArticle(req: Request, res: Response) {
-  const { title, content, image } = create(req.body, CreateArticleBodyStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const article = await articleService.createArticle(user.id, title, content, image);
-  return res.status(201).send(article);
-}
-// 게시글 조회(좋아요 포함)
-export async function getArticle(req: Request, res: Response) {
-  const { id } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  const article = await articleService.getArticle(id, user?.id);
-  return res.send(article);
-}
-//게시물 수정
-export async function updateArticle(req: Request, res: Response) {
-  const { id } = create(req.params, IdParamsStruct);
-  const data = create(req.body, UpdateArticleBodyStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const updated = await articleService.updateArticle(id, user.id, data);
-  return res.send(updated);
-}
-//게시물 삭제
-export async function deleteArticle(req: Request, res: Response) {
-  const { id } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  await articleService.deleteArticle(id, user.id);
-  return res.status(204).send();
-}
- 
-//게시글 목록 조회(좋아요 포함)
-export async function getArticleList(req: Request, res: Response) {
-  const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct);
-  const user = req.user;
-  const articles = await articleService.getArticleList(page, pageSize, orderBy, keyword, user?.id);
-  return res.send(articles);
-}
-//댓글 등록
-export async function createComment(req: Request, res: Response) {
-  const { id: articleId } = create(req.params, IdParamsStruct);
-  const { content } = create(req.body, CreateCommentBodyStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const comment = await articleService.createComment(user.id, articleId, content);
-  return res.status(201).send(comment);
-}
-//댓글 목록 조회
-export async function getCommentList(req: Request, res: Response) {
-  const { id: articleId } = create(req.params, IdParamsStruct);
-  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
-  const commnetsList = await articleService.getCommentList(articleId, limit, cursor);
-  return res.send(commnetsList);
-}
-//게시글 좋아요 등록
-export async function likeArticle(req: Request, res: Response) {
-  const { id: articleId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const articleLike = await articleService.likeArticle(user.id, articleId);
-  return res.status(200).send(articleLike);
-}
- 
-//게시글 좋아요 취소
-export async function unlikeArticle(req: Request, res: Response) {
-  const { id: articleId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const articleUnlike = await articleService.unlikeArticle(user.id, articleId);
-  return res.status(200).send(articleUnlike);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/controllers/commentsController.ts.html b/mission9/coverage/src/controllers/commentsController.ts.html deleted file mode 100644 index 9ef895178..000000000 --- a/mission9/coverage/src/controllers/commentsController.ts.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - Code coverage report for src/controllers/commentsController.ts - - - - - - - - - -
-
-

All files / src/controllers commentsController.ts

-
- -
- 35% - Statements - 7/20 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/2 -
- - -
- 35% - Lines - 7/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -305x -5x -5x -5x -  -5x -  -  -5x -  -  -  -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  - 
import { create } from 'superstruct';
-import { UpdateCommentBodyStruct } from '../structs/commentsStruct';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { IdParamsStruct } from '../structs/commonStructs';
-import { Request, Response } from 'express';
-import { commnetService } from '../services/commentService';
- 
-//댓글 수정
-export async function updateComment(req: Request, res: Response) {
-  const { id: commentId } = create(req.params, IdParamsStruct);
-  const { content } = create(req.body, UpdateCommentBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const updatedComment = await commnetService.updateComment(commentId, user.id, content);
-  return res.send(updatedComment);
-}
- 
-//댓글 삭제
-export async function deleteComment(req: Request, res: Response) {
-  const { id: commentId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  await commnetService.deleteComment(commentId, user.id);
-  return res.status(204).send();
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/controllers/errorController.ts.html b/mission9/coverage/src/controllers/errorController.ts.html deleted file mode 100644 index 86af6b171..000000000 --- a/mission9/coverage/src/controllers/errorController.ts.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Code coverage report for src/controllers/errorController.ts - - - - - - - - - -
-
-

All files / src/controllers errorController.ts

-
- -
- 24% - Statements - 6/25 -
- - -
- 0% - Branches - 0/18 -
- - -
- 0% - Functions - 0/2 -
- - -
- 24% - Lines - 6/25 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -471x -1x -  -  -  -  -  -1x -  -1x -  -  -1x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { StructError } from 'superstruct';
-import {
-  NotFoundError,
-  BadRequestError,
-  ForbiddenError,
-  UnauthorizedError,
-} from '../lib/errors/customErrors';
-import { Prisma } from '@prisma/client';
-import { Request, Response, NextFunction } from 'express';
-import { isSyntaxJsonError } from '../lib/errors/errorUtils';
- 
-//404 처리 미들웨어
-export function defaultNotFoundHandler(req: Request, res: Response, next: NextFunction) {
-  return res.status(404).send({ message: '존재하지 않습니다' });
-}
-//전역 에러 처리 미들웨어(400,401,403,404,500)
-export function globalErrorHandler(err: unknown, req: Request, res: Response, next: NextFunction) {
-  if (err instanceof StructError || err instanceof BadRequestError) {
-    return res.status(400).send({ message: '잘못된 요청입니다' });
-  }
-  if (isSyntaxJsonError(err)) {
-    return res.status(400).send({ message: '잘못된 요청입니다' });
-  }
-  if (err instanceof UnauthorizedError) {
-    return res.status(401).json({ message: err.message });
-  }
-  if (err instanceof ForbiddenError) {
-    return res.status(403).json({ message: err.message });
-  }
-  if (err instanceof NotFoundError) {
-    return res.status(404).send({ message: err.message });
-  }
-  //프리즈마 코드 에러, 그 외 known 에러 500처리
-  if (err instanceof Prisma.PrismaClientKnownRequestError) {
-    if (err.code === 'P2025') {
-      return res.status(404).json({ message: '존재하지 않습니다' });
-    }
-    if (err.code === 'P2002') {
-      return res.status(400).json({ message: '잘못된 요청입니다' });
-    }
-    return res.status(500).json({ message: '데이터 처리 중 오류가 발생했습니다' });
-  }
- 
-  console.error(err);
-  return res.status(500).send({ message: '데이터 처리 중 오류가 발생했습니다' });
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/controllers/imagesController.ts.html b/mission9/coverage/src/controllers/imagesController.ts.html deleted file mode 100644 index 9de297b28..000000000 --- a/mission9/coverage/src/controllers/imagesController.ts.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - Code coverage report for src/controllers/imagesController.ts - - - - - - - - - -
-
-

All files / src/controllers imagesController.ts

-
- -
- 50% - Statements - 10/20 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/4 -
- - -
- 50% - Lines - 10/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -431x -1x -1x -1x -1x -  -1x -  -1x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  - 
import multer from 'multer';
-import path from 'path';
-import { v4 as uuidv4 } from 'uuid';
-import { PUBLIC_PATH } from '../lib/constants';
-import { BadRequestError } from '../lib/errors/customErrors';
-import { Request, Response } from 'express';
-import { imageService } from '../services/imageService';
- 
-const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];
-const FILE_SIZE_LIMIT = 5 * 1024 * 1024;
- 
-//이미지 업로드 설정
-export const upload = multer({
-  storage: multer.diskStorage({
-    destination(req, file, cb) {
-      cb(null, PUBLIC_PATH);
-    },
-    filename(req, file, cb) {
-      const ext = path.extname(file.originalname);
-      const filename = `${uuidv4()}${ext}`;
-      cb(null, filename);
-    },
-  }),
- 
-  limits: {
-    fileSize: FILE_SIZE_LIMIT,
-  },
- 
-  fileFilter: function (req, file, cb) {
-    if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) {
-      const err = new BadRequestError('Only png, jpeg, and jpg are allowed');
-      return cb(err);
-    }
- 
-    cb(null, true);
-  },
-});
-//이미지 업로드 핸들러
-export async function uploadImage(req: Request, res: Response) {
-  const response = imageService.buildImageUrl(req);
-  return res.send(response);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/controllers/index.html b/mission9/coverage/src/controllers/index.html deleted file mode 100644 index 68a331014..000000000 --- a/mission9/coverage/src/controllers/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/controllers - - - - - - - - - -
-
-

All files src/controllers

-
- -
- 70.68% - Statements - 164/232 -
- - -
- 41.93% - Branches - 26/62 -
- - -
- 68.75% - Functions - 22/32 -
- - -
- 70.68% - Lines - 164/232 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articlesController.ts -
-
90.76%59/6560%12/20100%9/990.76%59/65
commentsController.ts -
-
35%7/200%0/40%0/235%7/20
notificationController.ts -
-
30.43%7/230%0/60%0/330.43%7/23
productsController.ts -
-
90.76%59/6560%12/20100%9/990.76%59/65
usersController.ts -
-
54.23%32/5916.66%2/1244.44%4/954.23%32/59
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/controllers/notificationController.ts.html b/mission9/coverage/src/controllers/notificationController.ts.html deleted file mode 100644 index 3432fbb90..000000000 --- a/mission9/coverage/src/controllers/notificationController.ts.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - Code coverage report for src/controllers/notificationController.ts - - - - - - - - - -
-
-

All files / src/controllers notificationController.ts

-
- -
- 30.43% - Statements - 7/23 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/3 -
- - -
- 30.43% - Lines - 7/23 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34  -5x -5x -5x -5x -  -5x -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  - 
import { Request, Response } from 'express';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { notificationService } from '../services/notificationService';
-import { IdParamsStruct } from '../structs/commonStructs';
-import { create } from 'superstruct';
- 
-export async function getNotifications(req: Request, res: Response) {
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const notifications = await notificationService.getNotifications(user.id);
-  return res.send(notifications);
-}
- 
-export async function getUnreadCount(req: Request, res: Response) {
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const count = await notificationService.getUnreadCount(user.id);
-  return res.send({ count });
-}
- 
-export async function markAsRead(req: Request, res: Response) {
-  const { id: notificationId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const notification = await notificationService.markAsRead(notificationId, user.id);
-  return res.send(notification);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/controllers/productsController.ts.html b/mission9/coverage/src/controllers/productsController.ts.html deleted file mode 100644 index 11058dda7..000000000 --- a/mission9/coverage/src/controllers/productsController.ts.html +++ /dev/null @@ -1,394 +0,0 @@ - - - - - - Code coverage report for src/controllers/productsController.ts - - - - - - - - - -
-
-

All files / src/controllers productsController.ts

-
- -
- 90.76% - Statements - 59/65 -
- - -
- 60% - Branches - 12/20 -
- - -
- 100% - Functions - 9/9 -
- - -
- 90.76% - Lines - 59/65 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -1045x -5x -5x -  -  -  -  -5x -5x -  -5x -  -  -5x -1x -1x -1x -  -  -1x -  -  -  -  -  -  -  -1x -  -  -5x -2x -2x -2x -1x -  -  -5x -2x -2x -2x -2x -  -  -2x -1x -  -  -5x -2x -2x -2x -  -  -2x -1x -  -  -5x -12x -10x -10x -10x -  -  -  -5x -1x -1x -1x -1x -  -  -1x -1x -  -  -5x -2x -2x -2x -2x -  -  -5x -2x -2x -2x -  -  -2x -2x -  -  -5x -1x -1x -1x -  -  -1x -1x -  - 
import { create } from 'superstruct';
-import { IdParamsStruct } from '../structs/commonStructs';
-import {
-  CreateProductBodyStruct,
-  GetProductListParamsStruct,
-  UpdateProductBodyStruct,
-} from '../structs/productsStruct';
-import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { Request, Response } from 'express';
-import { productService } from '../services/productService';
- 
-//상품 등록
-export async function createProduct(req: Request, res: Response) {
-  const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const product = await productService.createProduct({
-    name,
-    description,
-    price,
-    tags,
-    images,
-    userId: user.id,
-  });
-  return res.status(201).send(product);
-}
-//특정 상품 조회(좋아요 포함)
-export async function getProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  const product = await productService.getProduct(productId, user?.id);
-  return res.send(product);
-}
-//상품 수정
-export async function updateProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const data = create(req.body, UpdateProductBodyStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const updatedProduct = await productService.updateProduct(productId, user.id, data);
-  return res.send(updatedProduct);
-}
-//상품 삭제
-export async function deleteProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  await productService.deleteProduct(productId, user.id);
-  return res.status(204).send();
-}
-//상품 목록 조회(좋아요 포함)
-export async function getProductList(req: Request, res: Response) {
-  const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct);
-  const user = req.user;
-  const products = await productService.getProductList(page, pageSize, orderBy, keyword, user?.id);
-  return res.send(products);
-}
- 
-//댓글 등록
-export async function createComment(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const { content } = create(req.body, CreateCommentBodyStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const comment = await productService.createComment(user.id, productId, content);
-  return res.status(201).send(comment);
-}
-//상품 댓글 목록 조회
-export async function getCommentList(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
-  const commentList = await productService.getCommentList(productId, limit, cursor);
-  return res.send(commentList);
-}
-//상품 좋아요 등록
-export async function likeProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const productLike = await productService.likeProduct(user.id, productId);
-  return res.status(200).send(productLike);
-}
-//상품 좋아요 취소
-export async function unlikeProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const productUnliked = await productService.unlikeProduct(user.id, productId);
-  return res.send(productUnliked);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/controllers/usersController.ts.html b/mission9/coverage/src/controllers/usersController.ts.html deleted file mode 100644 index 543581ad1..000000000 --- a/mission9/coverage/src/controllers/usersController.ts.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - Code coverage report for src/controllers/usersController.ts - - - - - - - - - -
-
-

All files / src/controllers usersController.ts

-
- -
- 54.23% - Statements - 32/59 -
- - -
- 16.66% - Branches - 2/12 -
- - -
- 44.44% - Functions - 4/9 -
- - -
- 54.23% - Lines - 32/59 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -935x -  -  -  -  -  -  -  -5x -5x -5x -  -5x -5x -  -  -5x -22x -21x -20x -  -  -5x -18x -18x -17x -17x -  -  -5x -  -  -  -  -5x -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  -  -5x -1x -1x -1x -  -  -1x -1x -  -  -5x -  -  -  -  -  -  -  -  -  -5x -1x -1x -1x -  -  -1x -1x -  - 
import {
-  CreateUserBodyStruct,
-  UpdateUserBodyStruct,
-  LoginBodyStruct,
-  ChangePasswordBodyStruct,
-  GetMyProductListParamsStruct,
-  GetMyLikedProductListParamsStruct,
-} from '../structs/usersStructs';
-import { create } from 'superstruct';
-import { clearTokenCookies, setTokenCookies } from '../lib/cookies';
-import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants';
-import { Request, Response } from 'express';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { userService } from '../services/userService';
- 
-//회원가입
-export async function register(req: Request, res: Response) {
-  const { nickname, email, password, image } = create(req.body, CreateUserBodyStruct);
-  const user = await userService.register(nickname, email, password, image);
-  return res.status(201).send(user);
-}
-//로그인
-export async function login(req: Request, res: Response) {
-  const { email, password } = create(req.body, LoginBodyStruct);
-  const result = await userService.login(email, password);
-  setTokenCookies(res, result.tokens.accessToken, result.tokens.refreshToken);
-  return res.status(200).send({ message: result.message });
-}
-//로그아웃
-export async function logout(req: Request, res: Response) {
-  clearTokenCookies(res);
-  return res.status(200).send({ message: '로그아웃에 성공했습니다.' });
-}
-//내 프로필 조회 (최근 등록한 상품 5개, 최근 좋아요한 상품 5개 포함)
-export async function getProfile(req: Request, res: Response) {
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const profile = await userService.getProfile(user.id);
-  return res.send(profile);
-}
-//내 프로필 수정
-export async function updateProfile(req: Request, res: Response) {
-  const { nickname, email, image } = create(req.body, UpdateUserBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const update = await userService.updateProfile(user.id, nickname, email, image);
-  return res.send(update);
-}
-//내 비밀번호 변경
-export async function patchPassword(req: Request, res: Response) {
-  const { currentPassword, newPassword } = create(req.body, ChangePasswordBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  await userService.patchPassword(user.id, currentPassword, newPassword);
-  return res.status(200).send({ message: '비밀번호가 성공적으로 변경되었습니다.' });
-}
-//내가 등록한 상품 목록 조회 (상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능)
-export async function getMyProductList(req: Request, res: Response) {
-  const { page, pageSize, orderBy, keyword } = create(req.query, GetMyProductListParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const myProducts = await userService.getMyProductList(user.id, page, pageSize, orderBy, keyword);
-  return res.send(myProducts);
-}
-//토큰 갱신(리프레시)
-export async function refreshToken(req: Request, res: Response) {
-  const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME];
-  if (!refreshToken) {
-    throw new UnauthorizedError('리프레시 토큰이 없습니다.');
-  }
-  const tokens = await userService.refreshToken(refreshToken);
-  setTokenCookies(res, tokens.accessToken, tokens.refreshToken);
-  return res.status(200).send({ message: '토큰이 성공적으로 갱신되었습니다.' });
-}
-//내가 좋아요한 상품 목록 조회(상품이 꽤 많이 있을 경우 페이징 처리)
-export async function getMyLikedProducts(req: Request, res: Response) {
-  const { page, pageSize, orderBy } = create(req.query, GetMyLikedProductListParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const myLikedProducts = await userService.getMyLikedProducts(user.id, page, pageSize, orderBy);
-  return res.send(myLikedProducts);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/index.html b/mission9/coverage/src/index.html deleted file mode 100644 index e19a66f1f..000000000 --- a/mission9/coverage/src/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src - - - - - - - - - -
-
-

All files src

-
- -
- 100% - Statements - 26/26 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 26/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
app.ts -
-
100%26/26100%0/0100%0/0100%26/26
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/lib/constants.ts.html b/mission9/coverage/src/lib/constants.ts.html deleted file mode 100644 index e54059ce3..000000000 --- a/mission9/coverage/src/lib/constants.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for src/lib/constants.ts - - - - - - - - - -
-
-

All files / src/lib constants.ts

-
- -
- 100% - Statements - 20/20 -
- - -
- 50% - Branches - 4/8 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 20/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -271x -1x -  -1x -1x -1x -1x -1x -  -1x -  -1x -1x -1x -  -  -1x -1x -1x -1x -1x -1x -1x -1x -1x -  - 
import dotenv from 'dotenv';
-dotenv.config();
- 
-const DATABASE_URL = process.env.DATABASE_URL;
-const NODE_ENV = process.env.NODE_ENV || 'development';
-const PORT = process.env.PORT || 3000;
-const PUBLIC_PATH = 'public';
-const STATIC_PATH = '/public';
-const JWT_ACCESS_TOKEN_SECRET =
-  process.env.JWT_ACCESS_TOKEN_SECRET || 'your_jwt_access_token_secret';
-const JWT_REFRESH_TOKEN_SECRET =
-  process.env.JWT_REFRESH_TOKEN_SECRET || 'your_jwt_refresh_token_secret';
-const ACCESS_TOKEN_COOKIE_NAME = 'access-token';
-const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token';
- 
-export {
-  DATABASE_URL,
-  NODE_ENV,
-  PORT,
-  PUBLIC_PATH,
-  STATIC_PATH,
-  JWT_ACCESS_TOKEN_SECRET,
-  JWT_REFRESH_TOKEN_SECRET,
-  ACCESS_TOKEN_COOKIE_NAME,
-  REFRESH_TOKEN_COOKIE_NAME,
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/lib/cookies.ts.html b/mission9/coverage/src/lib/cookies.ts.html deleted file mode 100644 index b4382c51e..000000000 --- a/mission9/coverage/src/lib/cookies.ts.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - Code coverage report for src/lib/cookies.ts - - - - - - - - - -
-
-

All files / src/lib cookies.ts

-
- -
- 42.85% - Statements - 3/7 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 42.85% - Lines - 3/7 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -291x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  - 
import { NODE_ENV, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from './constants';
-import { Response } from 'express';
- 
-export function setTokenCookies(res: Response, accessToken: string, refreshToken: string) {
-  res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-    maxAge: 1 * 60 * 60 * 1000, // 1시간
-  });
-  res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-    maxAge: 7 * 24 * 60 * 60 * 1000, // 7일
-    path: '/users/refresh',
-  });
-}
- 
-export function clearTokenCookies(res: Response) {
-  res.clearCookie(ACCESS_TOKEN_COOKIE_NAME, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-  });
-  res.clearCookie(REFRESH_TOKEN_COOKIE_NAME, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-    path: '/users/refresh',
-  });
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/lib/errors/customErrors.ts.html b/mission9/coverage/src/lib/errors/customErrors.ts.html deleted file mode 100644 index 7992d9e0a..000000000 --- a/mission9/coverage/src/lib/errors/customErrors.ts.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Code coverage report for src/lib/errors/customErrors.ts - - - - - - - - - -
-
-

All files / src/lib/errors customErrors.ts

-
- -
- 38.88% - Statements - 7/18 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/7 -
- - -
- 38.88% - Lines - 7/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -471x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  - 
export class BaseError extends Error {
-  statusCode: number;
-  constructor(message: string, statusCode: number) {
-    super(message);
-    this.name = new.target.name;
-    this.statusCode = statusCode;
-  }
-}
- 
-export class NotFoundError extends BaseError {
-  constructor(message = '존재하지 않습니다') {
-    super(message, 404);
-  }
-}
- 
-export class UnauthorizedError extends BaseError {
-  constructor(message = '인증이 필요합니다') {
-    super(message, 401);
-  }
-}
- 
-export class BadRequestError extends BaseError {
-  constructor(message = '잘못된 요청입니다') {
-    super(message, 400);
-  }
-}
- 
-export class ForbiddenError extends BaseError {
-  constructor(message = '비밀번호가 틀렸습니다') {
-    super(message, 403);
-  }
-}
- 
-export class AlreadyLikeError extends ForbiddenError {
-  constructor(message = '이미 좋아요를 눌렀습니다.') {
-    super(message);
-    this.name = new.target.name;
-  }
-}
- 
-export class AlreadyUnlikeError extends ForbiddenError {
-  constructor(message = '좋아요가 존재하지 않습니다.') {
-    super(message);
-    this.name = new.target.name;
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/lib/errors/errorUtils.ts.html b/mission9/coverage/src/lib/errors/errorUtils.ts.html deleted file mode 100644 index 27ac22c0a..000000000 --- a/mission9/coverage/src/lib/errors/errorUtils.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/lib/errors/errorUtils.ts - - - - - - - - - -
-
-

All files / src/lib/errors errorUtils.ts

-
- -
- 20% - Statements - 1/5 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 25% - Lines - 1/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -  -  -  -1x -  -  -  -  -  -  -  - 
interface SyntaxJsonError extends SyntaxError {
-  status?: number;
-  body?: unknown;
-}
- 
-export function isSyntaxJsonError(err: unknown): err is SyntaxJsonError {
-  if (!(err instanceof SyntaxError)) return false;
-  const e = err as Partial<SyntaxJsonError>;
-  return typeof e.status === 'number' && 'body' in e;
-}
-// Partial<SyntaxJsonError>;
-// 얘는 SyntaxJsonError의 일부 프로퍼티만 가지고 있을 수도 있어”
-// 라고 TS에게 알려서 e.status, e.body 같은 속성 접근을 가능하게 해주는 장치
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/lib/errors/index.html b/mission9/coverage/src/lib/errors/index.html deleted file mode 100644 index 2bab3a8f0..000000000 --- a/mission9/coverage/src/lib/errors/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/lib/errors - - - - - - - - - -
-
-

All files src/lib/errors

-
- -
- 34.78% - Statements - 8/23 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/8 -
- - -
- 36.36% - Lines - 8/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
customErrors.ts -
-
38.88%7/180%0/60%0/738.88%7/18
errorUtils.ts -
-
20%1/50%0/40%0/125%1/4
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/lib/index.html b/mission9/coverage/src/lib/index.html deleted file mode 100644 index 1cd991112..000000000 --- a/mission9/coverage/src/lib/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/lib - - - - - - - - - -
-
-

All files src/lib

-
- -
- 74.46% - Statements - 35/47 -
- - -
- 50% - Branches - 4/8 -
- - -
- 37.5% - Functions - 3/8 -
- - -
- 73.91% - Lines - 34/46 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
constants.ts -
-
100%20/2050%4/8100%0/0100%20/20
cookies.ts -
-
42.85%3/7100%0/00%0/242.85%3/7
prismaClient.ts -
-
100%2/2100%0/0100%0/0100%2/2
token.ts -
-
41.66%5/12100%0/00%0/341.66%5/12
withAsync.ts -
-
83.33%5/6100%0/0100%3/380%4/5
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/lib/prismaClient.ts.html b/mission9/coverage/src/lib/prismaClient.ts.html deleted file mode 100644 index 2b46ffc58..000000000 --- a/mission9/coverage/src/lib/prismaClient.ts.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - Code coverage report for src/lib/prismaClient.ts - - - - - - - - - -
-
-

All files / src/lib prismaClient.ts

-
- -
- 100% - Statements - 2/2 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 2/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -41x -  -1x - 
import { PrismaClient } from '@prisma/client';
- 
-export const prisma = new PrismaClient();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/lib/token.ts.html b/mission9/coverage/src/lib/token.ts.html deleted file mode 100644 index 7f237a0d4..000000000 --- a/mission9/coverage/src/lib/token.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/lib/token.ts - - - - - - - - - -
-
-

All files / src/lib token.ts

-
- -
- 41.66% - Statements - 5/12 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/3 -
- - -
- 41.66% - Lines - 5/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -231x -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -1x -  -  -  - 
import jwt, { JwtPayload } from 'jsonwebtoken';
-import { JWT_ACCESS_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET } from './constants';
- 
-interface TokenPayload extends JwtPayload {
-  id: number;
-}
- 
-export function generateToken(userId: number) {
-  const accessToken = jwt.sign({ id: userId }, JWT_ACCESS_TOKEN_SECRET, { expiresIn: '1h' });
-  const refreshToken = jwt.sign({ id: userId }, JWT_REFRESH_TOKEN_SECRET, { expiresIn: '1d' });
-  return { accessToken, refreshToken };
-}
- 
-export function verifyAccessToken(token: string) {
-  const decoded = jwt.verify(token, JWT_ACCESS_TOKEN_SECRET) as TokenPayload;
-  return { userId: decoded.id };
-}
- 
-export function verifyRefreshToken(token: string) {
-  const decoded = jwt.verify(token, JWT_REFRESH_TOKEN_SECRET) as TokenPayload;
-  return { userId: decoded.id };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/lib/withAsync.ts.html b/mission9/coverage/src/lib/withAsync.ts.html deleted file mode 100644 index 809cf0593..000000000 --- a/mission9/coverage/src/lib/withAsync.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/lib/withAsync.ts - - - - - - - - - -
-
-

All files / src/lib withAsync.ts

-
- -
- 83.33% - Statements - 5/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 3/3 -
- - -
- 80% - Lines - 4/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -1x -  -  -33x -2x -2x -  -  -  -  -  - 
import type { Request, Response, NextFunction, RequestHandler } from 'express';
- 
-export function withAsync<T = unknown>(
-  handler: (req: Request, res: Response, next: NextFunction) => Promise<T>,
-): RequestHandler {
-  return async (req, res, next) => {
-    try {
-      await handler(req, res, next);
-    } catch (e) {
-      next(e);
-    }
-  };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/middlewares/authenticate.ts.html b/mission9/coverage/src/middlewares/authenticate.ts.html deleted file mode 100644 index 357387e1e..000000000 --- a/mission9/coverage/src/middlewares/authenticate.ts.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - Code coverage report for src/middlewares/authenticate.ts - - - - - - - - - -
-
-

All files / src/middlewares authenticate.ts

-
- -
- 55% - Statements - 11/20 -
- - -
- 42.85% - Branches - 3/7 -
- - -
- 100% - Functions - 3/3 -
- - -
- 52.63% - Lines - 10/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -311x -1x -1x -1x -  -  -  -26x -2x -2x -2x -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { prisma } from '../lib/prismaClient';
-import { verifyAccessToken } from '../lib/token';
-import { ACCESS_TOKEN_COOKIE_NAME } from '../lib/constants';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { NextFunction, Request, Response } from 'express';
- 
-function authenticate(options = { optional: false }) {
-  return async (req: Request, res: Response, next: NextFunction) => {
-    const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME];
-    Eif (!accessToken) {
-      Eif (options.optional) {
-        return next();
-      }
-      return next(new UnauthorizedError());
-    }
-    try {
-      const { userId } = verifyAccessToken(accessToken); //디코딩 된 토큰에서 user id 추출
-      const user = await prisma.user.findUniqueOrThrow({ where: { id: userId } });
-      req.user = user;
-    } catch (error) {
-      if (options.optional) {
-        return next();
-      }
-      return next(new UnauthorizedError());
-    }
-    next();
-  };
-}
- 
-export default authenticate;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/middlewares/index.html b/mission9/coverage/src/middlewares/index.html deleted file mode 100644 index 3c8f540d7..000000000 --- a/mission9/coverage/src/middlewares/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/middlewares - - - - - - - - - -
-
-

All files src/middlewares

-
- -
- 55% - Statements - 11/20 -
- - -
- 42.85% - Branches - 3/7 -
- - -
- 100% - Functions - 3/3 -
- - -
- 52.63% - Lines - 10/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
authenticate.ts -
-
55%11/2042.85%3/7100%3/352.63%10/19
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/repositories/articleRepository.ts.html b/mission9/coverage/src/repositories/articleRepository.ts.html deleted file mode 100644 index f3d106be9..000000000 --- a/mission9/coverage/src/repositories/articleRepository.ts.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - Code coverage report for src/repositories/articleRepository.ts - - - - - - - - - -
-
-

All files / src/repositories articleRepository.ts

-
- -
- 100% - Statements - 10/10 -
- - -
- 75% - Branches - 6/8 -
- - -
- 100% - Functions - 7/7 -
- - -
- 100% - Lines - 10/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58  -5x -  -  -5x -  -1x -  -  -10x -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -6x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -6x -  -  -1x -  -  -1x -  -  -  -5x - 
import { Prisma } from '@prisma/client';
-import { prisma } from '../lib/prismaClient';
-import { ArticleLikesAndCount } from '../../types/article';
- 
-export class ArticleRepository {
-  async create(data: Prisma.ArticleCreateInput) {
-    return prisma.article.create({ data });
-  }
-  async findById(id: number) {
-    return prisma.article.findUniqueOrThrow({ where: { id } });
-  }
-  async findByIdWithLikes(id: number, userId?: number): Promise<ArticleLikesAndCount> {
-    return prisma.article.findUniqueOrThrow({
-      where: { id },
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          //비로그인 시 -1을 줘서 []을 뱉도록
-          where: { userId: userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async findArticleListWithLikes(params: {
-    skip: number;
-    take: number;
-    orderBy: Prisma.ArticleOrderByWithRelationInput;
-    where: Prisma.ArticleWhereInput;
-    userId?: number;
-  }): Promise<ArticleLikesAndCount[]> {
-    return prisma.article.findMany({
-      skip: params.skip,
-      take: params.take,
-      orderBy: params.orderBy,
-      where: params.where,
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          where: { userId: params.userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async count(where: Prisma.ArticleWhereInput) {
-    return prisma.article.count({ where });
-  }
-  async update(id: number, data: Prisma.ArticleUpdateInput) {
-    return prisma.article.update({ where: { id }, data });
-  }
-  async delete(id: number) {
-    return prisma.article.delete({ where: { id } });
-  }
-}
- 
-export const articleRepo = new ArticleRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/repositories/commentRepository.ts.html b/mission9/coverage/src/repositories/commentRepository.ts.html deleted file mode 100644 index 7b20732b8..000000000 --- a/mission9/coverage/src/repositories/commentRepository.ts.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - Code coverage report for src/repositories/commentRepository.ts - - - - - - - - - -
-
-

All files / src/repositories commentRepository.ts

-
- -
- 62.5% - Statements - 5/8 -
- - -
- 50% - Branches - 1/2 -
- - -
- 40% - Functions - 2/5 -
- - -
- 62.5% - Lines - 5/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32  -5x -  -5x -  -2x -  -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x - 
import { Prisma } from '@prisma/client';
-import { prisma } from '../lib/prismaClient';
- 
-export class CommentRepository {
-  async create(data: Prisma.CommentCreateInput) {
-    return prisma.comment.create({ data });
-  }
-  async findCommentListQuery(
-    whereCondition: { articleId: number } | { productId: number },
-    limit: number,
-    cursor?: number,
-  ) {
-    return prisma.comment.findMany({
-      cursor: cursor ? { id: cursor } : undefined,
-      take: limit + 1,
-      where: whereCondition,
-      orderBy: { createdAt: 'desc' },
-    });
-  }
-  async findById(id: number) {
-    return prisma.comment.findUniqueOrThrow({ where: { id } });
-  }
-  async update(id: number, content?: string) {
-    return prisma.comment.update({ where: { id }, data: { content } });
-  }
-  async delete(id: number) {
-    return prisma.comment.delete({ where: { id } });
-  }
-}
- 
-export const commentRepo = new CommentRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/repositories/index.html b/mission9/coverage/src/repositories/index.html deleted file mode 100644 index 582634d54..000000000 --- a/mission9/coverage/src/repositories/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - Code coverage report for src/repositories - - - - - - - - - -
-
-

All files src/repositories

-
- -
- 73.07% - Statements - 38/52 -
- - -
- 69.23% - Branches - 18/26 -
- - -
- 63.63% - Functions - 21/33 -
- - -
- 73.07% - Lines - 38/52 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articleRepository.ts -
-
100%10/1075%6/8100%7/7100%10/10
commentRepository.ts -
-
62.5%5/850%1/240%2/562.5%5/8
likeRepository.ts -
-
77.77%7/966.66%4/675%3/477.77%7/9
notificationRepository.ts -
-
37.5%3/8100%0/00%0/537.5%3/8
productRepository.ts -
-
81.81%9/1170%7/1087.5%7/881.81%9/11
userRepository.ts -
-
66.66%4/6100%0/050%2/466.66%4/6
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/repositories/likeRepository.ts.html b/mission9/coverage/src/repositories/likeRepository.ts.html deleted file mode 100644 index 72f19bc21..000000000 --- a/mission9/coverage/src/repositories/likeRepository.ts.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - Code coverage report for src/repositories/likeRepository.ts - - - - - - - - - -
-
-

All files / src/repositories likeRepository.ts

-
- -
- 77.77% - Statements - 7/9 -
- - -
- 66.66% - Branches - 4/6 -
- - -
- 75% - Functions - 3/4 -
- - -
- 77.77% - Lines - 7/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37  -5x -  -  -  -  -3x -  -  -3x -  -  -  -  -3x -  -  -  -2x -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -5x - 
import { LikeTarget } from '../../types/like';
-import { prisma } from '../lib/prismaClient';
- 
-class LikdeRepository {
-  async findLike(userId: number, target: LikeTarget) {
-    const whereCondition =
-      'articleId' in target
-        ? { userId_articleId: { userId, articleId: target.articleId } }
-        : { userId_productId: { userId, productId: target.productId } };
-    return prisma.like.findUnique({
-      where: whereCondition,
-    });
-  }
-  async createLike(userId: number, target: LikeTarget) {
-    return prisma.like.create({ data: { userId, ...target } });
-  }
-  async deleteLike(userId: number, target: LikeTarget) {
-    const whereCondition =
-      'articleId' in target
-        ? { userId_articleId: { userId, articleId: target.articleId } }
-        : { userId_productId: { userId, productId: target.productId } };
-    return prisma.like.delete({
-      where: whereCondition,
-    });
-  }
-  async getLikers(target: LikeTarget) {
-    const whereCondition =
-      'articleId' in target ? { articleId: target.articleId } : { productId: target.productId };
-    return prisma.like.findMany({
-      where: whereCondition,
-      select: { userId: true },
-    });
-  }
-}
- 
-export const likeRepo = new LikdeRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/repositories/notificationRepository.ts.html b/mission9/coverage/src/repositories/notificationRepository.ts.html deleted file mode 100644 index 145a57f7c..000000000 --- a/mission9/coverage/src/repositories/notificationRepository.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for src/repositories/notificationRepository.ts - - - - - - - - - -
-
-

All files / src/repositories notificationRepository.ts

-
- -
- 37.5% - Statements - 3/8 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/5 -
- - -
- 37.5% - Lines - 3/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -275x -  -5x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x - 
import { prisma } from '../lib/prismaClient';
- 
-export class NotificationRepository {
-  async getNotification(userId: number) {
-    return prisma.notification.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } });
-  }
-  async getUnreadCount(userId: number) {
-    return prisma.notification.count({ where: { userId, isRead: false } });
-  }
-  async create(userId: number, message: string) {
-    return prisma.notification.create({ data: { userId, message } });
-  }
-  async findByIds(notificationId: number, userId: number) {
-    return prisma.notification.findFirst({
-      where: { id: notificationId, userId },
-    });
-  }
-  async updateRead(notificationId: number) {
-    return prisma.notification.update({
-      where: { id: notificationId },
-      data: { isRead: true },
-    });
-  }
-}
- 
-export const notificationRepo = new NotificationRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/repositories/productRepository.ts.html b/mission9/coverage/src/repositories/productRepository.ts.html deleted file mode 100644 index 9e6abc4a2..000000000 --- a/mission9/coverage/src/repositories/productRepository.ts.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - Code coverage report for src/repositories/productRepository.ts - - - - - - - - - -
-
-

All files / src/repositories productRepository.ts

-
- -
- 81.81% - Statements - 9/11 -
- - -
- 70% - Branches - 7/10 -
- - -
- 87.5% - Functions - 7/8 -
- - -
- 81.81% - Lines - 9/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66  -5x -  -  -  -  -  -1x -  -  -11x -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -1x -  -  -  -  -  -  -  -  -12x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -12x -  -  -  -  -  -  -  -  -  -  -  -5x - 
import { ProductLikesAndCount } from '../../types/product';
-import { prisma } from '../lib/prismaClient';
-import { Prisma } from '@prisma/client';
-import type { ProductRecentType } from '../../types/product';
- 
-class ProductRepository {
-  async create(data: Prisma.ProductCreateInput) {
-    return prisma.product.create({ data });
-  }
-  async findById(id: number) {
-    return prisma.product.findUniqueOrThrow({ where: { id } });
-  }
-  async findByIdWithLikes(id: number, userId?: number): Promise<ProductLikesAndCount> {
-    return prisma.product.findUniqueOrThrow({
-      where: { id },
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          where: { userId: userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async update(id: number, data: Prisma.ProductUpdateInput) {
-    return prisma.product.update({ where: { id }, data });
-  }
-  async delete(id: number) {
-    return prisma.product.delete({ where: { id } });
-  }
-  async findProductListWithLikes(params: {
-    skip: number;
-    take: number;
-    orderBy: Prisma.ProductOrderByWithRelationInput;
-    where: Prisma.ProductWhereInput;
-    userId?: number;
-  }): Promise<ProductLikesAndCount[]> {
-    return prisma.product.findMany({
-      skip: params.skip,
-      take: params.take,
-      orderBy: params.orderBy,
-      where: params.where,
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          where: { userId: params.userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async count(where: Prisma.ProductWhereInput) {
-    return prisma.product.count({ where });
-  }
-  async findRecentProduct(userId: number, limit: number, type: ProductRecentType) {
-    const whereCondition = type === 'myUploaded' ? { userId } : { likes: { some: { userId } } };
-    return prisma.product.findMany({
-      where: whereCondition,
-      orderBy: { createdAt: 'desc' },
-      take: limit,
-    });
-  }
-}
- 
-export const productRepo = new ProductRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/repositories/userRepository.ts.html b/mission9/coverage/src/repositories/userRepository.ts.html deleted file mode 100644 index 97525f6a6..000000000 --- a/mission9/coverage/src/repositories/userRepository.ts.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - Code coverage report for src/repositories/userRepository.ts - - - - - - - - - -
-
-

All files / src/repositories userRepository.ts

-
- -
- 66.66% - Statements - 4/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 50% - Functions - 2/4 -
- - -
- 66.66% - Lines - 4/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -205x -  -  -  -  -21x -  -  -18x -  -  -  -  -  -  -  -  -  -5x - 
import { prisma } from '../lib/prismaClient';
-import { Prisma } from '@prisma/client';
- 
-class UserRepository {
-  async create(data: Prisma.UserCreateInput) {
-    return prisma.user.create({ data });
-  }
-  async findByEmail(email: string) {
-    return prisma.user.findUnique({ where: { email } });
-  }
-  async update(id: number, data: Prisma.UserUpdateInput) {
-    return prisma.user.update({ where: { id }, data });
-  }
-  async findById(id: number) {
-    return prisma.user.findUnique({ where: { id } });
-  }
-}
- 
-export const userRepo = new UserRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/routers/articlesRouter.ts.html b/mission9/coverage/src/routers/articlesRouter.ts.html deleted file mode 100644 index 79e08a796..000000000 --- a/mission9/coverage/src/routers/articlesRouter.ts.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - Code coverage report for src/routers/articlesRouter.ts - - - - - - - - - -
-
-

All files / src/routers articlesRouter.ts

-
- -
- 100% - Statements - 15/15 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 15/15 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -295x -5x -5x -  -  -  -  -  -  -  -  -  -  -5x -  -5x -  -5x -5x -5x -5x -5x -5x -5x -5x -5x -  -5x - 
import express from 'express';
-import { withAsync } from '../lib/withAsync';
-import {
-  createArticle,
-  getArticleList,
-  getArticle,
-  updateArticle,
-  deleteArticle,
-  createComment,
-  getCommentList,
-  likeArticle,
-  unlikeArticle,
-} from '../controllers/articlesController';
-import authenticate from '../middlewares/authenticate';
- 
-const articlesRouter = express.Router();
- 
-articlesRouter.post('/', authenticate(), withAsync(createArticle));
-articlesRouter.get('/', authenticate({ optional: true }), withAsync(getArticleList));
-articlesRouter.get('/:id', authenticate({ optional: true }), withAsync(getArticle));
-articlesRouter.patch('/:id', authenticate(), withAsync(updateArticle));
-articlesRouter.delete('/:id', authenticate(), withAsync(deleteArticle));
-articlesRouter.post('/:id/comments', authenticate(), withAsync(createComment));
-articlesRouter.get('/:id/comments', withAsync(getCommentList));
-articlesRouter.post('/:id/like', authenticate(), withAsync(likeArticle));
-articlesRouter.delete('/:id/like', authenticate(), withAsync(unlikeArticle));
- 
-export default articlesRouter;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/routers/commentsRouter.ts.html b/mission9/coverage/src/routers/commentsRouter.ts.html deleted file mode 100644 index 8802d62a2..000000000 --- a/mission9/coverage/src/routers/commentsRouter.ts.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - Code coverage report for src/routers/commentsRouter.ts - - - - - - - - - -
-
-

All files / src/routers commentsRouter.ts

-
- -
- 100% - Statements - 8/8 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 8/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -125x -5x -5x -5x -  -5x -  -5x -5x -  -5x - 
import express from 'express';
-import { withAsync } from '../lib/withAsync';
-import { updateComment, deleteComment } from '../controllers/commentsController';
-import authenticate from '../middlewares/authenticate';
- 
-const commentsRouter = express.Router();
- 
-commentsRouter.patch('/:id', authenticate(), withAsync(updateComment));
-commentsRouter.delete('/:id', authenticate(), withAsync(deleteComment));
- 
-export default commentsRouter;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/routers/imagesRouter.ts.html b/mission9/coverage/src/routers/imagesRouter.ts.html deleted file mode 100644 index 8754a8533..000000000 --- a/mission9/coverage/src/routers/imagesRouter.ts.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - Code coverage report for src/routers/imagesRouter.ts - - - - - - - - - -
-
-

All files / src/routers imagesRouter.ts

-
- -
- 100% - Statements - 6/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 6/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -105x -5x -5x -  -5x -  -5x -  -5x - 
import express from 'express';
-import { withAsync } from '../lib/withAsync';
-import { upload, uploadImage } from '../controllers/imagesController';
- 
-const imagesRouter = express.Router();
- 
-imagesRouter.post('/upload', upload.single('image'), withAsync(uploadImage));
- 
-export default imagesRouter;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/routers/index.html b/mission9/coverage/src/routers/index.html deleted file mode 100644 index 547f536b5..000000000 --- a/mission9/coverage/src/routers/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - Code coverage report for src/routers - - - - - - - - - -
-
-

All files src/routers

-
- -
- 100% - Statements - 69/69 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 69/69 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articlesRouter.ts -
-
100%15/15100%0/0100%0/0100%15/15
commentsRouter.ts -
-
100%8/8100%0/0100%0/0100%8/8
imagesRouter.ts -
-
100%6/6100%0/0100%0/0100%6/6
notificationRouter.ts -
-
100%9/9100%0/0100%0/0100%9/9
productsRouter.ts -
-
100%18/18100%0/0100%0/0100%18/18
usersRouter.ts -
-
100%13/13100%0/0100%0/0100%13/13
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/routers/notificationRouter.ts.html b/mission9/coverage/src/routers/notificationRouter.ts.html deleted file mode 100644 index 1756ffb34..000000000 --- a/mission9/coverage/src/routers/notificationRouter.ts.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - Code coverage report for src/routers/notificationRouter.ts - - - - - - - - - -
-
-

All files / src/routers notificationRouter.ts

-
- -
- 100% - Statements - 9/9 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 9/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -175x -5x -5x -5x -  -  -  -  -  -5x -  -5x -5x -5x -  -5x - 
import express from 'express';
-import authenticate from '../middlewares/authenticate';
-import { withAsync } from '../lib/withAsync';
-import {
-  getNotifications,
-  getUnreadCount,
-  markAsRead,
-} from '../controllers/notificationController';
- 
-const notificationRouter = express.Router();
- 
-notificationRouter.get('/', authenticate(), withAsync(getNotifications));
-notificationRouter.get('/unread-count', authenticate(), withAsync(getUnreadCount));
-notificationRouter.patch('/:id/read', authenticate(), withAsync(markAsRead));
- 
-export default notificationRouter;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/routers/productsRouter.ts.html b/mission9/coverage/src/routers/productsRouter.ts.html deleted file mode 100644 index 9236e4c1a..000000000 --- a/mission9/coverage/src/routers/productsRouter.ts.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - Code coverage report for src/routers/productsRouter.ts - - - - - - - - - -
-
-

All files / src/routers productsRouter.ts

-
- -
- 100% - Statements - 18/18 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 18/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -325x -5x -5x -  -  -  -  -  -  -  -  -  -  -5x -5x -  -5x -  -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -  -5x - 
import express from 'express';
-import { withAsync } from '../lib/withAsync';
-import {
-  createProduct,
-  getProduct,
-  updateProduct,
-  deleteProduct,
-  getProductList,
-  createComment,
-  getCommentList,
-  likeProduct,
-  unlikeProduct,
-} from '../controllers/productsController';
-import authenticate from '../middlewares/authenticate';
-import { getMyLikedProducts, getMyProductList } from '../controllers/usersController';
- 
-const productsRouter = express.Router();
- 
-productsRouter.get('/me', authenticate(), withAsync(getMyProductList));
-productsRouter.get('/me/likes', authenticate(), withAsync(getMyLikedProducts));
-productsRouter.get('/', authenticate({ optional: true }), withAsync(getProductList));
-productsRouter.post('/', authenticate(), withAsync(createProduct));
-productsRouter.get('/:id', authenticate({ optional: true }), withAsync(getProduct));
-productsRouter.patch('/:id', authenticate(), withAsync(updateProduct));
-productsRouter.delete('/:id', authenticate(), withAsync(deleteProduct));
-productsRouter.post('/:id/comments', authenticate(), withAsync(createComment));
-productsRouter.get('/:id/comments', withAsync(getCommentList));
-productsRouter.post('/:id/like', authenticate(), withAsync(likeProduct));
-productsRouter.delete('/:id/like', authenticate(), withAsync(unlikeProduct));
- 
-export default productsRouter;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/routers/usersRouter.ts.html b/mission9/coverage/src/routers/usersRouter.ts.html deleted file mode 100644 index 3f6d130f9..000000000 --- a/mission9/coverage/src/routers/usersRouter.ts.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Code coverage report for src/routers/usersRouter.ts - - - - - - - - - -
-
-

All files / src/routers usersRouter.ts

-
- -
- 100% - Statements - 13/13 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 13/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -255x -5x -5x -  -  -  -  -  -  -  -  -5x -  -5x -  -5x -5x -5x -5x -5x -5x -5x -  -5x - 
import express from 'express';
-import { withAsync } from '../lib/withAsync';
-import {
-  register,
-  login,
-  logout,
-  getProfile,
-  patchPassword,
-  updateProfile,
-  refreshToken,
-} from '../controllers/usersController';
-import authenticate from '../middlewares/authenticate';
- 
-const usersRouter = express.Router();
- 
-usersRouter.post('/register', withAsync(register));
-usersRouter.post('/login', withAsync(login));
-usersRouter.post('/logout', withAsync(logout));
-usersRouter.post('/refresh', withAsync(refreshToken));
-usersRouter.get('/me', authenticate(), withAsync(getProfile));
-usersRouter.patch('/me', authenticate(), withAsync(updateProfile));
-usersRouter.patch('/me/password', authenticate(), withAsync(patchPassword));
- 
-export default usersRouter;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/services/articleService.ts.html b/mission9/coverage/src/services/articleService.ts.html deleted file mode 100644 index add761584..000000000 --- a/mission9/coverage/src/services/articleService.ts.html +++ /dev/null @@ -1,505 +0,0 @@ - - - - - - Code coverage report for src/services/articleService.ts - - - - - - - - - -
-
-

All files / src/services articleService.ts

-
- -
- 88.13% - Statements - 52/59 -
- - -
- 41.17% - Branches - 14/34 -
- - -
- 100% - Functions - 10/10 -
- - -
- 87.71% - Lines - 50/57 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -1415x -  -5x -5x -5x -5x -  -5x -  -  -5x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -2x -1x -1x -1x -  -  -  -  -  -  -2x -2x -1x -  -1x -  -  -2x -2x -1x -  -1x -  -  -  -  -  -  -  -  -6x -  -  -  -  -6x -  -  -  -  -  -  -  -  -  -6x -8x -8x -  -  -  -8x -8x -  -  -  -  -6x -  -  -  -6x -  -  -1x -1x -  -  -  -  -1x -1x -  -  -  -  -  -1x -  -  -  -  -  -  -2x -2x -2x -2x -2x -2x -  -  -  -1x -1x -1x -  -  -1x -1x -  -  -1x -1x -1x -  -  -  -  -  -  -1x -  -  -5x - 
import { articleRepo } from '../repositories/articleRepository';
-import { ArticleLikesAndCount, ArticleListResponse, ArticleResponse } from '../../types/article';
-import { AlreadyLikeError, AlreadyUnlikeError, ForbiddenError } from '../lib/errors/customErrors';
-import { commentRepo } from '../repositories/commentRepository';
-import { likeRepo } from '../repositories/likeRepository';
-import { Prisma, Article, Comment } from '@prisma/client';
-import type { CursorPaginated } from '../../types/cursorPaginated';
-import { notificationService } from './notificationService';
- 
-//객체로 주면 콘트롤러에서 인자순서 상관없이 적용되지만, ()형태로 반환하게되면 인자순서를 서비스형태와 동일하게 넣어야 함
-export class ArticleService {
-  async createArticle(
-    userId: number,
-    title: string,
-    content: string,
-    image?: string | null,
-  ): Promise<Article> {
-    return articleRepo.create({
-      title,
-      content,
-      image,
-      user: { connect: { id: userId } },
-    });
-  }
-  async getArticle(articleId: number, userId?: number): Promise<ArticleResponse> {
-    const article: ArticleLikesAndCount = await articleRepo.findByIdWithLikes(articleId, userId);
-    const { likes, _count, ...articleData } = article;
-    const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined;
-    return { ...articleData, likeCount: _count.likes, isLiked };
-  }
-  async updateArticle(
-    articleId: number,
-    userId: number,
-    data: { title?: string; content?: string; image?: string | null },
-  ): Promise<Article> {
-    const article = await articleRepo.findById(articleId);
-    if (article.userId !== userId) {
-      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
-    }
-    return articleRepo.update(articleId, data);
-  }
-  async deleteArticle(articleId: number, userId: number): Promise<void> {
-    const article = await articleRepo.findById(articleId);
-    if (article.userId !== userId) {
-      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
-    }
-    await articleRepo.delete(articleId);
-  }
-  async getArticleList(
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-    keyword?: string,
-    userId?: number,
-  ): Promise<ArticleListResponse> {
-    const where = keyword
-      ? {
-          OR: [{ title: { contains: keyword } }, { content: { contains: keyword } }],
-        }
-      : {};
-    const [totalCount, articles] = await Promise.all([
-      articleRepo.count(where),
-      articleRepo.findArticleListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId,
-      }),
-    ]);
-    const list: ArticleResponse[] = articles.map((m) => {
-      const { _count, likes, ...basicArticleData } = m;
-      const response: ArticleResponse = {
-        ...basicArticleData,
-        likeCount: _count.likes,
-      };
-      Eif (!userId) {
-        return response;
-      }
-      const isLiked = (likes ?? []).length > 0;
-      return { ...basicArticleData, isLiked, likeCount: _count.likes };
-    });
-    const response: ArticleListResponse = {
-      list,
-      totalCount,
-    };
-    return response;
-  }
-  async createComment(userId: number, articleId: number, content: string): Promise<Comment> {
-    await articleRepo.findById(articleId);
-    const comment = await commentRepo.create({
-      content,
-      user: { connect: { id: userId } },
-      article: { connect: { id: articleId } },
-    });
-    const article = await articleRepo.findById(articleId);
-    Iif (article.userId !== userId) {
-      await notificationService.createNotification(
-        article.userId,
-        `내 게시글 "${article.title}"에 새로운 댓글이 달렸습니다.`,
-      );
-    }
-    return comment;
-  }
-  async getCommentList(
-    articleId: number,
-    limit: number,
-    cursor?: number,
-  ): Promise<CursorPaginated<Comment>> {
-    await articleRepo.findById(articleId);
-    const commentsWithCursor = await commentRepo.findCommentListQuery({ articleId }, limit, cursor);
-    const comments = commentsWithCursor.slice(0, limit);
-    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
-    const nextCursor = cursorComment ? cursorComment.id : null;
-    return { list: comments, nextCursor };
-  }
-  //like , unlike 둘다 message를 반환해버려서 이게..프로미스로 타입 설정하는 것이 의미가 있는지...로직 수정 생각해봐야할 듯
-  async likeArticle(userId: number, articleId: number): Promise<{ message: string }> {
-    const article = await articleRepo.findById(articleId);
-    const existingLike = await likeRepo.findLike(userId, { articleId });
-    Iif (existingLike) {
-      throw new AlreadyLikeError();
-    }
-    await likeRepo.createLike(userId, { articleId });
-    return { message: `${article.title}게시글에 좋아요를 눌렀습니다.` };
-  }
-  async unlikeArticle(userId: number, articleId: number): Promise<{ message: string }> {
-    const article = await articleRepo.findById(articleId);
-    try {
-      await likeRepo.deleteLike(userId, { articleId });
-    } catch (error: unknown) {
-      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
-        throw new AlreadyUnlikeError();
-      }
-      throw error;
-    }
-    return { message: `${article.title}게시글의 좋아요를 취소했습니다` };
-  }
-}
-export const articleService = new ArticleService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/services/commentService.ts.html b/mission9/coverage/src/services/commentService.ts.html deleted file mode 100644 index d697ad1ae..000000000 --- a/mission9/coverage/src/services/commentService.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/services/commentService.ts - - - - - - - - - -
-
-

All files / src/services commentService.ts

-
- -
- 33.33% - Statements - 4/12 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/2 -
- - -
- 33.33% - Lines - 4/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -235x -5x -  -  -5x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x - 
import { commentRepo } from '../repositories/commentRepository';
-import { ForbiddenError } from '../lib/errors/customErrors';
-import { Comment } from '@prisma/client';
- 
-export class CommentService {
-  async updateComment(commentId: number, userId: number, content?: string): Promise<Comment> {
-    const comment = await commentRepo.findById(commentId);
-    if (comment.userId !== userId) {
-      throw new ForbiddenError('해당 댓글을 수정할 권한이 없습니다.');
-    }
-    return commentRepo.update(commentId, content);
-  }
-  async deleteComment(commentId: number, userId: number): Promise<void> {
-    const comment = await commentRepo.findById(commentId);
-    if (comment.userId !== userId) {
-      throw new ForbiddenError('해당 댓글을 삭제할 권한이 없습니다.');
-    }
-    await commentRepo.delete(commentId);
-  }
-}
- 
-export const commnetService = new CommentService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/services/imageService.ts.html b/mission9/coverage/src/services/imageService.ts.html deleted file mode 100644 index d11cab840..000000000 --- a/mission9/coverage/src/services/imageService.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/services/imageService.ts - - - - - - - - - -
-
-

All files / src/services imageService.ts

-
- -
- 38.46% - Statements - 5/13 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 38.46% - Lines - 5/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23  -  -1x -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { uploadImageResponse } from '../../types/image';
-import { Request } from 'express';
-import { BadRequestError } from '../lib/errors/customErrors';
-import path from 'path';
-import { STATIC_PATH } from '../lib/constants';
- 
-export class ImageService {
-  buildImageUrl(req: Request): uploadImageResponse {
-    const host = req.get('host');
-    if (!host) {
-      throw new BadRequestError('요청 헤더에 host 정보가 없습니다.');
-    }
-    if (!req.file) {
-      throw new BadRequestError();
-    }
-    const filePath = path.join(host, STATIC_PATH, req.file.filename);
-    const url = `http://${filePath}`;
-    return { url };
-  }
-}
- 
-export const imageService = new ImageService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/services/index.html b/mission9/coverage/src/services/index.html deleted file mode 100644 index c091268ea..000000000 --- a/mission9/coverage/src/services/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/services - - - - - - - - - -
-
-

All files src/services

-
- -
- 67.09% - Statements - 157/234 -
- - -
- 44.44% - Branches - 64/144 -
- - -
- 68.42% - Functions - 26/38 -
- - -
- 68.8% - Lines - 150/218 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articleService.ts -
-
88.13%52/5941.17%14/34100%10/1087.71%50/57
commentService.ts -
-
33.33%4/120%0/40%0/233.33%4/12
notificationService.ts -
-
33.33%5/150%0/20%0/435.71%5/14
productService.ts -
-
90%63/7066.66%32/48100%10/1089.7%61/68
userService.ts -
-
42.3%33/7832.14%18/5650%6/1244.77%30/67
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/services/notificationService.ts.html b/mission9/coverage/src/services/notificationService.ts.html deleted file mode 100644 index 8d579d208..000000000 --- a/mission9/coverage/src/services/notificationService.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for src/services/notificationService.ts - - - - - - - - - -
-
-

All files / src/services notificationService.ts

-
- -
- 33.33% - Statements - 5/15 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/4 -
- - -
- 35.71% - Lines - 5/14 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -275x -5x -5x -  -  -5x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x - 
import { UnauthorizedError } from '../lib/errors/customErrors';
-import { notificationRepo } from '../repositories/notificationRepository';
-import { getIO } from '../socket';
-import type { Notification as PrismaNotification } from '@prisma/client';
- 
-export class NotificationService {
-  async getNotifications(userId: number): Promise<PrismaNotification[]> {
-    return notificationRepo.getNotification(userId);
-  }
-  async getUnreadCount(userId: number): Promise<number> {
-    return notificationRepo.getUnreadCount(userId);
-  }
-  async createNotification(userId: number, message: string): Promise<PrismaNotification> {
-    const notification = await notificationRepo.create(userId, message);
-    const io = getIO();
-    io.to(`user-${userId}`).emit('notification', notification);
-    return notification;
-  }
-  async markAsRead(notificationId: number, userId: number): Promise<PrismaNotification> {
-    const notification = await notificationRepo.findByIds(notificationId, userId);
-    if (!notification) throw new UnauthorizedError();
-    return notificationRepo.updateRead(notificationId);
-  }
-}
- 
-export const notificationService = new NotificationService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/services/productService.ts.html b/mission9/coverage/src/services/productService.ts.html deleted file mode 100644 index 284300d3e..000000000 --- a/mission9/coverage/src/services/productService.ts.html +++ /dev/null @@ -1,616 +0,0 @@ - - - - - - Code coverage report for src/services/productService.ts - - - - - - - - - -
-
-

All files / src/services productService.ts

-
- -
- 90% - Statements - 63/70 -
- - -
- 66.66% - Branches - 32/48 -
- - -
- 100% - Functions - 10/10 -
- - -
- 89.7% - Lines - 61/68 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178  -6x -  -  -6x -6x -  -  -6x -6x -6x -6x -  -  -  -6x -  -  -  -  -  -  -  -  -2x -2x -  -  -  -  -  -  -  -  -  -3x -2x -2x -2x -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -3x -3x -1x -  -2x -  -2x -1x -1x -2x -1x -  -  -  -  -  -  -2x -  -  -2x -2x -1x -  -1x -  -  -  -  -  -  -  -  -11x -  -  -  -  -  -  -  -  -11x -  -  -  -  -  -  -  -  -  -11x -14x -14x -  -  -  -14x -13x -  -1x -1x -  -11x -  -  -  -11x -  -  -2x -2x -  -  -  -  -2x -2x -  -  -  -  -  -2x -  -  -  -  -  -  -2x -2x -2x -2x -2x -2x -  -  -2x -2x -2x -  -  -2x -2x -  -  -1x -1x -1x -  -  -  -  -  -  -1x -  -  -  -6x - 
import { ProductLikesAndCount } from '../../types/product';
-import { productRepo } from '../repositories/productRepository';
-import { Product } from '@prisma/client';
-import type { ProductListResponse, ProductResponse } from '../../types/product';
-import { ForbiddenError } from '../lib/errors/customErrors';
-import { commentRepo } from '../repositories/commentRepository';
-import type { Comment } from '@prisma/client';
-import type { CursorPaginated } from '../../types/cursorPaginated';
-import { AlreadyLikeError, AlreadyUnlikeError } from '../lib/errors/customErrors';
-import { likeRepo } from '../repositories/likeRepository';
-import { Prisma } from '@prisma/client';
-import { notificationService } from './notificationService';
- 
-//인자 순서가 옵셔널 다음 필수파라미터가 들어오면 컴파일에러가 발생함
-//객체로 묶어 보내기, 이러면 필수인 userid의 파라미터 순서를 바꾸지 않아도 됨
-export class ProductService {
-  async createProduct(params: {
-    name: string;
-    description: string;
-    price: number;
-    tags?: string[];
-    images?: string[];
-    userId: number;
-  }): Promise<Product> {
-    const { name, description, price, tags, images, userId } = params;
-    return productRepo.create({
-      name,
-      description,
-      price,
-      tags: tags ?? [],
-      images: images ?? [],
-      user: { connect: { id: userId } },
-    });
-  }
-  async getProduct(productId: number, userId?: number): Promise<ProductResponse> {
-    const product: ProductLikesAndCount = await productRepo.findByIdWithLikes(productId, userId);
-    const { likes, _count, ...productData } = product;
-    const baseResponse = { ...productData, likeCount: _count.likes };
-    Eif (!userId) {
-      return baseResponse;
-    }
-    const isLiked = (likes?.length ?? 0) > 0;
-    return { ...baseResponse, isLiked };
-  }
-  async updateProduct(
-    productId: number,
-    userId: number,
-    data: {
-      name?: string;
-      description?: string;
-      price?: number;
-      tags?: string[];
-      images?: string[];
-    },
-  ): Promise<Product> {
-    const product = await productRepo.findById(productId);
-    if (product.userId !== userId) {
-      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
-    }
-    const updateProduct = await productRepo.update(productId, data);
-    //undefined가 아니면서 기존가격과 다른 경우
-    if (data.price !== undefined && product.price !== data.price) {
-      const likers = await likeRepo.getLikers({ productId });
-      for (const liker of likers) {
-        if (liker.userId !== userId) {
-          await notificationService.createNotification(
-            liker.userId,
-            `관심 상품 "${product.name}"의 가격이 변동되었습니다.`,
-          );
-        }
-      }
-    }
-    return updateProduct;
-  }
-  async deleteProduct(productId: number, userId: number): Promise<void> {
-    const product = await productRepo.findById(productId);
-    if (product.userId !== userId) {
-      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
-    }
-    await productRepo.delete(productId);
-  }
-  async getProductList(
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-    keyword?: string,
-    userId?: number,
-  ): Promise<ProductListResponse> {
-    const where = keyword
-      ? {
-          OR: [
-            { name: { contains: keyword } },
-            { description: { contains: keyword } },
-            { tags: { has: keyword } },
-          ],
-        }
-      : {};
-    const [totalCount, products] = await Promise.all([
-      productRepo.count(where),
-      productRepo.findProductListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId,
-      }),
-    ]);
-    const list: ProductResponse[] = products.map((m) => {
-      const { _count, likes, ...basicProductData } = m;
-      const response: ProductResponse = {
-        ...basicProductData,
-        likeCount: _count.likes,
-      };
-      if (!userId) {
-        return response;
-      }
-      const isLiked = (likes ?? []).length > 0;
-      return { ...basicProductData, isLiked, likeCount: _count.likes };
-    });
-    const response: ProductListResponse = {
-      list,
-      totalCount,
-    };
-    return response;
-  }
-  async createComment(userId: number, productId: number, content: string): Promise<Comment> {
-    await productRepo.findById(productId);
-    const comment = await commentRepo.create({
-      content,
-      user: { connect: { id: userId } },
-      product: { connect: { id: productId } },
-    });
-    const product = await productRepo.findById(productId);
-    Iif (product.userId !== userId) {
-      await notificationService.createNotification(
-        product.userId,
-        `내 상품 "${product.name}"에 새로운 댓글이 달렸습니다.`,
-      );
-    }
-    return comment;
-  }
-  async getCommentList(
-    productId: number,
-    limit: number,
-    cursor?: number,
-  ): Promise<CursorPaginated<Comment>> {
-    await productRepo.findById(productId);
-    const commentsWithCursor = await commentRepo.findCommentListQuery({ productId }, limit, cursor);
-    const comments = commentsWithCursor.slice(0, limit);
-    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
-    const nextCursor = cursorComment ? cursorComment.id : null;
-    return { list: comments, nextCursor };
-  }
-  async likeProduct(userId: number, productId: number): Promise<{ message: string }> {
-    const product = await productRepo.findById(productId);
-    const existingLike = await likeRepo.findLike(userId, { productId });
-    Iif (existingLike) {
-      throw new AlreadyLikeError();
-    }
-    await likeRepo.createLike(userId, { productId });
-    return { message: `${product.name}상품에 좋아요를 눌렀습니다.` };
-  }
-  async unlikeProduct(userId: number, productId: number): Promise<{ message: string }> {
-    const product = await productRepo.findById(productId);
-    try {
-      await likeRepo.deleteLike(userId, { productId });
-    } catch (error: unknown) {
-      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
-        throw new AlreadyUnlikeError();
-      }
-      throw error;
-    }
-    return { message: `${product.name}상품의 좋아요를 취소했습니다` };
-  }
-}
- 
-export const productService = new ProductService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/services/userService.ts.html b/mission9/coverage/src/services/userService.ts.html deleted file mode 100644 index d77f9ed9a..000000000 --- a/mission9/coverage/src/services/userService.ts.html +++ /dev/null @@ -1,721 +0,0 @@ - - - - - - Code coverage report for src/services/userService.ts - - - - - - - - - -
-
-

All files / src/services userService.ts

-
- -
- 42.3% - Statements - 33/78 -
- - -
- 32.14% - Branches - 18/56 -
- - -
- 50% - Functions - 6/12 -
- - -
- 44.77% - Lines - 30/67 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -2135x -5x -  -5x -5x -5x -  -  -  -  -  -  -  -  -  -  -21x -21x -21x -  -  -  -  -  -20x -20x -  -  -  -  -  -18x -18x -  -  -  -18x -18x -1x -  -17x -17x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -2x -2x -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -1x -1x -  -  -  -  -  -1x -  -  -  -5x - 
import bcrypt from 'bcrypt';
-import { userRepo } from '../repositories/userRepository';
-import type { Prisma, User } from '@prisma/client';
-import { ForbiddenError, UnauthorizedError } from '../lib/errors/customErrors';
-import { generateToken, verifyRefreshToken } from '../lib/token';
-import { productRepo } from '../repositories/productRepository';
-import type { ProductListResponse } from '../../types/product';
-import { ProfileResponse } from '../../types/user';
- 
-class UserService {
-  async register(
-    nickname: string,
-    email: string,
-    password: string,
-    image?: string,
-  ): Promise<Omit<User, 'password'>> {
-    const salt = await bcrypt.genSalt(10);
-    const hashedPassword = await bcrypt.hash(password, salt);
-    const user = await userRepo.create({
-      nickname,
-      email,
-      password: hashedPassword,
-      image,
-    });
-    const { password: _, ...userWithoutPassword } = user;
-    return userWithoutPassword;
-  }
-  async login(
-    email: string,
-    password: string,
-  ): Promise<{ tokens: { accessToken: string; refreshToken: string }; message: string }> {
-    const user = await userRepo.findByEmail(email);
-    Iif (!user) {
-      //이메일, 비밀번호 검증에 대한 에러를 같은 메세지로 던짐으로써 좀 더 방어적으로 설계
-      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
-    }
-    const isPasswordValid = await bcrypt.compare(password, user.password);
-    if (!isPasswordValid) {
-      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
-    }
-    const tokens = generateToken(user.id);
-    return { tokens, message: '로그인에 성공했습니다.' };
-  }
-  async getProfile(myId: number): Promise<ProfileResponse> {
-    const user = await userRepo.findById(myId);
-    if (!user) throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
-    const { password: _, ...userInfo } = user;
-    const [myProductCount, myLikeProductCount, recentProductsRaw, recentLikedProductsRaw] =
-      await Promise.all([
-        productRepo.count({ userId: myId }),
-        productRepo.count({ likes: { some: { userId: myId } } }),
-        productRepo.findProductListWithLikes({
-          skip: 0,
-          take: 5,
-          orderBy: { createdAt: 'desc' },
-          where: { userId: myId },
-          userId: myId,
-        }),
-        productRepo.findProductListWithLikes({
-          skip: 0,
-          take: 5,
-          orderBy: { createdAt: 'desc' },
-          where: { likes: { some: { userId: myId } } },
-          userId: myId,
-        }),
-      ]);
-    const myRecentProducts = recentProductsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    const myRecentLikeProducts = recentLikedProductsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    return {
-      user: userInfo,
-      myProducts: {
-        list: myRecentProducts,
-        totalCount: myProductCount,
-      },
-      myLikedProducts: {
-        list: myRecentLikeProducts,
-        totalCount: myLikeProductCount,
-      },
-    };
-  }
- 
-  async updateProfile(
-    userId: number,
-    nickname?: string,
-    email?: string,
-    image?: string | null,
-  ): Promise<Omit<User, 'password'>> {
-    const data: Prisma.UserUpdateInput = {};
-    if (nickname !== undefined) data.nickname = nickname;
-    if (email !== undefined) data.email = email;
-    if (image !== undefined) data.image = image;
-    const update = await userRepo.update(userId, data);
-    const { password: _, ...userWithoutPassword } = update;
-    return userWithoutPassword;
-  }
-  async patchPassword(userId: number, currentPassword: string, newPassword: string): Promise<void> {
-    const user = await userRepo.findById(userId);
-    if (!user) {
-      throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
-    }
-    const isPasswordValid = await bcrypt.compare(currentPassword, user.password);
-    if (!isPasswordValid) {
-      throw new ForbiddenError('현재 비밀번호가 올바르지 않습니다.');
-    }
-    const salt = await bcrypt.genSalt(10);
-    const hashedNewPassword = await bcrypt.hash(newPassword, salt);
-    await userRepo.update(userId, { password: hashedNewPassword });
-  }
-  async getMyProductList(
-    myId: number,
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-    keyword?: string,
-  ): Promise<ProductListResponse> {
-    const where = {
-      userId: myId,
-      ...(keyword
-        ? {
-            OR: [
-              { name: { contains: keyword } },
-              { description: { contains: keyword } },
-              { tags: { has: keyword } },
-            ],
-          }
-        : {}),
-    };
-    const [totalCount, productsRaw] = await Promise.all([
-      productRepo.count(where),
-      productRepo.findProductListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId: myId,
-      }),
-    ]);
-    const list = productsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    return { list, totalCount };
-  }
-  async refreshToken(refreshToken: string) {
-    let userId: number;
-    try {
-      const payload = verifyRefreshToken(refreshToken);
-      userId = payload.userId;
-    } catch (error) {
-      throw new UnauthorizedError('유효하지 않은 리프레시 토큰입니다.');
-    }
-    const user = await userRepo.findById(userId);
-    if (!user) {
-      throw new UnauthorizedError('존재하지 않는 사용자입니다.');
-    }
-    const tokens = generateToken(user.id);
-    return tokens;
-  }
-  async getMyLikedProducts(
-    myId: number,
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-  ): Promise<ProductListResponse> {
-    const where = {
-      likes: {
-        some: {
-          userId: myId,
-        },
-      },
-    };
-    const [totalCount, productsRaw] = await Promise.all([
-      productRepo.count(where),
-      productRepo.findProductListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId: myId,
-      }),
-    ]);
-    const list = productsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    return { list, totalCount };
-  }
-}
- 
-export const userService = new UserService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/socket.ts.html b/mission9/coverage/src/socket.ts.html deleted file mode 100644 index 7dcdc9ac8..000000000 --- a/mission9/coverage/src/socket.ts.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - Code coverage report for src/socket.ts - - - - - - - - - -
-
-

All files / src socket.ts

-
- -
- 27.58% - Statements - 8/29 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/4 -
- - -
- 24% - Lines - 6/25 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -441x -  -1x -1x -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  - 
import { Server as SocketIOServer } from 'socket.io';
-import { Server as HttpServer } from 'http';
-import { verifyAccessToken } from './lib/token';
-import { UnauthorizedError } from './lib/errors/customErrors';
- 
-let io: SocketIOServer | null = null;
- 
-export const initSocket = (Server: HttpServer) => {
-  io = new SocketIOServer(Server, {
-    cors: {
-      origin: '*',
-      methods: ['GET', 'POST'],
-    },
-  });
- 
-  io.use((socket, next) => {
-    try {
-      const token = socket.handshake.auth.accessToken;
-      if (!token) return next(new UnauthorizedError());
-      const { userId } = verifyAccessToken(token);
-      if (!userId) return next(new UnauthorizedError());
-      socket.data.userId = userId;
-      next();
-    } catch (e) {
-      next(new UnauthorizedError());
-    }
-  });
- 
-  io.on('connection', (socket) => {
-    const userId = socket.data.userId;
-    console.log('User connected', socket.id);
-    socket.join(`user-${userId}`);
-    console.log(`User ${userId} joined room user-${userId}`);
-  });
-  return io;
-};
- 
-export const getIO = () => {
-  if (!io) {
-    throw new Error('Socket.IO 서버가 초기화되지 않았습니다.');
-  }
-  return io;
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/structs/articlesStructs.ts.html b/mission9/coverage/src/structs/articlesStructs.ts.html deleted file mode 100644 index 120a77143..000000000 --- a/mission9/coverage/src/structs/articlesStructs.ts.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Code coverage report for src/structs/articlesStructs.ts - - - - - - - - - -
-
-

All files / src/structs articlesStructs.ts

-
- -
- 83.33% - Statements - 5/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 83.33% - Lines - 5/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -131x -1x -  -1x -  -1x -  -  -  -  -  -1x - 
import { coerce, nonempty, nullable, object, partial, string } from 'superstruct';
-import { PageParamsStruct } from './commonStructs';
- 
-export const GetArticleListParamsStruct = PageParamsStruct;
- 
-export const CreateArticleBodyStruct = object({
-  title: coerce(nonempty(string()), string(), (value) => value.trim()),
-  content: nonempty(string()),
-  image: nullable(string()),
-});
- 
-export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct);
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/structs/commentsStruct.ts.html b/mission9/coverage/src/structs/commentsStruct.ts.html deleted file mode 100644 index 27619246e..000000000 --- a/mission9/coverage/src/structs/commentsStruct.ts.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Code coverage report for src/structs/commentsStruct.ts - - - - - - - - - -
-
-

All files / src/structs commentsStruct.ts

-
- -
- 100% - Statements - 5/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 5/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -111x -1x -  -1x -  -  -  -1x -  -1x - 
import { nonempty, object, partial, string } from 'superstruct';
-import { CursorParamsStruct } from './commonStructs';
- 
-export const CreateCommentBodyStruct = object({
-  content: nonempty(string()),
-});
- 
-export const GetCommentListParamsStruct = CursorParamsStruct;
- 
-export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct);
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/structs/commonStructs.ts.html b/mission9/coverage/src/structs/commonStructs.ts.html deleted file mode 100644 index d83d00745..000000000 --- a/mission9/coverage/src/structs/commonStructs.ts.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - Code coverage report for src/structs/commonStructs.ts - - - - - - - - - -
-
-

All files / src/structs commonStructs.ts

-
- -
- 83.33% - Statements - 5/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 100% - Lines - 5/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -221x -  -1x -  -1x -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  - 
import { coerce, integer, object, string, defaulted, optional, enums, nonempty } from 'superstruct';
- 
-const integerString = coerce(integer(), string(), (value) => parseInt(value));
- 
-export const IdParamsStruct = object({
-  id: integerString,
-});
- 
-export const PageParamsStruct = object({
-  page: defaulted(integerString, 1),
-  pageSize: defaulted(integerString, 10),
-  orderBy: optional(enums(['recent'])),
-  keyword: optional(nonempty(string())),
-});
- 
-export const CursorParamsStruct = object({
-  cursor: defaulted(integerString, 0),
-  limit: defaulted(integerString, 10),
-  orderBy: optional(enums(['recent'])),
-  keyword: optional(nonempty(string())),
-});
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/structs/index.html b/mission9/coverage/src/structs/index.html deleted file mode 100644 index de1e47be2..000000000 --- a/mission9/coverage/src/structs/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/structs - - - - - - - - - -
-
-

All files src/structs

-
- -
- 81.81% - Statements - 36/44 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/8 -
- - -
- 87.8% - Lines - 36/41 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articlesStructs.ts -
-
83.33%5/6100%0/00%0/183.33%5/6
commentsStruct.ts -
-
100%5/5100%0/0100%0/0100%5/5
commonStructs.ts -
-
83.33%5/6100%0/00%0/1100%5/5
productsStruct.ts -
-
85.71%6/7100%0/00%0/185.71%6/7
usersStructs.ts -
-
75%15/200%0/40%0/583.33%15/18
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/structs/productsStruct.ts.html b/mission9/coverage/src/structs/productsStruct.ts.html deleted file mode 100644 index 01ca56f56..000000000 --- a/mission9/coverage/src/structs/productsStruct.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for src/structs/productsStruct.ts - - - - - - - - - -
-
-

All files / src/structs productsStruct.ts

-
- -
- 85.71% - Statements - 6/7 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 85.71% - Lines - 6/7 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -271x -  -  -  -  -  -  -  -  -  -  -1x -  -1x -  -  -  -  -  -  -  -1x -  -1x -  -1x - 
import {
-  coerce,
-  partial,
-  object,
-  string,
-  min,
-  nonempty,
-  array,
-  integer,
-  optional,
-} from 'superstruct';
-import { PageParamsStruct } from './commonStructs';
- 
-export const CreateProductBodyStruct = object({
-  name: coerce(nonempty(string()), string(), (value) => value.trim()),
-  description: nonempty(string()),
-  price: min(integer(), 0),
-  tags: optional(array(string())),
-  images: optional(array(string())),
-});
- 
-export const GetProductListParamsStruct = PageParamsStruct;
- 
-export const UpdateProductBodyStruct = partial(CreateProductBodyStruct);
- 
-export const LikeProductParamsStruct = PageParamsStruct;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/coverage/src/structs/usersStructs.ts.html b/mission9/coverage/src/structs/usersStructs.ts.html deleted file mode 100644 index 79a230ceb..000000000 --- a/mission9/coverage/src/structs/usersStructs.ts.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - Code coverage report for src/structs/usersStructs.ts - - - - - - - - - -
-
-

All files / src/structs usersStructs.ts

-
- -
- 75% - Statements - 15/20 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/5 -
- - -
- 83.33% - Lines - 15/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -491x -1x -  -1x -  -  -1x -  -1x -  -  -  -1x -1x -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -1x -  -  -  -  -1x -  -  -  -  -1x -  -  -  -1x -  -1x - 
import * as s from 'superstruct';
-import { PageParamsStruct } from './commonStructs';
- 
-const CoercedNumber = s.coerce(s.number(), s.union([s.string(), s.number()]), (value) =>
-  Number(value),
-);
-const Integer = s.refine(CoercedNumber, 'Integer', (value) => Number.isInteger(value) && value > 0);
- 
-export const userIdStruct = s.object({
-  userId: Integer,
-});
-//이메일: 기본적인 이메일 형식 체크, 닉네임: 영어 + 숫자 + 한글, 2~10글자, 비밀번호: 8~16글자
-const email = s.refine(s.string(), 'Email', (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value));
-const nickname = s.refine(s.string(), 'Nickname', (value) =>
-  /^[A-Za-z0-9가-힣]{2,10}$/.test(value),
-);
-const password = s.refine(
-  s.string(),
-  'Password',
-  (value) => value.length >= 8 && value.length <= 16,
-);
- 
-export const CreateUserBodyStruct = s.object({
-  nickname: nickname,
-  email: email,
-  password: password,
-  image: s.optional(s.string()),
-});
- 
-export const UpdateUserBodyStruct = s.partial(CreateUserBodyStruct);
- 
-export const LoginBodyStruct = s.object({
-  email: email,
-  password: password,
-});
- 
-export const ChangePasswordBodyStruct = s.object({
-  currentPassword: password,
-  newPassword: password,
-});
- 
-export const RefreshTokenBodyStruct = s.object({
-  refreshToken: s.string(),
-});
- 
-export const GetMyProductListParamsStruct = PageParamsStruct;
- 
-export const GetMyLikedProductListParamsStruct = PageParamsStruct;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9/jest.config.js b/mission9/jest.config.js deleted file mode 100644 index cb2decff9..000000000 --- a/mission9/jest.config.js +++ /dev/null @@ -1,33 +0,0 @@ -module.exports = { - testEnvironment: 'node', - verbose: true, - testMatch: ['**/*.test.ts'], - transform: { - '^.+\\.ts$': 'ts-jest', - }, - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.test.json', - }, - }, - moduleFileExtensions: ['ts', 'js'], - // 커버리지 활성화 - collectCoverage: true, - // 어떤 파일을 커버리지 대상으로 볼지 - collectCoverageFrom: [ - 'src/**/*.ts', - '!src/main.ts', // 서버 시작 파일 제외 - '!src/**/*.d.ts', - '!src/socket.ts', - '!src/lib/**', - '!src/controllers/errorController.ts', - '!src/controllers/imagesController.ts', - '!src/middlewares/**', - '!src/services/imageService.ts', - '!src/structs/**', - ], - // 결과물 위치 - coverageDirectory: 'coverage', - // 리포트 형식 - coverageReporters: ['text', 'html'], -}; diff --git a/mission9/package-lock.json b/mission9/package-lock.json deleted file mode 100644 index ad5cf974a..000000000 --- a/mission9/package-lock.json +++ /dev/null @@ -1,9108 +0,0 @@ -{ - "name": "sprint-mission", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "sprint-mission", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@aws-sdk/client-s3": "^3.975.0", - "@prisma/client": "^6.19.0", - "bcrypt": "^6.0.0", - "cookie-parser": "^1.4.7", - "cors": "^2.8.5", - "dotenv": "^16.6.1", - "dotenv-cli": "^11.0.0", - "express": "^5.2.1", - "fs": "^0.0.1-security", - "is-uuid": "^1.0.2", - "jsonwebtoken": "^9.0.2", - "multer": "^2.0.2", - "socket.io": "^4.8.3", - "superstruct": "^2.0.2", - "tslib": "^2.8.1", - "uuid": "^13.0.0" - }, - "devDependencies": { - "@types/bcrypt": "^6.0.0", - "@types/cookie-parser": "^1.4.10", - "@types/cors": "^2.8.19", - "@types/express": "^5.0.6", - "@types/jest": "^30.0.0", - "@types/jsonwebtoken": "^9.0.10", - "@types/mocha": "^10.0.10", - "@types/multer": "^2.0.0", - "@types/node": "^24.10.1", - "@types/supertest": "^6.0.3", - "express-list-endpoints": "^7.1.1", - "jest": "^30.2.0", - "nodemon": "^3.1.11", - "prisma": "^6.19.0", - "supertest": "^7.2.2", - "ts-jest": "^29.4.6", - "ts-node": "^10.9.2", - "typescript": "^5.9.3" - } - }, - "node_modules/@aws-crypto/crc32": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", - "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/crc32c": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", - "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", - "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-s3": { - "version": "3.975.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.975.0.tgz", - "integrity": "sha512-aF1M/iMD29BPcpxjqoym0YFa4WR9Xie1/IhVumwOGH6TB45DaqYO7vLwantDBcYNRn/cZH6DFHksO7RmwTFBhw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha1-browser": "5.2.0", - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.1", - "@aws-sdk/credential-provider-node": "^3.972.1", - "@aws-sdk/middleware-bucket-endpoint": "^3.972.1", - "@aws-sdk/middleware-expect-continue": "^3.972.1", - "@aws-sdk/middleware-flexible-checksums": "^3.972.1", - "@aws-sdk/middleware-host-header": "^3.972.1", - "@aws-sdk/middleware-location-constraint": "^3.972.1", - "@aws-sdk/middleware-logger": "^3.972.1", - "@aws-sdk/middleware-recursion-detection": "^3.972.1", - "@aws-sdk/middleware-sdk-s3": "^3.972.2", - "@aws-sdk/middleware-ssec": "^3.972.1", - "@aws-sdk/middleware-user-agent": "^3.972.2", - "@aws-sdk/region-config-resolver": "^3.972.1", - "@aws-sdk/signature-v4-multi-region": "3.972.0", - "@aws-sdk/types": "^3.973.0", - "@aws-sdk/util-endpoints": "3.972.0", - "@aws-sdk/util-user-agent-browser": "^3.972.1", - "@aws-sdk/util-user-agent-node": "^3.972.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.21.1", - "@smithy/eventstream-serde-browser": "^4.2.8", - "@smithy/eventstream-serde-config-resolver": "^4.3.8", - "@smithy/eventstream-serde-node": "^4.2.8", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-blob-browser": "^4.2.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/hash-stream-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/md5-js": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.11", - "@smithy/middleware-retry": "^4.4.27", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.26", - "@smithy/util-defaults-mode-node": "^4.2.29", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.975.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.975.0.tgz", - "integrity": "sha512-HpgJuleH7P6uILxzJKQOmlHdwaCY+xYC6VgRDzlwVEqU/HXjo4m2gOAyjUbpXlBOCWfGgMUzfBlNJ9z3MboqEQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.1", - "@aws-sdk/middleware-host-header": "^3.972.1", - "@aws-sdk/middleware-logger": "^3.972.1", - "@aws-sdk/middleware-recursion-detection": "^3.972.1", - "@aws-sdk/middleware-user-agent": "^3.972.2", - "@aws-sdk/region-config-resolver": "^3.972.1", - "@aws-sdk/types": "^3.973.0", - "@aws-sdk/util-endpoints": "3.972.0", - "@aws-sdk/util-user-agent-browser": "^3.972.1", - "@aws-sdk/util-user-agent-node": "^3.972.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.21.1", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.11", - "@smithy/middleware-retry": "^4.4.27", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.26", - "@smithy/util-defaults-mode-node": "^4.2.29", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.973.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.3.tgz", - "integrity": "sha512-ZbM2Xy8ytAcfnNpkBltr6Qdw36W/4NW5nZdZieCuTfacoBFpi/NYiwb8U05KNJvLKeZnrV9Vi696i+r2DQFORg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/xml-builder": "^3.972.2", - "@smithy/core": "^3.21.1", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/crc64-nvme": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.0.tgz", - "integrity": "sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.2.tgz", - "integrity": "sha512-wzH1EdrZsytG1xN9UHaK12J9+kfrnd2+c8y0LVoS4O4laEjPoie1qVK3k8/rZe7KOtvULzyMnO3FT4Krr9Z0Dg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.3.tgz", - "integrity": "sha512-IbBGWhaxiEl64fznwh5PDEB0N7YJEAvK5b6nRtPVUKdKAHlOPgo6B9XB8mqWDs8Ct0oF/E34ZLiq2U0L5xDkrg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/types": "^3.973.1", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", - "@smithy/types": "^4.12.0", - "@smithy/util-stream": "^4.5.10", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.2.tgz", - "integrity": "sha512-Jrb8sLm6k8+L7520irBrvCtdLxNtrG7arIxe9TCeMJt/HxqMGJdbIjw8wILzkEHLMIi4MecF2FbXCln7OT1Tag==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/credential-provider-env": "^3.972.2", - "@aws-sdk/credential-provider-http": "^3.972.3", - "@aws-sdk/credential-provider-login": "^3.972.2", - "@aws-sdk/credential-provider-process": "^3.972.2", - "@aws-sdk/credential-provider-sso": "^3.972.2", - "@aws-sdk/credential-provider-web-identity": "^3.972.2", - "@aws-sdk/nested-clients": "3.975.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/credential-provider-imds": "^4.2.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.2.tgz", - "integrity": "sha512-mlaw2aiI3DrimW85ZMn3g7qrtHueidS58IGytZ+mbFpsYLK5wMjCAKZQtt7VatLMtSBG/dn/EY4njbnYXIDKeQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/nested-clients": "3.975.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.2.tgz", - "integrity": "sha512-Lz1J5IZdTjLYTVIcDP5DVDgi1xlgsF3p1cnvmbfKbjCRhQpftN2e2J4NFfRRvPD54W9+bZ8l5VipPXtTYK7aEg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.2", - "@aws-sdk/credential-provider-http": "^3.972.3", - "@aws-sdk/credential-provider-ini": "^3.972.2", - "@aws-sdk/credential-provider-process": "^3.972.2", - "@aws-sdk/credential-provider-sso": "^3.972.2", - "@aws-sdk/credential-provider-web-identity": "^3.972.2", - "@aws-sdk/types": "^3.973.1", - "@smithy/credential-provider-imds": "^4.2.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.2.tgz", - "integrity": "sha512-NLKLTT7jnUe9GpQAVkPTJO+cs2FjlQDt5fArIYS7h/Iw/CvamzgGYGFRVD2SE05nOHCMwafUSi42If8esGFV+g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.2.tgz", - "integrity": "sha512-YpwDn8g3gCGUl61cCV0sRxP2pFIwg+ZsMfWQ/GalSyjXtRkctCMFA+u0yPb/Q4uTfNEiya1Y4nm0C5rIHyPW5Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.975.0", - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/token-providers": "3.975.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.2.tgz", - "integrity": "sha512-x9DAiN9Qz+NjJ99ltDiVQ8d511M/tuF/9MFbe2jUgo7HZhD6+x4S3iT1YcP07ndwDUjmzKGmeOEgE24k4qvfdg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/nested-clients": "3.975.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.2.tgz", - "integrity": "sha512-ofuXBnitp9j8t05O4NQVrpMZDECPtUhRIWdLzR35baR5njOIPY7YqNtJE+yELVpSn2m4jt2sV1ezYMBY4/Lo+w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-arn-parser": "^3.972.2", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-config-provider": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.2.tgz", - "integrity": "sha512-d9bBQlGk1T5j5rWfof20M2tErddOSoSLDauP2/yyuXfeOfQRCSBUZNrApSxjJ9Hw+/RDGR/XL+LEOqmXxSlV3A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.972.2.tgz", - "integrity": "sha512-GgWVZJdzXzqhXxzNAYB3TnZCj7d5rZNdovqSIV91e97nowHVaExRoyaZ3H/Ydqot7veHGPTl8nBp464zZeLDTQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/crc64-nvme": "3.972.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.2.tgz", - "integrity": "sha512-42hZ8jEXT2uR6YybCzNq9OomqHPw43YIfRfz17biZjMQA4jKSQUaHIl6VvqO2Ddl5904pXg2Yd/ku78S0Ikgog==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.2.tgz", - "integrity": "sha512-pyayzpq+VQiG1o9pEUyr6BXEJ2g2t4JIPdNxDkIHp2AhR63Gy/10WQkXTBOgRnfQ7/aLPLOnjRIWwOPp0CfUlA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.2.tgz", - "integrity": "sha512-iUzdXKOgi4JVDDEG/VvoNw50FryRCEm0qAudw12DcZoiNJWl0rN6SYVLcL1xwugMfQncCXieK5UBlG6mhH7iYA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.2.tgz", - "integrity": "sha512-/mzlyzJDtngNFd/rAYvqx29a2d0VuiYKN84Y/Mu9mGw7cfMOCyRK+896tb9wV6MoPRHUX7IXuKCIL8nzz2Pz5A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.3.tgz", - "integrity": "sha512-ZVtakKpQ7vI9l7tE2SJjQgoPYv2f/Bw/HMip5wBigsQBDvVbN300h+6nPnm0gnEQwIGGG0yJF3XCvr1/4pZW9A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-arn-parser": "^3.972.2", - "@smithy/core": "^3.21.1", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", - "@smithy/types": "^4.12.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.2.tgz", - "integrity": "sha512-HJ3OmQnlQ1es6esrDWnx3nVPhBAN89WaFCzsDcb6oT7TMjBPUfZ5+1BpI7B0Hnme8cc6kp7qc4cgo2plrlROJA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.3.tgz", - "integrity": "sha512-zq6aTiO/BiAIOA8EH8nB+wYvvnZ14Md9Gomm5DDhParshVEVglAyNPO5ADK4ZXFQbftIoO+Vgcvf4gewW/+iYQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.972.0", - "@smithy/core": "^3.21.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/nested-clients": { - "version": "3.975.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.975.0.tgz", - "integrity": "sha512-OkeFHPlQj2c/Y5bQGkX14pxhDWUGUFt3LRHhjcDKsSCw6lrxKcxN3WFZN0qbJwKNydP+knL5nxvfgKiCLpTLRA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.1", - "@aws-sdk/middleware-host-header": "^3.972.1", - "@aws-sdk/middleware-logger": "^3.972.1", - "@aws-sdk/middleware-recursion-detection": "^3.972.1", - "@aws-sdk/middleware-user-agent": "^3.972.2", - "@aws-sdk/region-config-resolver": "^3.972.1", - "@aws-sdk/types": "^3.973.0", - "@aws-sdk/util-endpoints": "3.972.0", - "@aws-sdk/util-user-agent-browser": "^3.972.1", - "@aws-sdk/util-user-agent-node": "^3.972.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.21.1", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.11", - "@smithy/middleware-retry": "^4.4.27", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.26", - "@smithy/util-defaults-mode-node": "^4.2.29", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.2.tgz", - "integrity": "sha512-/7vRBsfmiOlg2X67EdKrzzQGw5/SbkXb7ALHQmlQLkZh8qNgvS2G2dDC6NtF3hzFlpP3j2k+KIEtql/6VrI6JA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.972.0.tgz", - "integrity": "sha512-2udiRijmjpN81Pvajje4TsjbXDZNP6K9bYUanBYH8hXa/tZG5qfGCySD+TyX0sgDxCQmEDMg3LaQdfjNHBDEgQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.972.0", - "@aws-sdk/types": "3.972.0", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/core": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.972.0.tgz", - "integrity": "sha512-nEeUW2M9F+xdIaD98F5MBcQ4ITtykj3yKbgFZ6J0JtL3bq+Z90szQ6Yy8H/BLPYXTs3V4n9ifnBo8cprRDiE6A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.972.0", - "@aws-sdk/xml-builder": "3.972.0", - "@smithy/core": "^3.20.6", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.10.8", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.0.tgz", - "integrity": "sha512-0bcKFXWx+NZ7tIlOo7KjQ+O2rydiHdIQahrq+fN6k9Osky29v17guy68urUKfhTobR6iY6KvxkroFWaFtTgS5w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.972.0", - "@aws-sdk/types": "3.972.0", - "@aws-sdk/util-arn-parser": "3.972.0", - "@smithy/core": "^3.20.6", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.10.8", - "@smithy/types": "^4.12.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz", - "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.0.tgz", - "integrity": "sha512-RM5Mmo/KJ593iMSrALlHEOcc9YOIyOsDmS5x2NLOMdEmzv1o00fcpAkCQ02IGu1eFneBFT7uX0Mpag0HI+Cz2g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/xml-builder": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.0.tgz", - "integrity": "sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "fast-xml-parser": "5.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.975.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.975.0.tgz", - "integrity": "sha512-AWQt64hkVbDQ+CmM09wnvSk2mVyH4iRROkmYkr3/lmUtFNbE2L/fnw26sckZnUcFCsHPqbkQrcsZAnTcBLbH4w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.1", - "@aws-sdk/nested-clients": "3.975.0", - "@aws-sdk/types": "^3.973.0", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.973.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", - "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.2.tgz", - "integrity": "sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.972.0.tgz", - "integrity": "sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.972.0", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-endpoints": "^3.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz", - "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.965.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.4.tgz", - "integrity": "sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.2.tgz", - "integrity": "sha512-gz76bUyebPZRxIsBHJUd/v+yiyFzm9adHbr8NykP2nm+z/rFyvQneOHajrUejtmnc5tTBeaDPL4X25TnagRk4A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.2.tgz", - "integrity": "sha512-vnxOc4C6AR7hVbwyFo1YuH0GB6dgJlWt8nIOOJpnzJAWJPkUMPJ9Zv2lnKsSU7TTZbhP2hEO8OZ4PYH59XFv8Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.3", - "@aws-sdk/types": "^3.973.1", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.2.tgz", - "integrity": "sha512-jGOOV/bV1DhkkUhHiZ3/1GZ67cZyOXaDb7d1rYD6ZiXf5V9tBNOcgqXwRRPvrCbYaFRa1pPMFb3ZjqjWpR3YfA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "fast-xml-parser": "5.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws/lambda-invoke-store": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", - "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", - "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/core": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", - "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.2.0", - "@jest/pattern": "30.0.1", - "@jest/reporters": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-changed-files": "30.2.0", - "jest-config": "30.2.0", - "jest-haste-map": "30.2.0", - "jest-message-util": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-resolve-dependencies": "30.2.0", - "jest-runner": "30.2.0", - "jest-runtime": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "jest-watcher": "30.2.0", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/diff-sequences": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", - "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "jest-mock": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "30.2.0", - "jest-snapshot": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", - "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", - "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@sinonjs/fake-timers": "^13.0.0", - "@types/node": "*", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", - "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.2.0", - "@jest/expect": "30.2.0", - "@jest/types": "30.2.0", - "jest-mock": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/pattern": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", - "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@jridgewell/trace-mapping": "^0.3.25", - "@types/node": "*", - "chalk": "^4.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^5.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "jest-worker": "30.2.0", - "slash": "^3.0.0", - "string-length": "^4.0.2", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/snapshot-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", - "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jest/test-result": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", - "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.2.0", - "@jest/types": "30.2.0", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", - "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.2.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", - "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.2.0", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.1", - "chalk": "^4.1.2", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-util": "30.2.0", - "micromatch": "^4.0.8", - "pirates": "^4.0.7", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jest/types": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", - "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@paralleldrive/cuid2": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", - "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@noble/hashes": "^1.1.5" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@prisma/client": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.0.tgz", - "integrity": "sha512-QXFT+N/bva/QI2qoXmjBzL7D6aliPffIwP+81AdTGq0FXDoLxLkWivGMawG8iM5B9BKfxLIXxfWWAF6wbuJU6g==", - "hasInstallScript": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "peerDependencies": { - "prisma": "*", - "typescript": ">=5.1.0" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@prisma/config": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.0.tgz", - "integrity": "sha512-zwCayme+NzI/WfrvFEtkFhhOaZb/hI+X8TTjzjJ252VbPxAl2hWHK5NMczmnG9sXck2lsXrxIZuK524E25UNmg==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "c12": "3.1.0", - "deepmerge-ts": "7.1.5", - "effect": "3.18.4", - "empathic": "2.0.0" - } - }, - "node_modules/@prisma/debug": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.0.tgz", - "integrity": "sha512-8hAdGG7JmxrzFcTzXZajlQCidX0XNkMJkpqtfbLV54wC6LSSX6Vni25W/G+nAANwLnZ2TmwkfIuWetA7jJxJFA==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/engines": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.0.tgz", - "integrity": "sha512-pMRJ+1S6NVdXoB8QJAPIGpKZevFjxhKt0paCkRDTZiczKb7F4yTgRP8M4JdVkpQwmaD4EoJf6qA+p61godDokw==", - "devOptional": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.0", - "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", - "@prisma/fetch-engine": "6.19.0", - "@prisma/get-platform": "6.19.0" - } - }, - "node_modules/@prisma/engines-version": { - "version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773.tgz", - "integrity": "sha512-gV7uOBQfAFlWDvPJdQxMT1aSRur3a0EkU/6cfbAC5isV67tKDWUrPauyaHNpB+wN1ebM4A9jn/f4gH+3iHSYSQ==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/fetch-engine": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.0.tgz", - "integrity": "sha512-OOx2Lda0DGrZ1rodADT06ZGqHzr7HY7LNMaFE2Vp8dp146uJld58sRuasdX0OiwpHgl8SqDTUKHNUyzEq7pDdQ==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.0", - "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", - "@prisma/get-platform": "6.19.0" - } - }, - "node_modules/@prisma/get-platform": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.0.tgz", - "integrity": "sha512-ym85WDO2yDhC3fIXHWYpG3kVMBA49cL1XD2GCsCF8xbwoy2OkDQY44gEbAt2X46IQ4Apq9H6g0Ex1iFfPqEkHA==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.34.47", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.47.tgz", - "integrity": "sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, - "node_modules/@smithy/abort-controller": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", - "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", - "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", - "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-base64": "^4.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", - "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.22.0.tgz", - "integrity": "sha512-6vjCHD6vaY8KubeNw2Fg3EK0KLGQYdldG4fYgQmA0xSW0dJ8G2xFhSOdrlUakWVoP5JuWHtFODg3PNd/DN3FDA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^4.2.9", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "@smithy/uuid": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", - "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.8.tgz", - "integrity": "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.12.0", - "@smithy/util-hex-encoding": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.8.tgz", - "integrity": "sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.8.tgz", - "integrity": "sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.8.tgz", - "integrity": "sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.8.tgz", - "integrity": "sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-codec": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", - "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.8", - "@smithy/querystring-builder": "^4.2.8", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-blob-browser": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.9.tgz", - "integrity": "sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/chunked-blob-reader": "^5.2.0", - "@smithy/chunked-blob-reader-native": "^4.2.1", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-node": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", - "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-stream-node": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.8.tgz", - "integrity": "sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", - "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", - "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/md5-js": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.8.tgz", - "integrity": "sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", - "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.12.tgz", - "integrity": "sha512-9JMKHVJtW9RysTNjcBZQHDwB0p3iTP6B1IfQV4m+uCevkVd/VuLgwfqk5cnI4RHcp4cPwoIvxQqN4B1sxeHo8Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.22.0", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-middleware": "^4.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "4.4.29", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.29.tgz", - "integrity": "sha512-bmTn75a4tmKRkC5w61yYQLb3DmxNzB8qSVu9SbTYqW6GAL0WXO2bDZuMAn/GJSbOdHEdjZvWxe+9Kk015bw6Cg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/service-error-classification": "^4.2.8", - "@smithy/smithy-client": "^4.11.1", - "@smithy/types": "^4.12.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/uuid": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", - "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", - "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", - "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", - "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/querystring-builder": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", - "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", - "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", - "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "@smithy/util-uri-escape": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", - "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", - "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", - "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.8.tgz", - "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-uri-escape": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.11.1.tgz", - "integrity": "sha512-SERgNg5Z1U+jfR6/2xPYjSEHY1t3pyTHC/Ma3YQl6qWtmiL42bvNId3W/oMUWIwu7ekL2FMPdqAmwbQegM7HeQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.22.0", - "@smithy/middleware-endpoint": "^4.4.12", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-stream": "^4.5.10", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", - "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", - "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-base64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", - "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", - "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", - "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", - "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", - "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.28", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.28.tgz", - "integrity": "sha512-/9zcatsCao9h6g18p/9vH9NIi5PSqhCkxQ/tb7pMgRFnqYp9XUOyOlGPDMHzr8n5ih6yYgwJEY2MLEobUgi47w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.8", - "@smithy/smithy-client": "^4.11.1", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.31", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.31.tgz", - "integrity": "sha512-JTvoApUXA5kbpceI2vuqQzRjeTbLpx1eoa5R/YEZbTgtxvIB7AQZxFJ0SEyfCpgPCyVV9IT7we+ytSeIB3CyWA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^4.4.6", - "@smithy/credential-provider-imds": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/smithy-client": "^4.11.1", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", - "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", - "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", - "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", - "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/service-error-classification": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "4.5.10", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", - "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", - "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", - "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.8.tgz", - "integrity": "sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/uuid": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", - "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/bcrypt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-6.0.0.tgz", - "integrity": "sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cookie-parser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.10.tgz", - "integrity": "sha512-B4xqkqfZ8Wek+rCOeRxsjMS9OgvzebEzzLYw7NHYuvzb7IdxOkI0ZHGgeEBX4PUM7QGVvNSK60T3OvWj3YfBRg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/cookiejar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", - "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", - "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^30.0.0", - "pretty-format": "^30.0.0" - } - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", - "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*", - "@types/node": "*" - } - }, - "node_modules/@types/methods": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mocha": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", - "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/multer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.0.0.tgz", - "integrity": "sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/superagent": { - "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", - "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/cookiejar": "^2.1.5", - "@types/methods": "^1.1.4", - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/supertest": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", - "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/methods": "^1.1.4", - "@types/superagent": "^8.1.0" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "license": "MIT" - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-jest": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", - "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "30.2.0", - "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.1", - "babel-preset-jest": "30.2.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", - "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", - "dev": true, - "license": "BSD-3-Clause", - "workspaces": [ - "test/babel-8" - ], - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", - "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/babel__core": "^7.20.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", - "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "30.2.0", - "babel-preset-current-node-syntax": "^1.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-beta.1" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.17", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", - "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/bcrypt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", - "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/body-parser/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/bowser": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", - "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/c12": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", - "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.3", - "confbox": "^0.2.2", - "defu": "^6.1.4", - "dotenv": "^16.6.1", - "exsolve": "^1.0.7", - "giget": "^2.0.0", - "jiti": "^2.4.2", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^2.2.0", - "rc9": "^2.1.2" - }, - "peerDependencies": { - "magicast": "^0.3.5" - }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } - } - }, - "node_modules/c12/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/c12/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001765", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz", - "integrity": "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/citty": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "consola": "^3.2.3" - } - }, - "node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-parser": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", - "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", - "license": "MIT", - "dependencies": { - "cookie": "0.7.2", - "cookie-signature": "1.0.6" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deepmerge-ts": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", - "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-cli": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-11.0.0.tgz", - "integrity": "sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.6", - "dotenv": "^17.1.0", - "dotenv-expand": "^12.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "dotenv": "cli.js" - } - }, - "node_modules/dotenv-cli/node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.3.tgz", - "integrity": "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==", - "license": "BSD-2-Clause", - "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/effect": { - "version": "3.18.4", - "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", - "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "fast-check": "^3.23.1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/empathic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", - "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/engine.io": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.5.tgz", - "integrity": "sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==", - "license": "MIT", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.4.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.18.3" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/exit-x": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "30.2.0", - "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-list-endpoints": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/express-list-endpoints/-/express-list-endpoints-7.1.1.tgz", - "integrity": "sha512-SA6YHH1r6DrioJ4fFJNqiwu1FweGFqJZO9KBApMzwPosoSGPOX2AW0wiMepOXjojjEXDuP9whIvckomheErbJA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/express/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/express/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/exsolve": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", - "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/fast-check": { - "version": "3.23.2", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", - "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", - "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT", - "dependencies": { - "pure-rand": "^6.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formidable": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", - "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@paralleldrive/cuid2": "^2.2.2", - "dezalgo": "^1.0.4", - "once": "^1.4.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", - "license": "ISC" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/giget": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", - "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.6", - "nypm": "^0.6.0", - "pathe": "^2.0.3" - }, - "bin": { - "giget": "dist/cli.mjs" - } - }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true, - "license": "ISC" - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-uuid": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-uuid/-/is-uuid-1.0.2.tgz", - "integrity": "sha512-tCByphFcJgf2qmiMo5hMCgNAquNSagOetVetDvBXswGkNfoyEMvGH1yDlF8cbZbKnbVBr4Y5/rlpMz9umxyBkQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", - "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "30.2.0", - "@jest/types": "30.2.0", - "import-local": "^3.2.0", - "jest-cli": "30.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", - "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.1.1", - "jest-util": "30.2.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-circus": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", - "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.2.0", - "@jest/expect": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "co": "^4.6.0", - "dedent": "^1.6.0", - "is-generator-fn": "^2.1.0", - "jest-each": "30.2.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-runtime": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "p-limit": "^3.1.0", - "pretty-format": "30.2.0", - "pure-rand": "^7.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-circus/node_modules/pure-rand": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", - "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/jest-cli": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", - "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", - "chalk": "^4.1.2", - "exit-x": "^0.2.2", - "import-local": "^3.2.0", - "jest-config": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "yargs": "^17.7.2" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", - "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/get-type": "30.1.0", - "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.2.0", - "@jest/types": "30.2.0", - "babel-jest": "30.2.0", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "deepmerge": "^4.3.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "jest-circus": "30.2.0", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-runner": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "micromatch": "^4.0.8", - "parse-json": "^5.2.0", - "pretty-format": "30.2.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "esbuild-register": ">=3.4.0", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "esbuild-register": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", - "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-each": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", - "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.2.0", - "chalk": "^4.1.2", - "jest-util": "30.2.0", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", - "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.2.0", - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "jest-mock": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", - "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "anymatch": "^3.1.3", - "fb-watchman": "^2.0.2", - "graceful-fs": "^4.2.11", - "jest-regex-util": "30.0.1", - "jest-util": "30.2.0", - "jest-worker": "30.2.0", - "micromatch": "^4.0.8", - "walker": "^1.0.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.3" - } - }, - "node_modules/jest-leak-detector": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", - "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", - "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "jest-diff": "30.2.0", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", - "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.2.0", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-mock": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", - "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "jest-util": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", - "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", - "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "slash": "^3.0.0", - "unrs-resolver": "^1.7.11" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", - "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "30.0.1", - "jest-snapshot": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runner": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", - "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.2.0", - "@jest/environment": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.2.0", - "jest-haste-map": "30.2.0", - "jest-leak-detector": "30.2.0", - "jest-message-util": "30.2.0", - "jest-resolve": "30.2.0", - "jest-runtime": "30.2.0", - "jest-util": "30.2.0", - "jest-watcher": "30.2.0", - "jest-worker": "30.2.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", - "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.2.0", - "@jest/fake-timers": "30.2.0", - "@jest/globals": "30.2.0", - "@jest/source-map": "30.0.1", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "cjs-module-lexer": "^2.1.0", - "collect-v8-coverage": "^1.0.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", - "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@babel/generator": "^7.27.5", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.2.0", - "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "babel-preset-current-node-syntax": "^1.2.0", - "chalk": "^4.1.2", - "expect": "30.2.0", - "graceful-fs": "^4.2.11", - "jest-diff": "30.2.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "pretty-format": "30.2.0", - "semver": "^7.7.2", - "synckit": "^0.11.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", - "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-validate": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", - "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.2.0", - "camelcase": "^6.3.0", - "chalk": "^4.1.2", - "leven": "^3.1.0", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", - "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "jest-util": "30.2.0", - "string-length": "^4.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-worker": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", - "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.2.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "devOptional": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "license": "MIT", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", - "license": "MIT", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.6.0", - "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">= 10.16.0" - } - }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nodemon": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", - "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nypm": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", - "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.2", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "tinyexec": "^1.0.1" - }, - "bin": { - "nypm": "dist/cli.mjs" - }, - "engines": { - "node": "^14.16.0 || >=16.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prisma": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.0.tgz", - "integrity": "sha512-F3eX7K+tWpkbhl3l4+VkFtrwJlLXbAM+f9jolgoUZbFcm1DgHZ4cq9AgVEgUym2au5Ad/TDLN8lg83D+M10ycw==", - "devOptional": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/config": "6.19.0", - "@prisma/engines": "6.19.0" - }, - "bin": { - "prisma": "build/index.js" - }, - "engines": { - "node": ">=18.18" - }, - "peerDependencies": { - "typescript": ">=5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "defu": "^6.1.4", - "destr": "^2.0.3" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/send/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/socket.io": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", - "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.4.1", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", - "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", - "license": "MIT", - "dependencies": { - "debug": "~4.4.1", - "ws": "~8.18.3" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz", - "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", - "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/superagent": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", - "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "component-emitter": "^1.3.1", - "cookiejar": "^2.1.4", - "debug": "^4.3.7", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.5", - "formidable": "^3.5.4", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.14.1" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/superstruct": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", - "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/supertest": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz", - "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cookie-signature": "^1.2.2", - "methods": "^1.1.2", - "superagent": "^10.3.0" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/supertest/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/synckit": { - "version": "0.11.12", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", - "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.9" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "license": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/ts-jest": { - "version": "29.4.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", - "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "^0.2.6", - "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.7.3", - "type-fest": "^4.41.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0 || ^30.0.0", - "@jest/types": "^29.0.0 || ^30.0.0", - "babel-jest": "^29.0.0 || ^30.0.0", - "jest": "^29.0.0 || ^30.0.0", - "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jest-util": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/mission9/package.json b/mission9/package.json deleted file mode 100644 index 435f38267..000000000 --- a/mission9/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "sprint-mission", - "version": "1.0.0", - "description": "", - "keywords": [], - "license": "ISC", - "author": "", - "main": "src/main.js", - "scripts": { - "dev": "nodemon --watch src --exec ts-node src/main.ts", - "build": "tsc -p tsconfig.build.json", - "start": "node dist/main.js", - "test": "dotenv -e .env.test -- npm run prisma:migrate && dotenv -e .env.test -- jest --runInBand", - "test:coverage": "jest --coverage", - "prisma:generate": "prisma generate", - "prisma:migrate": "prisma migrate dev", - "prisma:seed": "ts-node prisma/seed.ts" - }, - "dependencies": { - "@aws-sdk/client-s3": "^3.975.0", - "@prisma/client": "^6.19.0", - "bcrypt": "^6.0.0", - "cookie-parser": "^1.4.7", - "cors": "^2.8.5", - "dotenv": "^16.6.1", - "dotenv-cli": "^11.0.0", - "express": "^5.2.1", - "fs": "^0.0.1-security", - "is-uuid": "^1.0.2", - "jsonwebtoken": "^9.0.2", - "multer": "^2.0.2", - "socket.io": "^4.8.3", - "superstruct": "^2.0.2", - "tslib": "^2.8.1", - "uuid": "^13.0.0" - }, - "devDependencies": { - "@types/bcrypt": "^6.0.0", - "@types/cookie-parser": "^1.4.10", - "@types/cors": "^2.8.19", - "@types/express": "^5.0.6", - "@types/jest": "^30.0.0", - "@types/jsonwebtoken": "^9.0.10", - "@types/mocha": "^10.0.10", - "@types/multer": "^2.0.0", - "@types/node": "^24.10.1", - "@types/supertest": "^6.0.3", - "express-list-endpoints": "^7.1.1", - "jest": "^30.2.0", - "nodemon": "^3.1.11", - "prisma": "^6.19.0", - "supertest": "^7.2.2", - "ts-jest": "^29.4.6", - "ts-node": "^10.9.2", - "typescript": "^5.9.3" - }, - "prisma": { - "schema": "prisma/schema.prisma" - } -} diff --git a/mission9/prisma/migrations/20260119073239_add_notification/migration.sql b/mission9/prisma/migrations/20260119073239_add_notification/migration.sql deleted file mode 100644 index fc7d680ba..000000000 --- a/mission9/prisma/migrations/20260119073239_add_notification/migration.sql +++ /dev/null @@ -1,114 +0,0 @@ --- CreateTable -CREATE TABLE "Article" ( - "id" SERIAL NOT NULL, - "title" TEXT NOT NULL, - "content" TEXT NOT NULL, - "image" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "userId" INTEGER NOT NULL, - - CONSTRAINT "Article_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Product" ( - "id" SERIAL NOT NULL, - "name" TEXT NOT NULL, - "description" TEXT NOT NULL, - "price" INTEGER NOT NULL, - "tags" TEXT[], - "images" TEXT[], - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "userId" INTEGER NOT NULL, - - CONSTRAINT "Product_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Comment" ( - "id" SERIAL NOT NULL, - "content" TEXT NOT NULL, - "productId" INTEGER, - "articleId" INTEGER, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "userId" INTEGER NOT NULL, - - CONSTRAINT "Comment_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "User" ( - "id" SERIAL NOT NULL, - "email" TEXT NOT NULL, - "nickname" TEXT NOT NULL, - "image" TEXT, - "password" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "User_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Like" ( - "id" SERIAL NOT NULL, - "userId" INTEGER NOT NULL, - "productId" INTEGER, - "articleId" INTEGER, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Like_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Notification" ( - "id" SERIAL NOT NULL, - "userId" INTEGER NOT NULL, - "message" TEXT NOT NULL, - "isRead" BOOLEAN NOT NULL DEFAULT false, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Notification_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); - --- CreateIndex -CREATE UNIQUE INDEX "User_nickname_key" ON "User"("nickname"); - --- CreateIndex -CREATE UNIQUE INDEX "Like_userId_productId_key" ON "Like"("userId", "productId"); - --- CreateIndex -CREATE UNIQUE INDEX "Like_userId_articleId_key" ON "Like"("userId", "articleId"); - --- AddForeignKey -ALTER TABLE "Article" ADD CONSTRAINT "Article_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Product" ADD CONSTRAINT "Product_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Comment" ADD CONSTRAINT "Comment_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Comment" ADD CONSTRAINT "Comment_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Comment" ADD CONSTRAINT "Comment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Like" ADD CONSTRAINT "Like_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Like" ADD CONSTRAINT "Like_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Like" ADD CONSTRAINT "Like_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/mission9/prisma/migrations/migration_lock.toml b/mission9/prisma/migrations/migration_lock.toml deleted file mode 100644 index 044d57cdb..000000000 --- a/mission9/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (e.g., Git) -provider = "postgresql" diff --git a/mission9/prisma/schema.prisma b/mission9/prisma/schema.prisma deleted file mode 100644 index f78c7da69..000000000 --- a/mission9/prisma/schema.prisma +++ /dev/null @@ -1,93 +0,0 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - -// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? -// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init - -generator client { - provider = "prisma-client-js" -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -model Article { - id Int @id @default(autoincrement()) - title String - content String - image String? - articleComment Comment[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - user User @relation(fields: [userId], references: [id]) - userId Int - likes Like[] -} - -model Product { - id Int @id @default(autoincrement()) - name String - description String - price Int - tags String[] - images String[] - productComment Comment[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - user User @relation(fields: [userId], references: [id]) - userId Int - likes Like[] -} - -model Comment { - id Int @id @default(autoincrement()) - content String - product Product? @relation(fields: [productId], references: [id], onDelete: Cascade) - productId Int? - article Article? @relation(fields: [articleId], references: [id], onDelete: Cascade) - articleId Int? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - user User @relation(fields: [userId], references: [id]) - userId Int -} - -model User { - id Int @id @default(autoincrement()) - email String @unique - nickname String @unique - image String? - password String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - products Product[] - articles Article[] - comments Comment[] - likes Like[] - notifications Notification[] -} - -model Like { - id Int @id @default(autoincrement()) - user User @relation(fields: [userId], references: [id]) - userId Int - product Product? @relation(fields: [productId], references: [id], onDelete: Cascade) - productId Int? - article Article? @relation(fields: [articleId], references: [id], onDelete: Cascade) - articleId Int? - createdAt DateTime @default(now()) - - @@unique([userId, productId]) - @@unique([userId, articleId]) -} - -model Notification { - id Int @id @default(autoincrement()) - userId Int - user User @relation(fields: [userId], references: [id]) - message String - isRead Boolean @default(false) - createdAt DateTime @default(now()) -} diff --git a/mission9/public/.gitkeep b/mission9/public/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/mission9/public/socket-client-test.html b/mission9/public/socket-client-test.html deleted file mode 100644 index cdfeed825..000000000 --- a/mission9/public/socket-client-test.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - Document - - -

Socket.IO client test

-
- - -
- - - - - diff --git a/mission9/readme.md b/mission9/readme.md deleted file mode 100644 index 886574b32..000000000 --- a/mission9/readme.md +++ /dev/null @@ -1,163 +0,0 @@ -# 스프린트 미션5 - -- 미션8 소켓io를 활용한 알림 api 기능 개발 - -## 추가된 주요 기능 - -- 자신의 알림 목록 조회 -- 자신이 읽지 않은 알림 개수 조회 -- 자신의 알림 읽음 처리 -- 클라이언트 실시간 알림 기능 -- 좋아요한 상품의 가격 변동 알림 -- 자신이 작성한 게시글의 댓글 알림 - -## ERD 다이어그램 - -```mermaid -erDiagram - USER { - Int id PK - String email "UNIQUE" - String nickname "UNIQUE" - String image "nullable" - String password - DateTime createdAt - DateTime updatedAt - } - - ARTICLE { - Int id PK - String title - String content - String image "nullable" - DateTime createdAt - DateTime updatedAt - Int userId FK - } - - PRODUCT { - Int id PK - String name - String description - Int price - String[] tags - String[] images - DateTime createdAt - DateTime updatedAt - Int userId FK - } - - COMMENT { - Int id PK - String content - Int productId FK "nullable" - Int articleId FK "nullable" - DateTime createdAt - DateTime updatedAt - Int userId FK - } - - LIKE { - Int id PK - Int userId FK - Int productId FK "nullable" - Int articleId FK "nullable" - DateTime createdAt - } - - NOTIFICATION { - Int id PK - Int userId FK - String message - Boolean isRead - DateTime createdAt - } - - USER ||--o{ ARTICLE : writes - USER ||--o{ PRODUCT : sells - USER ||--o{ COMMENT : writes - USER ||--o{ LIKE : creates - USER ||--o{ NOTIFICATION : receives - - ARTICLE ||--o{ COMMENT : has - PRODUCT ||--o{ COMMENT : has - - ARTICLE ||--o{ LIKE : likedBy - PRODUCT ||--o{ LIKE : likedBy - -``` - -- 한 유저는 같은 Product/Article 에 한 번만 좋아요를 누를 수 있습니다. (unique 제약) - -## 프로젝트 구조 - -``` -mission8 -├── prisma -│ ├── migrations -│ └── schema.prisma -├── public -│ └──socket-client-test.html -├── src -│ ├── controllers -│ │ ├── articlesController.ts -│ │ ├── commentsController.ts -│ │ ├── errorController.ts -│ │ ├── imagesController.ts -│ │ ├── notificationController.ts -│ │ ├── productsController.ts -│ │ └── usersController.ts -│ │ -│ ├── lib -│ │ ├── errors -│ │ │ ├── customErrors.ts -│ │ │ └── errorUtils.ts -│ │ ├── constants.ts -│ │ ├── cookies.ts -│ │ ├── prismaClient.ts -│ │ ├── token.ts -│ │ └── withAsync.ts -│ │ -│ ├── middlewares -│ │ └── authenticate.ts -│ │ -│ ├── repositories -│ │ ├── articleRepository.ts -│ │ ├── commentRepository.ts -│ │ ├── likeRepository.ts -│ │ ├── notificationRepository.ts -│ │ ├── productRepository.ts -│ │ └── userRepository.ts -│ │ -│ ├── routers -│ │ ├── articlesRouter.ts -│ │ ├── commentsRouter.ts -│ │ ├── imagesRouter.ts -│ │ ├── notificationRepository.ts -│ │ ├── productsRouter.ts -│ │ └── usersRouter.ts -│ │ -│ ├── services -│ │ ├── articleService.ts -│ │ ├── commentService.ts -│ │ ├── imageService.ts -│ │ ├── notificationService.ts -│ │ ├── productService.ts -│ │ └── userService.ts -│ │ -│ ├── structs -│ │ ├── articlesStructs.ts -│ │ ├── commentsStructs.ts -│ │ ├── commonStructs.ts -│ │ ├── productsStructs.ts -│ │ └── usersStructs.ts -│ │ -│ ├── socket.ts -│ └── main.ts -│ -├── tests -├── types -├── package.json -├── package-lock.json -└── readme.md -``` diff --git a/mission9/src/app.ts b/mission9/src/app.ts deleted file mode 100644 index bd0bbf6e0..000000000 --- a/mission9/src/app.ts +++ /dev/null @@ -1,31 +0,0 @@ -import express from 'express'; -import cors from 'cors'; -import path from 'path'; -import { PUBLIC_PATH, STATIC_PATH } from './lib/constants'; -import articlesRouter from './routers/articlesRouter'; -import productsRouter from './routers/productsRouter'; -import commentsRouter from './routers/commentsRouter'; -import imagesRouter from './routers/imagesRouter'; -import usersRouter from './routers/usersRouter'; -import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController'; -import cookieParser from 'cookie-parser'; -import notificationRouter from './routers/notificationRouter'; - -const app = express(); - -app.use(cors()); -app.use(cookieParser()); -app.use(express.json()); -app.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH))); - -app.use('/articles', articlesRouter); -app.use('/products', productsRouter); -app.use('/comments', commentsRouter); -app.use('/images', imagesRouter); -app.use('/users', usersRouter); -app.use('/notifications', notificationRouter); - -app.use(defaultNotFoundHandler); -app.use(globalErrorHandler); - -export default app; diff --git a/mission9/src/controllers/articlesController.ts b/mission9/src/controllers/articlesController.ts deleted file mode 100644 index 688e97352..000000000 --- a/mission9/src/controllers/articlesController.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { create } from 'superstruct'; -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { IdParamsStruct } from '../structs/commonStructs'; -import { - CreateArticleBodyStruct, - UpdateArticleBodyStruct, - GetArticleListParamsStruct, -} from '../structs/articlesStructs'; -import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct'; -import { Request, Response } from 'express'; -import { articleService } from '../services/articleService'; - -//게시물 생성 -export async function createArticle(req: Request, res: Response) { - const { title, content, image } = create(req.body, CreateArticleBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const article = await articleService.createArticle(user.id, title, content, image); - return res.status(201).send(article); -} -// 게시글 조회(좋아요 포함) -export async function getArticle(req: Request, res: Response) { - const { id } = create(req.params, IdParamsStruct); - const user = req.user; - const article = await articleService.getArticle(id, user?.id); - return res.send(article); -} -//게시물 수정 -export async function updateArticle(req: Request, res: Response) { - const { id } = create(req.params, IdParamsStruct); - const data = create(req.body, UpdateArticleBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const updated = await articleService.updateArticle(id, user.id, data); - return res.send(updated); -} -//게시물 삭제 -export async function deleteArticle(req: Request, res: Response) { - const { id } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - await articleService.deleteArticle(id, user.id); - return res.status(204).send(); -} - -//게시글 목록 조회(좋아요 포함) -export async function getArticleList(req: Request, res: Response) { - const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct); - const user = req.user; - const articles = await articleService.getArticleList(page, pageSize, orderBy, keyword, user?.id); - return res.send(articles); -} -//댓글 등록 -export async function createComment(req: Request, res: Response) { - const { id: articleId } = create(req.params, IdParamsStruct); - const { content } = create(req.body, CreateCommentBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const comment = await articleService.createComment(user.id, articleId, content); - return res.status(201).send(comment); -} -//댓글 목록 조회 -export async function getCommentList(req: Request, res: Response) { - const { id: articleId } = create(req.params, IdParamsStruct); - const { cursor, limit } = create(req.query, GetCommentListParamsStruct); - const commnetsList = await articleService.getCommentList(articleId, limit, cursor); - return res.send(commnetsList); -} -//게시글 좋아요 등록 -export async function likeArticle(req: Request, res: Response) { - const { id: articleId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const articleLike = await articleService.likeArticle(user.id, articleId); - return res.status(200).send(articleLike); -} - -//게시글 좋아요 취소 -export async function unlikeArticle(req: Request, res: Response) { - const { id: articleId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const articleUnlike = await articleService.unlikeArticle(user.id, articleId); - return res.status(200).send(articleUnlike); -} diff --git a/mission9/src/controllers/commentsController.ts b/mission9/src/controllers/commentsController.ts deleted file mode 100644 index ad89524bc..000000000 --- a/mission9/src/controllers/commentsController.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { create } from 'superstruct'; -import { UpdateCommentBodyStruct } from '../structs/commentsStruct'; -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { IdParamsStruct } from '../structs/commonStructs'; -import { Request, Response } from 'express'; -import { commnetService } from '../services/commentService'; - -//댓글 수정 -export async function updateComment(req: Request, res: Response) { - const { id: commentId } = create(req.params, IdParamsStruct); - const { content } = create(req.body, UpdateCommentBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const updatedComment = await commnetService.updateComment(commentId, user.id, content); - return res.send(updatedComment); -} - -//댓글 삭제 -export async function deleteComment(req: Request, res: Response) { - const { id: commentId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - await commnetService.deleteComment(commentId, user.id); - return res.status(204).send(); -} diff --git a/mission9/src/controllers/errorController.ts b/mission9/src/controllers/errorController.ts deleted file mode 100644 index 0ebb1e34a..000000000 --- a/mission9/src/controllers/errorController.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { StructError } from 'superstruct'; -import { - NotFoundError, - BadRequestError, - ForbiddenError, - UnauthorizedError, -} from '../lib/errors/customErrors'; -import { Prisma } from '@prisma/client'; -import { Request, Response, NextFunction } from 'express'; -import { isSyntaxJsonError } from '../lib/errors/errorUtils'; - -//404 처리 미들웨어 -export function defaultNotFoundHandler(req: Request, res: Response, next: NextFunction) { - return res.status(404).send({ message: '존재하지 않습니다' }); -} -//전역 에러 처리 미들웨어(400,401,403,404,500) -export function globalErrorHandler(err: unknown, req: Request, res: Response, next: NextFunction) { - if (err instanceof StructError || err instanceof BadRequestError) { - return res.status(400).send({ message: '잘못된 요청입니다' }); - } - if (isSyntaxJsonError(err)) { - return res.status(400).send({ message: '잘못된 요청입니다' }); - } - if (err instanceof UnauthorizedError) { - return res.status(401).json({ message: err.message }); - } - if (err instanceof ForbiddenError) { - return res.status(403).json({ message: err.message }); - } - if (err instanceof NotFoundError) { - return res.status(404).send({ message: err.message }); - } - //프리즈마 코드 에러, 그 외 known 에러 500처리 - if (err instanceof Prisma.PrismaClientKnownRequestError) { - if (err.code === 'P2025') { - return res.status(404).json({ message: '존재하지 않습니다' }); - } - if (err.code === 'P2002') { - return res.status(400).json({ message: '잘못된 요청입니다' }); - } - return res.status(500).json({ message: '데이터 처리 중 오류가 발생했습니다' }); - } - - console.error(err); - return res.status(500).send({ message: '데이터 처리 중 오류가 발생했습니다' }); -} diff --git a/mission9/src/controllers/imagesController.ts b/mission9/src/controllers/imagesController.ts deleted file mode 100644 index bc067f6ef..000000000 --- a/mission9/src/controllers/imagesController.ts +++ /dev/null @@ -1,42 +0,0 @@ -import multer from 'multer'; -import path from 'path'; -import { v4 as uuidv4 } from 'uuid'; -import { PUBLIC_PATH } from '../lib/constants'; -import { BadRequestError } from '../lib/errors/customErrors'; -import { Request, Response } from 'express'; -import { imageService } from '../services/imageService'; - -const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg']; -const FILE_SIZE_LIMIT = 5 * 1024 * 1024; - -//이미지 업로드 설정 -export const upload = multer({ - storage: multer.diskStorage({ - destination(req, file, cb) { - cb(null, PUBLIC_PATH); - }, - filename(req, file, cb) { - const ext = path.extname(file.originalname); - const filename = `${uuidv4()}${ext}`; - cb(null, filename); - }, - }), - - limits: { - fileSize: FILE_SIZE_LIMIT, - }, - - fileFilter: function (req, file, cb) { - if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) { - const err = new BadRequestError('Only png, jpeg, and jpg are allowed'); - return cb(err); - } - - cb(null, true); - }, -}); -//이미지 업로드 핸들러 -export async function uploadImage(req: Request, res: Response) { - const response = imageService.buildImageUrl(req); - return res.send(response); -} diff --git a/mission9/src/controllers/notificationController.ts b/mission9/src/controllers/notificationController.ts deleted file mode 100644 index 18917a816..000000000 --- a/mission9/src/controllers/notificationController.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Request, Response } from 'express'; -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { notificationService } from '../services/notificationService'; -import { IdParamsStruct } from '../structs/commonStructs'; -import { create } from 'superstruct'; - -export async function getNotifications(req: Request, res: Response) { - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const notifications = await notificationService.getNotifications(user.id); - return res.send(notifications); -} - -export async function getUnreadCount(req: Request, res: Response) { - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const count = await notificationService.getUnreadCount(user.id); - return res.send({ count }); -} - -export async function markAsRead(req: Request, res: Response) { - const { id: notificationId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const notification = await notificationService.markAsRead(notificationId, user.id); - return res.send(notification); -} diff --git a/mission9/src/controllers/productsController.ts b/mission9/src/controllers/productsController.ts deleted file mode 100644 index de9f9f6da..000000000 --- a/mission9/src/controllers/productsController.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { create } from 'superstruct'; -import { IdParamsStruct } from '../structs/commonStructs'; -import { - CreateProductBodyStruct, - GetProductListParamsStruct, - UpdateProductBodyStruct, -} from '../structs/productsStruct'; -import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct'; -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { Request, Response } from 'express'; -import { productService } from '../services/productService'; - -//상품 등록 -export async function createProduct(req: Request, res: Response) { - const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const product = await productService.createProduct({ - name, - description, - price, - tags, - images, - userId: user.id, - }); - return res.status(201).send(product); -} -//특정 상품 조회(좋아요 포함) -export async function getProduct(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const user = req.user; - const product = await productService.getProduct(productId, user?.id); - return res.send(product); -} -//상품 수정 -export async function updateProduct(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const data = create(req.body, UpdateProductBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const updatedProduct = await productService.updateProduct(productId, user.id, data); - return res.send(updatedProduct); -} -//상품 삭제 -export async function deleteProduct(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - await productService.deleteProduct(productId, user.id); - return res.status(204).send(); -} -//상품 목록 조회(좋아요 포함) -export async function getProductList(req: Request, res: Response) { - const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct); - const user = req.user; - const products = await productService.getProductList(page, pageSize, orderBy, keyword, user?.id); - return res.send(products); -} - -//댓글 등록 -export async function createComment(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const { content } = create(req.body, CreateCommentBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const comment = await productService.createComment(user.id, productId, content); - return res.status(201).send(comment); -} -//상품 댓글 목록 조회 -export async function getCommentList(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const { cursor, limit } = create(req.query, GetCommentListParamsStruct); - const commentList = await productService.getCommentList(productId, limit, cursor); - return res.send(commentList); -} -//상품 좋아요 등록 -export async function likeProduct(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const productLike = await productService.likeProduct(user.id, productId); - return res.status(200).send(productLike); -} -//상품 좋아요 취소 -export async function unlikeProduct(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const productUnliked = await productService.unlikeProduct(user.id, productId); - return res.send(productUnliked); -} diff --git a/mission9/src/controllers/usersController.ts b/mission9/src/controllers/usersController.ts deleted file mode 100644 index fe8a9898b..000000000 --- a/mission9/src/controllers/usersController.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { - CreateUserBodyStruct, - UpdateUserBodyStruct, - LoginBodyStruct, - ChangePasswordBodyStruct, - GetMyProductListParamsStruct, - GetMyLikedProductListParamsStruct, -} from '../structs/usersStructs'; -import { create } from 'superstruct'; -import { clearTokenCookies, setTokenCookies } from '../lib/cookies'; -import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants'; -import { Request, Response } from 'express'; -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { userService } from '../services/userService'; - -//회원가입 -export async function register(req: Request, res: Response) { - const { nickname, email, password, image } = create(req.body, CreateUserBodyStruct); - const user = await userService.register(nickname, email, password, image); - return res.status(201).send(user); -} -//로그인 -export async function login(req: Request, res: Response) { - const { email, password } = create(req.body, LoginBodyStruct); - const result = await userService.login(email, password); - setTokenCookies(res, result.tokens.accessToken, result.tokens.refreshToken); - return res.status(200).send({ message: result.message }); -} -//로그아웃 -export async function logout(req: Request, res: Response) { - clearTokenCookies(res); - return res.status(200).send({ message: '로그아웃에 성공했습니다.' }); -} -//내 프로필 조회 (최근 등록한 상품 5개, 최근 좋아요한 상품 5개 포함) -export async function getProfile(req: Request, res: Response) { - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const profile = await userService.getProfile(user.id); - return res.send(profile); -} -//내 프로필 수정 -export async function updateProfile(req: Request, res: Response) { - const { nickname, email, image } = create(req.body, UpdateUserBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const update = await userService.updateProfile(user.id, nickname, email, image); - return res.send(update); -} -//내 비밀번호 변경 -export async function patchPassword(req: Request, res: Response) { - const { currentPassword, newPassword } = create(req.body, ChangePasswordBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - await userService.patchPassword(user.id, currentPassword, newPassword); - return res.status(200).send({ message: '비밀번호가 성공적으로 변경되었습니다.' }); -} -//내가 등록한 상품 목록 조회 (상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능) -export async function getMyProductList(req: Request, res: Response) { - const { page, pageSize, orderBy, keyword } = create(req.query, GetMyProductListParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const myProducts = await userService.getMyProductList(user.id, page, pageSize, orderBy, keyword); - return res.send(myProducts); -} -//토큰 갱신(리프레시) -export async function refreshToken(req: Request, res: Response) { - const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME]; - if (!refreshToken) { - throw new UnauthorizedError('리프레시 토큰이 없습니다.'); - } - const tokens = await userService.refreshToken(refreshToken); - setTokenCookies(res, tokens.accessToken, tokens.refreshToken); - return res.status(200).send({ message: '토큰이 성공적으로 갱신되었습니다.' }); -} -//내가 좋아요한 상품 목록 조회(상품이 꽤 많이 있을 경우 페이징 처리) -export async function getMyLikedProducts(req: Request, res: Response) { - const { page, pageSize, orderBy } = create(req.query, GetMyLikedProductListParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const myLikedProducts = await userService.getMyLikedProducts(user.id, page, pageSize, orderBy); - return res.send(myLikedProducts); -} diff --git a/mission9/src/lib/constants.ts b/mission9/src/lib/constants.ts deleted file mode 100644 index 51abd9949..000000000 --- a/mission9/src/lib/constants.ts +++ /dev/null @@ -1,26 +0,0 @@ -import dotenv from 'dotenv'; -dotenv.config(); - -const DATABASE_URL = process.env.DATABASE_URL; -const NODE_ENV = process.env.NODE_ENV || 'development'; -const PORT = process.env.PORT || 3000; -const PUBLIC_PATH = 'public'; -const STATIC_PATH = '/public'; -const JWT_ACCESS_TOKEN_SECRET = - process.env.JWT_ACCESS_TOKEN_SECRET || 'your_jwt_access_token_secret'; -const JWT_REFRESH_TOKEN_SECRET = - process.env.JWT_REFRESH_TOKEN_SECRET || 'your_jwt_refresh_token_secret'; -const ACCESS_TOKEN_COOKIE_NAME = 'access-token'; -const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token'; - -export { - DATABASE_URL, - NODE_ENV, - PORT, - PUBLIC_PATH, - STATIC_PATH, - JWT_ACCESS_TOKEN_SECRET, - JWT_REFRESH_TOKEN_SECRET, - ACCESS_TOKEN_COOKIE_NAME, - REFRESH_TOKEN_COOKIE_NAME, -}; diff --git a/mission9/src/lib/cookies.ts b/mission9/src/lib/cookies.ts deleted file mode 100644 index 36311f1b2..000000000 --- a/mission9/src/lib/cookies.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { NODE_ENV, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from './constants'; -import { Response } from 'express'; - -export function setTokenCookies(res: Response, accessToken: string, refreshToken: string) { - res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, { - httpOnly: true, - secure: NODE_ENV === 'production', - maxAge: 1 * 60 * 60 * 1000, // 1시간 - }); - res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, { - httpOnly: true, - secure: NODE_ENV === 'production', - maxAge: 7 * 24 * 60 * 60 * 1000, // 7일 - path: '/users/refresh', - }); -} - -export function clearTokenCookies(res: Response) { - res.clearCookie(ACCESS_TOKEN_COOKIE_NAME, { - httpOnly: true, - secure: NODE_ENV === 'production', - }); - res.clearCookie(REFRESH_TOKEN_COOKIE_NAME, { - httpOnly: true, - secure: NODE_ENV === 'production', - path: '/users/refresh', - }); -} diff --git a/mission9/src/lib/errors/customErrors.ts b/mission9/src/lib/errors/customErrors.ts deleted file mode 100644 index 8bde3cfe8..000000000 --- a/mission9/src/lib/errors/customErrors.ts +++ /dev/null @@ -1,46 +0,0 @@ -export class BaseError extends Error { - statusCode: number; - constructor(message: string, statusCode: number) { - super(message); - this.name = new.target.name; - this.statusCode = statusCode; - } -} - -export class NotFoundError extends BaseError { - constructor(message = '존재하지 않습니다') { - super(message, 404); - } -} - -export class UnauthorizedError extends BaseError { - constructor(message = '인증이 필요합니다') { - super(message, 401); - } -} - -export class BadRequestError extends BaseError { - constructor(message = '잘못된 요청입니다') { - super(message, 400); - } -} - -export class ForbiddenError extends BaseError { - constructor(message = '비밀번호가 틀렸습니다') { - super(message, 403); - } -} - -export class AlreadyLikeError extends ForbiddenError { - constructor(message = '이미 좋아요를 눌렀습니다.') { - super(message); - this.name = new.target.name; - } -} - -export class AlreadyUnlikeError extends ForbiddenError { - constructor(message = '좋아요가 존재하지 않습니다.') { - super(message); - this.name = new.target.name; - } -} diff --git a/mission9/src/lib/errors/errorUtils.ts b/mission9/src/lib/errors/errorUtils.ts deleted file mode 100644 index 55c11df26..000000000 --- a/mission9/src/lib/errors/errorUtils.ts +++ /dev/null @@ -1,13 +0,0 @@ -interface SyntaxJsonError extends SyntaxError { - status?: number; - body?: unknown; -} - -export function isSyntaxJsonError(err: unknown): err is SyntaxJsonError { - if (!(err instanceof SyntaxError)) return false; - const e = err as Partial; - return typeof e.status === 'number' && 'body' in e; -} -// Partial; -// 얘는 SyntaxJsonError의 일부 프로퍼티만 가지고 있을 수도 있어” -// 라고 TS에게 알려서 e.status, e.body 같은 속성 접근을 가능하게 해주는 장치 diff --git a/mission9/src/lib/prismaClient.ts b/mission9/src/lib/prismaClient.ts deleted file mode 100644 index 9b6c4ce30..000000000 --- a/mission9/src/lib/prismaClient.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { PrismaClient } from '@prisma/client'; - -export const prisma = new PrismaClient(); diff --git a/mission9/src/lib/token.ts b/mission9/src/lib/token.ts deleted file mode 100644 index 0e16839c3..000000000 --- a/mission9/src/lib/token.ts +++ /dev/null @@ -1,22 +0,0 @@ -import jwt, { JwtPayload } from 'jsonwebtoken'; -import { JWT_ACCESS_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET } from './constants'; - -interface TokenPayload extends JwtPayload { - id: number; -} - -export function generateToken(userId: number) { - const accessToken = jwt.sign({ id: userId }, JWT_ACCESS_TOKEN_SECRET, { expiresIn: '1h' }); - const refreshToken = jwt.sign({ id: userId }, JWT_REFRESH_TOKEN_SECRET, { expiresIn: '1d' }); - return { accessToken, refreshToken }; -} - -export function verifyAccessToken(token: string) { - const decoded = jwt.verify(token, JWT_ACCESS_TOKEN_SECRET) as TokenPayload; - return { userId: decoded.id }; -} - -export function verifyRefreshToken(token: string) { - const decoded = jwt.verify(token, JWT_REFRESH_TOKEN_SECRET) as TokenPayload; - return { userId: decoded.id }; -} diff --git a/mission9/src/lib/withAsync.ts b/mission9/src/lib/withAsync.ts deleted file mode 100644 index 500839366..000000000 --- a/mission9/src/lib/withAsync.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { Request, Response, NextFunction, RequestHandler } from 'express'; - -export function withAsync( - handler: (req: Request, res: Response, next: NextFunction) => Promise, -): RequestHandler { - return async (req, res, next) => { - try { - await handler(req, res, next); - } catch (e) { - next(e); - } - }; -} diff --git a/mission9/src/main.ts b/mission9/src/main.ts deleted file mode 100644 index 8ed2dac0e..000000000 --- a/mission9/src/main.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { createServer } from 'http'; -import app from './app'; -import { PORT } from './lib/constants'; -import { initSocket } from './socket'; - -const server = createServer(app); - -initSocket(server); - -server.listen(PORT, () => { - console.log(`Server started on port ${PORT}`); -}); diff --git a/mission9/src/middlewares/authenticate.ts b/mission9/src/middlewares/authenticate.ts deleted file mode 100644 index 5c70effec..000000000 --- a/mission9/src/middlewares/authenticate.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { prisma } from '../lib/prismaClient'; -import { verifyAccessToken } from '../lib/token'; -import { ACCESS_TOKEN_COOKIE_NAME } from '../lib/constants'; -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { NextFunction, Request, Response } from 'express'; - -function authenticate(options = { optional: false }) { - return async (req: Request, res: Response, next: NextFunction) => { - const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME]; - if (!accessToken) { - if (options.optional) { - return next(); - } - return next(new UnauthorizedError()); - } - try { - const { userId } = verifyAccessToken(accessToken); //디코딩 된 토큰에서 user id 추출 - const user = await prisma.user.findUniqueOrThrow({ where: { id: userId } }); - req.user = user; - } catch (error) { - if (options.optional) { - return next(); - } - return next(new UnauthorizedError()); - } - next(); - }; -} - -export default authenticate; diff --git a/mission9/src/repositories/articleRepository.ts b/mission9/src/repositories/articleRepository.ts deleted file mode 100644 index 3505e0393..000000000 --- a/mission9/src/repositories/articleRepository.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Prisma } from '@prisma/client'; -import { prisma } from '../lib/prismaClient'; -import { ArticleLikesAndCount } from '../../types/article'; - -export class ArticleRepository { - async create(data: Prisma.ArticleCreateInput) { - return prisma.article.create({ data }); - } - async findById(id: number) { - return prisma.article.findUniqueOrThrow({ where: { id } }); - } - async findByIdWithLikes(id: number, userId?: number): Promise { - return prisma.article.findUniqueOrThrow({ - where: { id }, - include: { - _count: { select: { likes: true } }, - likes: { - //비로그인 시 -1을 줘서 []을 뱉도록 - where: { userId: userId ?? -1 }, - select: { id: true }, - }, - }, - }); - } - async findArticleListWithLikes(params: { - skip: number; - take: number; - orderBy: Prisma.ArticleOrderByWithRelationInput; - where: Prisma.ArticleWhereInput; - userId?: number; - }): Promise { - return prisma.article.findMany({ - skip: params.skip, - take: params.take, - orderBy: params.orderBy, - where: params.where, - include: { - _count: { select: { likes: true } }, - likes: { - where: { userId: params.userId ?? -1 }, - select: { id: true }, - }, - }, - }); - } - async count(where: Prisma.ArticleWhereInput) { - return prisma.article.count({ where }); - } - async update(id: number, data: Prisma.ArticleUpdateInput) { - return prisma.article.update({ where: { id }, data }); - } - async delete(id: number) { - return prisma.article.delete({ where: { id } }); - } -} - -export const articleRepo = new ArticleRepository(); diff --git a/mission9/src/repositories/commentRepository.ts b/mission9/src/repositories/commentRepository.ts deleted file mode 100644 index cc81be921..000000000 --- a/mission9/src/repositories/commentRepository.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Prisma } from '@prisma/client'; -import { prisma } from '../lib/prismaClient'; - -export class CommentRepository { - async create(data: Prisma.CommentCreateInput) { - return prisma.comment.create({ data }); - } - async findCommentListQuery( - whereCondition: { articleId: number } | { productId: number }, - limit: number, - cursor?: number, - ) { - return prisma.comment.findMany({ - cursor: cursor ? { id: cursor } : undefined, - take: limit + 1, - where: whereCondition, - orderBy: { createdAt: 'desc' }, - }); - } - async findById(id: number) { - return prisma.comment.findUniqueOrThrow({ where: { id } }); - } - async update(id: number, content?: string) { - return prisma.comment.update({ where: { id }, data: { content } }); - } - async delete(id: number) { - return prisma.comment.delete({ where: { id } }); - } -} - -export const commentRepo = new CommentRepository(); diff --git a/mission9/src/repositories/likeRepository.ts b/mission9/src/repositories/likeRepository.ts deleted file mode 100644 index 033015eaf..000000000 --- a/mission9/src/repositories/likeRepository.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { LikeTarget } from '../../types/like'; -import { prisma } from '../lib/prismaClient'; - -class LikdeRepository { - async findLike(userId: number, target: LikeTarget) { - const whereCondition = - 'articleId' in target - ? { userId_articleId: { userId, articleId: target.articleId } } - : { userId_productId: { userId, productId: target.productId } }; - return prisma.like.findUnique({ - where: whereCondition, - }); - } - async createLike(userId: number, target: LikeTarget) { - return prisma.like.create({ data: { userId, ...target } }); - } - async deleteLike(userId: number, target: LikeTarget) { - const whereCondition = - 'articleId' in target - ? { userId_articleId: { userId, articleId: target.articleId } } - : { userId_productId: { userId, productId: target.productId } }; - return prisma.like.delete({ - where: whereCondition, - }); - } - async getLikers(target: LikeTarget) { - const whereCondition = - 'articleId' in target ? { articleId: target.articleId } : { productId: target.productId }; - return prisma.like.findMany({ - where: whereCondition, - select: { userId: true }, - }); - } -} - -export const likeRepo = new LikdeRepository(); diff --git a/mission9/src/repositories/notificationRepository.ts b/mission9/src/repositories/notificationRepository.ts deleted file mode 100644 index 945c2b5ac..000000000 --- a/mission9/src/repositories/notificationRepository.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { prisma } from '../lib/prismaClient'; - -export class NotificationRepository { - async getNotification(userId: number) { - return prisma.notification.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } }); - } - async getUnreadCount(userId: number) { - return prisma.notification.count({ where: { userId, isRead: false } }); - } - async create(userId: number, message: string) { - return prisma.notification.create({ data: { userId, message } }); - } - async findByIds(notificationId: number, userId: number) { - return prisma.notification.findFirst({ - where: { id: notificationId, userId }, - }); - } - async updateRead(notificationId: number) { - return prisma.notification.update({ - where: { id: notificationId }, - data: { isRead: true }, - }); - } -} - -export const notificationRepo = new NotificationRepository(); diff --git a/mission9/src/repositories/productRepository.ts b/mission9/src/repositories/productRepository.ts deleted file mode 100644 index a461c300b..000000000 --- a/mission9/src/repositories/productRepository.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { ProductLikesAndCount } from '../../types/product'; -import { prisma } from '../lib/prismaClient'; -import { Prisma } from '@prisma/client'; -import type { ProductRecentType } from '../../types/product'; - -class ProductRepository { - async create(data: Prisma.ProductCreateInput) { - return prisma.product.create({ data }); - } - async findById(id: number) { - return prisma.product.findUniqueOrThrow({ where: { id } }); - } - async findByIdWithLikes(id: number, userId?: number): Promise { - return prisma.product.findUniqueOrThrow({ - where: { id }, - include: { - _count: { select: { likes: true } }, - likes: { - where: { userId: userId ?? -1 }, - select: { id: true }, - }, - }, - }); - } - async update(id: number, data: Prisma.ProductUpdateInput) { - return prisma.product.update({ where: { id }, data }); - } - async delete(id: number) { - return prisma.product.delete({ where: { id } }); - } - async findProductListWithLikes(params: { - skip: number; - take: number; - orderBy: Prisma.ProductOrderByWithRelationInput; - where: Prisma.ProductWhereInput; - userId?: number; - }): Promise { - return prisma.product.findMany({ - skip: params.skip, - take: params.take, - orderBy: params.orderBy, - where: params.where, - include: { - _count: { select: { likes: true } }, - likes: { - where: { userId: params.userId ?? -1 }, - select: { id: true }, - }, - }, - }); - } - async count(where: Prisma.ProductWhereInput) { - return prisma.product.count({ where }); - } - async findRecentProduct(userId: number, limit: number, type: ProductRecentType) { - const whereCondition = type === 'myUploaded' ? { userId } : { likes: { some: { userId } } }; - return prisma.product.findMany({ - where: whereCondition, - orderBy: { createdAt: 'desc' }, - take: limit, - }); - } -} - -export const productRepo = new ProductRepository(); diff --git a/mission9/src/repositories/userRepository.ts b/mission9/src/repositories/userRepository.ts deleted file mode 100644 index 0f337d690..000000000 --- a/mission9/src/repositories/userRepository.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { prisma } from '../lib/prismaClient'; -import { Prisma } from '@prisma/client'; - -class UserRepository { - async create(data: Prisma.UserCreateInput) { - return prisma.user.create({ data }); - } - async findByEmail(email: string) { - return prisma.user.findUnique({ where: { email } }); - } - async update(id: number, data: Prisma.UserUpdateInput) { - return prisma.user.update({ where: { id }, data }); - } - async findById(id: number) { - return prisma.user.findUnique({ where: { id } }); - } -} - -export const userRepo = new UserRepository(); diff --git a/mission9/src/routers/articlesRouter.ts b/mission9/src/routers/articlesRouter.ts deleted file mode 100644 index 1b4989b36..000000000 --- a/mission9/src/routers/articlesRouter.ts +++ /dev/null @@ -1,28 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync'; -import { - createArticle, - getArticleList, - getArticle, - updateArticle, - deleteArticle, - createComment, - getCommentList, - likeArticle, - unlikeArticle, -} from '../controllers/articlesController'; -import authenticate from '../middlewares/authenticate'; - -const articlesRouter = express.Router(); - -articlesRouter.post('/', authenticate(), withAsync(createArticle)); -articlesRouter.get('/', authenticate({ optional: true }), withAsync(getArticleList)); -articlesRouter.get('/:id', authenticate({ optional: true }), withAsync(getArticle)); -articlesRouter.patch('/:id', authenticate(), withAsync(updateArticle)); -articlesRouter.delete('/:id', authenticate(), withAsync(deleteArticle)); -articlesRouter.post('/:id/comments', authenticate(), withAsync(createComment)); -articlesRouter.get('/:id/comments', withAsync(getCommentList)); -articlesRouter.post('/:id/like', authenticate(), withAsync(likeArticle)); -articlesRouter.delete('/:id/like', authenticate(), withAsync(unlikeArticle)); - -export default articlesRouter; diff --git a/mission9/src/routers/commentsRouter.ts b/mission9/src/routers/commentsRouter.ts deleted file mode 100644 index f0da623c4..000000000 --- a/mission9/src/routers/commentsRouter.ts +++ /dev/null @@ -1,11 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync'; -import { updateComment, deleteComment } from '../controllers/commentsController'; -import authenticate from '../middlewares/authenticate'; - -const commentsRouter = express.Router(); - -commentsRouter.patch('/:id', authenticate(), withAsync(updateComment)); -commentsRouter.delete('/:id', authenticate(), withAsync(deleteComment)); - -export default commentsRouter; diff --git a/mission9/src/routers/imagesRouter.ts b/mission9/src/routers/imagesRouter.ts deleted file mode 100644 index 9cd859445..000000000 --- a/mission9/src/routers/imagesRouter.ts +++ /dev/null @@ -1,9 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync'; -import { upload, uploadImage } from '../controllers/imagesController'; - -const imagesRouter = express.Router(); - -imagesRouter.post('/upload', upload.single('image'), withAsync(uploadImage)); - -export default imagesRouter; diff --git a/mission9/src/routers/notificationRouter.ts b/mission9/src/routers/notificationRouter.ts deleted file mode 100644 index 35209701a..000000000 --- a/mission9/src/routers/notificationRouter.ts +++ /dev/null @@ -1,16 +0,0 @@ -import express from 'express'; -import authenticate from '../middlewares/authenticate'; -import { withAsync } from '../lib/withAsync'; -import { - getNotifications, - getUnreadCount, - markAsRead, -} from '../controllers/notificationController'; - -const notificationRouter = express.Router(); - -notificationRouter.get('/', authenticate(), withAsync(getNotifications)); -notificationRouter.get('/unread-count', authenticate(), withAsync(getUnreadCount)); -notificationRouter.patch('/:id/read', authenticate(), withAsync(markAsRead)); - -export default notificationRouter; diff --git a/mission9/src/routers/productsRouter.ts b/mission9/src/routers/productsRouter.ts deleted file mode 100644 index f4907ccca..000000000 --- a/mission9/src/routers/productsRouter.ts +++ /dev/null @@ -1,31 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync'; -import { - createProduct, - getProduct, - updateProduct, - deleteProduct, - getProductList, - createComment, - getCommentList, - likeProduct, - unlikeProduct, -} from '../controllers/productsController'; -import authenticate from '../middlewares/authenticate'; -import { getMyLikedProducts, getMyProductList } from '../controllers/usersController'; - -const productsRouter = express.Router(); - -productsRouter.get('/me', authenticate(), withAsync(getMyProductList)); -productsRouter.get('/me/likes', authenticate(), withAsync(getMyLikedProducts)); -productsRouter.get('/', authenticate({ optional: true }), withAsync(getProductList)); -productsRouter.post('/', authenticate(), withAsync(createProduct)); -productsRouter.get('/:id', authenticate({ optional: true }), withAsync(getProduct)); -productsRouter.patch('/:id', authenticate(), withAsync(updateProduct)); -productsRouter.delete('/:id', authenticate(), withAsync(deleteProduct)); -productsRouter.post('/:id/comments', authenticate(), withAsync(createComment)); -productsRouter.get('/:id/comments', withAsync(getCommentList)); -productsRouter.post('/:id/like', authenticate(), withAsync(likeProduct)); -productsRouter.delete('/:id/like', authenticate(), withAsync(unlikeProduct)); - -export default productsRouter; diff --git a/mission9/src/routers/usersRouter.ts b/mission9/src/routers/usersRouter.ts deleted file mode 100644 index 1a4a28f8f..000000000 --- a/mission9/src/routers/usersRouter.ts +++ /dev/null @@ -1,24 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync'; -import { - register, - login, - logout, - getProfile, - patchPassword, - updateProfile, - refreshToken, -} from '../controllers/usersController'; -import authenticate from '../middlewares/authenticate'; - -const usersRouter = express.Router(); - -usersRouter.post('/register', withAsync(register)); -usersRouter.post('/login', withAsync(login)); -usersRouter.post('/logout', withAsync(logout)); -usersRouter.post('/refresh', withAsync(refreshToken)); -usersRouter.get('/me', authenticate(), withAsync(getProfile)); -usersRouter.patch('/me', authenticate(), withAsync(updateProfile)); -usersRouter.patch('/me/password', authenticate(), withAsync(patchPassword)); - -export default usersRouter; diff --git a/mission9/src/services/articleService.ts b/mission9/src/services/articleService.ts deleted file mode 100644 index 1c1e9c016..000000000 --- a/mission9/src/services/articleService.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { articleRepo } from '../repositories/articleRepository'; -import { ArticleLikesAndCount, ArticleListResponse, ArticleResponse } from '../../types/article'; -import { AlreadyLikeError, AlreadyUnlikeError, ForbiddenError } from '../lib/errors/customErrors'; -import { commentRepo } from '../repositories/commentRepository'; -import { likeRepo } from '../repositories/likeRepository'; -import { Prisma, Article, Comment } from '@prisma/client'; -import type { CursorPaginated } from '../../types/cursorPaginated'; -import { notificationService } from './notificationService'; - -//객체로 주면 콘트롤러에서 인자순서 상관없이 적용되지만, ()형태로 반환하게되면 인자순서를 서비스형태와 동일하게 넣어야 함 -export class ArticleService { - async createArticle( - userId: number, - title: string, - content: string, - image?: string | null, - ): Promise
{ - return articleRepo.create({ - title, - content, - image, - user: { connect: { id: userId } }, - }); - } - async getArticle(articleId: number, userId?: number): Promise { - const article: ArticleLikesAndCount = await articleRepo.findByIdWithLikes(articleId, userId); - const { likes, _count, ...articleData } = article; - const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined; - return { ...articleData, likeCount: _count.likes, isLiked }; - } - async updateArticle( - articleId: number, - userId: number, - data: { title?: string; content?: string; image?: string | null }, - ): Promise
{ - const article = await articleRepo.findById(articleId); - if (article.userId !== userId) { - throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.'); - } - return articleRepo.update(articleId, data); - } - async deleteArticle(articleId: number, userId: number): Promise { - const article = await articleRepo.findById(articleId); - if (article.userId !== userId) { - throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.'); - } - await articleRepo.delete(articleId); - } - async getArticleList( - page: number, - pageSize: number, - orderBy?: 'recent' | 'desc' | 'asc', - keyword?: string, - userId?: number, - ): Promise { - const where = keyword - ? { - OR: [{ title: { contains: keyword } }, { content: { contains: keyword } }], - } - : {}; - const [totalCount, articles] = await Promise.all([ - articleRepo.count(where), - articleRepo.findArticleListWithLikes({ - skip: (page - 1) * pageSize, - take: pageSize, - orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, - where, - userId, - }), - ]); - const list: ArticleResponse[] = articles.map((m) => { - const { _count, likes, ...basicArticleData } = m; - const response: ArticleResponse = { - ...basicArticleData, - likeCount: _count.likes, - }; - if (!userId) { - return response; - } - const isLiked = (likes ?? []).length > 0; - return { ...basicArticleData, isLiked, likeCount: _count.likes }; - }); - const response: ArticleListResponse = { - list, - totalCount, - }; - return response; - } - async createComment(userId: number, articleId: number, content: string): Promise { - await articleRepo.findById(articleId); - const comment = await commentRepo.create({ - content, - user: { connect: { id: userId } }, - article: { connect: { id: articleId } }, - }); - const article = await articleRepo.findById(articleId); - if (article.userId !== userId) { - await notificationService.createNotification( - article.userId, - `내 게시글 "${article.title}"에 새로운 댓글이 달렸습니다.`, - ); - } - return comment; - } - async getCommentList( - articleId: number, - limit: number, - cursor?: number, - ): Promise> { - await articleRepo.findById(articleId); - const commentsWithCursor = await commentRepo.findCommentListQuery({ articleId }, limit, cursor); - const comments = commentsWithCursor.slice(0, limit); - const cursorComment = commentsWithCursor[commentsWithCursor.length - 1]; - const nextCursor = cursorComment ? cursorComment.id : null; - return { list: comments, nextCursor }; - } - //like , unlike 둘다 message를 반환해버려서 이게..프로미스로 타입 설정하는 것이 의미가 있는지...로직 수정 생각해봐야할 듯 - async likeArticle(userId: number, articleId: number): Promise<{ message: string }> { - const article = await articleRepo.findById(articleId); - const existingLike = await likeRepo.findLike(userId, { articleId }); - if (existingLike) { - throw new AlreadyLikeError(); - } - await likeRepo.createLike(userId, { articleId }); - return { message: `${article.title}게시글에 좋아요를 눌렀습니다.` }; - } - async unlikeArticle(userId: number, articleId: number): Promise<{ message: string }> { - const article = await articleRepo.findById(articleId); - try { - await likeRepo.deleteLike(userId, { articleId }); - } catch (error: unknown) { - if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') { - throw new AlreadyUnlikeError(); - } - throw error; - } - return { message: `${article.title}게시글의 좋아요를 취소했습니다` }; - } -} -export const articleService = new ArticleService(); diff --git a/mission9/src/services/commentService.ts b/mission9/src/services/commentService.ts deleted file mode 100644 index 24581974f..000000000 --- a/mission9/src/services/commentService.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { commentRepo } from '../repositories/commentRepository'; -import { ForbiddenError } from '../lib/errors/customErrors'; -import { Comment } from '@prisma/client'; - -export class CommentService { - async updateComment(commentId: number, userId: number, content?: string): Promise { - const comment = await commentRepo.findById(commentId); - if (comment.userId !== userId) { - throw new ForbiddenError('해당 댓글을 수정할 권한이 없습니다.'); - } - return commentRepo.update(commentId, content); - } - async deleteComment(commentId: number, userId: number): Promise { - const comment = await commentRepo.findById(commentId); - if (comment.userId !== userId) { - throw new ForbiddenError('해당 댓글을 삭제할 권한이 없습니다.'); - } - await commentRepo.delete(commentId); - } -} - -export const commnetService = new CommentService(); diff --git a/mission9/src/services/imageService.ts b/mission9/src/services/imageService.ts deleted file mode 100644 index dfba8616c..000000000 --- a/mission9/src/services/imageService.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { uploadImageResponse } from '../../types/image'; -import { Request } from 'express'; -import { BadRequestError } from '../lib/errors/customErrors'; -import path from 'path'; -import { STATIC_PATH } from '../lib/constants'; - -export class ImageService { - buildImageUrl(req: Request): uploadImageResponse { - const host = req.get('host'); - if (!host) { - throw new BadRequestError('요청 헤더에 host 정보가 없습니다.'); - } - if (!req.file) { - throw new BadRequestError(); - } - const filePath = path.join(host, STATIC_PATH, req.file.filename); - const url = `http://${filePath}`; - return { url }; - } -} - -export const imageService = new ImageService(); diff --git a/mission9/src/services/notificationService.ts b/mission9/src/services/notificationService.ts deleted file mode 100644 index bff17da06..000000000 --- a/mission9/src/services/notificationService.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { notificationRepo } from '../repositories/notificationRepository'; -import { getIO } from '../socket'; -import type { Notification as PrismaNotification } from '@prisma/client'; - -export class NotificationService { - async getNotifications(userId: number): Promise { - return notificationRepo.getNotification(userId); - } - async getUnreadCount(userId: number): Promise { - return notificationRepo.getUnreadCount(userId); - } - async createNotification(userId: number, message: string): Promise { - const notification = await notificationRepo.create(userId, message); - const io = getIO(); - io.to(`user-${userId}`).emit('notification', notification); - return notification; - } - async markAsRead(notificationId: number, userId: number): Promise { - const notification = await notificationRepo.findByIds(notificationId, userId); - if (!notification) throw new UnauthorizedError(); - return notificationRepo.updateRead(notificationId); - } -} - -export const notificationService = new NotificationService(); diff --git a/mission9/src/services/productService.ts b/mission9/src/services/productService.ts deleted file mode 100644 index 922a43d57..000000000 --- a/mission9/src/services/productService.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { ProductLikesAndCount } from '../../types/product'; -import { productRepo } from '../repositories/productRepository'; -import { Product } from '@prisma/client'; -import type { ProductListResponse, ProductResponse } from '../../types/product'; -import { ForbiddenError } from '../lib/errors/customErrors'; -import { commentRepo } from '../repositories/commentRepository'; -import type { Comment } from '@prisma/client'; -import type { CursorPaginated } from '../../types/cursorPaginated'; -import { AlreadyLikeError, AlreadyUnlikeError } from '../lib/errors/customErrors'; -import { likeRepo } from '../repositories/likeRepository'; -import { Prisma } from '@prisma/client'; -import { notificationService } from './notificationService'; - -//인자 순서가 옵셔널 다음 필수파라미터가 들어오면 컴파일에러가 발생함 -//객체로 묶어 보내기, 이러면 필수인 userid의 파라미터 순서를 바꾸지 않아도 됨 -export class ProductService { - async createProduct(params: { - name: string; - description: string; - price: number; - tags?: string[]; - images?: string[]; - userId: number; - }): Promise { - const { name, description, price, tags, images, userId } = params; - return productRepo.create({ - name, - description, - price, - tags: tags ?? [], - images: images ?? [], - user: { connect: { id: userId } }, - }); - } - async getProduct(productId: number, userId?: number): Promise { - const product: ProductLikesAndCount = await productRepo.findByIdWithLikes(productId, userId); - const { likes, _count, ...productData } = product; - const baseResponse = { ...productData, likeCount: _count.likes }; - if (!userId) { - return baseResponse; - } - const isLiked = (likes?.length ?? 0) > 0; - return { ...baseResponse, isLiked }; - } - async updateProduct( - productId: number, - userId: number, - data: { - name?: string; - description?: string; - price?: number; - tags?: string[]; - images?: string[]; - }, - ): Promise { - const product = await productRepo.findById(productId); - if (product.userId !== userId) { - throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.'); - } - const updateProduct = await productRepo.update(productId, data); - //undefined가 아니면서 기존가격과 다른 경우 - if (data.price !== undefined && product.price !== data.price) { - const likers = await likeRepo.getLikers({ productId }); - for (const liker of likers) { - if (liker.userId !== userId) { - await notificationService.createNotification( - liker.userId, - `관심 상품 "${product.name}"의 가격이 변동되었습니다.`, - ); - } - } - } - return updateProduct; - } - async deleteProduct(productId: number, userId: number): Promise { - const product = await productRepo.findById(productId); - if (product.userId !== userId) { - throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.'); - } - await productRepo.delete(productId); - } - async getProductList( - page: number, - pageSize: number, - orderBy?: 'recent' | 'desc' | 'asc', - keyword?: string, - userId?: number, - ): Promise { - const where = keyword - ? { - OR: [ - { name: { contains: keyword } }, - { description: { contains: keyword } }, - { tags: { has: keyword } }, - ], - } - : {}; - const [totalCount, products] = await Promise.all([ - productRepo.count(where), - productRepo.findProductListWithLikes({ - skip: (page - 1) * pageSize, - take: pageSize, - orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, - where, - userId, - }), - ]); - const list: ProductResponse[] = products.map((m) => { - const { _count, likes, ...basicProductData } = m; - const response: ProductResponse = { - ...basicProductData, - likeCount: _count.likes, - }; - if (!userId) { - return response; - } - const isLiked = (likes ?? []).length > 0; - return { ...basicProductData, isLiked, likeCount: _count.likes }; - }); - const response: ProductListResponse = { - list, - totalCount, - }; - return response; - } - async createComment(userId: number, productId: number, content: string): Promise { - await productRepo.findById(productId); - const comment = await commentRepo.create({ - content, - user: { connect: { id: userId } }, - product: { connect: { id: productId } }, - }); - const product = await productRepo.findById(productId); - if (product.userId !== userId) { - await notificationService.createNotification( - product.userId, - `내 상품 "${product.name}"에 새로운 댓글이 달렸습니다.`, - ); - } - return comment; - } - async getCommentList( - productId: number, - limit: number, - cursor?: number, - ): Promise> { - await productRepo.findById(productId); - const commentsWithCursor = await commentRepo.findCommentListQuery({ productId }, limit, cursor); - const comments = commentsWithCursor.slice(0, limit); - const cursorComment = commentsWithCursor[commentsWithCursor.length - 1]; - const nextCursor = cursorComment ? cursorComment.id : null; - return { list: comments, nextCursor }; - } - async likeProduct(userId: number, productId: number): Promise<{ message: string }> { - const product = await productRepo.findById(productId); - const existingLike = await likeRepo.findLike(userId, { productId }); - if (existingLike) { - throw new AlreadyLikeError(); - } - await likeRepo.createLike(userId, { productId }); - return { message: `${product.name}상품에 좋아요를 눌렀습니다.` }; - } - async unlikeProduct(userId: number, productId: number): Promise<{ message: string }> { - const product = await productRepo.findById(productId); - try { - await likeRepo.deleteLike(userId, { productId }); - } catch (error: unknown) { - if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') { - throw new AlreadyUnlikeError(); - } - throw error; - } - return { message: `${product.name}상품의 좋아요를 취소했습니다` }; - } -} - -export const productService = new ProductService(); diff --git a/mission9/src/services/userService.ts b/mission9/src/services/userService.ts deleted file mode 100644 index 850dad53b..000000000 --- a/mission9/src/services/userService.ts +++ /dev/null @@ -1,212 +0,0 @@ -import bcrypt from 'bcrypt'; -import { userRepo } from '../repositories/userRepository'; -import type { Prisma, User } from '@prisma/client'; -import { ForbiddenError, UnauthorizedError } from '../lib/errors/customErrors'; -import { generateToken, verifyRefreshToken } from '../lib/token'; -import { productRepo } from '../repositories/productRepository'; -import type { ProductListResponse } from '../../types/product'; -import { ProfileResponse } from '../../types/user'; - -class UserService { - async register( - nickname: string, - email: string, - password: string, - image?: string, - ): Promise> { - const salt = await bcrypt.genSalt(10); - const hashedPassword = await bcrypt.hash(password, salt); - const user = await userRepo.create({ - nickname, - email, - password: hashedPassword, - image, - }); - const { password: _, ...userWithoutPassword } = user; - return userWithoutPassword; - } - async login( - email: string, - password: string, - ): Promise<{ tokens: { accessToken: string; refreshToken: string }; message: string }> { - const user = await userRepo.findByEmail(email); - if (!user) { - //이메일, 비밀번호 검증에 대한 에러를 같은 메세지로 던짐으로써 좀 더 방어적으로 설계 - throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.'); - } - const isPasswordValid = await bcrypt.compare(password, user.password); - if (!isPasswordValid) { - throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.'); - } - const tokens = generateToken(user.id); - return { tokens, message: '로그인에 성공했습니다.' }; - } - async getProfile(myId: number): Promise { - const user = await userRepo.findById(myId); - if (!user) throw new UnauthorizedError('사용자를 찾을 수 없습니다.'); - const { password: _, ...userInfo } = user; - const [myProductCount, myLikeProductCount, recentProductsRaw, recentLikedProductsRaw] = - await Promise.all([ - productRepo.count({ userId: myId }), - productRepo.count({ likes: { some: { userId: myId } } }), - productRepo.findProductListWithLikes({ - skip: 0, - take: 5, - orderBy: { createdAt: 'desc' }, - where: { userId: myId }, - userId: myId, - }), - productRepo.findProductListWithLikes({ - skip: 0, - take: 5, - orderBy: { createdAt: 'desc' }, - where: { likes: { some: { userId: myId } } }, - userId: myId, - }), - ]); - const myRecentProducts = recentProductsRaw.map((m) => { - const { _count, likes, ...rest } = m; - return { - ...rest, - likeCount: _count.likes, - isLiked: (likes?.length ?? 0) > 0, - }; - }); - const myRecentLikeProducts = recentLikedProductsRaw.map((m) => { - const { _count, likes, ...rest } = m; - return { - ...rest, - likeCount: _count.likes, - isLiked: (likes?.length ?? 0) > 0, - }; - }); - return { - user: userInfo, - myProducts: { - list: myRecentProducts, - totalCount: myProductCount, - }, - myLikedProducts: { - list: myRecentLikeProducts, - totalCount: myLikeProductCount, - }, - }; - } - - async updateProfile( - userId: number, - nickname?: string, - email?: string, - image?: string | null, - ): Promise> { - const data: Prisma.UserUpdateInput = {}; - if (nickname !== undefined) data.nickname = nickname; - if (email !== undefined) data.email = email; - if (image !== undefined) data.image = image; - const update = await userRepo.update(userId, data); - const { password: _, ...userWithoutPassword } = update; - return userWithoutPassword; - } - async patchPassword(userId: number, currentPassword: string, newPassword: string): Promise { - const user = await userRepo.findById(userId); - if (!user) { - throw new UnauthorizedError('사용자를 찾을 수 없습니다.'); - } - const isPasswordValid = await bcrypt.compare(currentPassword, user.password); - if (!isPasswordValid) { - throw new ForbiddenError('현재 비밀번호가 올바르지 않습니다.'); - } - const salt = await bcrypt.genSalt(10); - const hashedNewPassword = await bcrypt.hash(newPassword, salt); - await userRepo.update(userId, { password: hashedNewPassword }); - } - async getMyProductList( - myId: number, - page: number, - pageSize: number, - orderBy?: 'recent' | 'desc' | 'asc', - keyword?: string, - ): Promise { - const where = { - userId: myId, - ...(keyword - ? { - OR: [ - { name: { contains: keyword } }, - { description: { contains: keyword } }, - { tags: { has: keyword } }, - ], - } - : {}), - }; - const [totalCount, productsRaw] = await Promise.all([ - productRepo.count(where), - productRepo.findProductListWithLikes({ - skip: (page - 1) * pageSize, - take: pageSize, - orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, - where, - userId: myId, - }), - ]); - const list = productsRaw.map((m) => { - const { _count, likes, ...rest } = m; - return { - ...rest, - likeCount: _count.likes, - isLiked: (likes?.length ?? 0) > 0, - }; - }); - return { list, totalCount }; - } - async refreshToken(refreshToken: string) { - let userId: number; - try { - const payload = verifyRefreshToken(refreshToken); - userId = payload.userId; - } catch (error) { - throw new UnauthorizedError('유효하지 않은 리프레시 토큰입니다.'); - } - const user = await userRepo.findById(userId); - if (!user) { - throw new UnauthorizedError('존재하지 않는 사용자입니다.'); - } - const tokens = generateToken(user.id); - return tokens; - } - async getMyLikedProducts( - myId: number, - page: number, - pageSize: number, - orderBy?: 'recent' | 'desc' | 'asc', - ): Promise { - const where = { - likes: { - some: { - userId: myId, - }, - }, - }; - const [totalCount, productsRaw] = await Promise.all([ - productRepo.count(where), - productRepo.findProductListWithLikes({ - skip: (page - 1) * pageSize, - take: pageSize, - orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, - where, - userId: myId, - }), - ]); - const list = productsRaw.map((m) => { - const { _count, likes, ...rest } = m; - return { - ...rest, - likeCount: _count.likes, - isLiked: (likes?.length ?? 0) > 0, - }; - }); - return { list, totalCount }; - } -} - -export const userService = new UserService(); diff --git a/mission9/src/socket.ts b/mission9/src/socket.ts deleted file mode 100644 index cc35975ce..000000000 --- a/mission9/src/socket.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Server as SocketIOServer } from 'socket.io'; -import { Server as HttpServer } from 'http'; -import { verifyAccessToken } from './lib/token'; -import { UnauthorizedError } from './lib/errors/customErrors'; - -let io: SocketIOServer | null = null; - -export const initSocket = (Server: HttpServer) => { - io = new SocketIOServer(Server, { - cors: { - origin: '*', - methods: ['GET', 'POST'], - }, - }); - - io.use((socket, next) => { - try { - const token = socket.handshake.auth.accessToken; - if (!token) return next(new UnauthorizedError()); - const { userId } = verifyAccessToken(token); - if (!userId) return next(new UnauthorizedError()); - socket.data.userId = userId; - next(); - } catch (e) { - next(new UnauthorizedError()); - } - }); - - io.on('connection', (socket) => { - const userId = socket.data.userId; - console.log('User connected', socket.id); - socket.join(`user-${userId}`); - console.log(`User ${userId} joined room user-${userId}`); - }); - return io; -}; - -export const getIO = () => { - if (!io) { - throw new Error('Socket.IO 서버가 초기화되지 않았습니다.'); - } - return io; -}; diff --git a/mission9/src/structs/articlesStructs.ts b/mission9/src/structs/articlesStructs.ts deleted file mode 100644 index 3d25131b5..000000000 --- a/mission9/src/structs/articlesStructs.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { coerce, nonempty, nullable, object, partial, string } from 'superstruct'; -import { PageParamsStruct } from './commonStructs'; - -export const GetArticleListParamsStruct = PageParamsStruct; - -export const CreateArticleBodyStruct = object({ - title: coerce(nonempty(string()), string(), (value) => value.trim()), - content: nonempty(string()), - image: nullable(string()), -}); - -export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct); diff --git a/mission9/src/structs/commentsStruct.ts b/mission9/src/structs/commentsStruct.ts deleted file mode 100644 index dce57521b..000000000 --- a/mission9/src/structs/commentsStruct.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { nonempty, object, partial, string } from 'superstruct'; -import { CursorParamsStruct } from './commonStructs'; - -export const CreateCommentBodyStruct = object({ - content: nonempty(string()), -}); - -export const GetCommentListParamsStruct = CursorParamsStruct; - -export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct); diff --git a/mission9/src/structs/commonStructs.ts b/mission9/src/structs/commonStructs.ts deleted file mode 100644 index 00f563f2b..000000000 --- a/mission9/src/structs/commonStructs.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { coerce, integer, object, string, defaulted, optional, enums, nonempty } from 'superstruct'; - -const integerString = coerce(integer(), string(), (value) => parseInt(value)); - -export const IdParamsStruct = object({ - id: integerString, -}); - -export const PageParamsStruct = object({ - page: defaulted(integerString, 1), - pageSize: defaulted(integerString, 10), - orderBy: optional(enums(['recent'])), - keyword: optional(nonempty(string())), -}); - -export const CursorParamsStruct = object({ - cursor: defaulted(integerString, 0), - limit: defaulted(integerString, 10), - orderBy: optional(enums(['recent'])), - keyword: optional(nonempty(string())), -}); diff --git a/mission9/src/structs/productsStruct.ts b/mission9/src/structs/productsStruct.ts deleted file mode 100644 index 6c3f9781e..000000000 --- a/mission9/src/structs/productsStruct.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { - coerce, - partial, - object, - string, - min, - nonempty, - array, - integer, - optional, -} from 'superstruct'; -import { PageParamsStruct } from './commonStructs'; - -export const CreateProductBodyStruct = object({ - name: coerce(nonempty(string()), string(), (value) => value.trim()), - description: nonempty(string()), - price: min(integer(), 0), - tags: optional(array(string())), - images: optional(array(string())), -}); - -export const GetProductListParamsStruct = PageParamsStruct; - -export const UpdateProductBodyStruct = partial(CreateProductBodyStruct); - -export const LikeProductParamsStruct = PageParamsStruct; diff --git a/mission9/src/structs/usersStructs.ts b/mission9/src/structs/usersStructs.ts deleted file mode 100644 index 10740ff77..000000000 --- a/mission9/src/structs/usersStructs.ts +++ /dev/null @@ -1,48 +0,0 @@ -import * as s from 'superstruct'; -import { PageParamsStruct } from './commonStructs'; - -const CoercedNumber = s.coerce(s.number(), s.union([s.string(), s.number()]), (value) => - Number(value), -); -const Integer = s.refine(CoercedNumber, 'Integer', (value) => Number.isInteger(value) && value > 0); - -export const userIdStruct = s.object({ - userId: Integer, -}); -//이메일: 기본적인 이메일 형식 체크, 닉네임: 영어 + 숫자 + 한글, 2~10글자, 비밀번호: 8~16글자 -const email = s.refine(s.string(), 'Email', (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)); -const nickname = s.refine(s.string(), 'Nickname', (value) => - /^[A-Za-z0-9가-힣]{2,10}$/.test(value), -); -const password = s.refine( - s.string(), - 'Password', - (value) => value.length >= 8 && value.length <= 16, -); - -export const CreateUserBodyStruct = s.object({ - nickname: nickname, - email: email, - password: password, - image: s.optional(s.string()), -}); - -export const UpdateUserBodyStruct = s.partial(CreateUserBodyStruct); - -export const LoginBodyStruct = s.object({ - email: email, - password: password, -}); - -export const ChangePasswordBodyStruct = s.object({ - currentPassword: password, - newPassword: password, -}); - -export const RefreshTokenBodyStruct = s.object({ - refreshToken: s.string(), -}); - -export const GetMyProductListParamsStruct = PageParamsStruct; - -export const GetMyLikedProductListParamsStruct = PageParamsStruct; diff --git a/mission9/tests/articles.auth.test.ts b/mission9/tests/articles.auth.test.ts deleted file mode 100644 index 70aac9c5f..000000000 --- a/mission9/tests/articles.auth.test.ts +++ /dev/null @@ -1,170 +0,0 @@ -import request from 'supertest'; -import app from '../src/app'; -import { prisma } from '../src/lib/prismaClient'; -import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; - -jest.mock('uuid', () => ({ - v4: () => 'test-uuid', -})); - -async function registerAndLogin(email: string, nickname: string) { - const agent = request.agent(app); - await agent.post('/users/register').send({ - email, - nickname, - password: 'password1', - }); - await agent.post('/users/login').send({ - email, - password: 'password1', - }); - return agent; -} - -describe('인증이 필요한 게시글 API 통합 테스트', () => { - beforeAll(async () => { - await cleanDb(); - }); - - beforeEach(async () => { - await prisma.like.deleteMany(); - await prisma.comment.deleteMany(); - await prisma.article.deleteMany(); - await prisma.user.deleteMany(); - }); - - afterAll(async () => { - await cleanDb(); - await disconnectDb(); - }); - - describe('POST /articles', () => { - test('로그인 없이 요청하면 401을 반환한다', async () => { - const res = await request(app).post('/articles').send({ - title: 'NoAuth', - content: 'x', - image: null, - }); - expect(res.status).toBe(401); - }); - - test('로그인 상태면 201과 게시글 정보를 반환한다', async () => { - const agent = await registerAndLogin('owner-a@example.com', 'ownerA'); - const res = await agent.post('/articles').send({ - title: 'MyArticle', - content: 'content', - image: null, - }); - expect(res.status).toBe(201); - expect(res.body).toHaveProperty('id'); - expect(res.body).toHaveProperty('title', 'MyArticle'); - }); - }); - - describe('PATCH /articles/:id', () => { - test('본인 게시글이면 수정된다', async () => { - const agent = await registerAndLogin('owner-b@example.com', 'ownerB'); - const article = await prisma.article.create({ - data: { - title: 'Old', - content: 'old', - image: null, - user: { connect: { email: 'owner-b@example.com' } }, - }, - }); - const res = await agent.patch(`/articles/${article.id}`).send({ title: 'New' }); - expect(res.status).toBe(200); - expect(res.body.title).toBe('New'); - }); - - test('다른 사람 게시글이면 403을 반환한다', async () => { - await prisma.user.create({ - data: { email: 'owner-c@example.com', nickname: 'ownerC', password: 'pw' }, - }); - const article = await prisma.article.create({ - data: { - title: 'Other', - content: 'x', - image: null, - user: { connect: { email: 'owner-c@example.com' } }, - }, - }); - const agent = await registerAndLogin('user-a@example.com', 'userA'); - const res = await agent.patch(`/articles/${article.id}`).send({ title: 'Nope' }); - expect(res.status).toBe(403); - }); - }); - - describe('DELETE /articles/:id', () => { - test('본인 게시글이면 삭제된다', async () => { - const agent = await registerAndLogin('owner-d@example.com', 'ownerD'); - const article = await prisma.article.create({ - data: { - title: 'DeleteMe', - content: 'x', - image: null, - user: { connect: { email: 'owner-d@example.com' } }, - }, - }); - const res = await agent.delete(`/articles/${article.id}`); - expect(res.status).toBe(204); - }); - - test('다른 사람 게시글이면 403을 반환한다', async () => { - await prisma.user.create({ - data: { email: 'owner-e@example.com', nickname: 'ownerE', password: 'pw' }, - }); - const article = await prisma.article.create({ - data: { - title: 'Other', - content: 'x', - image: null, - user: { connect: { email: 'owner-e@example.com' } }, - }, - }); - const agent = await registerAndLogin('user-b@example.com', 'userB'); - const res = await agent.delete(`/articles/${article.id}`); - expect(res.status).toBe(403); - }); - }); - - describe('POST /articles/:id/comments', () => { - test('로그인 상태면 댓글이 등록된다', async () => { - const agent = await registerAndLogin('owner-f@example.com', 'ownerF'); - const article = await prisma.article.create({ - data: { - title: 'WithComment', - content: 'x', - image: null, - user: { connect: { email: 'owner-f@example.com' } }, - }, - }); - - const res = await agent.post(`/articles/${article.id}/comments`).send({ content: 'hello' }); - - expect(res.status).toBe(201); - expect(res.body).toHaveProperty('id'); - expect(res.body).toHaveProperty('content', 'hello'); - }); - }); - - describe('POST/DELETE /articles/:id/like', () => { - test('좋아요 등록/취소가 동작한다', async () => { - const agent = await registerAndLogin('owner-g@example.com', 'ownerG'); - const article = await prisma.article.create({ - data: { - title: 'LikeMe', - content: 'x', - image: null, - user: { connect: { email: 'owner-g@example.com' } }, - }, - }); - - const likeRes = await agent.post(`/articles/${article.id}/like`); - expect(likeRes.status).toBe(200); - - const unlikeRes = await agent.delete(`/articles/${article.id}/like`); - expect(unlikeRes.status).toBe(200); - }); - }); -}); diff --git a/mission9/tests/articles.public.test.ts b/mission9/tests/articles.public.test.ts deleted file mode 100644 index 458eca67c..000000000 --- a/mission9/tests/articles.public.test.ts +++ /dev/null @@ -1,188 +0,0 @@ -import request from 'supertest'; -import app from '../src/app'; -import { prisma } from '../src/lib/prismaClient'; -import { createSeedUser } from './utils.ts/createUser'; -import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; - -jest.mock('uuid', () => ({ - v4: () => 'test-uuid', -})); - -describe('인증이 필요하지 않은 게시글 API 통합 테스트', () => { - let ownerId: number; - - beforeAll(async () => { - await cleanDb(); - const owner = await createSeedUser(); - ownerId = owner.id; - }); - - beforeEach(async () => { - await prisma.like.deleteMany(); - await prisma.comment.deleteMany(); - await prisma.article.deleteMany(); - }); - - afterAll(async () => { - await cleanDb(); - await disconnectDb(); - }); - - describe('GET /articles (공개 조회)', () => { - it('게시글이 없으면 { list: [], totalCount: 0 }을 반환한다', async () => { - const res = await request(app).get('/articles'); - - expect(res.status).toBe(200); - expect(res.body).toEqual({ list: [], totalCount: 0 }); - }); - - it('여러 개의 게시글이 있으면 list/totalCount를 올바르게 반환한다', async () => { - await prisma.article.createMany({ - data: [ - { title: '글1', content: '내용1', image: null, userId: ownerId }, - { title: '글2', content: '내용2', image: null, userId: ownerId }, - ], - }); - - const res = await request(app) - .get('/articles') - .query({ page: 1, pageSize: 10, orderBy: 'recent' }); - - expect(res.status).toBe(200); - expect(res.body.totalCount).toBe(2); - expect(res.body.list).toHaveLength(2); - expect(res.body.list).toEqual( - expect.arrayContaining([ - expect.objectContaining({ title: '글1', content: '내용1' }), - expect.objectContaining({ title: '글2', content: '내용2' }), - ]), - ); - }); - - it('page/pageSize로 페이징이 된다', async () => { - await prisma.article.createMany({ - data: [ - { title: 'A1', content: 'C1', image: null, userId: ownerId }, - { title: 'A2', content: 'C2', image: null, userId: ownerId }, - { title: 'A3', content: 'C3', image: null, userId: ownerId }, - { title: 'A4', content: 'C4', image: null, userId: ownerId }, - { title: 'A5', content: 'C5', image: null, userId: ownerId }, - ], - }); - - const res1 = await request(app) - .get('/articles') - .query({ page: 1, pageSize: 2, orderBy: 'recent' }); - expect(res1.status).toBe(200); - expect(res1.body.totalCount).toBe(5); - expect(res1.body.list).toHaveLength(2); - - const res2 = await request(app) - .get('/articles') - .query({ page: 2, pageSize: 2, orderBy: 'recent' }); - expect(res2.status).toBe(200); - expect(res2.body.totalCount).toBe(5); - expect(res2.body.list).toHaveLength(2); - - // 실제로 다른 페이지인지 확인 - expect(res1.body.list[0].id).not.toBe(res2.body.list[0].id); - }); - - it("orderBy='asc' 같은 값은 허용되지 않아 400을 반환한다(Struct 기준)", async () => { - const res = await request(app) - .get('/articles') - .query({ page: 1, pageSize: 10, orderBy: 'asc' }); - - expect(res.status).toBe(400); - }); - - it('keyword 검색은 title/content에 매칭되면 포함된다', async () => { - await prisma.article.createMany({ - data: [ - { title: 'Apple Story', content: 'fresh', image: null, userId: ownerId }, - { title: 'Banana', content: 'yellowDescOnly', image: null, userId: ownerId }, - { title: 'Car', content: 'vehicle', image: null, userId: ownerId }, - ], - }); - - const r1 = await request(app) - .get('/articles') - .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'Apple' }); - expect(r1.status).toBe(200); - expect(r1.body.totalCount).toBe(1); - expect(r1.body.list[0].title).toContain('Apple'); - - const r2 = await request(app) - .get('/articles') - .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'yellowDescOnly' }); - expect(r2.status).toBe(200); - expect(r2.body.totalCount).toBe(1); - expect(r2.body.list[0].title).toBe('Banana'); - }); - - it('잘못된 쿼리(page가 숫자가 아님)는 400(또는 스펙 코드)을 반환한다', async () => { - const res = await request(app).get('/articles').query({ page: 'abc', pageSize: 10 }); - expect([400, 422]).toContain(res.status); - }); - }); - - describe('GET /articles/:id (공개 상세 조회)', () => { - it('ID로 게시글 상세를 반환한다', async () => { - const article = await prisma.article.create({ - data: { title: 'Detail', content: 'Detail content', image: null, userId: ownerId }, - }); - - const res = await request(app).get(`/articles/${article.id}`); - - expect(res.status).toBe(200); - expect(res.body.title).toBe('Detail'); - expect(res.body.content).toBe('Detail content'); - }); - - it('존재하지 않는 id면 404(또는 400)를 반환한다', async () => { - const res = await request(app).get('/articles/999999999'); - expect([404, 400]).toContain(res.status); - }); - }); - - describe('GET /articles/:id/comments (공개 댓글 목록 조회)', () => { - it('댓글이 없으면 빈 목록을 반환한다', async () => { - const article = await prisma.article.create({ - data: { title: 'A', content: 'C', image: null, userId: ownerId }, - }); - - const res = await request(app) - .get(`/articles/${article.id}/comments`) - .query({ cursor: 0, limit: 10 }); - - expect(res.status).toBe(200); - expect(res.body).toEqual({ list: [], nextCursor: null }); - }); - - it('cursor/limit로 페이지네이션이 된다(구현되어 있다면)', async () => { - const article = await prisma.article.create({ - data: { title: 'A', content: 'C', image: null, userId: ownerId }, - }); - - const commenter = await prisma.user.create({ - data: { email: `c+${Date.now()}@ex.com`, nickname: `c_${Date.now()}`, password: 'pw' }, - }); - - await prisma.comment.createMany({ - data: [ - { content: 'c1', articleId: article.id, userId: commenter.id }, - { content: 'c2', articleId: article.id, userId: commenter.id }, - { content: 'c3', articleId: article.id, userId: commenter.id }, - ], - }); - - const res = await request(app) - .get(`/articles/${article.id}/comments`) - .query({ cursor: 0, limit: 2 }); - - expect(res.status).toBe(200); - expect(res.body.list).toHaveLength(2); - expect(res.body.nextCursor).toBeTruthy(); - }); - }); -}); diff --git a/mission9/tests/auth.test.ts b/mission9/tests/auth.test.ts deleted file mode 100644 index 62266c90c..000000000 --- a/mission9/tests/auth.test.ts +++ /dev/null @@ -1,103 +0,0 @@ -import request from 'supertest'; -import app from '../src/app'; -import { prisma } from '../src/lib/prismaClient'; -import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; - -jest.mock('uuid', () => ({ - v4: () => 'test-uuid', -})); - -describe('인증 API 통합 테스트 (회원가입/로그인)', () => { - beforeAll(async () => { - await cleanDb(); - }); - - beforeEach(async () => { - await prisma.user.deleteMany(); - }); - - afterAll(async () => { - await cleanDb(); - await disconnectDb(); - }); - - describe('POST /users/register', () => { - test('정상 입력이면 201과 사용자 정보를 반환한다', async () => { - const res = await request(app).post('/users/register').send({ - email: 'newuser@example.com', - nickname: 'user01', - password: 'password1', - image: 'https://example.com/profile.png', - }); - - expect(res.status).toBe(201); - expect(res.body).toHaveProperty('id'); - expect(res.body).toHaveProperty('email', 'newuser@example.com'); - expect(res.body).toHaveProperty('nickname', 'user01'); - expect(res.body).not.toHaveProperty('password'); - }); - - test('이메일 형식이 틀리면 400을 반환한다', async () => { - const res = await request(app).post('/users/register').send({ - email: 'invalid-email', - nickname: 'user01', - password: 'password1', - }); - - expect(res.status).toBe(400); - }); - - test('중복 이메일이면 400을 반환한다', async () => { - await request(app).post('/users/register').send({ - email: 'dup@example.com', - nickname: 'user01', - password: 'password1', - }); - - const res = await request(app).post('/users/register').send({ - email: 'dup@example.com', - nickname: 'user02', - password: 'password1', - }); - - expect(res.status).toBe(400); - }); - }); - - describe('POST /users/login', () => { - test('올바른 이메일/비밀번호면 200과 쿠키를 반환한다', async () => { - await request(app).post('/users/register').send({ - email: 'login@example.com', - nickname: 'login01', - password: 'password1', - }); - - const res = await request(app).post('/users/login').send({ - email: 'login@example.com', - password: 'password1', - }); - - expect(res.status).toBe(200); - expect(res.body).toHaveProperty('message'); - const setCookie = res.headers['set-cookie'] ?? []; - const cookieHeader = Array.isArray(setCookie) ? setCookie.join(';') : setCookie; - expect(cookieHeader).toContain('access-token='); - expect(cookieHeader).toContain('refresh-token='); - }); - - test('잘못된 비밀번호면 401을 반환한다', async () => { - await request(app).post('/users/register').send({ - email: 'wrongpw@example.com', - nickname: 'wrongpw', - password: 'password1', - }); - - const res = await request(app).post('/users/login').send({ - email: 'wrongpw@example.com', - password: 'password2', - }); - - expect(res.status).toBe(401); - }); - }); -}); diff --git a/mission9/tests/product.service.unit.test.ts b/mission9/tests/product.service.unit.test.ts deleted file mode 100644 index 57aacc178..000000000 --- a/mission9/tests/product.service.unit.test.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { productService } from '../src/services/productService'; -import { productRepo } from '../src/repositories/productRepository'; -import { likeRepo } from '../src/repositories/likeRepository'; -import { commentRepo } from '../src/repositories/commentRepository'; -import { notificationService } from '../src/services/notificationService'; - -jest.mock('../src/repositories/productRepository', () => ({ - productRepo: { - create: jest.fn(), - findById: jest.fn(), - findByIdWithLikes: jest.fn(), - update: jest.fn(), - delete: jest.fn(), - findProductListWithLikes: jest.fn(), - count: jest.fn(), - }, -})); - -jest.mock('../src/repositories/likeRepository', () => ({ - likeRepo: { - findLike: jest.fn(), - createLike: jest.fn(), - deleteLike: jest.fn(), - getLikers: jest.fn(), - }, -})); - -jest.mock('../src/repositories/commentRepository', () => ({ - commentRepo: { - create: jest.fn(), - findCommentListQuery: jest.fn(), - }, -})); - -jest.mock('../src/services/notificationService', () => ({ - notificationService: { - createNotification: jest.fn(), - }, -})); - -const mockedProductRepo = productRepo as jest.Mocked; -const mockedLikeRepo = likeRepo as jest.Mocked; -const mockedCommentRepo = commentRepo as jest.Mocked; -const mockedNotificationService = notificationService as jest.Mocked; - -describe('ProductService (unit)', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - test('createProduct: tags/images가 없으면 빈 배열로 저장한다', async () => { - mockedProductRepo.create.mockResolvedValueOnce({ - id: 1, - name: 'P', - description: 'D', - price: 100, - tags: [], - images: [], - userId: 1, - } as any); - - await productService.createProduct({ - name: 'P', - description: 'D', - price: 100, - userId: 1, - }); - - expect(mockedProductRepo.create).toHaveBeenCalledWith({ - name: 'P', - description: 'D', - price: 100, - tags: [], - images: [], - user: { connect: { id: 1 } }, - }); - }); - - test('getProduct: 비로그인은 isLiked 키가 내려오지 않는다', async () => { - mockedProductRepo.findByIdWithLikes.mockResolvedValueOnce({ - id: 1, - name: 'P', - description: 'D', - price: 100, - tags: [], - images: [], - userId: 1, - likes: [], - _count: { likes: 0 }, - } as any); - - const res = await productService.getProduct(1); - - expect(res.likeCount).toBe(0); - expect(res).not.toHaveProperty('isLiked'); - }); - - test('updateProduct: 가격 변경 시 좋아요 누른 유저에게 알림을 보낸다', async () => { - mockedProductRepo.findById.mockResolvedValueOnce({ - id: 1, - name: 'P', - description: 'D', - price: 100, - tags: [], - images: [], - userId: 1, - } as any); - mockedProductRepo.update.mockResolvedValueOnce({ - id: 1, - name: 'P', - description: 'D', - price: 200, - tags: [], - images: [], - userId: 1, - } as any); - mockedLikeRepo.getLikers.mockResolvedValueOnce([{ userId: 2 }, { userId: 1 }]); - - await productService.updateProduct(1, 1, { price: 200 }); - - expect(mockedNotificationService.createNotification).toHaveBeenCalledTimes(1); - expect(mockedNotificationService.createNotification).toHaveBeenCalledWith( - 2, - '관심 상품 "P"의 가격이 변동되었습니다.', - ); - }); - - test('getProductList: 로그인 유저는 isLiked를 포함한다', async () => { - mockedProductRepo.count.mockResolvedValueOnce(1); - mockedProductRepo.findProductListWithLikes.mockResolvedValueOnce([ - { - id: 1, - name: 'P', - description: 'D', - price: 100, - tags: [], - images: [], - userId: 1, - likes: [{ id: 99 }], - _count: { likes: 1 }, - }, - ] as any); - - const res = await productService.getProductList(1, 10, 'recent', undefined, 1); - - expect(res.totalCount).toBe(1); - expect(res.list[0].isLiked).toBe(true); - expect(res.list[0].likeCount).toBe(1); - }); - - test('createComment: 댓글이 등록된다', async () => { - mockedProductRepo.findById.mockResolvedValue({ - id: 1, - name: 'P', - description: 'D', - price: 100, - tags: [], - images: [], - userId: 1, - } as any); - mockedCommentRepo.create.mockResolvedValueOnce({ - id: 10, - content: 'c1', - } as any); - - const res = await productService.createComment(1, 1, 'c1'); - - expect(res).toHaveProperty('id', 10); - expect(mockedCommentRepo.create).toHaveBeenCalledWith({ - content: 'c1', - user: { connect: { id: 1 } }, - product: { connect: { id: 1 } }, - }); - }); -}); diff --git a/mission9/tests/products.auth.test.ts b/mission9/tests/products.auth.test.ts deleted file mode 100644 index 89d66be78..000000000 --- a/mission9/tests/products.auth.test.ts +++ /dev/null @@ -1,254 +0,0 @@ -import request from 'supertest'; -import app from '../src/app'; -import { prisma } from '../src/lib/prismaClient'; -import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; - -jest.mock('uuid', () => ({ - v4: () => 'test-uuid', -})); - -async function registerAndLogin(email: string, nickname: string) { - const agent = request.agent(app); - await agent.post('/users/register').send({ - email, - nickname, - password: 'password1', - }); - await agent.post('/users/login').send({ - email, - password: 'password1', - }); - return agent; -} - -describe('인증이 필요한 상품 API 통합 테스트', () => { - beforeAll(async () => { - await cleanDb(); - }); - - beforeEach(async () => { - await prisma.like.deleteMany(); - await prisma.comment.deleteMany(); - await prisma.product.deleteMany(); - await prisma.user.deleteMany(); - }); - - afterAll(async () => { - await cleanDb(); - await disconnectDb(); - }); - - describe('POST /products', () => { - test('로그인 없이 요청하면 401을 반환한다', async () => { - const res = await request(app).post('/products').send({ - name: 'NoAuth', - description: 'x', - price: 100, - tags: [], - images: [], - }); - expect(res.status).toBe(401); - }); - - test('로그인 상태면 201과 상품 정보를 반환한다', async () => { - const agent = await registerAndLogin('owner@example.com', 'owner01'); - const res = await agent.post('/products').send({ - name: 'MyProduct', - description: 'desc', - price: 1000, - tags: ['t1'], - images: ['i1'], - }); - expect(res.status).toBe(201); - expect(res.body).toHaveProperty('id'); - expect(res.body).toHaveProperty('name', 'MyProduct'); - }); - }); - - describe('PATCH /products/:id', () => { - test('본인 상품이면 수정된다', async () => { - const agent = await registerAndLogin('owner2@example.com', 'owner02'); - const product = await prisma.product.create({ - data: { - name: 'Old', - description: 'old', - price: 1, - tags: [], - images: [], - user: { connect: { email: 'owner2@example.com' } }, - }, - }); - const res = await agent.patch(`/products/${product.id}`).send({ name: 'New' }); - expect(res.status).toBe(200); - expect(res.body.name).toBe('New'); - }); - - test('다른 사람 상품이면 403을 반환한다', async () => { - await prisma.user.create({ - data: { email: 'owner3@example.com', nickname: 'owner03', password: 'pw' }, - }); - const product = await prisma.product.create({ - data: { - name: 'Other', - description: 'x', - price: 1, - tags: [], - images: [], - user: { connect: { email: 'owner3@example.com' } }, - }, - }); - const agent = await registerAndLogin('user@example.com', 'user01'); - const res = await agent.patch(`/products/${product.id}`).send({ name: 'Nope' }); - expect(res.status).toBe(403); - }); - }); - - describe('DELETE /products/:id', () => { - test('본인 상품이면 삭제된다', async () => { - const agent = await registerAndLogin('owner4@example.com', 'owner04'); - const product = await prisma.product.create({ - data: { - name: 'DeleteMe', - description: 'x', - price: 1, - tags: [], - images: [], - user: { connect: { email: 'owner4@example.com' } }, - }, - }); - const res = await agent.delete(`/products/${product.id}`); - expect(res.status).toBe(204); - }); - - test('다른 사람 상품이면 403을 반환한다', async () => { - await prisma.user.create({ - data: { email: 'owner5@example.com', nickname: 'owner05', password: 'pw' }, - }); - const product = await prisma.product.create({ - data: { - name: 'Other', - description: 'x', - price: 1, - tags: [], - images: [], - user: { connect: { email: 'owner5@example.com' } }, - }, - }); - const agent = await registerAndLogin('user2@example.com', 'user02'); - const res = await agent.delete(`/products/${product.id}`); - expect(res.status).toBe(403); - }); - }); - - describe('POST /products/:id/comments', () => { - test('로그인 상태면 댓글이 등록된다', async () => { - const agent = await registerAndLogin('owner6@example.com', 'owner06'); - const product = await prisma.product.create({ - data: { - name: 'WithComment', - description: 'x', - price: 1, - tags: [], - images: [], - user: { connect: { email: 'owner6@example.com' } }, - }, - }); - - const res = await agent - .post(`/products/${product.id}/comments`) - .send({ content: 'hello' }); - - expect(res.status).toBe(201); - expect(res.body).toHaveProperty('id'); - expect(res.body).toHaveProperty('content', 'hello'); - }); - }); - - describe('POST/DELETE /products/:id/like', () => { - test('좋아요 등록/취소가 동작한다', async () => { - const agent = await registerAndLogin('owner7@example.com', 'owner07'); - const product = await prisma.product.create({ - data: { - name: 'LikeMe', - description: 'x', - price: 1, - tags: [], - images: [], - user: { connect: { email: 'owner7@example.com' } }, - }, - }); - - const likeRes = await agent.post(`/products/${product.id}/like`); - expect(likeRes.status).toBe(200); - - const unlikeRes = await agent.delete(`/products/${product.id}/like`); - expect(unlikeRes.status).toBe(200); - }); - }); - - describe('GET /products/me', () => { - test('내가 등록한 상품 목록을 반환한다', async () => { - const agent = await registerAndLogin('owner8@example.com', 'owner08'); - const owner = await prisma.user.findUnique({ - where: { email: 'owner8@example.com' }, - select: { id: true }, - }); - if (!owner) { - throw new Error('Test user not found'); - } - await prisma.product.createMany({ - data: [ - { - name: 'Mine1', - description: 'x', - price: 1, - tags: [], - images: [], - userId: owner.id, - }, - { - name: 'Mine2', - description: 'x', - price: 2, - tags: [], - images: [], - userId: owner.id, - }, - ], - }); - - const res = await agent.get('/products/me').query({ page: 1, pageSize: 10, orderBy: 'recent' }); - expect(res.status).toBe(200); - expect(res.body.totalCount).toBe(2); - expect(res.body.list).toHaveLength(2); - }); - }); - - describe('GET /products/me/likes', () => { - test('내가 좋아요한 상품 목록을 반환한다', async () => { - const agent = await registerAndLogin('owner9@example.com', 'owner09'); - const product = await prisma.product.create({ - data: { - name: 'Liked', - description: 'x', - price: 1, - tags: [], - images: [], - user: { - create: { email: 'seller@example.com', nickname: 'seller01', password: 'pw' }, - }, - }, - }); - - await agent.post(`/products/${product.id}/like`); - - const res = await agent - .get('/products/me/likes') - .query({ page: 1, pageSize: 10, orderBy: 'recent' }); - expect(res.status).toBe(200); - expect(res.body.totalCount).toBe(1); - expect(res.body.list).toHaveLength(1); - expect(res.body.list[0].id).toBe(product.id); - }); - }); -}); diff --git a/mission9/tests/products.public.test.ts b/mission9/tests/products.public.test.ts deleted file mode 100644 index f97097efa..000000000 --- a/mission9/tests/products.public.test.ts +++ /dev/null @@ -1,275 +0,0 @@ -import request from 'supertest'; -import app from '../src/app'; -import { prisma } from '../src/lib/prismaClient'; -import { createSeedUser } from './utils.ts/createUser'; -import { cleanDb, disconnectDb } from './utils.ts/cleanDb'; - -jest.mock('uuid', () => ({ - v4: () => 'test-uuid', -})); - -describe('인증이 필요하지 않은 상품 API 통합 테스트', () => { - let ownerId: number; - - beforeAll(async () => { - await cleanDb(); - const owner = await createSeedUser(); - ownerId = owner.id; - }); - - beforeEach(async () => { - await prisma.like.deleteMany(); - await prisma.comment.deleteMany(); - await prisma.product.deleteMany(); - }); - - afterAll(async () => { - await cleanDb(); - await disconnectDb(); - }); - - test('상품이 없을 때, { list: [], totalCount: 0 }을 반환한다', async () => { - const res = await request(app).get('/products'); - - expect(res.status).toBe(200); - expect(res.body).toEqual({ list: [], totalCount: 0 }); - }); - - test('여러 개의 상품이 있을 때, list/totalCount를 올바르게 반환한다', async () => { - await prisma.product.createMany({ - data: [ - { name: '상품1', price: 1000, description: '설명1', tags: [], images: [], userId: ownerId }, - { name: '상품2', price: 2000, description: '설명2', tags: [], images: [], userId: ownerId }, - ], - }); - - const res = await request(app) - .get('/products') - .query({ page: 1, pageSize: 10, orderBy: 'recent' }); - - expect(res.status).toBe(200); - expect(res.body.totalCount).toBe(2); - expect(res.body.list).toHaveLength(2); - expect(res.body.list[0]).toHaveProperty('likeCount'); - expect(res.body.list).toEqual( - expect.arrayContaining([ - expect.objectContaining({ name: '상품1', price: 1000, description: '설명1' }), - expect.objectContaining({ name: '상품2', price: 2000, description: '설명2' }), - ]), - ); - }); - - test('page/pageSize로 페이징이 된다', async () => { - await prisma.product.createMany({ - data: [ - { name: 'P1', price: 1, description: 'D1', tags: [], images: [], userId: ownerId }, - { name: 'P2', price: 2, description: 'D2', tags: [], images: [], userId: ownerId }, - { name: 'P3', price: 3, description: 'D3', tags: [], images: [], userId: ownerId }, - { name: 'P4', price: 4, description: 'D4', tags: [], images: [], userId: ownerId }, - { name: 'P5', price: 5, description: 'D5', tags: [], images: [], userId: ownerId }, - ], - }); - - const res1 = await request(app) - .get('/products') - .query({ page: 1, pageSize: 2, orderBy: 'recent' }); - expect(res1.status).toBe(200); - expect(res1.body.totalCount).toBe(5); - expect(res1.body.list).toHaveLength(2); - - const res2 = await request(app) - .get('/products') - .query({ page: 2, pageSize: 2, orderBy: 'recent' }); - expect(res2.status).toBe(200); - expect(res2.body.totalCount).toBe(5); - expect(res2.body.list).toHaveLength(2); - - const res3 = await request(app) - .get('/products') - .query({ page: 3, pageSize: 2, orderBy: 'recent' }); - expect(res3.status).toBe(200); - expect(res3.body.totalCount).toBe(5); - expect(res3.body.list).toHaveLength(1); - }); - - test('orderBy를 안 주면(기본) createdAt 오래된 순(오름차순)이다', async () => { - const oldOne = await prisma.product.create({ - data: { name: 'Old', price: 1, description: 'old', tags: [], images: [], userId: ownerId }, - }); - await new Promise((r) => setTimeout(r, 30)); - const newOne = await prisma.product.create({ - data: { name: 'New', price: 2, description: 'new', tags: [], images: [], userId: ownerId }, - }); - - const res = await request(app).get('/products').query({ page: 1, pageSize: 10 }); //orderBy 생략 - - expect(res.status).toBe(200); - expect(res.body.list[0].id).toBe(oldOne.id); - expect(res.body.list[1].id).toBe(newOne.id); - }); - - test("orderBy에 'asc' 같은 값은 허용되지 않아서 400을 반환한다", async () => { - const res = await request(app) - .get('/products') - .query({ page: 1, pageSize: 10, orderBy: 'asc' }); - - expect(res.status).toBe(400); - }); - - test('keyword 검색은 name/description/tags 중 하나라도 매칭되면 포함된다', async () => { - await prisma.product.createMany({ - data: [ - { - name: 'Apple', - price: 100, - description: 'fresh', - tags: ['fruitTagOnly'], - images: [], - userId: ownerId, - }, - { - name: 'Banana', - price: 200, - description: 'yellowDescOnly', - tags: ['tasty'], - images: [], - userId: ownerId, - }, - { - name: 'Car', - price: 300, - description: 'vehicle', - tags: ['transport'], - images: [], - userId: ownerId, - }, - ], - }); - - const r1 = await request(app) - .get('/products') - .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'App' }); - expect(r1.status).toBe(200); - expect(r1.body.totalCount).toBe(1); - expect(r1.body.list[0].name).toBe('Apple'); - - const r2 = await request(app) - .get('/products') - .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'yellowDescOnly' }); - expect(r2.status).toBe(200); - expect(r2.body.totalCount).toBe(1); - expect(r2.body.list[0].name).toBe('Banana'); - - const r3 = await request(app) - .get('/products') - .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'fruitTagOnly' }); - expect(r3.status).toBe(200); - expect(r3.body.totalCount).toBe(1); - expect(r3.body.list[0].name).toBe('Apple'); - }); - - test('공개 조회에서는 isLiked 필드가 내려오지 않는다(로그인 안 함)', async () => { - await prisma.product.create({ - data: { name: 'NoAuth', price: 10, description: 'x', tags: [], images: [], userId: ownerId }, - }); - - const res = await request(app) - .get('/products') - .query({ page: 1, pageSize: 10, orderBy: 'recent' }); - expect(res.status).toBe(200); - - // list 내 isLiked가 없어야 함 - for (const item of res.body.list) { - expect(item).not.toHaveProperty('isLiked'); - expect(item).toHaveProperty('likeCount'); - } - }); - - test('잘못된 쿼리(page가 숫자가 아님)는 400을 반환한다', async () => { - const res = await request(app).get('/products').query({ page: 'abc', pageSize: 10 }); - expect([400, 422]).toContain(res.status); - }); - - describe('GET /products/:id (공개 상세 조회)', () => { - test('ID로 상품 상세를 반환한다', async () => { - const product = await prisma.product.create({ - data: { - name: 'Detail', - description: 'Detail desc', - price: 123, - tags: [], - images: [], - userId: ownerId, - }, - }); - - const res = await request(app).get(`/products/${product.id}`); - - expect(res.status).toBe(200); - expect(res.body.name).toBe('Detail'); - expect(res.body.description).toBe('Detail desc'); - expect(res.body).toHaveProperty('likeCount'); - expect(res.body).not.toHaveProperty('isLiked'); - }); - - test('존재하지 않는 id면 404(또는 400)를 반환한다', async () => { - const res = await request(app).get('/products/999999999'); - expect([404, 400]).toContain(res.status); - }); - }); - - describe('GET /products/:id/comments (공개 댓글 목록 조회)', () => { - test('댓글이 없으면 빈 목록을 반환한다', async () => { - const product = await prisma.product.create({ - data: { - name: 'NoComment', - description: 'x', - price: 1, - tags: [], - images: [], - userId: ownerId, - }, - }); - - const res = await request(app) - .get(`/products/${product.id}/comments`) - .query({ cursor: 0, limit: 10 }); - - expect(res.status).toBe(200); - expect(res.body).toEqual({ list: [], nextCursor: null }); - }); - - test('cursor/limit로 페이지네이션이 된다', async () => { - const product = await prisma.product.create({ - data: { - name: 'WithComments', - description: 'x', - price: 1, - tags: [], - images: [], - userId: ownerId, - }, - }); - - const commenter = await prisma.user.create({ - data: { email: `c+${Date.now()}@ex.com`, nickname: `c_${Date.now()}`, password: 'pw' }, - }); - - await prisma.comment.createMany({ - data: [ - { content: 'c1', productId: product.id, userId: commenter.id }, - { content: 'c2', productId: product.id, userId: commenter.id }, - { content: 'c3', productId: product.id, userId: commenter.id }, - ], - }); - - const res = await request(app) - .get(`/products/${product.id}/comments`) - .query({ cursor: 0, limit: 2 }); - - expect(res.status).toBe(200); - expect(res.body.list).toHaveLength(2); - expect(res.body.nextCursor).toBeTruthy(); - }); - }); -}); diff --git a/mission9/tests/test.http b/mission9/tests/test.http deleted file mode 100644 index b49ae4648..000000000 --- a/mission9/tests/test.http +++ /dev/null @@ -1,210 +0,0 @@ -### Article 목록 조회하기(좋아요 포함) -GET http://localhost:3000/articles/?page=1&pageSize=3&orderBy=recent&keyword=이것은 -Accept: application/json - -### 새로운 Article 만들기 -POST http://localhost:3000/articles -Content-Type: application/json - -{ - "title": "새로운 Article2 제목입니다.", - "content": "이것은 새로운 Article의 내용입니다.", - "image": "https://example.com/image.jpg" -} - -### 특정 ID의 Article 가져오기(좋아요 포함) -GET http://localhost:3000/articles/4 -Accept: application/json - -### Article 업데이트하기 -PATCH http://localhost:3000/articles/9 -Content-Type: application/json - -{ - "title": "Article 2 업데이트", - "content": "이것은 업데이트된 내용입니다." -} - -### Article 삭제하기 -DELETE http://localhost:3000/articles/9 -Accept: application/json - -### Article에 Comment 달기 테스트 -POST http://localhost:3000/articles/1/comments -Content-Type: application/json - -{ - "content": "이것은 Article에 대한 테스트 Comment입니다." -} - -### Article의 Comment 가져오기 테스트 -GET http://localhost:3000/articles/2/comments?limit=200 -Accept: application/json - -### Comment 업데이트 테스트 -PATCH http://localhost:3000/comments/6 -Content-Type: application/json - -{ - "content": "이것은 업데이트된 테스트 Comment입니다." -} - -### Comment 삭제 테스트 -DELETE http://localhost:3000/comments/7 -Accept: application/json - -### 새로운 Product 만들기 테스트 -POST http://localhost:3000/products -Content-Type: application/json - -{ - "name": "2025년 최신형 세탁기", - "description": "신상품입니다.", - "price": 2000000, - "tags": ["세탁기"], - "images": ["image1.png", "image2.png"] -} - -### 모든 Product 가져오기 테스트 -GET http://localhost:3000/products/?page=1&pageSize=10&orderBy=recent& -Accept: application/json - -### 특정 Product 조회 (좋아요 포함) -GET http://localhost:3000/products/4 -Accept: application/json - -### Product 업데이트하기 테스트 -PATCH http://localhost:3000/products/1 -Content-Type: application/json - -{ - "name": "업데이트된 테스트 Product", - "description": "이것은 업데이트된 테스트 Product 설명입니다.", - "price": 3000000, - "tags": ["업데이트", "Product"], - "images": ["업데이트된_image1.png"] -} - -### Product 삭제하기 테스트 -DELETE http://localhost:3000/products/60 -Accept: application/json - -### Product에 Comment 달기 테스트 -POST http://localhost:3000/products/1/comments -Content-Type: application/json - -{ - "content": "이것은 Product에 대한 테스트 Comment입니다." -} - -### Product의 Comment 가져오기 테스트 -GET http://localhost:3000/products/1/comments -Accept: application/json - - -### Comment 업데이트하기 테스트 -PATCH http://localhost:3000/comments/7 -Content-Type: application/json - -{ - "content": "이것은 업데이트된 테스트 Comment입니다." -} - -### Comment 삭제하기 테스트 -DELETE http://localhost:3000/comments/4 -Accept: application/json - -### 이미지 업로드 테스트 -POST http://localhost:3000/images/upload -Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW - -------WebKitFormBoundary7MA4YWxkTrZu0gW -Content-Disposition: form-data; name="image"; filename="test.png" -Content-Type: image/png - -< ./test.png -------WebKitFormBoundary7MA4YWxkTrZu0gW-- - -### 사용자 등록 테스트 -POST http://localhost:3000/users/register -Content-Type: application/json - -{ - "email": "alstn7@gmail.com", - "password": "password123", - "nickname": "민수bingsu7" -} - -### 사용자 로그인 테스트 -POST http://localhost:3000/users/login -Content-Type: application/json - -{ - "email": "alstn6@gmail.com", - "password": "password123" -} - -### 사용자 로그아웃 테스트 -POST http://localhost:3000/users/logout - -### 사용자 정보 가져오기 테스트(최근 등록 상품 5개 포함, 최근 좋아요 상품 5개 포함) -GET http://localhost:3000/users/me -Accept: application/json - -### 사용자 정보 업데이트 테스트 -PATCH http://localhost:3000/users/me -Content-Type: application/json - -{ - "email": "chlalstn@gmail.com", - "nickname": "수정한닉네임", - "image": "https://example.com/newprofile.jpg" -} - -### 비밀번호 변경 테스트 -PATCH http://localhost:3000/users/me/password -Content-Type: application/json - -{ - "currentPassword": "password123", - "newPassword": "newpassword123" -} - -###refresh token 테스트 -POST http://localhost:3000/users/refresh - -###상품like 테스트 -POST http://localhost:3000/products/1/like -Accept: application/json - -###상품unlike 테스트 , 취소가 됐음에도 불구하고 다시 시도하는 경우 에러메세지(존재하지 않습니다) 변경 고려 -DELETE http://localhost:3000/products/35/like -Accept: application/json - -### Article like 테스트 -POST http://localhost:3000/articles/8/like -Accept: application/json - -### Article unlike 테스트 -DELETE http://localhost:3000/articles/8/like -Accept: application/json - -### 내가 좋아요한 product 목록 가져오기 테스트(상품이 꽤 많이 있을 경우 페이징 처리) -GET http://localhost:3000/products/me/likes/?page=1&pageSize=10&orderBy=recent -Accept: application/json - -### 내가 등록한 상품 목록 가져오기 테스트, &keword=세탁기(상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능) -GET http://localhost:3000/products/me/?page=1&pageSize=10&orderBy=recent -Accept: application/json - -### 알림 목록 조회 테스트 -GET http://localhost:3000/notifications -Accept: application/json - -### 안 읽은 알림 개수 조회 테스트 -GET http://localhost:3000/notifications/unread-count -Accept: application/json - -### 알림 읽음 처리 테스트 -PATCH http://localhost:3000/notifications/6/read -Accept: application/json diff --git a/mission9/tests/test.js b/mission9/tests/test.js deleted file mode 100644 index 8cd82dc8c..000000000 --- a/mission9/tests/test.js +++ /dev/null @@ -1,68 +0,0 @@ -async function bulkArticleCreate() { - for (let i = 1; i <= 100; i++) { - await fetch(`http://localhost:3000/articles`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - title: `Article ${i}`, - content: `This is the content of article ${i}.`, - image: `https://example.com/image${i}.jpg`, - }), - }); - } -} - -async function bulkArticleCommentCreate(articleId) { - for (let i = 1; i <= 100; i++) { - await fetch(`http://localhost:3000/articles/${articleId}/comments`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - content: `This is the content of article ${articleId} comment${i}.`, - }), - }); - } -} - -async function bulkProductCreate() { - for (let i = 1; i <= 100; i++) { - await fetch(`http://localhost:3000/products`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - name: `Test Product ${i}`, - description: `This is a test product description ${i}.`, - price: 100, - tags: ['test', 'product'], - images: ['image1.png', 'image2.png'], - }), - }); - } -} - -async function bulkProductCommentCreate(productId) { - for (let i = 1; i <= 100; i++) { - await fetch(`http://localhost:3000/products/${productId}/comments`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - content: `This is the content of product ${productId} comment${i}.`, - }), - }); - } -} - -bulkArticleCreate(); -bulkArticleCommentCreate(1); -bulkArticleCommentCreate(2); -bulkProductCreate(); -bulkProductCommentCreate(1); -bulkProductCommentCreate(2); diff --git a/mission9/tests/test.png b/mission9/tests/test.png deleted file mode 100644 index 35a7b5616a6b18773cb64d62627874b0bde02271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6066 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 부모" 순서로 삭제해야 함 -// 스키마 기준: Like/Notification/Comment -> Product/Article -> User -export async function cleanDb() { - await prisma.like.deleteMany(); - await prisma.notification.deleteMany(); - await prisma.comment.deleteMany(); - await prisma.product.deleteMany(); - await prisma.article.deleteMany(); - await prisma.user.deleteMany(); -} -// 테스트 종료 시 prisma 연결 종료 -export async function disconnectDb() { - await prisma.$disconnect(); -} diff --git a/mission9/tests/utils.ts/createUser.ts b/mission9/tests/utils.ts/createUser.ts deleted file mode 100644 index 2a5f37cd0..000000000 --- a/mission9/tests/utils.ts/createUser.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { prisma } from '../../src/lib/prismaClient'; - -export async function createSeedUser() { - const now = Date.now(); - return prisma.user.create({ - data: { - email: `seed+${now}@example.com`, - nickname: `seed_${now}`, - password: 'seed-password', - }, - }); -} diff --git a/mission9/tsconfig.build.json b/mission9/tsconfig.build.json deleted file mode 100644 index e4c703bb8..000000000 --- a/mission9/tsconfig.build.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "types": ["node"], - "rootDir": "./src", - "outDir": "./dist", - "noEmit": false - }, - "include": ["src"], - "exclude": ["tests", "node_modules", "dist"] -} diff --git a/mission9/tsconfig.json b/mission9/tsconfig.json deleted file mode 100644 index d9c28d604..000000000 --- a/mission9/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, - /* Modules */ - "module": "commonjs" /* Specify what module code is generated. */, - "rootDir": "." /* Allow src + tests in this tsconfig */, - "outDir": "./dist", - "baseUrl": ".", - "paths": { - "superstruct/src/*": ["node_modules/superstruct/dist/*"] - }, - "typeRoots": [ - "./types", - "./node_modules/@types" - ] /* Specify multiple folders that act like './node_modules/@types'. */, - "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, - "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, - /* Type Checking */ - "strict": true /* Enable all strict type-checking options. */, - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - }, - "include": ["src", "tests"], - "exclude": ["node_modules", "dist"] -} diff --git a/mission9/tsconfig.test.json b/mission9/tsconfig.test.json deleted file mode 100644 index fd329ed6a..000000000 --- a/mission9/tsconfig.test.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "types": ["jest", "node"], - "noEmit": true - }, - "include": ["tests", "src", "types"] -} diff --git a/mission9/types/article.d.ts b/mission9/types/article.d.ts deleted file mode 100644 index f57178922..000000000 --- a/mission9/types/article.d.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Prisma, Article, Comment } from '@prisma/client'; - -type ArticleLikesAndCount = Prisma.ArticleGetPayload<{ - include: { - _count: { - select: { - likes: true; - }; - }; - likes: { - select: { - id: true; - }; - }; - }; -}>; - -//db는 주방 냉장고, 클라이언트는 손님, dto는 서빙되는 접시(플레이팅된 요리) -//DTO 주방에서 재료를 꺼내 손님이 먹기 좋게 가공, 예쁜 그릇에 담은 상태 -//기술적인 의미로는 데이터베이스에 저장된 원본 데이터와 클라이언트가 실제로 받는 데이터의 모양이 다를때 dto사용 - -// DB/내부 모델을 ‘그대로’ 밖으로 내보내지 않고, -// 외부(프론트/외부 API)가 쓰기 좋은 모양으로 -// 한 번 가공해서 내보내는 역할을 하는 타입/객체 - -interface ArticleResponse extends Article { - likeCount: number; - isLiked?: boolean; -} - -interface ArticleListResponse { - list: ArticleResponse[]; - totalCount: number; -} diff --git a/mission9/types/cursorPaginated.d.ts b/mission9/types/cursorPaginated.d.ts deleted file mode 100644 index 1b168ea24..000000000 --- a/mission9/types/cursorPaginated.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type CursorPaginated = { - list: T[]; - nextCursor: number | null; -}; diff --git a/mission9/types/express.d.ts b/mission9/types/express.d.ts deleted file mode 100644 index 04e33bd43..000000000 --- a/mission9/types/express.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { User } from '@prisma/client'; - -declare global { - namespace Express { - interface Request { - user?: User; - } - } -} - -export {}; - -/*tsconfig에서 Include로 type경로를 지정해버리면 -실행 코드로 인식해버려 소스 코드가 되어버림, 심지어 d.ts 파일인데 import/export 구조 때문에 node가 실제 모듈처럼 취급하고 실행 경로에 영향을 줌. -실제 내가 사용하려고했던 글로벌 타입(확장)선언이 컴파일러 입장에서는 '타입이 아니고 실행모듈이네?'로 인식하게 된다는 것임. -결과적으로 내가 의도한 타입선언이 제대로 이루어지지 않은 것. -그래서 include를 제거하고 typeRoots : "./types" 해당 경로를 통하게 되면, 타입선언 전용으로만 참여하게 됨. => 정상작동*/ diff --git a/mission9/types/image.d.ts b/mission9/types/image.d.ts deleted file mode 100644 index 5045caa2d..000000000 --- a/mission9/types/image.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface uploadImageResponse { - url: string; -} diff --git a/mission9/types/like.d.ts b/mission9/types/like.d.ts deleted file mode 100644 index d2a0203d7..000000000 --- a/mission9/types/like.d.ts +++ /dev/null @@ -1 +0,0 @@ -export type LikeTarget = { articleId: number } | { productId: number }; diff --git a/mission9/types/product.d.ts b/mission9/types/product.d.ts deleted file mode 100644 index 4d483852f..000000000 --- a/mission9/types/product.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Prisma, Product } from '@prisma/client'; - -type ProductLikesAndCount = Prisma.ProductGetPayload<{ - include: { - _count: { - select: { - likes: true; - }; - }; - likes: { - select: { - id: true; - }; - }; - }; -}>; - -type ProductRecentType = 'myUploaded' | 'myliked'; - -interface ProductResponse extends Product { - likeCount: number; - isLiked?: boolean; -} - -interface ProductListResponse { - list: ProductResponse[]; - totalCount: number; -} diff --git a/mission9/types/user.d.ts b/mission9/types/user.d.ts deleted file mode 100644 index 57314d2c5..000000000 --- a/mission9/types/user.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface ProfileResponse { - user: Omit; - myProducts: { - list: ProductResponse[]; - totalCount: number; - }; - myLikedProducts: { - list: ProductResponse[]; - totalCount: number; - }; -} From 1931ab5dbe1f237c83360c30265074e1fac10830 Mon Sep 17 00:00:00 2001 From: Minsoo Choi Date: Mon, 9 Feb 2026 16:44:21 +0900 Subject: [PATCH 06/17] =?UTF-8?q?=EB=AF=B8=EC=85=9810=20=EB=A6=AC=EB=B2=A0?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=84=B8=ED=8C=85=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mission9-10-11/.env.example | 8 + mission9-10-11/.env.production.example | 11 + mission9-10-11/.env.test.example | 1 + mission9-10-11/.prettierrc | 9 + mission9-10-11/coverage/base.css | 224 + mission9-10-11/coverage/block-navigation.js | 87 + mission9-10-11/coverage/clover.xml | 6 + .../controllers/articlesController.ts.html | 376 + .../controllers/commentsController.ts.html | 172 + .../controllers/errorController.ts.html | 223 + .../controllers/imagesController.ts.html | 211 + .../coverage/controllers/index.html | 206 + .../notificationController.ts.html | 184 + .../controllers/productsController.ts.html | 394 + .../controllers/usersController.ts.html | 361 + mission9-10-11/coverage/coverage-final.json | 1 + mission9-10-11/coverage/favicon.png | Bin 0 -> 445 bytes mission9-10-11/coverage/index.html | 176 + mission9-10-11/coverage/lcov-report/base.css | 224 + .../coverage/lcov-report/block-navigation.js | 87 + .../coverage/lcov-report/favicon.png | Bin 0 -> 445 bytes .../coverage/lcov-report/index.html | 101 + .../coverage/lcov-report/prettify.css | 1 + .../coverage/lcov-report/prettify.js | 2 + .../lcov-report/sort-arrow-sprite.png | Bin 0 -> 138 bytes mission9-10-11/coverage/lcov-report/sorter.js | 210 + mission9-10-11/coverage/lcov.info | 0 mission9-10-11/coverage/lib/constants.ts.html | 163 + mission9-10-11/coverage/lib/cookies.ts.html | 169 + .../coverage/lib/errors/customErrors.ts.html | 223 + .../coverage/lib/errors/errorUtils.ts.html | 124 + mission9-10-11/coverage/lib/errors/index.html | 131 + mission9-10-11/coverage/lib/index.html | 176 + .../coverage/lib/prismaClient.ts.html | 94 + mission9-10-11/coverage/lib/token.ts.html | 151 + mission9-10-11/coverage/lib/withAsync.ts.html | 124 + .../coverage/middlewares/authenticate.ts.html | 175 + .../coverage/middlewares/index.html | 116 + mission9-10-11/coverage/prettify.css | 1 + mission9-10-11/coverage/prettify.js | 2 + .../repositories/articleRepository.ts.html | 256 + .../repositories/commentRepository.ts.html | 178 + .../coverage/repositories/index.html | 191 + .../repositories/likeRepository.ts.html | 193 + .../notificationRepository.ts.html | 163 + .../repositories/productRepository.ts.html | 280 + .../repositories/userRepository.ts.html | 142 + .../coverage/services/articleService.ts.html | 499 + .../coverage/services/commentService.ts.html | 151 + .../coverage/services/imageService.ts.html | 151 + mission9-10-11/coverage/services/index.html | 191 + .../services/notificationService.ts.html | 163 + .../coverage/services/productService.ts.html | 604 ++ .../coverage/services/userService.ts.html | 721 ++ mission9-10-11/coverage/sort-arrow-sprite.png | Bin 0 -> 138 bytes mission9-10-11/coverage/sorter.js | 210 + mission9-10-11/coverage/src/app.ts.html | 178 + .../controllers/articlesController.ts.html | 376 + .../controllers/commentsController.ts.html | 172 + .../src/controllers/errorController.ts.html | 223 + .../src/controllers/imagesController.ts.html | 211 + .../coverage/src/controllers/index.html | 176 + .../notificationController.ts.html | 184 + .../controllers/productsController.ts.html | 394 + .../src/controllers/usersController.ts.html | 361 + mission9-10-11/coverage/src/index.html | 116 + .../coverage/src/lib/constants.ts.html | 163 + .../coverage/src/lib/cookies.ts.html | 169 + .../src/lib/errors/customErrors.ts.html | 223 + .../src/lib/errors/errorUtils.ts.html | 124 + .../coverage/src/lib/errors/index.html | 131 + mission9-10-11/coverage/src/lib/index.html | 176 + .../coverage/src/lib/prismaClient.ts.html | 94 + mission9-10-11/coverage/src/lib/token.ts.html | 151 + .../coverage/src/lib/withAsync.ts.html | 124 + .../src/middlewares/authenticate.ts.html | 175 + .../coverage/src/middlewares/index.html | 116 + .../repositories/articleRepository.ts.html | 256 + .../repositories/commentRepository.ts.html | 178 + .../coverage/src/repositories/index.html | 191 + .../src/repositories/likeRepository.ts.html | 193 + .../notificationRepository.ts.html | 163 + .../repositories/productRepository.ts.html | 280 + .../src/repositories/userRepository.ts.html | 142 + .../src/routers/articlesRouter.ts.html | 169 + .../src/routers/commentsRouter.ts.html | 118 + .../coverage/src/routers/imagesRouter.ts.html | 112 + .../coverage/src/routers/index.html | 191 + .../src/routers/notificationRouter.ts.html | 133 + .../src/routers/productsRouter.ts.html | 178 + .../coverage/src/routers/usersRouter.ts.html | 157 + .../src/services/articleService.ts.html | 505 + .../src/services/commentService.ts.html | 151 + .../src/services/imageService.ts.html | 151 + .../coverage/src/services/index.html | 176 + .../src/services/notificationService.ts.html | 163 + .../src/services/productService.ts.html | 616 ++ .../coverage/src/services/userService.ts.html | 721 ++ mission9-10-11/coverage/src/socket.ts.html | 214 + .../src/structs/articlesStructs.ts.html | 121 + .../src/structs/commentsStruct.ts.html | 115 + .../src/structs/commonStructs.ts.html | 148 + .../coverage/src/structs/index.html | 176 + .../src/structs/productsStruct.ts.html | 163 + .../coverage/src/structs/usersStructs.ts.html | 229 + mission9-10-11/infra/ec2/ecosystem.config.js | 17 + mission9-10-11/infra/ec2/nginx.conf | 74 + .../infra/ec2/secure-group-inbound.png | Bin 0 -> 90868 bytes .../infra/ec2/secure-gruop-outbound.png | Bin 0 -> 65630 bytes mission9-10-11/infra/ec2/start.sh | 20 + .../infra/rds/secure-group-inbound.png | Bin 0 -> 95011 bytes .../infra/rds/secure-gruop-outbound.png | Bin 0 -> 91869 bytes mission9-10-11/infra/s3/policy.png | Bin 0 -> 208287 bytes mission9-10-11/infra/test | 0 mission9-10-11/jest.config.js | 33 + mission9-10-11/package-lock.json | 9108 +++++++++++++++++ mission9-10-11/package.json | 60 + .../migration.sql | 114 + .../prisma/migrations/migration_lock.toml | 3 + mission9-10-11/prisma/schema.prisma | 93 + mission9-10-11/public/.gitkeep | 0 .../4f3edda9-25e4-462b-b18b-a45bb5f789ca.png | Bin 0 -> 6066 bytes mission9-10-11/public/socket-client-test.html | 37 + mission9-10-11/readme.md | 163 + mission9-10-11/src/app.ts | 30 + .../src/controllers/articlesController.ts | 97 + .../src/controllers/commentsController.ts | 29 + .../src/controllers/errorController.ts | 46 + .../src/controllers/imagesController.ts | 7 + .../src/controllers/notificationController.ts | 33 + .../src/controllers/productsController.ts | 103 + .../src/controllers/usersController.ts | 92 + mission9-10-11/src/lib/constants.ts | 26 + mission9-10-11/src/lib/cookies.ts | 28 + mission9-10-11/src/lib/errors/customErrors.ts | 46 + mission9-10-11/src/lib/errors/errorUtils.ts | 13 + mission9-10-11/src/lib/prismaClient.ts | 3 + mission9-10-11/src/lib/setupStatic.ts | 8 + mission9-10-11/src/lib/token.ts | 22 + mission9-10-11/src/lib/withAsync.ts | 13 + mission9-10-11/src/main.ts | 12 + .../src/middlewares/authenticate.ts | 30 + mission9-10-11/src/middlewares/upload.ts | 44 + .../src/repositories/articleRepository.ts | 57 + .../src/repositories/commentRepository.ts | 31 + .../src/repositories/likeRepository.ts | 36 + .../repositories/notificationRepository.ts | 26 + .../src/repositories/productRepository.ts | 65 + .../src/repositories/userRepository.ts | 19 + mission9-10-11/src/routers/articlesRouter.ts | 28 + mission9-10-11/src/routers/commentsRouter.ts | 11 + mission9-10-11/src/routers/imagesRouter.ts | 10 + .../src/routers/notificationRouter.ts | 16 + mission9-10-11/src/routers/productsRouter.ts | 31 + mission9-10-11/src/routers/usersRouter.ts | 24 + mission9-10-11/src/services/articleService.ts | 140 + mission9-10-11/src/services/commentService.ts | 22 + mission9-10-11/src/services/imageService.ts | 82 + .../src/services/notificationService.ts | 26 + mission9-10-11/src/services/productService.ts | 177 + mission9-10-11/src/services/userService.ts | 212 + mission9-10-11/src/socket.ts | 43 + mission9-10-11/src/structs/articlesStructs.ts | 12 + mission9-10-11/src/structs/commentsStruct.ts | 10 + mission9-10-11/src/structs/commonStructs.ts | 21 + mission9-10-11/src/structs/productsStruct.ts | 26 + mission9-10-11/src/structs/usersStructs.ts | 48 + mission9-10-11/tests/articles.auth.test.ts | 170 + mission9-10-11/tests/articles.public.test.ts | 188 + mission9-10-11/tests/auth.test.ts | 103 + .../tests/product.service.unit.test.ts | 175 + mission9-10-11/tests/products.auth.test.ts | 254 + mission9-10-11/tests/products.public.test.ts | 275 + mission9-10-11/tests/test.http | 210 + mission9-10-11/tests/test.js | 68 + mission9-10-11/tests/test.png | Bin 0 -> 6066 bytes mission9-10-11/tests/utils/cleanDb.ts | 17 + mission9-10-11/tests/utils/createUser.ts | 12 + mission9-10-11/tsconfig.build.json | 11 + mission9-10-11/tsconfig.json | 24 + mission9-10-11/tsconfig.test.json | 8 + mission9-10-11/types/article.d.ts | 34 + mission9-10-11/types/cursorPaginated.d.ts | 4 + mission9-10-11/types/express.d.ts | 17 + mission9-10-11/types/image.d.ts | 3 + mission9-10-11/types/like.d.ts | 1 + mission9-10-11/types/multer.ts | 10 + mission9-10-11/types/product.d.ts | 28 + mission9-10-11/types/user.d.ts | 11 + 189 files changed, 32364 insertions(+) create mode 100644 mission9-10-11/.env.example create mode 100644 mission9-10-11/.env.production.example create mode 100644 mission9-10-11/.env.test.example create mode 100644 mission9-10-11/.prettierrc create mode 100644 mission9-10-11/coverage/base.css create mode 100644 mission9-10-11/coverage/block-navigation.js create mode 100644 mission9-10-11/coverage/clover.xml create mode 100644 mission9-10-11/coverage/controllers/articlesController.ts.html create mode 100644 mission9-10-11/coverage/controllers/commentsController.ts.html create mode 100644 mission9-10-11/coverage/controllers/errorController.ts.html create mode 100644 mission9-10-11/coverage/controllers/imagesController.ts.html create mode 100644 mission9-10-11/coverage/controllers/index.html create mode 100644 mission9-10-11/coverage/controllers/notificationController.ts.html create mode 100644 mission9-10-11/coverage/controllers/productsController.ts.html create mode 100644 mission9-10-11/coverage/controllers/usersController.ts.html create mode 100644 mission9-10-11/coverage/coverage-final.json create mode 100644 mission9-10-11/coverage/favicon.png create mode 100644 mission9-10-11/coverage/index.html create mode 100644 mission9-10-11/coverage/lcov-report/base.css create mode 100644 mission9-10-11/coverage/lcov-report/block-navigation.js create mode 100644 mission9-10-11/coverage/lcov-report/favicon.png create mode 100644 mission9-10-11/coverage/lcov-report/index.html create mode 100644 mission9-10-11/coverage/lcov-report/prettify.css create mode 100644 mission9-10-11/coverage/lcov-report/prettify.js create mode 100644 mission9-10-11/coverage/lcov-report/sort-arrow-sprite.png create mode 100644 mission9-10-11/coverage/lcov-report/sorter.js create mode 100644 mission9-10-11/coverage/lcov.info create mode 100644 mission9-10-11/coverage/lib/constants.ts.html create mode 100644 mission9-10-11/coverage/lib/cookies.ts.html create mode 100644 mission9-10-11/coverage/lib/errors/customErrors.ts.html create mode 100644 mission9-10-11/coverage/lib/errors/errorUtils.ts.html create mode 100644 mission9-10-11/coverage/lib/errors/index.html create mode 100644 mission9-10-11/coverage/lib/index.html create mode 100644 mission9-10-11/coverage/lib/prismaClient.ts.html create mode 100644 mission9-10-11/coverage/lib/token.ts.html create mode 100644 mission9-10-11/coverage/lib/withAsync.ts.html create mode 100644 mission9-10-11/coverage/middlewares/authenticate.ts.html create mode 100644 mission9-10-11/coverage/middlewares/index.html create mode 100644 mission9-10-11/coverage/prettify.css create mode 100644 mission9-10-11/coverage/prettify.js create mode 100644 mission9-10-11/coverage/repositories/articleRepository.ts.html create mode 100644 mission9-10-11/coverage/repositories/commentRepository.ts.html create mode 100644 mission9-10-11/coverage/repositories/index.html create mode 100644 mission9-10-11/coverage/repositories/likeRepository.ts.html create mode 100644 mission9-10-11/coverage/repositories/notificationRepository.ts.html create mode 100644 mission9-10-11/coverage/repositories/productRepository.ts.html create mode 100644 mission9-10-11/coverage/repositories/userRepository.ts.html create mode 100644 mission9-10-11/coverage/services/articleService.ts.html create mode 100644 mission9-10-11/coverage/services/commentService.ts.html create mode 100644 mission9-10-11/coverage/services/imageService.ts.html create mode 100644 mission9-10-11/coverage/services/index.html create mode 100644 mission9-10-11/coverage/services/notificationService.ts.html create mode 100644 mission9-10-11/coverage/services/productService.ts.html create mode 100644 mission9-10-11/coverage/services/userService.ts.html create mode 100644 mission9-10-11/coverage/sort-arrow-sprite.png create mode 100644 mission9-10-11/coverage/sorter.js create mode 100644 mission9-10-11/coverage/src/app.ts.html create mode 100644 mission9-10-11/coverage/src/controllers/articlesController.ts.html create mode 100644 mission9-10-11/coverage/src/controllers/commentsController.ts.html create mode 100644 mission9-10-11/coverage/src/controllers/errorController.ts.html create mode 100644 mission9-10-11/coverage/src/controllers/imagesController.ts.html create mode 100644 mission9-10-11/coverage/src/controllers/index.html create mode 100644 mission9-10-11/coverage/src/controllers/notificationController.ts.html create mode 100644 mission9-10-11/coverage/src/controllers/productsController.ts.html create mode 100644 mission9-10-11/coverage/src/controllers/usersController.ts.html create mode 100644 mission9-10-11/coverage/src/index.html create mode 100644 mission9-10-11/coverage/src/lib/constants.ts.html create mode 100644 mission9-10-11/coverage/src/lib/cookies.ts.html create mode 100644 mission9-10-11/coverage/src/lib/errors/customErrors.ts.html create mode 100644 mission9-10-11/coverage/src/lib/errors/errorUtils.ts.html create mode 100644 mission9-10-11/coverage/src/lib/errors/index.html create mode 100644 mission9-10-11/coverage/src/lib/index.html create mode 100644 mission9-10-11/coverage/src/lib/prismaClient.ts.html create mode 100644 mission9-10-11/coverage/src/lib/token.ts.html create mode 100644 mission9-10-11/coverage/src/lib/withAsync.ts.html create mode 100644 mission9-10-11/coverage/src/middlewares/authenticate.ts.html create mode 100644 mission9-10-11/coverage/src/middlewares/index.html create mode 100644 mission9-10-11/coverage/src/repositories/articleRepository.ts.html create mode 100644 mission9-10-11/coverage/src/repositories/commentRepository.ts.html create mode 100644 mission9-10-11/coverage/src/repositories/index.html create mode 100644 mission9-10-11/coverage/src/repositories/likeRepository.ts.html create mode 100644 mission9-10-11/coverage/src/repositories/notificationRepository.ts.html create mode 100644 mission9-10-11/coverage/src/repositories/productRepository.ts.html create mode 100644 mission9-10-11/coverage/src/repositories/userRepository.ts.html create mode 100644 mission9-10-11/coverage/src/routers/articlesRouter.ts.html create mode 100644 mission9-10-11/coverage/src/routers/commentsRouter.ts.html create mode 100644 mission9-10-11/coverage/src/routers/imagesRouter.ts.html create mode 100644 mission9-10-11/coverage/src/routers/index.html create mode 100644 mission9-10-11/coverage/src/routers/notificationRouter.ts.html create mode 100644 mission9-10-11/coverage/src/routers/productsRouter.ts.html create mode 100644 mission9-10-11/coverage/src/routers/usersRouter.ts.html create mode 100644 mission9-10-11/coverage/src/services/articleService.ts.html create mode 100644 mission9-10-11/coverage/src/services/commentService.ts.html create mode 100644 mission9-10-11/coverage/src/services/imageService.ts.html create mode 100644 mission9-10-11/coverage/src/services/index.html create mode 100644 mission9-10-11/coverage/src/services/notificationService.ts.html create mode 100644 mission9-10-11/coverage/src/services/productService.ts.html create mode 100644 mission9-10-11/coverage/src/services/userService.ts.html create mode 100644 mission9-10-11/coverage/src/socket.ts.html create mode 100644 mission9-10-11/coverage/src/structs/articlesStructs.ts.html create mode 100644 mission9-10-11/coverage/src/structs/commentsStruct.ts.html create mode 100644 mission9-10-11/coverage/src/structs/commonStructs.ts.html create mode 100644 mission9-10-11/coverage/src/structs/index.html create mode 100644 mission9-10-11/coverage/src/structs/productsStruct.ts.html create mode 100644 mission9-10-11/coverage/src/structs/usersStructs.ts.html create mode 100644 mission9-10-11/infra/ec2/ecosystem.config.js create mode 100644 mission9-10-11/infra/ec2/nginx.conf create mode 100644 mission9-10-11/infra/ec2/secure-group-inbound.png create mode 100644 mission9-10-11/infra/ec2/secure-gruop-outbound.png create mode 100644 mission9-10-11/infra/ec2/start.sh create mode 100644 mission9-10-11/infra/rds/secure-group-inbound.png create mode 100644 mission9-10-11/infra/rds/secure-gruop-outbound.png create mode 100644 mission9-10-11/infra/s3/policy.png create mode 100644 mission9-10-11/infra/test create mode 100644 mission9-10-11/jest.config.js create mode 100644 mission9-10-11/package-lock.json create mode 100644 mission9-10-11/package.json create mode 100644 mission9-10-11/prisma/migrations/20260119073239_add_notification/migration.sql create mode 100644 mission9-10-11/prisma/migrations/migration_lock.toml create mode 100644 mission9-10-11/prisma/schema.prisma create mode 100644 mission9-10-11/public/.gitkeep create mode 100644 mission9-10-11/public/4f3edda9-25e4-462b-b18b-a45bb5f789ca.png create mode 100644 mission9-10-11/public/socket-client-test.html create mode 100644 mission9-10-11/readme.md create mode 100644 mission9-10-11/src/app.ts create mode 100644 mission9-10-11/src/controllers/articlesController.ts create mode 100644 mission9-10-11/src/controllers/commentsController.ts create mode 100644 mission9-10-11/src/controllers/errorController.ts create mode 100644 mission9-10-11/src/controllers/imagesController.ts create mode 100644 mission9-10-11/src/controllers/notificationController.ts create mode 100644 mission9-10-11/src/controllers/productsController.ts create mode 100644 mission9-10-11/src/controllers/usersController.ts create mode 100644 mission9-10-11/src/lib/constants.ts create mode 100644 mission9-10-11/src/lib/cookies.ts create mode 100644 mission9-10-11/src/lib/errors/customErrors.ts create mode 100644 mission9-10-11/src/lib/errors/errorUtils.ts create mode 100644 mission9-10-11/src/lib/prismaClient.ts create mode 100644 mission9-10-11/src/lib/setupStatic.ts create mode 100644 mission9-10-11/src/lib/token.ts create mode 100644 mission9-10-11/src/lib/withAsync.ts create mode 100644 mission9-10-11/src/main.ts create mode 100644 mission9-10-11/src/middlewares/authenticate.ts create mode 100644 mission9-10-11/src/middlewares/upload.ts create mode 100644 mission9-10-11/src/repositories/articleRepository.ts create mode 100644 mission9-10-11/src/repositories/commentRepository.ts create mode 100644 mission9-10-11/src/repositories/likeRepository.ts create mode 100644 mission9-10-11/src/repositories/notificationRepository.ts create mode 100644 mission9-10-11/src/repositories/productRepository.ts create mode 100644 mission9-10-11/src/repositories/userRepository.ts create mode 100644 mission9-10-11/src/routers/articlesRouter.ts create mode 100644 mission9-10-11/src/routers/commentsRouter.ts create mode 100644 mission9-10-11/src/routers/imagesRouter.ts create mode 100644 mission9-10-11/src/routers/notificationRouter.ts create mode 100644 mission9-10-11/src/routers/productsRouter.ts create mode 100644 mission9-10-11/src/routers/usersRouter.ts create mode 100644 mission9-10-11/src/services/articleService.ts create mode 100644 mission9-10-11/src/services/commentService.ts create mode 100644 mission9-10-11/src/services/imageService.ts create mode 100644 mission9-10-11/src/services/notificationService.ts create mode 100644 mission9-10-11/src/services/productService.ts create mode 100644 mission9-10-11/src/services/userService.ts create mode 100644 mission9-10-11/src/socket.ts create mode 100644 mission9-10-11/src/structs/articlesStructs.ts create mode 100644 mission9-10-11/src/structs/commentsStruct.ts create mode 100644 mission9-10-11/src/structs/commonStructs.ts create mode 100644 mission9-10-11/src/structs/productsStruct.ts create mode 100644 mission9-10-11/src/structs/usersStructs.ts create mode 100644 mission9-10-11/tests/articles.auth.test.ts create mode 100644 mission9-10-11/tests/articles.public.test.ts create mode 100644 mission9-10-11/tests/auth.test.ts create mode 100644 mission9-10-11/tests/product.service.unit.test.ts create mode 100644 mission9-10-11/tests/products.auth.test.ts create mode 100644 mission9-10-11/tests/products.public.test.ts create mode 100644 mission9-10-11/tests/test.http create mode 100644 mission9-10-11/tests/test.js create mode 100644 mission9-10-11/tests/test.png create mode 100644 mission9-10-11/tests/utils/cleanDb.ts create mode 100644 mission9-10-11/tests/utils/createUser.ts create mode 100644 mission9-10-11/tsconfig.build.json create mode 100644 mission9-10-11/tsconfig.json create mode 100644 mission9-10-11/tsconfig.test.json create mode 100644 mission9-10-11/types/article.d.ts create mode 100644 mission9-10-11/types/cursorPaginated.d.ts create mode 100644 mission9-10-11/types/express.d.ts create mode 100644 mission9-10-11/types/image.d.ts create mode 100644 mission9-10-11/types/like.d.ts create mode 100644 mission9-10-11/types/multer.ts create mode 100644 mission9-10-11/types/product.d.ts create mode 100644 mission9-10-11/types/user.d.ts diff --git a/mission9-10-11/.env.example b/mission9-10-11/.env.example new file mode 100644 index 000000000..9a38c69ce --- /dev/null +++ b/mission9-10-11/.env.example @@ -0,0 +1,8 @@ +DATABASE_URL="postgresql://user:password@localhost:5432/dbname?schema=public" +NODE_ENV=development +PORT=3000 +JWT_ACCESS_TOKEN_SECRET=your_access_token_secret_key +JWT_REFRESH_TOKEN_SECRET=your_refresh_token_secret_key +AWS_ACCESS_KEY_ID=your_aws_access_key_id +AWS_SECRET_ACCESS_KEY=your_aws_secret_access_key +UPLOAD_PROVIDER=local \ No newline at end of file diff --git a/mission9-10-11/.env.production.example b/mission9-10-11/.env.production.example new file mode 100644 index 000000000..eb36d25b5 --- /dev/null +++ b/mission9-10-11/.env.production.example @@ -0,0 +1,11 @@ +NODE_ENV=production +UPLOAD_PROVIDER=s3 +AWS_REGION=your_aws_region +AWS_S3_BUCKET=your_s3_bucket_name +AWS_ACCESS_KEY_ID=your_aws_access_key_id +AWS_SECRET_ACCESS_KEY=your_aws_secret_access_key +DATABASE_URL="postgresql://user:password@localhost:5432/dbname?schema=public" +//데이터 베이스 유알엘은 rds로 바꾸기 +PORT=3000 +JWT_ACCESS_TOKEN_SECRET=your_access_token_secret_key +JWT_REFRESH_TOKEN_SECRET=your_refresh_token_secret_key diff --git a/mission9-10-11/.env.test.example b/mission9-10-11/.env.test.example new file mode 100644 index 000000000..0a64cea78 --- /dev/null +++ b/mission9-10-11/.env.test.example @@ -0,0 +1 @@ +DATABASE_URL="postgresql://user:password@localhost:5432/dbname?_test" diff --git a/mission9-10-11/.prettierrc b/mission9-10-11/.prettierrc new file mode 100644 index 000000000..503a5da40 --- /dev/null +++ b/mission9-10-11/.prettierrc @@ -0,0 +1,9 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "semi": true, + "printWidth": 100, + "endOfLine": "auto", + "arrowParens": "always", + "tabWidth": 2 +} diff --git a/mission9-10-11/coverage/base.css b/mission9-10-11/coverage/base.css new file mode 100644 index 000000000..f418035b4 --- /dev/null +++ b/mission9-10-11/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/mission9-10-11/coverage/block-navigation.js b/mission9-10-11/coverage/block-navigation.js new file mode 100644 index 000000000..530d1ed2b --- /dev/null +++ b/mission9-10-11/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/mission9-10-11/coverage/clover.xml b/mission9-10-11/coverage/clover.xml new file mode 100644 index 000000000..e9a8bd4b5 --- /dev/null +++ b/mission9-10-11/coverage/clover.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/mission9-10-11/coverage/controllers/articlesController.ts.html b/mission9-10-11/coverage/controllers/articlesController.ts.html new file mode 100644 index 000000000..4b10f4f60 --- /dev/null +++ b/mission9-10-11/coverage/controllers/articlesController.ts.html @@ -0,0 +1,376 @@ + + + + + + Code coverage report for controllers/articlesController.ts + + + + + + + + + +
+
+

All files / controllers articlesController.ts

+
+ +
+ 23.07% + Statements + 15/65 +
+ + +
+ 0% + Branches + 0/20 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 23.07% + Lines + 15/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +981x +1x +1x +1x +  +  +  +  +1x +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  + 
import { create } from 'superstruct';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { IdParamsStruct } from '../structs/commonStructs';
+import {
+  CreateArticleBodyStruct,
+  UpdateArticleBodyStruct,
+  GetArticleListParamsStruct,
+} from '../structs/articlesStructs';
+import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
+import { Request, Response } from 'express';
+import { articleService } from '../services/articleService';
+ 
+//게시물 생성
+export async function createArticle(req: Request, res: Response) {
+  const { title, content, image } = create(req.body, CreateArticleBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const article = await articleService.createArticle(user.id, title, content, image);
+  return res.status(201).send(article);
+}
+// 게시글 조회(좋아요 포함)
+export async function getArticle(req: Request, res: Response) {
+  const { id } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  const article = await articleService.getArticle(id, user?.id);
+  return res.send(article);
+}
+//게시물 수정
+export async function updateArticle(req: Request, res: Response) {
+  const { id } = create(req.params, IdParamsStruct);
+  const data = create(req.body, UpdateArticleBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const updated = await articleService.updateArticle(id, user.id, data);
+  return res.send(updated);
+}
+//게시물 삭제
+export async function deleteArticle(req: Request, res: Response) {
+  const { id } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  await articleService.deleteArticle(id, user.id);
+  return res.status(204).send();
+}
+ 
+//게시글 목록 조회(좋아요 포함)
+export async function getArticleList(req: Request, res: Response) {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct);
+  const user = req.user;
+  const articles = await articleService.getArticleList(page, pageSize, orderBy, keyword, user?.id);
+  return res.send(articles);
+}
+//댓글 등록
+export async function createComment(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, CreateCommentBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const comment = await articleService.createComment(user.id, articleId, content);
+  return res.status(201).send(comment);
+}
+//댓글 목록 조회
+export async function getCommentList(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
+  const commnetsList = await articleService.getCommentList(articleId, limit, cursor);
+  return res.send(commnetsList);
+}
+//게시글 좋아요 등록
+export async function likeArticle(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const articleLike = await articleService.likeArticle(user.id, articleId);
+  return res.status(200).send(articleLike);
+}
+ 
+//게시글 좋아요 취소
+export async function unlikeArticle(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const articleUnlike = await articleService.unlikeArticle(user.id, articleId);
+  return res.status(200).send(articleUnlike);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/controllers/commentsController.ts.html b/mission9-10-11/coverage/controllers/commentsController.ts.html new file mode 100644 index 000000000..fbea65de5 --- /dev/null +++ b/mission9-10-11/coverage/controllers/commentsController.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for controllers/commentsController.ts + + + + + + + + + +
+
+

All files / controllers commentsController.ts

+
+ +
+ 35% + Statements + 7/20 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 35% + Lines + 7/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +301x +1x +1x +1x +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  + 
import { create } from 'superstruct';
+import { UpdateCommentBodyStruct } from '../structs/commentsStruct';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { IdParamsStruct } from '../structs/commonStructs';
+import { Request, Response } from 'express';
+import { commnetService } from '../services/commentService';
+ 
+//댓글 수정
+export async function updateComment(req: Request, res: Response) {
+  const { id: commentId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, UpdateCommentBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const updatedComment = await commnetService.updateComment(commentId, user.id, content);
+  return res.send(updatedComment);
+}
+ 
+//댓글 삭제
+export async function deleteComment(req: Request, res: Response) {
+  const { id: commentId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  await commnetService.deleteComment(commentId, user.id);
+  return res.status(204).send();
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/controllers/errorController.ts.html b/mission9-10-11/coverage/controllers/errorController.ts.html new file mode 100644 index 000000000..6e37e6a71 --- /dev/null +++ b/mission9-10-11/coverage/controllers/errorController.ts.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for controllers/errorController.ts + + + + + + + + + +
+
+

All files / controllers errorController.ts

+
+ +
+ 24% + Statements + 6/25 +
+ + +
+ 0% + Branches + 0/18 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 24% + Lines + 6/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +1x +  +  +  +  +  +1x +  +1x +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { StructError } from 'superstruct';
+import {
+  NotFoundError,
+  BadRequestError,
+  ForbiddenError,
+  UnauthorizedError,
+} from '../lib/errors/customErrors';
+import { Prisma } from '@prisma/client';
+import { Request, Response, NextFunction } from 'express';
+import { isSyntaxJsonError } from '../lib/errors/errorUtils';
+ 
+//404 처리 미들웨어
+export function defaultNotFoundHandler(req: Request, res: Response, next: NextFunction) {
+  return res.status(404).send({ message: '존재하지 않습니다' });
+}
+//전역 에러 처리 미들웨어(400,401,403,404,500)
+export function globalErrorHandler(err: unknown, req: Request, res: Response, next: NextFunction) {
+  if (err instanceof StructError || err instanceof BadRequestError) {
+    return res.status(400).send({ message: '잘못된 요청입니다' });
+  }
+  if (isSyntaxJsonError(err)) {
+    return res.status(400).send({ message: '잘못된 요청입니다' });
+  }
+  if (err instanceof UnauthorizedError) {
+    return res.status(401).json({ message: err.message });
+  }
+  if (err instanceof ForbiddenError) {
+    return res.status(403).json({ message: err.message });
+  }
+  if (err instanceof NotFoundError) {
+    return res.status(404).send({ message: err.message });
+  }
+  //프리즈마 코드 에러, 그 외 known 에러 500처리
+  if (err instanceof Prisma.PrismaClientKnownRequestError) {
+    if (err.code === 'P2025') {
+      return res.status(404).json({ message: '존재하지 않습니다' });
+    }
+    if (err.code === 'P2002') {
+      return res.status(400).json({ message: '잘못된 요청입니다' });
+    }
+    return res.status(500).json({ message: '데이터 처리 중 오류가 발생했습니다' });
+  }
+ 
+  console.error(err);
+  return res.status(500).send({ message: '데이터 처리 중 오류가 발생했습니다' });
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/controllers/imagesController.ts.html b/mission9-10-11/coverage/controllers/imagesController.ts.html new file mode 100644 index 000000000..220f752e1 --- /dev/null +++ b/mission9-10-11/coverage/controllers/imagesController.ts.html @@ -0,0 +1,211 @@ + + + + + + Code coverage report for controllers/imagesController.ts + + + + + + + + + +
+
+

All files / controllers imagesController.ts

+
+ +
+ 50% + Statements + 10/20 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 50% + Lines + 10/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +431x +1x +1x +1x +1x +  +1x +  +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  + 
import multer from 'multer';
+import path from 'path';
+import { v4 as uuidv4 } from 'uuid';
+import { PUBLIC_PATH } from '../lib/constants';
+import { BadRequestError } from '../lib/errors/customErrors';
+import { Request, Response } from 'express';
+import { imageService } from '../services/imageService';
+ 
+const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];
+const FILE_SIZE_LIMIT = 5 * 1024 * 1024;
+ 
+//이미지 업로드 설정
+export const upload = multer({
+  storage: multer.diskStorage({
+    destination(req, file, cb) {
+      cb(null, PUBLIC_PATH);
+    },
+    filename(req, file, cb) {
+      const ext = path.extname(file.originalname);
+      const filename = `${uuidv4()}${ext}`;
+      cb(null, filename);
+    },
+  }),
+ 
+  limits: {
+    fileSize: FILE_SIZE_LIMIT,
+  },
+ 
+  fileFilter: function (req, file, cb) {
+    if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) {
+      const err = new BadRequestError('Only png, jpeg, and jpg are allowed');
+      return cb(err);
+    }
+ 
+    cb(null, true);
+  },
+});
+//이미지 업로드 핸들러
+export async function uploadImage(req: Request, res: Response) {
+  const response = imageService.buildImageUrl(req);
+  return res.send(response);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/controllers/index.html b/mission9-10-11/coverage/controllers/index.html new file mode 100644 index 000000000..f4c6a8fdb --- /dev/null +++ b/mission9-10-11/coverage/controllers/index.html @@ -0,0 +1,206 @@ + + + + + + Code coverage report for controllers + + + + + + + + + +
+
+

All files controllers

+
+ +
+ 28.51% + Statements + 79/277 +
+ + +
+ 3.65% + Branches + 3/82 +
+ + +
+ 2.63% + Functions + 1/38 +
+ + +
+ 28.51% + Lines + 79/277 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesController.ts +
+
23.07%15/650%0/200%0/923.07%15/65
commentsController.ts +
+
35%7/200%0/40%0/235%7/20
errorController.ts +
+
24%6/250%0/180%0/224%6/25
imagesController.ts +
+
50%10/200%0/20%0/450%10/20
notificationController.ts +
+
30.43%7/230%0/60%0/330.43%7/23
productsController.ts +
+
29.23%19/6515%3/2011.11%1/929.23%19/65
usersController.ts +
+
25.42%15/590%0/120%0/925.42%15/59
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/controllers/notificationController.ts.html b/mission9-10-11/coverage/controllers/notificationController.ts.html new file mode 100644 index 000000000..b2919224a --- /dev/null +++ b/mission9-10-11/coverage/controllers/notificationController.ts.html @@ -0,0 +1,184 @@ + + + + + + Code coverage report for controllers/notificationController.ts + + + + + + + + + +
+
+

All files / controllers notificationController.ts

+
+ +
+ 30.43% + Statements + 7/23 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 30.43% + Lines + 7/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34  +1x +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  + 
import { Request, Response } from 'express';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { notificationService } from '../services/notificationService';
+import { IdParamsStruct } from '../structs/commonStructs';
+import { create } from 'superstruct';
+ 
+export async function getNotifications(req: Request, res: Response) {
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const notifications = await notificationService.getNotifications(user.id);
+  return res.send(notifications);
+}
+ 
+export async function getUnreadCount(req: Request, res: Response) {
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const count = await notificationService.getUnreadCount(user.id);
+  return res.send({ count });
+}
+ 
+export async function markAsRead(req: Request, res: Response) {
+  const { id: notificationId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const notification = await notificationService.markAsRead(notificationId, user.id);
+  return res.send(notification);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/controllers/productsController.ts.html b/mission9-10-11/coverage/controllers/productsController.ts.html new file mode 100644 index 000000000..698f62d91 --- /dev/null +++ b/mission9-10-11/coverage/controllers/productsController.ts.html @@ -0,0 +1,394 @@ + + + + + + Code coverage report for controllers/productsController.ts + + + + + + + + + +
+
+

All files / controllers productsController.ts

+
+ +
+ 29.23% + Statements + 19/65 +
+ + +
+ 15% + Branches + 3/20 +
+ + +
+ 11.11% + Functions + 1/9 +
+ + +
+ 29.23% + Lines + 19/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +1041x +1x +1x +  +  +  +  +1x +1x +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +2x +2x +2x +2x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  + 
import { create } from 'superstruct';
+import { IdParamsStruct } from '../structs/commonStructs';
+import {
+  CreateProductBodyStruct,
+  GetProductListParamsStruct,
+  UpdateProductBodyStruct,
+} from '../structs/productsStruct';
+import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { Request, Response } from 'express';
+import { productService } from '../services/productService';
+ 
+//상품 등록
+export async function createProduct(req: Request, res: Response) {
+  const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const product = await productService.createProduct({
+    name,
+    description,
+    price,
+    tags,
+    images,
+    userId: user.id,
+  });
+  return res.status(201).send(product);
+}
+//특정 상품 조회(좋아요 포함)
+export async function getProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  const product = await productService.getProduct(productId, user?.id);
+  return res.send(product);
+}
+//상품 수정
+export async function updateProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const data = create(req.body, UpdateProductBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const updatedProduct = await productService.updateProduct(productId, user.id, data);
+  return res.send(updatedProduct);
+}
+//상품 삭제
+export async function deleteProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  await productService.deleteProduct(productId, user.id);
+  return res.status(204).send();
+}
+//상품 목록 조회(좋아요 포함)
+export async function getProductList(req: Request, res: Response) {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct);
+  const user = req.user;
+  const products = await productService.getProductList(page, pageSize, orderBy, keyword, user?.id);
+  return res.send(products);
+}
+ 
+//댓글 등록
+export async function createComment(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, CreateCommentBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const comment = await productService.createComment(user.id, productId, content);
+  return res.status(201).send(comment);
+}
+//상품 댓글 목록 조회
+export async function getCommentList(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
+  const commentList = await productService.getCommentList(productId, limit, cursor);
+  return res.send(commentList);
+}
+//상품 좋아요 등록
+export async function likeProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const productLike = await productService.likeProduct(user.id, productId);
+  return res.status(200).send(productLike);
+}
+//상품 좋아요 취소
+export async function unlikeProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const productUnliked = await productService.unlikeProduct(user.id, productId);
+  return res.send(productUnliked);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/controllers/usersController.ts.html b/mission9-10-11/coverage/controllers/usersController.ts.html new file mode 100644 index 000000000..64d2b0e41 --- /dev/null +++ b/mission9-10-11/coverage/controllers/usersController.ts.html @@ -0,0 +1,361 @@ + + + + + + Code coverage report for controllers/usersController.ts + + + + + + + + + +
+
+

All files / controllers usersController.ts

+
+ +
+ 25.42% + Statements + 15/59 +
+ + +
+ 0% + Branches + 0/12 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 25.42% + Lines + 15/59 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +931x +  +  +  +  +  +  +  +1x +1x +1x +  +1x +1x +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  + 
import {
+  CreateUserBodyStruct,
+  UpdateUserBodyStruct,
+  LoginBodyStruct,
+  ChangePasswordBodyStruct,
+  GetMyProductListParamsStruct,
+  GetMyLikedProductListParamsStruct,
+} from '../structs/usersStructs';
+import { create } from 'superstruct';
+import { clearTokenCookies, setTokenCookies } from '../lib/cookies';
+import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants';
+import { Request, Response } from 'express';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { userService } from '../services/userService';
+ 
+//회원가입
+export async function register(req: Request, res: Response) {
+  const { nickname, email, password, image } = create(req.body, CreateUserBodyStruct);
+  const user = await userService.register(nickname, email, password, image);
+  return res.status(201).send(user);
+}
+//로그인
+export async function login(req: Request, res: Response) {
+  const { email, password } = create(req.body, LoginBodyStruct);
+  const result = await userService.login(email, password);
+  setTokenCookies(res, result.tokens.accessToken, result.tokens.refreshToken);
+  return res.status(200).send({ message: result.message });
+}
+//로그아웃
+export async function logout(req: Request, res: Response) {
+  clearTokenCookies(res);
+  return res.status(200).send({ message: '로그아웃에 성공했습니다.' });
+}
+//내 프로필 조회 (최근 등록한 상품 5개, 최근 좋아요한 상품 5개 포함)
+export async function getProfile(req: Request, res: Response) {
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const profile = await userService.getProfile(user.id);
+  return res.send(profile);
+}
+//내 프로필 수정
+export async function updateProfile(req: Request, res: Response) {
+  const { nickname, email, image } = create(req.body, UpdateUserBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const update = await userService.updateProfile(user.id, nickname, email, image);
+  return res.send(update);
+}
+//내 비밀번호 변경
+export async function patchPassword(req: Request, res: Response) {
+  const { currentPassword, newPassword } = create(req.body, ChangePasswordBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  await userService.patchPassword(user.id, currentPassword, newPassword);
+  return res.status(200).send({ message: '비밀번호가 성공적으로 변경되었습니다.' });
+}
+//내가 등록한 상품 목록 조회 (상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능)
+export async function getMyProductList(req: Request, res: Response) {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetMyProductListParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const myProducts = await userService.getMyProductList(user.id, page, pageSize, orderBy, keyword);
+  return res.send(myProducts);
+}
+//토큰 갱신(리프레시)
+export async function refreshToken(req: Request, res: Response) {
+  const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME];
+  if (!refreshToken) {
+    throw new UnauthorizedError('리프레시 토큰이 없습니다.');
+  }
+  const tokens = await userService.refreshToken(refreshToken);
+  setTokenCookies(res, tokens.accessToken, tokens.refreshToken);
+  return res.status(200).send({ message: '토큰이 성공적으로 갱신되었습니다.' });
+}
+//내가 좋아요한 상품 목록 조회(상품이 꽤 많이 있을 경우 페이징 처리)
+export async function getMyLikedProducts(req: Request, res: Response) {
+  const { page, pageSize, orderBy } = create(req.query, GetMyLikedProductListParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const myLikedProducts = await userService.getMyLikedProducts(user.id, page, pageSize, orderBy);
+  return res.send(myLikedProducts);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/coverage-final.json b/mission9-10-11/coverage/coverage-final.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/mission9-10-11/coverage/coverage-final.json @@ -0,0 +1 @@ +{} diff --git a/mission9-10-11/coverage/favicon.png b/mission9-10-11/coverage/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 74.06% + Statements + 454/613 +
+ + +
+ 46.55% + Branches + 108/232 +
+ + +
+ 66.99% + Functions + 69/103 +
+ + +
+ 74.87% + Lines + 447/597 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src +
+
100%26/26100%0/0100%0/0100%26/26
src/controllers +
+
70.68%164/23241.93%26/6268.75%22/3270.68%164/232
src/repositories +
+
73.07%38/5269.23%18/2663.63%21/3373.07%38/52
src/routers +
+
100%69/69100%0/0100%0/0100%69/69
src/services +
+
67.09%157/23444.44%64/14468.42%26/3868.8%150/218
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/lcov-report/base.css b/mission9-10-11/coverage/lcov-report/base.css new file mode 100644 index 000000000..f418035b4 --- /dev/null +++ b/mission9-10-11/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/mission9-10-11/coverage/lcov-report/block-navigation.js b/mission9-10-11/coverage/lcov-report/block-navigation.js new file mode 100644 index 000000000..530d1ed2b --- /dev/null +++ b/mission9-10-11/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/mission9-10-11/coverage/lcov-report/favicon.png b/mission9-10-11/coverage/lcov-report/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ Unknown% + Statements + 0/0 +
+ + +
+ Unknown% + Branches + 0/0 +
+ + +
+ Unknown% + Functions + 0/0 +
+ + +
+ Unknown% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/lcov-report/prettify.css b/mission9-10-11/coverage/lcov-report/prettify.css new file mode 100644 index 000000000..b317a7cda --- /dev/null +++ b/mission9-10-11/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/mission9-10-11/coverage/lcov-report/prettify.js b/mission9-10-11/coverage/lcov-report/prettify.js new file mode 100644 index 000000000..b3225238f --- /dev/null +++ b/mission9-10-11/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/mission9-10-11/coverage/lcov-report/sort-arrow-sprite.png b/mission9-10-11/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/mission9-10-11/coverage/lcov-report/sorter.js b/mission9-10-11/coverage/lcov-report/sorter.js new file mode 100644 index 000000000..4ed70ae5a --- /dev/null +++ b/mission9-10-11/coverage/lcov-report/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/mission9-10-11/coverage/lcov.info b/mission9-10-11/coverage/lcov.info new file mode 100644 index 000000000..e69de29bb diff --git a/mission9-10-11/coverage/lib/constants.ts.html b/mission9-10-11/coverage/lib/constants.ts.html new file mode 100644 index 000000000..9e18f9c6b --- /dev/null +++ b/mission9-10-11/coverage/lib/constants.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for lib/constants.ts + + + + + + + + + +
+
+

All files / lib constants.ts

+
+ +
+ 100% + Statements + 20/20 +
+ + +
+ 50% + Branches + 4/8 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +1x +  +1x +1x +1x +1x +1x +  +1x +  +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  + 
import dotenv from 'dotenv';
+dotenv.config();
+ 
+const DATABASE_URL = process.env.DATABASE_URL;
+const NODE_ENV = process.env.NODE_ENV || 'development';
+const PORT = process.env.PORT || 3000;
+const PUBLIC_PATH = 'public';
+const STATIC_PATH = '/public';
+const JWT_ACCESS_TOKEN_SECRET =
+  process.env.JWT_ACCESS_TOKEN_SECRET || 'your_jwt_access_token_secret';
+const JWT_REFRESH_TOKEN_SECRET =
+  process.env.JWT_REFRESH_TOKEN_SECRET || 'your_jwt_refresh_token_secret';
+const ACCESS_TOKEN_COOKIE_NAME = 'access-token';
+const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token';
+ 
+export {
+  DATABASE_URL,
+  NODE_ENV,
+  PORT,
+  PUBLIC_PATH,
+  STATIC_PATH,
+  JWT_ACCESS_TOKEN_SECRET,
+  JWT_REFRESH_TOKEN_SECRET,
+  ACCESS_TOKEN_COOKIE_NAME,
+  REFRESH_TOKEN_COOKIE_NAME,
+};
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/lib/cookies.ts.html b/mission9-10-11/coverage/lib/cookies.ts.html new file mode 100644 index 000000000..7c2e7eaed --- /dev/null +++ b/mission9-10-11/coverage/lib/cookies.ts.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for lib/cookies.ts + + + + + + + + + +
+
+

All files / lib cookies.ts

+
+ +
+ 42.85% + Statements + 3/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 42.85% + Lines + 3/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +291x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  + 
import { NODE_ENV, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from './constants';
+import { Response } from 'express';
+ 
+export function setTokenCookies(res: Response, accessToken: string, refreshToken: string) {
+  res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+    maxAge: 1 * 60 * 60 * 1000, // 1시간
+  });
+  res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+    maxAge: 7 * 24 * 60 * 60 * 1000, // 7일
+    path: '/users/refresh',
+  });
+}
+ 
+export function clearTokenCookies(res: Response) {
+  res.clearCookie(ACCESS_TOKEN_COOKIE_NAME, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+  });
+  res.clearCookie(REFRESH_TOKEN_COOKIE_NAME, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+    path: '/users/refresh',
+  });
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/lib/errors/customErrors.ts.html b/mission9-10-11/coverage/lib/errors/customErrors.ts.html new file mode 100644 index 000000000..98442b49b --- /dev/null +++ b/mission9-10-11/coverage/lib/errors/customErrors.ts.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for lib/errors/customErrors.ts + + + + + + + + + +
+
+

All files / lib/errors customErrors.ts

+
+ +
+ 38.88% + Statements + 7/18 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 38.88% + Lines + 7/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  + 
export class BaseError extends Error {
+  statusCode: number;
+  constructor(message: string, statusCode: number) {
+    super(message);
+    this.name = new.target.name;
+    this.statusCode = statusCode;
+  }
+}
+ 
+export class NotFoundError extends BaseError {
+  constructor(message = '존재하지 않습니다') {
+    super(message, 404);
+  }
+}
+ 
+export class UnauthorizedError extends BaseError {
+  constructor(message = '인증이 필요합니다') {
+    super(message, 401);
+  }
+}
+ 
+export class BadRequestError extends BaseError {
+  constructor(message = '잘못된 요청입니다') {
+    super(message, 400);
+  }
+}
+ 
+export class ForbiddenError extends BaseError {
+  constructor(message = '비밀번호가 틀렸습니다') {
+    super(message, 403);
+  }
+}
+ 
+export class AlreadyLikeError extends ForbiddenError {
+  constructor(message = '이미 좋아요를 눌렀습니다.') {
+    super(message);
+    this.name = new.target.name;
+  }
+}
+ 
+export class AlreadyUnlikeError extends ForbiddenError {
+  constructor(message = '좋아요가 존재하지 않습니다.') {
+    super(message);
+    this.name = new.target.name;
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/lib/errors/errorUtils.ts.html b/mission9-10-11/coverage/lib/errors/errorUtils.ts.html new file mode 100644 index 000000000..2087af67c --- /dev/null +++ b/mission9-10-11/coverage/lib/errors/errorUtils.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for lib/errors/errorUtils.ts + + + + + + + + + +
+
+

All files / lib/errors errorUtils.ts

+
+ +
+ 20% + Statements + 1/5 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 25% + Lines + 1/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14  +  +  +  +  +1x +  +  +  +  +  +  +  + 
interface SyntaxJsonError extends SyntaxError {
+  status?: number;
+  body?: unknown;
+}
+ 
+export function isSyntaxJsonError(err: unknown): err is SyntaxJsonError {
+  if (!(err instanceof SyntaxError)) return false;
+  const e = err as Partial<SyntaxJsonError>;
+  return typeof e.status === 'number' && 'body' in e;
+}
+// Partial<SyntaxJsonError>;
+// 얘는 SyntaxJsonError의 일부 프로퍼티만 가지고 있을 수도 있어”
+// 라고 TS에게 알려서 e.status, e.body 같은 속성 접근을 가능하게 해주는 장치
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/lib/errors/index.html b/mission9-10-11/coverage/lib/errors/index.html new file mode 100644 index 000000000..cd59b19a2 --- /dev/null +++ b/mission9-10-11/coverage/lib/errors/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for lib/errors + + + + + + + + + +
+
+

All files lib/errors

+
+ +
+ 34.78% + Statements + 8/23 +
+ + +
+ 0% + Branches + 0/10 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 36.36% + Lines + 8/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
customErrors.ts +
+
38.88%7/180%0/60%0/738.88%7/18
errorUtils.ts +
+
20%1/50%0/40%0/125%1/4
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/lib/index.html b/mission9-10-11/coverage/lib/index.html new file mode 100644 index 000000000..ecde2e77e --- /dev/null +++ b/mission9-10-11/coverage/lib/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for lib + + + + + + + + + +
+
+

All files lib

+
+ +
+ 74.46% + Statements + 35/47 +
+ + +
+ 50% + Branches + 4/8 +
+ + +
+ 37.5% + Functions + 3/8 +
+ + +
+ 73.91% + Lines + 34/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
constants.ts +
+
100%20/2050%4/8100%0/0100%20/20
cookies.ts +
+
42.85%3/7100%0/00%0/242.85%3/7
prismaClient.ts +
+
100%2/2100%0/0100%0/0100%2/2
token.ts +
+
41.66%5/12100%0/00%0/341.66%5/12
withAsync.ts +
+
83.33%5/6100%0/0100%3/380%4/5
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/lib/prismaClient.ts.html b/mission9-10-11/coverage/lib/prismaClient.ts.html new file mode 100644 index 000000000..2e8063c3d --- /dev/null +++ b/mission9-10-11/coverage/lib/prismaClient.ts.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for lib/prismaClient.ts + + + + + + + + + +
+
+

All files / lib prismaClient.ts

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +  +1x + 
import { PrismaClient } from '@prisma/client';
+ 
+export const prisma = new PrismaClient();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/lib/token.ts.html b/mission9-10-11/coverage/lib/token.ts.html new file mode 100644 index 000000000..372192f34 --- /dev/null +++ b/mission9-10-11/coverage/lib/token.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for lib/token.ts + + + + + + + + + +
+
+

All files / lib token.ts

+
+ +
+ 41.66% + Statements + 5/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 41.66% + Lines + 5/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  + 
import jwt, { JwtPayload } from 'jsonwebtoken';
+import { JWT_ACCESS_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET } from './constants';
+ 
+interface TokenPayload extends JwtPayload {
+  id: number;
+}
+ 
+export function generateToken(userId: number) {
+  const accessToken = jwt.sign({ id: userId }, JWT_ACCESS_TOKEN_SECRET, { expiresIn: '1h' });
+  const refreshToken = jwt.sign({ id: userId }, JWT_REFRESH_TOKEN_SECRET, { expiresIn: '1d' });
+  return { accessToken, refreshToken };
+}
+ 
+export function verifyAccessToken(token: string) {
+  const decoded = jwt.verify(token, JWT_ACCESS_TOKEN_SECRET) as TokenPayload;
+  return { userId: decoded.id };
+}
+ 
+export function verifyRefreshToken(token: string) {
+  const decoded = jwt.verify(token, JWT_REFRESH_TOKEN_SECRET) as TokenPayload;
+  return { userId: decoded.id };
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/lib/withAsync.ts.html b/mission9-10-11/coverage/lib/withAsync.ts.html new file mode 100644 index 000000000..2e7a603fd --- /dev/null +++ b/mission9-10-11/coverage/lib/withAsync.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for lib/withAsync.ts + + + + + + + + + +
+
+

All files / lib withAsync.ts

+
+ +
+ 83.33% + Statements + 5/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 80% + Lines + 4/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14  +  +1x +  +  +33x +2x +2x +  +  +  +  +  + 
import type { Request, Response, NextFunction, RequestHandler } from 'express';
+ 
+export function withAsync<T = unknown>(
+  handler: (req: Request, res: Response, next: NextFunction) => Promise<T>,
+): RequestHandler {
+  return async (req, res, next) => {
+    try {
+      await handler(req, res, next);
+    } catch (e) {
+      next(e);
+    }
+  };
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/middlewares/authenticate.ts.html b/mission9-10-11/coverage/middlewares/authenticate.ts.html new file mode 100644 index 000000000..56eeaf857 --- /dev/null +++ b/mission9-10-11/coverage/middlewares/authenticate.ts.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for middlewares/authenticate.ts + + + + + + + + + +
+
+

All files / middlewares authenticate.ts

+
+ +
+ 55% + Statements + 11/20 +
+ + +
+ 42.85% + Branches + 3/7 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 52.63% + Lines + 10/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +311x +1x +1x +1x +  +  +  +26x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { prisma } from '../lib/prismaClient';
+import { verifyAccessToken } from '../lib/token';
+import { ACCESS_TOKEN_COOKIE_NAME } from '../lib/constants';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { NextFunction, Request, Response } from 'express';
+ 
+function authenticate(options = { optional: false }) {
+  return async (req: Request, res: Response, next: NextFunction) => {
+    const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME];
+    Eif (!accessToken) {
+      Eif (options.optional) {
+        return next();
+      }
+      return next(new UnauthorizedError());
+    }
+    try {
+      const { userId } = verifyAccessToken(accessToken); //디코딩 된 토큰에서 user id 추출
+      const user = await prisma.user.findUniqueOrThrow({ where: { id: userId } });
+      req.user = user;
+    } catch (error) {
+      if (options.optional) {
+        return next();
+      }
+      return next(new UnauthorizedError());
+    }
+    next();
+  };
+}
+ 
+export default authenticate;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/middlewares/index.html b/mission9-10-11/coverage/middlewares/index.html new file mode 100644 index 000000000..73cd09812 --- /dev/null +++ b/mission9-10-11/coverage/middlewares/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for middlewares + + + + + + + + + +
+
+

All files middlewares

+
+ +
+ 55% + Statements + 11/20 +
+ + +
+ 42.85% + Branches + 3/7 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 52.63% + Lines + 10/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
authenticate.ts +
+
55%11/2042.85%3/7100%3/352.63%10/19
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/prettify.css b/mission9-10-11/coverage/prettify.css new file mode 100644 index 000000000..b317a7cda --- /dev/null +++ b/mission9-10-11/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/mission9-10-11/coverage/prettify.js b/mission9-10-11/coverage/prettify.js new file mode 100644 index 000000000..b3225238f --- /dev/null +++ b/mission9-10-11/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/mission9-10-11/coverage/repositories/articleRepository.ts.html b/mission9-10-11/coverage/repositories/articleRepository.ts.html new file mode 100644 index 000000000..d1defbc06 --- /dev/null +++ b/mission9-10-11/coverage/repositories/articleRepository.ts.html @@ -0,0 +1,256 @@ + + + + + + Code coverage report for repositories/articleRepository.ts + + + + + + + + + +
+
+

All files / repositories articleRepository.ts

+
+ +
+ 30% + Statements + 3/10 +
+ + +
+ 0% + Branches + 0/8 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 30% + Lines + 3/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { Prisma } from '@prisma/client';
+import { prisma } from '../lib/prismaClient';
+import { ArticleLikesAndCount } from '../../types/article';
+ 
+export class ArticleRepository {
+  async create(data: Prisma.ArticleCreateInput) {
+    return prisma.article.create({ data });
+  }
+  async findById(id: number) {
+    return prisma.article.findUniqueOrThrow({ where: { id } });
+  }
+  async findByIdWithLikes(id: number, userId?: number): Promise<ArticleLikesAndCount> {
+    return prisma.article.findUniqueOrThrow({
+      where: { id },
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          //비로그인 시 -1을 줘서 []을 뱉도록
+          where: { userId: userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async findArticleListWithLikes(params: {
+    skip: number;
+    take: number;
+    orderBy: Prisma.ArticleOrderByWithRelationInput;
+    where: Prisma.ArticleWhereInput;
+    userId?: number;
+  }): Promise<ArticleLikesAndCount[]> {
+    return prisma.article.findMany({
+      skip: params.skip,
+      take: params.take,
+      orderBy: params.orderBy,
+      where: params.where,
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          where: { userId: params.userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async count(where: Prisma.ArticleWhereInput) {
+    return prisma.article.count({ where });
+  }
+  async update(id: number, data: Prisma.ArticleUpdateInput) {
+    return prisma.article.update({ where: { id }, data });
+  }
+  async delete(id: number) {
+    return prisma.article.delete({ where: { id } });
+  }
+}
+ 
+export const articleRepo = new ArticleRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/repositories/commentRepository.ts.html b/mission9-10-11/coverage/repositories/commentRepository.ts.html new file mode 100644 index 000000000..9d84f7d08 --- /dev/null +++ b/mission9-10-11/coverage/repositories/commentRepository.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for repositories/commentRepository.ts + + + + + + + + + +
+
+

All files / repositories commentRepository.ts

+
+ +
+ 37.5% + Statements + 3/8 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 37.5% + Lines + 3/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { Prisma } from '@prisma/client';
+import { prisma } from '../lib/prismaClient';
+ 
+export class CommentRepository {
+  async create(data: Prisma.CommentCreateInput) {
+    return prisma.comment.create({ data });
+  }
+  async findCommentListQuery(
+    whereCondition: { articleId: number } | { productId: number },
+    limit: number,
+    cursor?: number,
+  ) {
+    return prisma.comment.findMany({
+      cursor: cursor ? { id: cursor } : undefined,
+      take: limit + 1,
+      where: whereCondition,
+      orderBy: { createdAt: 'desc' },
+    });
+  }
+  async findById(id: number) {
+    return prisma.comment.findUniqueOrThrow({ where: { id } });
+  }
+  async update(id: number, content?: string) {
+    return prisma.comment.update({ where: { id }, data: { content } });
+  }
+  async delete(id: number) {
+    return prisma.comment.delete({ where: { id } });
+  }
+}
+ 
+export const commentRepo = new CommentRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/repositories/index.html b/mission9-10-11/coverage/repositories/index.html new file mode 100644 index 000000000..0e2a502ec --- /dev/null +++ b/mission9-10-11/coverage/repositories/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for repositories + + + + + + + + + +
+
+

All files repositories

+
+ +
+ 32.69% + Statements + 17/52 +
+ + +
+ 11.53% + Branches + 3/26 +
+ + +
+ 6.06% + Functions + 2/33 +
+ + +
+ 32.69% + Lines + 17/52 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articleRepository.ts +
+
30%3/100%0/80%0/730%3/10
commentRepository.ts +
+
37.5%3/80%0/20%0/537.5%3/8
likeRepository.ts +
+
22.22%2/90%0/60%0/422.22%2/9
notificationRepository.ts +
+
37.5%3/8100%0/00%0/537.5%3/8
productRepository.ts +
+
36.36%4/1130%3/1025%2/836.36%4/11
userRepository.ts +
+
33.33%2/6100%0/00%0/433.33%2/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/repositories/likeRepository.ts.html b/mission9-10-11/coverage/repositories/likeRepository.ts.html new file mode 100644 index 000000000..426f98a4e --- /dev/null +++ b/mission9-10-11/coverage/repositories/likeRepository.ts.html @@ -0,0 +1,193 @@ + + + + + + Code coverage report for repositories/likeRepository.ts + + + + + + + + + +
+
+

All files / repositories likeRepository.ts

+
+ +
+ 22.22% + Statements + 2/9 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 22.22% + Lines + 2/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { LikeTarget } from '../../types/like';
+import { prisma } from '../lib/prismaClient';
+ 
+class LikdeRepository {
+  async findLike(userId: number, target: LikeTarget) {
+    const whereCondition =
+      'articleId' in target
+        ? { userId_articleId: { userId, articleId: target.articleId } }
+        : { userId_productId: { userId, productId: target.productId } };
+    return prisma.like.findUnique({
+      where: whereCondition,
+    });
+  }
+  async createLike(userId: number, target: LikeTarget) {
+    return prisma.like.create({ data: { userId, ...target } });
+  }
+  async deleteLike(userId: number, target: LikeTarget) {
+    const whereCondition =
+      'articleId' in target
+        ? { userId_articleId: { userId, articleId: target.articleId } }
+        : { userId_productId: { userId, productId: target.productId } };
+    return prisma.like.delete({
+      where: whereCondition,
+    });
+  }
+  async getLikers(target: LikeTarget) {
+    const whereCondition =
+      'articleId' in target ? { articleId: target.articleId } : { productId: target.productId };
+    return prisma.like.findMany({
+      where: whereCondition,
+      select: { userId: true },
+    });
+  }
+}
+ 
+export const likeRepo = new LikdeRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/repositories/notificationRepository.ts.html b/mission9-10-11/coverage/repositories/notificationRepository.ts.html new file mode 100644 index 000000000..196af5b36 --- /dev/null +++ b/mission9-10-11/coverage/repositories/notificationRepository.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for repositories/notificationRepository.ts + + + + + + + + + +
+
+

All files / repositories notificationRepository.ts

+
+ +
+ 37.5% + Statements + 3/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 37.5% + Lines + 3/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { prisma } from '../lib/prismaClient';
+ 
+export class NotificationRepository {
+  async getNotification(userId: number) {
+    return prisma.notification.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } });
+  }
+  async getUnreadCount(userId: number) {
+    return prisma.notification.count({ where: { userId, isRead: false } });
+  }
+  async create(userId: number, message: string) {
+    return prisma.notification.create({ data: { userId, message } });
+  }
+  async findByIds(notificationId: number, userId: number) {
+    return prisma.notification.findFirst({
+      where: { id: notificationId, userId },
+    });
+  }
+  async updateRead(notificationId: number) {
+    return prisma.notification.update({
+      where: { id: notificationId },
+      data: { isRead: true },
+    });
+  }
+}
+ 
+export const notificationRepo = new NotificationRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/repositories/productRepository.ts.html b/mission9-10-11/coverage/repositories/productRepository.ts.html new file mode 100644 index 000000000..d9370bb0f --- /dev/null +++ b/mission9-10-11/coverage/repositories/productRepository.ts.html @@ -0,0 +1,280 @@ + + + + + + Code coverage report for repositories/productRepository.ts + + + + + + + + + +
+
+

All files / repositories productRepository.ts

+
+ +
+ 36.36% + Statements + 4/11 +
+ + +
+ 30% + Branches + 3/10 +
+ + +
+ 25% + Functions + 2/8 +
+ + +
+ 36.36% + Lines + 4/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { ProductLikesAndCount } from '../../types/product';
+import { prisma } from '../lib/prismaClient';
+import { Prisma } from '@prisma/client';
+import type { ProductRecentType } from '../../types/product';
+ 
+class ProductRepository {
+  async create(data: Prisma.ProductCreateInput) {
+    return prisma.product.create({ data });
+  }
+  async findById(id: number) {
+    return prisma.product.findUniqueOrThrow({ where: { id } });
+  }
+  async findByIdWithLikes(id: number, userId?: number): Promise<ProductLikesAndCount> {
+    return prisma.product.findUniqueOrThrow({
+      where: { id },
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          where: { userId: userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async update(id: number, data: Prisma.ProductUpdateInput) {
+    return prisma.product.update({ where: { id }, data });
+  }
+  async delete(id: number) {
+    return prisma.product.delete({ where: { id } });
+  }
+  async findProductListWithLikes(params: {
+    skip: number;
+    take: number;
+    orderBy: Prisma.ProductOrderByWithRelationInput;
+    where: Prisma.ProductWhereInput;
+    userId?: number;
+  }): Promise<ProductLikesAndCount[]> {
+    return prisma.product.findMany({
+      skip: params.skip,
+      take: params.take,
+      orderBy: params.orderBy,
+      where: params.where,
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          where: { userId: params.userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async count(where: Prisma.ProductWhereInput) {
+    return prisma.product.count({ where });
+  }
+  async findRecentProduct(userId: number, limit: number, type: ProductRecentType) {
+    const whereCondition = type === 'myUploaded' ? { userId } : { likes: { some: { userId } } };
+    return prisma.product.findMany({
+      where: whereCondition,
+      orderBy: { createdAt: 'desc' },
+      take: limit,
+    });
+  }
+}
+ 
+export const productRepo = new ProductRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/repositories/userRepository.ts.html b/mission9-10-11/coverage/repositories/userRepository.ts.html new file mode 100644 index 000000000..babeb8a89 --- /dev/null +++ b/mission9-10-11/coverage/repositories/userRepository.ts.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for repositories/userRepository.ts + + + + + + + + + +
+
+

All files / repositories userRepository.ts

+
+ +
+ 33.33% + Statements + 2/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 33.33% + Lines + 2/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +201x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { prisma } from '../lib/prismaClient';
+import { Prisma } from '@prisma/client';
+ 
+class UserRepository {
+  async create(data: Prisma.UserCreateInput) {
+    return prisma.user.create({ data });
+  }
+  async findByEmail(email: string) {
+    return prisma.user.findUnique({ where: { email } });
+  }
+  async update(id: number, data: Prisma.UserUpdateInput) {
+    return prisma.user.update({ where: { id }, data });
+  }
+  async findById(id: number) {
+    return prisma.user.findUnique({ where: { id } });
+  }
+}
+ 
+export const userRepo = new UserRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/services/articleService.ts.html b/mission9-10-11/coverage/services/articleService.ts.html new file mode 100644 index 000000000..24a14424b --- /dev/null +++ b/mission9-10-11/coverage/services/articleService.ts.html @@ -0,0 +1,499 @@ + + + + + + Code coverage report for services/articleService.ts + + + + + + + + + +
+
+

All files / services articleService.ts

+
+ +
+ 13.55% + Statements + 8/59 +
+ + +
+ 0% + Branches + 0/34 +
+ + +
+ 0% + Functions + 0/10 +
+ + +
+ 14.03% + Lines + 8/57 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +1391x +  +1x +1x +1x +1x +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { articleRepo } from '../repositories/articleRepository';
+import { ArticleLikesAndCount, ArticleListResponse, ArticleResponse } from '../../types/article';
+import { AlreadyLikeError, AlreadyUnlikeError, ForbiddenError } from '../lib/errors/customErrors';
+import { commentRepo } from '../repositories/commentRepository';
+import { likeRepo } from '../repositories/likeRepository';
+import { Prisma, Article, Comment } from '@prisma/client';
+import type { CursorPaginated } from '../../types/cursorPaginated';
+import { notificationService } from './notificationService';
+ 
+//객체로 주면 콘트롤러에서 인자순서 상관없이 적용되지만, ()형태로 반환하게되면 인자순서를 서비스형태와 동일하게 넣어야 함
+export class ArticleService {
+  async createArticle(
+    userId: number,
+    title: string,
+    content: string,
+    image?: string | null,
+  ): Promise<Article> {
+    return articleRepo.create({
+      title,
+      content,
+      image,
+      user: { connect: { id: userId } },
+    });
+  }
+  async getArticle(articleId: number, userId?: number): Promise<ArticleResponse> {
+    const article: ArticleLikesAndCount = await articleRepo.findByIdWithLikes(articleId, userId);
+    const { likes, _count, ...articleData } = article;
+    const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined;
+    return { ...articleData, likeCount: _count.likes, isLiked };
+  }
+  async updateArticle(
+    articleId: number,
+    userId: number,
+    data: { title?: string; content?: string; image?: string | null },
+  ): Promise<Article> {
+    const article = await articleRepo.findById(articleId);
+    if (article.userId !== userId) {
+      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
+    }
+    return articleRepo.update(articleId, data);
+  }
+  async deleteArticle(articleId: number, userId: number): Promise<void> {
+    const article = await articleRepo.findById(articleId);
+    if (article.userId !== userId) {
+      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
+    }
+    await articleRepo.delete(articleId);
+  }
+  async getArticleList(
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+    keyword?: string,
+    userId?: number,
+  ): Promise<ArticleListResponse> {
+    const where = {
+      title: keyword ? { contains: keyword } : undefined,
+    };
+    const [totalCount, articles] = await Promise.all([
+      articleRepo.count(where),
+      articleRepo.findArticleListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId,
+      }),
+    ]);
+    const list: ArticleResponse[] = articles.map((m) => {
+      const { _count, likes, ...basicArticleData } = m;
+      const response: ArticleResponse = {
+        ...basicArticleData,
+        likeCount: _count.likes,
+      };
+      if (!userId) {
+        return response;
+      }
+      const isLiked = (likes ?? []).length > 0;
+      return { ...basicArticleData, isLiked, likeCount: _count.likes };
+    });
+    const response: ArticleListResponse = {
+      list,
+      totalCount,
+    };
+    return response;
+  }
+  async createComment(userId: number, articleId: number, content: string): Promise<Comment> {
+    await articleRepo.findById(articleId);
+    const comment = await commentRepo.create({
+      content,
+      user: { connect: { id: userId } },
+      article: { connect: { id: articleId } },
+    });
+    const article = await articleRepo.findById(articleId);
+    if (article.userId !== userId) {
+      await notificationService.createNotification(
+        article.userId,
+        `내 게시글 "${article.title}"에 새로운 댓글이 달렸습니다.`,
+      );
+    }
+    return comment;
+  }
+  async getCommentList(
+    articleId: number,
+    limit: number,
+    cursor?: number,
+  ): Promise<CursorPaginated<Comment>> {
+    await articleRepo.findById(articleId);
+    const commentsWithCursor = await commentRepo.findCommentListQuery({ articleId }, limit, cursor);
+    const comments = commentsWithCursor.slice(0, limit);
+    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
+    const nextCursor = cursorComment ? cursorComment.id : null;
+    return { list: comments, nextCursor };
+  }
+  //like , unlike 둘다 message를 반환해버려서 이게..프로미스로 타입 설정하는 것이 의미가 있는지...로직 수정 생각해봐야할 듯
+  async likeArticle(userId: number, articleId: number): Promise<{ message: string }> {
+    const article = await articleRepo.findById(articleId);
+    const existingLike = await likeRepo.findLike(userId, { articleId });
+    if (existingLike) {
+      throw new AlreadyLikeError();
+    }
+    await likeRepo.createLike(userId, { articleId });
+    return { message: `${article.title}게시글에 좋아요를 눌렀습니다.` };
+  }
+  async unlikeArticle(userId: number, articleId: number): Promise<{ message: string }> {
+    const article = await articleRepo.findById(articleId);
+    try {
+      await likeRepo.deleteLike(userId, { articleId });
+    } catch (error: unknown) {
+      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
+        throw new AlreadyUnlikeError();
+      }
+      throw error;
+    }
+    return { message: `${article.title}게시글의 좋아요를 취소했습니다` };
+  }
+}
+export const articleService = new ArticleService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/services/commentService.ts.html b/mission9-10-11/coverage/services/commentService.ts.html new file mode 100644 index 000000000..b00d0ec11 --- /dev/null +++ b/mission9-10-11/coverage/services/commentService.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for services/commentService.ts + + + + + + + + + +
+
+

All files / services commentService.ts

+
+ +
+ 33.33% + Statements + 4/12 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 33.33% + Lines + 4/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { commentRepo } from '../repositories/commentRepository';
+import { ForbiddenError } from '../lib/errors/customErrors';
+import { Comment } from '@prisma/client';
+ 
+export class CommentService {
+  async updateComment(commentId: number, userId: number, content?: string): Promise<Comment> {
+    const comment = await commentRepo.findById(commentId);
+    if (comment.userId !== userId) {
+      throw new ForbiddenError('해당 댓글을 수정할 권한이 없습니다.');
+    }
+    return commentRepo.update(commentId, content);
+  }
+  async deleteComment(commentId: number, userId: number): Promise<void> {
+    const comment = await commentRepo.findById(commentId);
+    if (comment.userId !== userId) {
+      throw new ForbiddenError('해당 댓글을 삭제할 권한이 없습니다.');
+    }
+    await commentRepo.delete(commentId);
+  }
+}
+ 
+export const commnetService = new CommentService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/services/imageService.ts.html b/mission9-10-11/coverage/services/imageService.ts.html new file mode 100644 index 000000000..6f8b0cf18 --- /dev/null +++ b/mission9-10-11/coverage/services/imageService.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for services/imageService.ts + + + + + + + + + +
+
+

All files / services imageService.ts

+
+ +
+ 38.46% + Statements + 5/13 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 38.46% + Lines + 5/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { uploadImageResponse } from '../../types/image';
+import { Request } from 'express';
+import { BadRequestError } from '../lib/errors/customErrors';
+import path from 'path';
+import { STATIC_PATH } from '../lib/constants';
+ 
+export class ImageService {
+  buildImageUrl(req: Request): uploadImageResponse {
+    const host = req.get('host');
+    if (!host) {
+      throw new BadRequestError('요청 헤더에 host 정보가 없습니다.');
+    }
+    if (!req.file) {
+      throw new BadRequestError();
+    }
+    const filePath = path.join(host, STATIC_PATH, req.file.filename);
+    const url = `http://${filePath}`;
+    return { url };
+  }
+}
+ 
+export const imageService = new ImageService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/services/index.html b/mission9-10-11/coverage/services/index.html new file mode 100644 index 000000000..02ae16e1c --- /dev/null +++ b/mission9-10-11/coverage/services/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for services + + + + + + + + + +
+
+

All files services

+
+ +
+ 19.26% + Statements + 47/244 +
+ + +
+ 2.02% + Branches + 3/148 +
+ + +
+ 5.12% + Functions + 2/39 +
+ + +
+ 20.17% + Lines + 46/228 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articleService.ts +
+
13.55%8/590%0/340%0/1014.03%8/57
commentService.ts +
+
33.33%4/120%0/40%0/233.33%4/12
imageService.ts +
+
38.46%5/130%0/40%0/138.46%5/13
notificationService.ts +
+
33.33%5/150%0/20%0/435.71%5/14
productService.ts +
+
28.35%19/676.25%3/4820%2/1027.69%18/65
userService.ts +
+
7.69%6/780%0/560%0/128.95%6/67
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/services/notificationService.ts.html b/mission9-10-11/coverage/services/notificationService.ts.html new file mode 100644 index 000000000..92c271ff3 --- /dev/null +++ b/mission9-10-11/coverage/services/notificationService.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for services/notificationService.ts + + + + + + + + + +
+
+

All files / services notificationService.ts

+
+ +
+ 33.33% + Statements + 5/15 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 35.71% + Lines + 5/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { UnauthorizedError } from '../lib/errors/customErrors';
+import { notificationRepo } from '../repositories/notificationRepository';
+import { getIO } from '../socket';
+import type { Notification as PrismaNotification } from '@prisma/client';
+ 
+export class NotificationService {
+  async getNotifications(userId: number): Promise<PrismaNotification[]> {
+    return notificationRepo.getNotification(userId);
+  }
+  async getUnreadCount(userId: number): Promise<number> {
+    return notificationRepo.getUnreadCount(userId);
+  }
+  async createNotification(userId: number, message: string): Promise<PrismaNotification> {
+    const notification = await notificationRepo.create(userId, message);
+    const io = getIO();
+    io.to(`user-${userId}`).emit('notification', notification);
+    return notification;
+  }
+  async markAsRead(notificationId: number, userId: number): Promise<PrismaNotification> {
+    const notification = await notificationRepo.findByIds(notificationId, userId);
+    if (!notification) throw new UnauthorizedError();
+    return notificationRepo.updateRead(notificationId);
+  }
+}
+ 
+export const notificationService = new NotificationService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/services/productService.ts.html b/mission9-10-11/coverage/services/productService.ts.html new file mode 100644 index 000000000..56fdc37ce --- /dev/null +++ b/mission9-10-11/coverage/services/productService.ts.html @@ -0,0 +1,604 @@ + + + + + + Code coverage report for services/productService.ts + + + + + + + + + +
+
+

All files / services productService.ts

+
+ +
+ 28.35% + Statements + 19/67 +
+ + +
+ 6.25% + Branches + 3/48 +
+ + +
+ 20% + Functions + 2/10 +
+ + +
+ 27.69% + Lines + 18/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174  +1x +  +  +1x +1x +  +  +1x +1x +1x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +2x +2x +2x +  +  +  +2x +2x +  +  +  +  +2x +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { ProductLikesAndCount } from '../../types/product';
+import { productRepo } from '../repositories/productRepository';
+import { Product } from '@prisma/client';
+import type { ProductListResponse, ProductResponse } from '../../types/product';
+import { ForbiddenError } from '../lib/errors/customErrors';
+import { commentRepo } from '../repositories/commentRepository';
+import type { Comment } from '@prisma/client';
+import type { CursorPaginated } from '../../types/cursorPaginated';
+import { AlreadyLikeError, AlreadyUnlikeError } from '../lib/errors/customErrors';
+import { likeRepo } from '../repositories/likeRepository';
+import { Prisma } from '@prisma/client';
+import { notificationService } from './notificationService';
+ 
+//인자 순서가 옵셔널 다음 필수파라미터가 들어오면 컴파일에러가 발생함
+//객체로 묶어 보내기, 이러면 필수인 userid의 파라미터 순서를 바꾸지 않아도 됨
+export class ProductService {
+  async createProduct(params: {
+    name: string;
+    description: string;
+    price: number;
+    tags?: string[];
+    images?: string[];
+    userId: number;
+  }): Promise<Product> {
+    const { name, description, price, tags, images, userId } = params;
+    return productRepo.create({
+      name,
+      description,
+      price,
+      tags: tags ?? [],
+      images: images ?? [],
+      user: { connect: { id: userId } },
+    });
+  }
+  async getProduct(productId: number, userId?: number): Promise<ProductResponse> {
+    const product: ProductLikesAndCount = await productRepo.findByIdWithLikes(productId, userId);
+    const { likes, _count, ...productData } = product;
+    const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined;
+    return { ...productData, likeCount: _count.likes, isLiked };
+  }
+  async updateProduct(
+    productId: number,
+    userId: number,
+    data: {
+      name?: string;
+      description?: string;
+      price?: number;
+      tags?: string[];
+      images?: string[];
+    },
+  ): Promise<Product> {
+    const product = await productRepo.findById(productId);
+    if (product.userId !== userId) {
+      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
+    }
+    const updateProduct = await productRepo.update(productId, data);
+    //undefined가 아니면서 기존가격과 다른 경우
+    if (data.price !== undefined && product.price !== data.price) {
+      const likers = await likeRepo.getLikers({ productId });
+      for (const liker of likers) {
+        if (liker.userId !== userId) {
+          await notificationService.createNotification(
+            liker.userId,
+            `관심 상품 "${product.name}"의 가격이 변동되었습니다.`,
+          );
+        }
+      }
+    }
+    return updateProduct;
+  }
+  async deleteProduct(productId: number, userId: number): Promise<void> {
+    const product = await productRepo.findById(productId);
+    if (product.userId !== userId) {
+      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
+    }
+    await productRepo.delete(productId);
+  }
+  async getProductList(
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+    keyword?: string,
+    userId?: number,
+  ): Promise<ProductListResponse> {
+    const where = keyword
+      ? {
+          OR: [
+            { name: { contains: keyword } },
+            { description: { contains: keyword } },
+            { tags: { has: keyword } },
+          ],
+        }
+      : {};
+    const [totalCount, products] = await Promise.all([
+      productRepo.count(where),
+      productRepo.findProductListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId,
+      }),
+    ]);
+    const list: ProductResponse[] = products.map((m) => {
+      const { _count, likes, ...basicProductData } = m;
+      const response: ProductResponse = {
+        ...basicProductData,
+        likeCount: _count.likes,
+      };
+      Eif (!userId) {
+        return response;
+      }
+      const isLiked = (likes ?? []).length > 0;
+      return { ...basicProductData, isLiked, likeCount: _count.likes };
+    });
+    const response: ProductListResponse = {
+      list,
+      totalCount,
+    };
+    return response;
+  }
+  async createComment(userId: number, productId: number, content: string): Promise<Comment> {
+    await productRepo.findById(productId);
+    const comment = await commentRepo.create({
+      content,
+      user: { connect: { id: userId } },
+      product: { connect: { id: productId } },
+    });
+    const product = await productRepo.findById(productId);
+    if (product.userId !== userId) {
+      await notificationService.createNotification(
+        product.userId,
+        `내 상품 "${product.name}"에 새로운 댓글이 달렸습니다.`,
+      );
+    }
+    return comment;
+  }
+  async getCommentList(
+    productId: number,
+    limit: number,
+    cursor?: number,
+  ): Promise<CursorPaginated<Comment>> {
+    await productRepo.findById(productId);
+    const commentsWithCursor = await commentRepo.findCommentListQuery({ productId }, limit, cursor);
+    const comments = commentsWithCursor.slice(0, limit);
+    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
+    const nextCursor = cursorComment ? cursorComment.id : null;
+    return { list: comments, nextCursor };
+  }
+  async likeProduct(userId: number, productId: number): Promise<{ message: string }> {
+    const product = await productRepo.findById(productId);
+    const existingLike = await likeRepo.findLike(userId, { productId });
+    if (existingLike) {
+      throw new AlreadyLikeError();
+    }
+    await likeRepo.createLike(userId, { productId });
+    return { message: `${product.name}상품에 좋아요를 눌렀습니다.` };
+  }
+  async unlikeProduct(userId: number, productId: number): Promise<{ message: string }> {
+    const product = await productRepo.findById(productId);
+    try {
+      await likeRepo.deleteLike(userId, { productId });
+    } catch (error: unknown) {
+      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
+        throw new AlreadyUnlikeError();
+      }
+      throw error;
+    }
+    return { message: `${product.name}상품의 좋아요를 취소했습니다` };
+  }
+}
+ 
+export const productService = new ProductService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/services/userService.ts.html b/mission9-10-11/coverage/services/userService.ts.html new file mode 100644 index 000000000..9923c4656 --- /dev/null +++ b/mission9-10-11/coverage/services/userService.ts.html @@ -0,0 +1,721 @@ + + + + + + Code coverage report for services/userService.ts + + + + + + + + + +
+
+

All files / services userService.ts

+
+ +
+ 7.69% + Statements + 6/78 +
+ + +
+ 0% + Branches + 0/56 +
+ + +
+ 0% + Functions + 0/12 +
+ + +
+ 8.95% + Lines + 6/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +2131x +1x +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import bcrypt from 'bcrypt';
+import { userRepo } from '../repositories/userRepository';
+import type { Prisma, User } from '@prisma/client';
+import { ForbiddenError, UnauthorizedError } from '../lib/errors/customErrors';
+import { generateToken, verifyRefreshToken } from '../lib/token';
+import { productRepo } from '../repositories/productRepository';
+import type { ProductListResponse } from '../../types/product';
+import { ProfileResponse } from '../../types/user';
+ 
+class UserService {
+  async register(
+    nickname: string,
+    email: string,
+    password: string,
+    image?: string,
+  ): Promise<Omit<User, 'password'>> {
+    const salt = await bcrypt.genSalt(10);
+    const hashedPassword = await bcrypt.hash(password, salt);
+    const user = await userRepo.create({
+      nickname,
+      email,
+      password: hashedPassword,
+      image,
+    });
+    const { password: _, ...userWithoutPassword } = user;
+    return userWithoutPassword;
+  }
+  async login(
+    email: string,
+    password: string,
+  ): Promise<{ tokens: { accessToken: string; refreshToken: string }; message: string }> {
+    const user = await userRepo.findByEmail(email);
+    if (!user) {
+      //이메일, 비밀번호 검증에 대한 에러를 같은 메세지로 던짐으로써 좀 더 방어적으로 설계
+      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
+    }
+    const isPasswordValid = await bcrypt.compare(password, user.password);
+    if (!isPasswordValid) {
+      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
+    }
+    const tokens = generateToken(user.id);
+    return { tokens, message: '로그인에 성공했습니다.' };
+  }
+  async getProfile(myId: number): Promise<ProfileResponse> {
+    const user = await userRepo.findById(myId);
+    if (!user) throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
+    const { password: _, ...userInfo } = user;
+    const [myProductCount, myLikeProductCount, recentProductsRaw, recentLikedProductsRaw] =
+      await Promise.all([
+        productRepo.count({ userId: myId }),
+        productRepo.count({ likes: { some: { userId: myId } } }),
+        productRepo.findProductListWithLikes({
+          skip: 0,
+          take: 5,
+          orderBy: { createdAt: 'desc' },
+          where: { userId: myId },
+          userId: myId,
+        }),
+        productRepo.findProductListWithLikes({
+          skip: 0,
+          take: 5,
+          orderBy: { createdAt: 'desc' },
+          where: { likes: { some: { userId: myId } } },
+          userId: myId,
+        }),
+      ]);
+    const myRecentProducts = recentProductsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    const myRecentLikeProducts = recentLikedProductsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    return {
+      user: userInfo,
+      myProducts: {
+        list: myRecentProducts,
+        totalCount: myProductCount,
+      },
+      myLikedProducts: {
+        list: myRecentLikeProducts,
+        totalCount: myLikeProductCount,
+      },
+    };
+  }
+ 
+  async updateProfile(
+    userId: number,
+    nickname?: string,
+    email?: string,
+    image?: string | null,
+  ): Promise<Omit<User, 'password'>> {
+    const data: Prisma.UserUpdateInput = {};
+    if (nickname !== undefined) data.nickname = nickname;
+    if (email !== undefined) data.email = email;
+    if (image !== undefined) data.image = image;
+    const update = await userRepo.update(userId, data);
+    const { password: _, ...userWithoutPassword } = update;
+    return userWithoutPassword;
+  }
+  async patchPassword(userId: number, currentPassword: string, newPassword: string): Promise<void> {
+    const user = await userRepo.findById(userId);
+    if (!user) {
+      throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
+    }
+    const isPasswordValid = await bcrypt.compare(currentPassword, user.password);
+    if (!isPasswordValid) {
+      throw new ForbiddenError('현재 비밀번호가 올바르지 않습니다.');
+    }
+    const salt = await bcrypt.genSalt(10);
+    const hashedNewPassword = await bcrypt.hash(newPassword, salt);
+    await userRepo.update(userId, { password: hashedNewPassword });
+  }
+  async getMyProductList(
+    myId: number,
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+    keyword?: string,
+  ): Promise<ProductListResponse> {
+    const where = {
+      userId: myId,
+      ...(keyword
+        ? {
+            OR: [
+              { name: { contains: keyword } },
+              { description: { contains: keyword } },
+              { tags: { has: keyword } },
+            ],
+          }
+        : {}),
+    };
+    const [totalCount, productsRaw] = await Promise.all([
+      productRepo.count(where),
+      productRepo.findProductListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId: myId,
+      }),
+    ]);
+    const list = productsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    return { list, totalCount };
+  }
+  async refreshToken(refreshToken: string) {
+    let userId: number;
+    try {
+      const payload = verifyRefreshToken(refreshToken);
+      userId = payload.userId;
+    } catch (error) {
+      throw new UnauthorizedError('유효하지 않은 리프레시 토큰입니다.');
+    }
+    const user = await userRepo.findById(userId);
+    if (!user) {
+      throw new UnauthorizedError('존재하지 않는 사용자입니다.');
+    }
+    const tokens = generateToken(user.id);
+    return tokens;
+  }
+  async getMyLikedProducts(
+    myId: number,
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+  ): Promise<ProductListResponse> {
+    const where = {
+      likes: {
+        some: {
+          userId: myId,
+        },
+      },
+    };
+    const [totalCount, productsRaw] = await Promise.all([
+      productRepo.count(where),
+      productRepo.findProductListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId: myId,
+      }),
+    ]);
+    const list = productsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    return { list, totalCount };
+  }
+}
+ 
+export const userService = new UserService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/sort-arrow-sprite.png b/mission9-10-11/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/mission9-10-11/coverage/sorter.js b/mission9-10-11/coverage/sorter.js new file mode 100644 index 000000000..4ed70ae5a --- /dev/null +++ b/mission9-10-11/coverage/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/mission9-10-11/coverage/src/app.ts.html b/mission9-10-11/coverage/src/app.ts.html new file mode 100644 index 000000000..ebbdc13c5 --- /dev/null +++ b/mission9-10-11/coverage/src/app.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/app.ts + + + + + + + + + +
+
+

All files / src app.ts

+
+ +
+ 100% + Statements + 26/26 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 26/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +325x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +  +5x +  +5x +5x +5x +5x +  +5x +5x +5x +5x +5x +5x +  +5x +5x +  +5x + 
import express from 'express';
+import cors from 'cors';
+import path from 'path';
+import { PUBLIC_PATH, STATIC_PATH } from './lib/constants';
+import articlesRouter from './routers/articlesRouter';
+import productsRouter from './routers/productsRouter';
+import commentsRouter from './routers/commentsRouter';
+import imagesRouter from './routers/imagesRouter';
+import usersRouter from './routers/usersRouter';
+import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController';
+import cookieParser from 'cookie-parser';
+import notificationRouter from './routers/notificationRouter';
+ 
+const app = express();
+ 
+app.use(cors());
+app.use(cookieParser());
+app.use(express.json());
+app.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH)));
+ 
+app.use('/articles', articlesRouter);
+app.use('/products', productsRouter);
+app.use('/comments', commentsRouter);
+app.use('/images', imagesRouter);
+app.use('/users', usersRouter);
+app.use('/notifications', notificationRouter);
+ 
+app.use(defaultNotFoundHandler);
+app.use(globalErrorHandler);
+ 
+export default app;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/controllers/articlesController.ts.html b/mission9-10-11/coverage/src/controllers/articlesController.ts.html new file mode 100644 index 000000000..ee8c380d1 --- /dev/null +++ b/mission9-10-11/coverage/src/controllers/articlesController.ts.html @@ -0,0 +1,376 @@ + + + + + + Code coverage report for src/controllers/articlesController.ts + + + + + + + + + +
+
+

All files / src/controllers articlesController.ts

+
+ +
+ 90.76% + Statements + 59/65 +
+ + +
+ 60% + Branches + 12/20 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 90.76% + Lines + 59/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +985x +5x +5x +5x +  +  +  +  +5x +  +5x +  +  +5x +1x +1x +1x +  +  +1x +1x +  +  +5x +2x +2x +2x +1x +  +  +5x +2x +2x +2x +2x +  +  +2x +1x +  +  +5x +2x +2x +2x +  +  +2x +1x +  +  +  +5x +8x +6x +6x +6x +  +  +5x +1x +1x +1x +1x +  +  +1x +1x +  +  +5x +2x +2x +2x +2x +  +  +5x +1x +1x +1x +  +  +1x +1x +  +  +  +5x +1x +1x +1x +  +  +1x +1x +  + 
import { create } from 'superstruct';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { IdParamsStruct } from '../structs/commonStructs';
+import {
+  CreateArticleBodyStruct,
+  UpdateArticleBodyStruct,
+  GetArticleListParamsStruct,
+} from '../structs/articlesStructs';
+import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
+import { Request, Response } from 'express';
+import { articleService } from '../services/articleService';
+ 
+//게시물 생성
+export async function createArticle(req: Request, res: Response) {
+  const { title, content, image } = create(req.body, CreateArticleBodyStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const article = await articleService.createArticle(user.id, title, content, image);
+  return res.status(201).send(article);
+}
+// 게시글 조회(좋아요 포함)
+export async function getArticle(req: Request, res: Response) {
+  const { id } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  const article = await articleService.getArticle(id, user?.id);
+  return res.send(article);
+}
+//게시물 수정
+export async function updateArticle(req: Request, res: Response) {
+  const { id } = create(req.params, IdParamsStruct);
+  const data = create(req.body, UpdateArticleBodyStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const updated = await articleService.updateArticle(id, user.id, data);
+  return res.send(updated);
+}
+//게시물 삭제
+export async function deleteArticle(req: Request, res: Response) {
+  const { id } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  await articleService.deleteArticle(id, user.id);
+  return res.status(204).send();
+}
+ 
+//게시글 목록 조회(좋아요 포함)
+export async function getArticleList(req: Request, res: Response) {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct);
+  const user = req.user;
+  const articles = await articleService.getArticleList(page, pageSize, orderBy, keyword, user?.id);
+  return res.send(articles);
+}
+//댓글 등록
+export async function createComment(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, CreateCommentBodyStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const comment = await articleService.createComment(user.id, articleId, content);
+  return res.status(201).send(comment);
+}
+//댓글 목록 조회
+export async function getCommentList(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
+  const commnetsList = await articleService.getCommentList(articleId, limit, cursor);
+  return res.send(commnetsList);
+}
+//게시글 좋아요 등록
+export async function likeArticle(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const articleLike = await articleService.likeArticle(user.id, articleId);
+  return res.status(200).send(articleLike);
+}
+ 
+//게시글 좋아요 취소
+export async function unlikeArticle(req: Request, res: Response) {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const articleUnlike = await articleService.unlikeArticle(user.id, articleId);
+  return res.status(200).send(articleUnlike);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/controllers/commentsController.ts.html b/mission9-10-11/coverage/src/controllers/commentsController.ts.html new file mode 100644 index 000000000..9ef895178 --- /dev/null +++ b/mission9-10-11/coverage/src/controllers/commentsController.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/controllers/commentsController.ts + + + + + + + + + +
+
+

All files / src/controllers commentsController.ts

+
+ +
+ 35% + Statements + 7/20 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 35% + Lines + 7/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +305x +5x +5x +5x +  +5x +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  + 
import { create } from 'superstruct';
+import { UpdateCommentBodyStruct } from '../structs/commentsStruct';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { IdParamsStruct } from '../structs/commonStructs';
+import { Request, Response } from 'express';
+import { commnetService } from '../services/commentService';
+ 
+//댓글 수정
+export async function updateComment(req: Request, res: Response) {
+  const { id: commentId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, UpdateCommentBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const updatedComment = await commnetService.updateComment(commentId, user.id, content);
+  return res.send(updatedComment);
+}
+ 
+//댓글 삭제
+export async function deleteComment(req: Request, res: Response) {
+  const { id: commentId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  await commnetService.deleteComment(commentId, user.id);
+  return res.status(204).send();
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/controllers/errorController.ts.html b/mission9-10-11/coverage/src/controllers/errorController.ts.html new file mode 100644 index 000000000..86af6b171 --- /dev/null +++ b/mission9-10-11/coverage/src/controllers/errorController.ts.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for src/controllers/errorController.ts + + + + + + + + + +
+
+

All files / src/controllers errorController.ts

+
+ +
+ 24% + Statements + 6/25 +
+ + +
+ 0% + Branches + 0/18 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 24% + Lines + 6/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +1x +  +  +  +  +  +1x +  +1x +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { StructError } from 'superstruct';
+import {
+  NotFoundError,
+  BadRequestError,
+  ForbiddenError,
+  UnauthorizedError,
+} from '../lib/errors/customErrors';
+import { Prisma } from '@prisma/client';
+import { Request, Response, NextFunction } from 'express';
+import { isSyntaxJsonError } from '../lib/errors/errorUtils';
+ 
+//404 처리 미들웨어
+export function defaultNotFoundHandler(req: Request, res: Response, next: NextFunction) {
+  return res.status(404).send({ message: '존재하지 않습니다' });
+}
+//전역 에러 처리 미들웨어(400,401,403,404,500)
+export function globalErrorHandler(err: unknown, req: Request, res: Response, next: NextFunction) {
+  if (err instanceof StructError || err instanceof BadRequestError) {
+    return res.status(400).send({ message: '잘못된 요청입니다' });
+  }
+  if (isSyntaxJsonError(err)) {
+    return res.status(400).send({ message: '잘못된 요청입니다' });
+  }
+  if (err instanceof UnauthorizedError) {
+    return res.status(401).json({ message: err.message });
+  }
+  if (err instanceof ForbiddenError) {
+    return res.status(403).json({ message: err.message });
+  }
+  if (err instanceof NotFoundError) {
+    return res.status(404).send({ message: err.message });
+  }
+  //프리즈마 코드 에러, 그 외 known 에러 500처리
+  if (err instanceof Prisma.PrismaClientKnownRequestError) {
+    if (err.code === 'P2025') {
+      return res.status(404).json({ message: '존재하지 않습니다' });
+    }
+    if (err.code === 'P2002') {
+      return res.status(400).json({ message: '잘못된 요청입니다' });
+    }
+    return res.status(500).json({ message: '데이터 처리 중 오류가 발생했습니다' });
+  }
+ 
+  console.error(err);
+  return res.status(500).send({ message: '데이터 처리 중 오류가 발생했습니다' });
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/controllers/imagesController.ts.html b/mission9-10-11/coverage/src/controllers/imagesController.ts.html new file mode 100644 index 000000000..9de297b28 --- /dev/null +++ b/mission9-10-11/coverage/src/controllers/imagesController.ts.html @@ -0,0 +1,211 @@ + + + + + + Code coverage report for src/controllers/imagesController.ts + + + + + + + + + +
+
+

All files / src/controllers imagesController.ts

+
+ +
+ 50% + Statements + 10/20 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 50% + Lines + 10/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +431x +1x +1x +1x +1x +  +1x +  +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  + 
import multer from 'multer';
+import path from 'path';
+import { v4 as uuidv4 } from 'uuid';
+import { PUBLIC_PATH } from '../lib/constants';
+import { BadRequestError } from '../lib/errors/customErrors';
+import { Request, Response } from 'express';
+import { imageService } from '../services/imageService';
+ 
+const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];
+const FILE_SIZE_LIMIT = 5 * 1024 * 1024;
+ 
+//이미지 업로드 설정
+export const upload = multer({
+  storage: multer.diskStorage({
+    destination(req, file, cb) {
+      cb(null, PUBLIC_PATH);
+    },
+    filename(req, file, cb) {
+      const ext = path.extname(file.originalname);
+      const filename = `${uuidv4()}${ext}`;
+      cb(null, filename);
+    },
+  }),
+ 
+  limits: {
+    fileSize: FILE_SIZE_LIMIT,
+  },
+ 
+  fileFilter: function (req, file, cb) {
+    if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) {
+      const err = new BadRequestError('Only png, jpeg, and jpg are allowed');
+      return cb(err);
+    }
+ 
+    cb(null, true);
+  },
+});
+//이미지 업로드 핸들러
+export async function uploadImage(req: Request, res: Response) {
+  const response = imageService.buildImageUrl(req);
+  return res.send(response);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/controllers/index.html b/mission9-10-11/coverage/src/controllers/index.html new file mode 100644 index 000000000..68a331014 --- /dev/null +++ b/mission9-10-11/coverage/src/controllers/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/controllers + + + + + + + + + +
+
+

All files src/controllers

+
+ +
+ 70.68% + Statements + 164/232 +
+ + +
+ 41.93% + Branches + 26/62 +
+ + +
+ 68.75% + Functions + 22/32 +
+ + +
+ 70.68% + Lines + 164/232 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesController.ts +
+
90.76%59/6560%12/20100%9/990.76%59/65
commentsController.ts +
+
35%7/200%0/40%0/235%7/20
notificationController.ts +
+
30.43%7/230%0/60%0/330.43%7/23
productsController.ts +
+
90.76%59/6560%12/20100%9/990.76%59/65
usersController.ts +
+
54.23%32/5916.66%2/1244.44%4/954.23%32/59
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/controllers/notificationController.ts.html b/mission9-10-11/coverage/src/controllers/notificationController.ts.html new file mode 100644 index 000000000..3432fbb90 --- /dev/null +++ b/mission9-10-11/coverage/src/controllers/notificationController.ts.html @@ -0,0 +1,184 @@ + + + + + + Code coverage report for src/controllers/notificationController.ts + + + + + + + + + +
+
+

All files / src/controllers notificationController.ts

+
+ +
+ 30.43% + Statements + 7/23 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 30.43% + Lines + 7/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34  +5x +5x +5x +5x +  +5x +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  + 
import { Request, Response } from 'express';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { notificationService } from '../services/notificationService';
+import { IdParamsStruct } from '../structs/commonStructs';
+import { create } from 'superstruct';
+ 
+export async function getNotifications(req: Request, res: Response) {
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const notifications = await notificationService.getNotifications(user.id);
+  return res.send(notifications);
+}
+ 
+export async function getUnreadCount(req: Request, res: Response) {
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const count = await notificationService.getUnreadCount(user.id);
+  return res.send({ count });
+}
+ 
+export async function markAsRead(req: Request, res: Response) {
+  const { id: notificationId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const notification = await notificationService.markAsRead(notificationId, user.id);
+  return res.send(notification);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/controllers/productsController.ts.html b/mission9-10-11/coverage/src/controllers/productsController.ts.html new file mode 100644 index 000000000..11058dda7 --- /dev/null +++ b/mission9-10-11/coverage/src/controllers/productsController.ts.html @@ -0,0 +1,394 @@ + + + + + + Code coverage report for src/controllers/productsController.ts + + + + + + + + + +
+
+

All files / src/controllers productsController.ts

+
+ +
+ 90.76% + Statements + 59/65 +
+ + +
+ 60% + Branches + 12/20 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 90.76% + Lines + 59/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +1045x +5x +5x +  +  +  +  +5x +5x +  +5x +  +  +5x +1x +1x +1x +  +  +1x +  +  +  +  +  +  +  +1x +  +  +5x +2x +2x +2x +1x +  +  +5x +2x +2x +2x +2x +  +  +2x +1x +  +  +5x +2x +2x +2x +  +  +2x +1x +  +  +5x +12x +10x +10x +10x +  +  +  +5x +1x +1x +1x +1x +  +  +1x +1x +  +  +5x +2x +2x +2x +2x +  +  +5x +2x +2x +2x +  +  +2x +2x +  +  +5x +1x +1x +1x +  +  +1x +1x +  + 
import { create } from 'superstruct';
+import { IdParamsStruct } from '../structs/commonStructs';
+import {
+  CreateProductBodyStruct,
+  GetProductListParamsStruct,
+  UpdateProductBodyStruct,
+} from '../structs/productsStruct';
+import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { Request, Response } from 'express';
+import { productService } from '../services/productService';
+ 
+//상품 등록
+export async function createProduct(req: Request, res: Response) {
+  const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const product = await productService.createProduct({
+    name,
+    description,
+    price,
+    tags,
+    images,
+    userId: user.id,
+  });
+  return res.status(201).send(product);
+}
+//특정 상품 조회(좋아요 포함)
+export async function getProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  const product = await productService.getProduct(productId, user?.id);
+  return res.send(product);
+}
+//상품 수정
+export async function updateProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const data = create(req.body, UpdateProductBodyStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const updatedProduct = await productService.updateProduct(productId, user.id, data);
+  return res.send(updatedProduct);
+}
+//상품 삭제
+export async function deleteProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  await productService.deleteProduct(productId, user.id);
+  return res.status(204).send();
+}
+//상품 목록 조회(좋아요 포함)
+export async function getProductList(req: Request, res: Response) {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct);
+  const user = req.user;
+  const products = await productService.getProductList(page, pageSize, orderBy, keyword, user?.id);
+  return res.send(products);
+}
+ 
+//댓글 등록
+export async function createComment(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, CreateCommentBodyStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const comment = await productService.createComment(user.id, productId, content);
+  return res.status(201).send(comment);
+}
+//상품 댓글 목록 조회
+export async function getCommentList(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
+  const commentList = await productService.getCommentList(productId, limit, cursor);
+  return res.send(commentList);
+}
+//상품 좋아요 등록
+export async function likeProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const productLike = await productService.likeProduct(user.id, productId);
+  return res.status(200).send(productLike);
+}
+//상품 좋아요 취소
+export async function unlikeProduct(req: Request, res: Response) {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const productUnliked = await productService.unlikeProduct(user.id, productId);
+  return res.send(productUnliked);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/controllers/usersController.ts.html b/mission9-10-11/coverage/src/controllers/usersController.ts.html new file mode 100644 index 000000000..543581ad1 --- /dev/null +++ b/mission9-10-11/coverage/src/controllers/usersController.ts.html @@ -0,0 +1,361 @@ + + + + + + Code coverage report for src/controllers/usersController.ts + + + + + + + + + +
+
+

All files / src/controllers usersController.ts

+
+ +
+ 54.23% + Statements + 32/59 +
+ + +
+ 16.66% + Branches + 2/12 +
+ + +
+ 44.44% + Functions + 4/9 +
+ + +
+ 54.23% + Lines + 32/59 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +935x +  +  +  +  +  +  +  +5x +5x +5x +  +5x +5x +  +  +5x +22x +21x +20x +  +  +5x +18x +18x +17x +17x +  +  +5x +  +  +  +  +5x +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +5x +1x +1x +1x +  +  +1x +1x +  +  +5x +  +  +  +  +  +  +  +  +  +5x +1x +1x +1x +  +  +1x +1x +  + 
import {
+  CreateUserBodyStruct,
+  UpdateUserBodyStruct,
+  LoginBodyStruct,
+  ChangePasswordBodyStruct,
+  GetMyProductListParamsStruct,
+  GetMyLikedProductListParamsStruct,
+} from '../structs/usersStructs';
+import { create } from 'superstruct';
+import { clearTokenCookies, setTokenCookies } from '../lib/cookies';
+import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants';
+import { Request, Response } from 'express';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { userService } from '../services/userService';
+ 
+//회원가입
+export async function register(req: Request, res: Response) {
+  const { nickname, email, password, image } = create(req.body, CreateUserBodyStruct);
+  const user = await userService.register(nickname, email, password, image);
+  return res.status(201).send(user);
+}
+//로그인
+export async function login(req: Request, res: Response) {
+  const { email, password } = create(req.body, LoginBodyStruct);
+  const result = await userService.login(email, password);
+  setTokenCookies(res, result.tokens.accessToken, result.tokens.refreshToken);
+  return res.status(200).send({ message: result.message });
+}
+//로그아웃
+export async function logout(req: Request, res: Response) {
+  clearTokenCookies(res);
+  return res.status(200).send({ message: '로그아웃에 성공했습니다.' });
+}
+//내 프로필 조회 (최근 등록한 상품 5개, 최근 좋아요한 상품 5개 포함)
+export async function getProfile(req: Request, res: Response) {
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const profile = await userService.getProfile(user.id);
+  return res.send(profile);
+}
+//내 프로필 수정
+export async function updateProfile(req: Request, res: Response) {
+  const { nickname, email, image } = create(req.body, UpdateUserBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  const update = await userService.updateProfile(user.id, nickname, email, image);
+  return res.send(update);
+}
+//내 비밀번호 변경
+export async function patchPassword(req: Request, res: Response) {
+  const { currentPassword, newPassword } = create(req.body, ChangePasswordBodyStruct);
+  const user = req.user;
+  if (!user) {
+    throw new UnauthorizedError();
+  }
+  await userService.patchPassword(user.id, currentPassword, newPassword);
+  return res.status(200).send({ message: '비밀번호가 성공적으로 변경되었습니다.' });
+}
+//내가 등록한 상품 목록 조회 (상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능)
+export async function getMyProductList(req: Request, res: Response) {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetMyProductListParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const myProducts = await userService.getMyProductList(user.id, page, pageSize, orderBy, keyword);
+  return res.send(myProducts);
+}
+//토큰 갱신(리프레시)
+export async function refreshToken(req: Request, res: Response) {
+  const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME];
+  if (!refreshToken) {
+    throw new UnauthorizedError('리프레시 토큰이 없습니다.');
+  }
+  const tokens = await userService.refreshToken(refreshToken);
+  setTokenCookies(res, tokens.accessToken, tokens.refreshToken);
+  return res.status(200).send({ message: '토큰이 성공적으로 갱신되었습니다.' });
+}
+//내가 좋아요한 상품 목록 조회(상품이 꽤 많이 있을 경우 페이징 처리)
+export async function getMyLikedProducts(req: Request, res: Response) {
+  const { page, pageSize, orderBy } = create(req.query, GetMyLikedProductListParamsStruct);
+  const user = req.user;
+  Iif (!user) {
+    throw new UnauthorizedError();
+  }
+  const myLikedProducts = await userService.getMyLikedProducts(user.id, page, pageSize, orderBy);
+  return res.send(myLikedProducts);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/index.html b/mission9-10-11/coverage/src/index.html new file mode 100644 index 000000000..e19a66f1f --- /dev/null +++ b/mission9-10-11/coverage/src/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 100% + Statements + 26/26 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 26/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
app.ts +
+
100%26/26100%0/0100%0/0100%26/26
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/lib/constants.ts.html b/mission9-10-11/coverage/src/lib/constants.ts.html new file mode 100644 index 000000000..e54059ce3 --- /dev/null +++ b/mission9-10-11/coverage/src/lib/constants.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for src/lib/constants.ts + + + + + + + + + +
+
+

All files / src/lib constants.ts

+
+ +
+ 100% + Statements + 20/20 +
+ + +
+ 50% + Branches + 4/8 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +1x +  +1x +1x +1x +1x +1x +  +1x +  +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  + 
import dotenv from 'dotenv';
+dotenv.config();
+ 
+const DATABASE_URL = process.env.DATABASE_URL;
+const NODE_ENV = process.env.NODE_ENV || 'development';
+const PORT = process.env.PORT || 3000;
+const PUBLIC_PATH = 'public';
+const STATIC_PATH = '/public';
+const JWT_ACCESS_TOKEN_SECRET =
+  process.env.JWT_ACCESS_TOKEN_SECRET || 'your_jwt_access_token_secret';
+const JWT_REFRESH_TOKEN_SECRET =
+  process.env.JWT_REFRESH_TOKEN_SECRET || 'your_jwt_refresh_token_secret';
+const ACCESS_TOKEN_COOKIE_NAME = 'access-token';
+const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token';
+ 
+export {
+  DATABASE_URL,
+  NODE_ENV,
+  PORT,
+  PUBLIC_PATH,
+  STATIC_PATH,
+  JWT_ACCESS_TOKEN_SECRET,
+  JWT_REFRESH_TOKEN_SECRET,
+  ACCESS_TOKEN_COOKIE_NAME,
+  REFRESH_TOKEN_COOKIE_NAME,
+};
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/lib/cookies.ts.html b/mission9-10-11/coverage/src/lib/cookies.ts.html new file mode 100644 index 000000000..b4382c51e --- /dev/null +++ b/mission9-10-11/coverage/src/lib/cookies.ts.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for src/lib/cookies.ts + + + + + + + + + +
+
+

All files / src/lib cookies.ts

+
+ +
+ 42.85% + Statements + 3/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 42.85% + Lines + 3/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +291x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  + 
import { NODE_ENV, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from './constants';
+import { Response } from 'express';
+ 
+export function setTokenCookies(res: Response, accessToken: string, refreshToken: string) {
+  res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+    maxAge: 1 * 60 * 60 * 1000, // 1시간
+  });
+  res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+    maxAge: 7 * 24 * 60 * 60 * 1000, // 7일
+    path: '/users/refresh',
+  });
+}
+ 
+export function clearTokenCookies(res: Response) {
+  res.clearCookie(ACCESS_TOKEN_COOKIE_NAME, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+  });
+  res.clearCookie(REFRESH_TOKEN_COOKIE_NAME, {
+    httpOnly: true,
+    secure: NODE_ENV === 'production',
+    path: '/users/refresh',
+  });
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/lib/errors/customErrors.ts.html b/mission9-10-11/coverage/src/lib/errors/customErrors.ts.html new file mode 100644 index 000000000..7992d9e0a --- /dev/null +++ b/mission9-10-11/coverage/src/lib/errors/customErrors.ts.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for src/lib/errors/customErrors.ts + + + + + + + + + +
+
+

All files / src/lib/errors customErrors.ts

+
+ +
+ 38.88% + Statements + 7/18 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 38.88% + Lines + 7/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  + 
export class BaseError extends Error {
+  statusCode: number;
+  constructor(message: string, statusCode: number) {
+    super(message);
+    this.name = new.target.name;
+    this.statusCode = statusCode;
+  }
+}
+ 
+export class NotFoundError extends BaseError {
+  constructor(message = '존재하지 않습니다') {
+    super(message, 404);
+  }
+}
+ 
+export class UnauthorizedError extends BaseError {
+  constructor(message = '인증이 필요합니다') {
+    super(message, 401);
+  }
+}
+ 
+export class BadRequestError extends BaseError {
+  constructor(message = '잘못된 요청입니다') {
+    super(message, 400);
+  }
+}
+ 
+export class ForbiddenError extends BaseError {
+  constructor(message = '비밀번호가 틀렸습니다') {
+    super(message, 403);
+  }
+}
+ 
+export class AlreadyLikeError extends ForbiddenError {
+  constructor(message = '이미 좋아요를 눌렀습니다.') {
+    super(message);
+    this.name = new.target.name;
+  }
+}
+ 
+export class AlreadyUnlikeError extends ForbiddenError {
+  constructor(message = '좋아요가 존재하지 않습니다.') {
+    super(message);
+    this.name = new.target.name;
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/lib/errors/errorUtils.ts.html b/mission9-10-11/coverage/src/lib/errors/errorUtils.ts.html new file mode 100644 index 000000000..27ac22c0a --- /dev/null +++ b/mission9-10-11/coverage/src/lib/errors/errorUtils.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/lib/errors/errorUtils.ts + + + + + + + + + +
+
+

All files / src/lib/errors errorUtils.ts

+
+ +
+ 20% + Statements + 1/5 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 25% + Lines + 1/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14  +  +  +  +  +1x +  +  +  +  +  +  +  + 
interface SyntaxJsonError extends SyntaxError {
+  status?: number;
+  body?: unknown;
+}
+ 
+export function isSyntaxJsonError(err: unknown): err is SyntaxJsonError {
+  if (!(err instanceof SyntaxError)) return false;
+  const e = err as Partial<SyntaxJsonError>;
+  return typeof e.status === 'number' && 'body' in e;
+}
+// Partial<SyntaxJsonError>;
+// 얘는 SyntaxJsonError의 일부 프로퍼티만 가지고 있을 수도 있어”
+// 라고 TS에게 알려서 e.status, e.body 같은 속성 접근을 가능하게 해주는 장치
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/lib/errors/index.html b/mission9-10-11/coverage/src/lib/errors/index.html new file mode 100644 index 000000000..2bab3a8f0 --- /dev/null +++ b/mission9-10-11/coverage/src/lib/errors/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/lib/errors + + + + + + + + + +
+
+

All files src/lib/errors

+
+ +
+ 34.78% + Statements + 8/23 +
+ + +
+ 0% + Branches + 0/10 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 36.36% + Lines + 8/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
customErrors.ts +
+
38.88%7/180%0/60%0/738.88%7/18
errorUtils.ts +
+
20%1/50%0/40%0/125%1/4
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/lib/index.html b/mission9-10-11/coverage/src/lib/index.html new file mode 100644 index 000000000..1cd991112 --- /dev/null +++ b/mission9-10-11/coverage/src/lib/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/lib + + + + + + + + + +
+
+

All files src/lib

+
+ +
+ 74.46% + Statements + 35/47 +
+ + +
+ 50% + Branches + 4/8 +
+ + +
+ 37.5% + Functions + 3/8 +
+ + +
+ 73.91% + Lines + 34/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
constants.ts +
+
100%20/2050%4/8100%0/0100%20/20
cookies.ts +
+
42.85%3/7100%0/00%0/242.85%3/7
prismaClient.ts +
+
100%2/2100%0/0100%0/0100%2/2
token.ts +
+
41.66%5/12100%0/00%0/341.66%5/12
withAsync.ts +
+
83.33%5/6100%0/0100%3/380%4/5
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/lib/prismaClient.ts.html b/mission9-10-11/coverage/src/lib/prismaClient.ts.html new file mode 100644 index 000000000..2b46ffc58 --- /dev/null +++ b/mission9-10-11/coverage/src/lib/prismaClient.ts.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for src/lib/prismaClient.ts + + + + + + + + + +
+
+

All files / src/lib prismaClient.ts

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +  +1x + 
import { PrismaClient } from '@prisma/client';
+ 
+export const prisma = new PrismaClient();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/lib/token.ts.html b/mission9-10-11/coverage/src/lib/token.ts.html new file mode 100644 index 000000000..7f237a0d4 --- /dev/null +++ b/mission9-10-11/coverage/src/lib/token.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for src/lib/token.ts + + + + + + + + + +
+
+

All files / src/lib token.ts

+
+ +
+ 41.66% + Statements + 5/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 41.66% + Lines + 5/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  + 
import jwt, { JwtPayload } from 'jsonwebtoken';
+import { JWT_ACCESS_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET } from './constants';
+ 
+interface TokenPayload extends JwtPayload {
+  id: number;
+}
+ 
+export function generateToken(userId: number) {
+  const accessToken = jwt.sign({ id: userId }, JWT_ACCESS_TOKEN_SECRET, { expiresIn: '1h' });
+  const refreshToken = jwt.sign({ id: userId }, JWT_REFRESH_TOKEN_SECRET, { expiresIn: '1d' });
+  return { accessToken, refreshToken };
+}
+ 
+export function verifyAccessToken(token: string) {
+  const decoded = jwt.verify(token, JWT_ACCESS_TOKEN_SECRET) as TokenPayload;
+  return { userId: decoded.id };
+}
+ 
+export function verifyRefreshToken(token: string) {
+  const decoded = jwt.verify(token, JWT_REFRESH_TOKEN_SECRET) as TokenPayload;
+  return { userId: decoded.id };
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/lib/withAsync.ts.html b/mission9-10-11/coverage/src/lib/withAsync.ts.html new file mode 100644 index 000000000..809cf0593 --- /dev/null +++ b/mission9-10-11/coverage/src/lib/withAsync.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/lib/withAsync.ts + + + + + + + + + +
+
+

All files / src/lib withAsync.ts

+
+ +
+ 83.33% + Statements + 5/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 80% + Lines + 4/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14  +  +1x +  +  +33x +2x +2x +  +  +  +  +  + 
import type { Request, Response, NextFunction, RequestHandler } from 'express';
+ 
+export function withAsync<T = unknown>(
+  handler: (req: Request, res: Response, next: NextFunction) => Promise<T>,
+): RequestHandler {
+  return async (req, res, next) => {
+    try {
+      await handler(req, res, next);
+    } catch (e) {
+      next(e);
+    }
+  };
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/middlewares/authenticate.ts.html b/mission9-10-11/coverage/src/middlewares/authenticate.ts.html new file mode 100644 index 000000000..357387e1e --- /dev/null +++ b/mission9-10-11/coverage/src/middlewares/authenticate.ts.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for src/middlewares/authenticate.ts + + + + + + + + + +
+
+

All files / src/middlewares authenticate.ts

+
+ +
+ 55% + Statements + 11/20 +
+ + +
+ 42.85% + Branches + 3/7 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 52.63% + Lines + 10/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +311x +1x +1x +1x +  +  +  +26x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { prisma } from '../lib/prismaClient';
+import { verifyAccessToken } from '../lib/token';
+import { ACCESS_TOKEN_COOKIE_NAME } from '../lib/constants';
+import { UnauthorizedError } from '../lib/errors/customErrors';
+import { NextFunction, Request, Response } from 'express';
+ 
+function authenticate(options = { optional: false }) {
+  return async (req: Request, res: Response, next: NextFunction) => {
+    const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME];
+    Eif (!accessToken) {
+      Eif (options.optional) {
+        return next();
+      }
+      return next(new UnauthorizedError());
+    }
+    try {
+      const { userId } = verifyAccessToken(accessToken); //디코딩 된 토큰에서 user id 추출
+      const user = await prisma.user.findUniqueOrThrow({ where: { id: userId } });
+      req.user = user;
+    } catch (error) {
+      if (options.optional) {
+        return next();
+      }
+      return next(new UnauthorizedError());
+    }
+    next();
+  };
+}
+ 
+export default authenticate;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/middlewares/index.html b/mission9-10-11/coverage/src/middlewares/index.html new file mode 100644 index 000000000..3c8f540d7 --- /dev/null +++ b/mission9-10-11/coverage/src/middlewares/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/middlewares + + + + + + + + + +
+
+

All files src/middlewares

+
+ +
+ 55% + Statements + 11/20 +
+ + +
+ 42.85% + Branches + 3/7 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 52.63% + Lines + 10/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
authenticate.ts +
+
55%11/2042.85%3/7100%3/352.63%10/19
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/repositories/articleRepository.ts.html b/mission9-10-11/coverage/src/repositories/articleRepository.ts.html new file mode 100644 index 000000000..f3d106be9 --- /dev/null +++ b/mission9-10-11/coverage/src/repositories/articleRepository.ts.html @@ -0,0 +1,256 @@ + + + + + + Code coverage report for src/repositories/articleRepository.ts + + + + + + + + + +
+
+

All files / src/repositories articleRepository.ts

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 75% + Branches + 6/8 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58  +5x +  +  +5x +  +1x +  +  +10x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +1x +  +  +1x +  +  +  +5x + 
import { Prisma } from '@prisma/client';
+import { prisma } from '../lib/prismaClient';
+import { ArticleLikesAndCount } from '../../types/article';
+ 
+export class ArticleRepository {
+  async create(data: Prisma.ArticleCreateInput) {
+    return prisma.article.create({ data });
+  }
+  async findById(id: number) {
+    return prisma.article.findUniqueOrThrow({ where: { id } });
+  }
+  async findByIdWithLikes(id: number, userId?: number): Promise<ArticleLikesAndCount> {
+    return prisma.article.findUniqueOrThrow({
+      where: { id },
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          //비로그인 시 -1을 줘서 []을 뱉도록
+          where: { userId: userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async findArticleListWithLikes(params: {
+    skip: number;
+    take: number;
+    orderBy: Prisma.ArticleOrderByWithRelationInput;
+    where: Prisma.ArticleWhereInput;
+    userId?: number;
+  }): Promise<ArticleLikesAndCount[]> {
+    return prisma.article.findMany({
+      skip: params.skip,
+      take: params.take,
+      orderBy: params.orderBy,
+      where: params.where,
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          where: { userId: params.userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async count(where: Prisma.ArticleWhereInput) {
+    return prisma.article.count({ where });
+  }
+  async update(id: number, data: Prisma.ArticleUpdateInput) {
+    return prisma.article.update({ where: { id }, data });
+  }
+  async delete(id: number) {
+    return prisma.article.delete({ where: { id } });
+  }
+}
+ 
+export const articleRepo = new ArticleRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/repositories/commentRepository.ts.html b/mission9-10-11/coverage/src/repositories/commentRepository.ts.html new file mode 100644 index 000000000..7b20732b8 --- /dev/null +++ b/mission9-10-11/coverage/src/repositories/commentRepository.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/repositories/commentRepository.ts + + + + + + + + + +
+
+

All files / src/repositories commentRepository.ts

+
+ +
+ 62.5% + Statements + 5/8 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 40% + Functions + 2/5 +
+ + +
+ 62.5% + Lines + 5/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32  +5x +  +5x +  +2x +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x + 
import { Prisma } from '@prisma/client';
+import { prisma } from '../lib/prismaClient';
+ 
+export class CommentRepository {
+  async create(data: Prisma.CommentCreateInput) {
+    return prisma.comment.create({ data });
+  }
+  async findCommentListQuery(
+    whereCondition: { articleId: number } | { productId: number },
+    limit: number,
+    cursor?: number,
+  ) {
+    return prisma.comment.findMany({
+      cursor: cursor ? { id: cursor } : undefined,
+      take: limit + 1,
+      where: whereCondition,
+      orderBy: { createdAt: 'desc' },
+    });
+  }
+  async findById(id: number) {
+    return prisma.comment.findUniqueOrThrow({ where: { id } });
+  }
+  async update(id: number, content?: string) {
+    return prisma.comment.update({ where: { id }, data: { content } });
+  }
+  async delete(id: number) {
+    return prisma.comment.delete({ where: { id } });
+  }
+}
+ 
+export const commentRepo = new CommentRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/repositories/index.html b/mission9-10-11/coverage/src/repositories/index.html new file mode 100644 index 000000000..582634d54 --- /dev/null +++ b/mission9-10-11/coverage/src/repositories/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for src/repositories + + + + + + + + + +
+
+

All files src/repositories

+
+ +
+ 73.07% + Statements + 38/52 +
+ + +
+ 69.23% + Branches + 18/26 +
+ + +
+ 63.63% + Functions + 21/33 +
+ + +
+ 73.07% + Lines + 38/52 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articleRepository.ts +
+
100%10/1075%6/8100%7/7100%10/10
commentRepository.ts +
+
62.5%5/850%1/240%2/562.5%5/8
likeRepository.ts +
+
77.77%7/966.66%4/675%3/477.77%7/9
notificationRepository.ts +
+
37.5%3/8100%0/00%0/537.5%3/8
productRepository.ts +
+
81.81%9/1170%7/1087.5%7/881.81%9/11
userRepository.ts +
+
66.66%4/6100%0/050%2/466.66%4/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/repositories/likeRepository.ts.html b/mission9-10-11/coverage/src/repositories/likeRepository.ts.html new file mode 100644 index 000000000..72f19bc21 --- /dev/null +++ b/mission9-10-11/coverage/src/repositories/likeRepository.ts.html @@ -0,0 +1,193 @@ + + + + + + Code coverage report for src/repositories/likeRepository.ts + + + + + + + + + +
+
+

All files / src/repositories likeRepository.ts

+
+ +
+ 77.77% + Statements + 7/9 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 77.77% + Lines + 7/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37  +5x +  +  +  +  +3x +  +  +3x +  +  +  +  +3x +  +  +  +2x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +5x + 
import { LikeTarget } from '../../types/like';
+import { prisma } from '../lib/prismaClient';
+ 
+class LikdeRepository {
+  async findLike(userId: number, target: LikeTarget) {
+    const whereCondition =
+      'articleId' in target
+        ? { userId_articleId: { userId, articleId: target.articleId } }
+        : { userId_productId: { userId, productId: target.productId } };
+    return prisma.like.findUnique({
+      where: whereCondition,
+    });
+  }
+  async createLike(userId: number, target: LikeTarget) {
+    return prisma.like.create({ data: { userId, ...target } });
+  }
+  async deleteLike(userId: number, target: LikeTarget) {
+    const whereCondition =
+      'articleId' in target
+        ? { userId_articleId: { userId, articleId: target.articleId } }
+        : { userId_productId: { userId, productId: target.productId } };
+    return prisma.like.delete({
+      where: whereCondition,
+    });
+  }
+  async getLikers(target: LikeTarget) {
+    const whereCondition =
+      'articleId' in target ? { articleId: target.articleId } : { productId: target.productId };
+    return prisma.like.findMany({
+      where: whereCondition,
+      select: { userId: true },
+    });
+  }
+}
+ 
+export const likeRepo = new LikdeRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/repositories/notificationRepository.ts.html b/mission9-10-11/coverage/src/repositories/notificationRepository.ts.html new file mode 100644 index 000000000..145a57f7c --- /dev/null +++ b/mission9-10-11/coverage/src/repositories/notificationRepository.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for src/repositories/notificationRepository.ts + + + + + + + + + +
+
+

All files / src/repositories notificationRepository.ts

+
+ +
+ 37.5% + Statements + 3/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 37.5% + Lines + 3/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +275x +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x + 
import { prisma } from '../lib/prismaClient';
+ 
+export class NotificationRepository {
+  async getNotification(userId: number) {
+    return prisma.notification.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } });
+  }
+  async getUnreadCount(userId: number) {
+    return prisma.notification.count({ where: { userId, isRead: false } });
+  }
+  async create(userId: number, message: string) {
+    return prisma.notification.create({ data: { userId, message } });
+  }
+  async findByIds(notificationId: number, userId: number) {
+    return prisma.notification.findFirst({
+      where: { id: notificationId, userId },
+    });
+  }
+  async updateRead(notificationId: number) {
+    return prisma.notification.update({
+      where: { id: notificationId },
+      data: { isRead: true },
+    });
+  }
+}
+ 
+export const notificationRepo = new NotificationRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/repositories/productRepository.ts.html b/mission9-10-11/coverage/src/repositories/productRepository.ts.html new file mode 100644 index 000000000..9e6abc4a2 --- /dev/null +++ b/mission9-10-11/coverage/src/repositories/productRepository.ts.html @@ -0,0 +1,280 @@ + + + + + + Code coverage report for src/repositories/productRepository.ts + + + + + + + + + +
+
+

All files / src/repositories productRepository.ts

+
+ +
+ 81.81% + Statements + 9/11 +
+ + +
+ 70% + Branches + 7/10 +
+ + +
+ 87.5% + Functions + 7/8 +
+ + +
+ 81.81% + Lines + 9/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66  +5x +  +  +  +  +  +1x +  +  +11x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +  +  +  +  +  +12x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +12x +  +  +  +  +  +  +  +  +  +  +  +5x + 
import { ProductLikesAndCount } from '../../types/product';
+import { prisma } from '../lib/prismaClient';
+import { Prisma } from '@prisma/client';
+import type { ProductRecentType } from '../../types/product';
+ 
+class ProductRepository {
+  async create(data: Prisma.ProductCreateInput) {
+    return prisma.product.create({ data });
+  }
+  async findById(id: number) {
+    return prisma.product.findUniqueOrThrow({ where: { id } });
+  }
+  async findByIdWithLikes(id: number, userId?: number): Promise<ProductLikesAndCount> {
+    return prisma.product.findUniqueOrThrow({
+      where: { id },
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          where: { userId: userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async update(id: number, data: Prisma.ProductUpdateInput) {
+    return prisma.product.update({ where: { id }, data });
+  }
+  async delete(id: number) {
+    return prisma.product.delete({ where: { id } });
+  }
+  async findProductListWithLikes(params: {
+    skip: number;
+    take: number;
+    orderBy: Prisma.ProductOrderByWithRelationInput;
+    where: Prisma.ProductWhereInput;
+    userId?: number;
+  }): Promise<ProductLikesAndCount[]> {
+    return prisma.product.findMany({
+      skip: params.skip,
+      take: params.take,
+      orderBy: params.orderBy,
+      where: params.where,
+      include: {
+        _count: { select: { likes: true } },
+        likes: {
+          where: { userId: params.userId ?? -1 },
+          select: { id: true },
+        },
+      },
+    });
+  }
+  async count(where: Prisma.ProductWhereInput) {
+    return prisma.product.count({ where });
+  }
+  async findRecentProduct(userId: number, limit: number, type: ProductRecentType) {
+    const whereCondition = type === 'myUploaded' ? { userId } : { likes: { some: { userId } } };
+    return prisma.product.findMany({
+      where: whereCondition,
+      orderBy: { createdAt: 'desc' },
+      take: limit,
+    });
+  }
+}
+ 
+export const productRepo = new ProductRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/repositories/userRepository.ts.html b/mission9-10-11/coverage/src/repositories/userRepository.ts.html new file mode 100644 index 000000000..97525f6a6 --- /dev/null +++ b/mission9-10-11/coverage/src/repositories/userRepository.ts.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for src/repositories/userRepository.ts + + + + + + + + + +
+
+

All files / src/repositories userRepository.ts

+
+ +
+ 66.66% + Statements + 4/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 2/4 +
+ + +
+ 66.66% + Lines + 4/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +205x +  +  +  +  +21x +  +  +18x +  +  +  +  +  +  +  +  +  +5x + 
import { prisma } from '../lib/prismaClient';
+import { Prisma } from '@prisma/client';
+ 
+class UserRepository {
+  async create(data: Prisma.UserCreateInput) {
+    return prisma.user.create({ data });
+  }
+  async findByEmail(email: string) {
+    return prisma.user.findUnique({ where: { email } });
+  }
+  async update(id: number, data: Prisma.UserUpdateInput) {
+    return prisma.user.update({ where: { id }, data });
+  }
+  async findById(id: number) {
+    return prisma.user.findUnique({ where: { id } });
+  }
+}
+ 
+export const userRepo = new UserRepository();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/routers/articlesRouter.ts.html b/mission9-10-11/coverage/src/routers/articlesRouter.ts.html new file mode 100644 index 000000000..79e08a796 --- /dev/null +++ b/mission9-10-11/coverage/src/routers/articlesRouter.ts.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for src/routers/articlesRouter.ts + + + + + + + + + +
+
+

All files / src/routers articlesRouter.ts

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 15/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +295x +5x +5x +  +  +  +  +  +  +  +  +  +  +5x +  +5x +  +5x +5x +5x +5x +5x +5x +5x +5x +5x +  +5x + 
import express from 'express';
+import { withAsync } from '../lib/withAsync';
+import {
+  createArticle,
+  getArticleList,
+  getArticle,
+  updateArticle,
+  deleteArticle,
+  createComment,
+  getCommentList,
+  likeArticle,
+  unlikeArticle,
+} from '../controllers/articlesController';
+import authenticate from '../middlewares/authenticate';
+ 
+const articlesRouter = express.Router();
+ 
+articlesRouter.post('/', authenticate(), withAsync(createArticle));
+articlesRouter.get('/', authenticate({ optional: true }), withAsync(getArticleList));
+articlesRouter.get('/:id', authenticate({ optional: true }), withAsync(getArticle));
+articlesRouter.patch('/:id', authenticate(), withAsync(updateArticle));
+articlesRouter.delete('/:id', authenticate(), withAsync(deleteArticle));
+articlesRouter.post('/:id/comments', authenticate(), withAsync(createComment));
+articlesRouter.get('/:id/comments', withAsync(getCommentList));
+articlesRouter.post('/:id/like', authenticate(), withAsync(likeArticle));
+articlesRouter.delete('/:id/like', authenticate(), withAsync(unlikeArticle));
+ 
+export default articlesRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/routers/commentsRouter.ts.html b/mission9-10-11/coverage/src/routers/commentsRouter.ts.html new file mode 100644 index 000000000..8802d62a2 --- /dev/null +++ b/mission9-10-11/coverage/src/routers/commentsRouter.ts.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for src/routers/commentsRouter.ts + + + + + + + + + +
+
+

All files / src/routers commentsRouter.ts

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +125x +5x +5x +5x +  +5x +  +5x +5x +  +5x + 
import express from 'express';
+import { withAsync } from '../lib/withAsync';
+import { updateComment, deleteComment } from '../controllers/commentsController';
+import authenticate from '../middlewares/authenticate';
+ 
+const commentsRouter = express.Router();
+ 
+commentsRouter.patch('/:id', authenticate(), withAsync(updateComment));
+commentsRouter.delete('/:id', authenticate(), withAsync(deleteComment));
+ 
+export default commentsRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/routers/imagesRouter.ts.html b/mission9-10-11/coverage/src/routers/imagesRouter.ts.html new file mode 100644 index 000000000..8754a8533 --- /dev/null +++ b/mission9-10-11/coverage/src/routers/imagesRouter.ts.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for src/routers/imagesRouter.ts + + + + + + + + + +
+
+

All files / src/routers imagesRouter.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +105x +5x +5x +  +5x +  +5x +  +5x + 
import express from 'express';
+import { withAsync } from '../lib/withAsync';
+import { upload, uploadImage } from '../controllers/imagesController';
+ 
+const imagesRouter = express.Router();
+ 
+imagesRouter.post('/upload', upload.single('image'), withAsync(uploadImage));
+ 
+export default imagesRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/routers/index.html b/mission9-10-11/coverage/src/routers/index.html new file mode 100644 index 000000000..547f536b5 --- /dev/null +++ b/mission9-10-11/coverage/src/routers/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for src/routers + + + + + + + + + +
+
+

All files src/routers

+
+ +
+ 100% + Statements + 69/69 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 69/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesRouter.ts +
+
100%15/15100%0/0100%0/0100%15/15
commentsRouter.ts +
+
100%8/8100%0/0100%0/0100%8/8
imagesRouter.ts +
+
100%6/6100%0/0100%0/0100%6/6
notificationRouter.ts +
+
100%9/9100%0/0100%0/0100%9/9
productsRouter.ts +
+
100%18/18100%0/0100%0/0100%18/18
usersRouter.ts +
+
100%13/13100%0/0100%0/0100%13/13
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/routers/notificationRouter.ts.html b/mission9-10-11/coverage/src/routers/notificationRouter.ts.html new file mode 100644 index 000000000..1756ffb34 --- /dev/null +++ b/mission9-10-11/coverage/src/routers/notificationRouter.ts.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for src/routers/notificationRouter.ts + + + + + + + + + +
+
+

All files / src/routers notificationRouter.ts

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +175x +5x +5x +5x +  +  +  +  +  +5x +  +5x +5x +5x +  +5x + 
import express from 'express';
+import authenticate from '../middlewares/authenticate';
+import { withAsync } from '../lib/withAsync';
+import {
+  getNotifications,
+  getUnreadCount,
+  markAsRead,
+} from '../controllers/notificationController';
+ 
+const notificationRouter = express.Router();
+ 
+notificationRouter.get('/', authenticate(), withAsync(getNotifications));
+notificationRouter.get('/unread-count', authenticate(), withAsync(getUnreadCount));
+notificationRouter.patch('/:id/read', authenticate(), withAsync(markAsRead));
+ 
+export default notificationRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/routers/productsRouter.ts.html b/mission9-10-11/coverage/src/routers/productsRouter.ts.html new file mode 100644 index 000000000..9236e4c1a --- /dev/null +++ b/mission9-10-11/coverage/src/routers/productsRouter.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/routers/productsRouter.ts + + + + + + + + + +
+
+

All files / src/routers productsRouter.ts

+
+ +
+ 100% + Statements + 18/18 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 18/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +325x +5x +5x +  +  +  +  +  +  +  +  +  +  +5x +5x +  +5x +  +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +  +5x + 
import express from 'express';
+import { withAsync } from '../lib/withAsync';
+import {
+  createProduct,
+  getProduct,
+  updateProduct,
+  deleteProduct,
+  getProductList,
+  createComment,
+  getCommentList,
+  likeProduct,
+  unlikeProduct,
+} from '../controllers/productsController';
+import authenticate from '../middlewares/authenticate';
+import { getMyLikedProducts, getMyProductList } from '../controllers/usersController';
+ 
+const productsRouter = express.Router();
+ 
+productsRouter.get('/me', authenticate(), withAsync(getMyProductList));
+productsRouter.get('/me/likes', authenticate(), withAsync(getMyLikedProducts));
+productsRouter.get('/', authenticate({ optional: true }), withAsync(getProductList));
+productsRouter.post('/', authenticate(), withAsync(createProduct));
+productsRouter.get('/:id', authenticate({ optional: true }), withAsync(getProduct));
+productsRouter.patch('/:id', authenticate(), withAsync(updateProduct));
+productsRouter.delete('/:id', authenticate(), withAsync(deleteProduct));
+productsRouter.post('/:id/comments', authenticate(), withAsync(createComment));
+productsRouter.get('/:id/comments', withAsync(getCommentList));
+productsRouter.post('/:id/like', authenticate(), withAsync(likeProduct));
+productsRouter.delete('/:id/like', authenticate(), withAsync(unlikeProduct));
+ 
+export default productsRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/routers/usersRouter.ts.html b/mission9-10-11/coverage/src/routers/usersRouter.ts.html new file mode 100644 index 000000000..3f6d130f9 --- /dev/null +++ b/mission9-10-11/coverage/src/routers/usersRouter.ts.html @@ -0,0 +1,157 @@ + + + + + + Code coverage report for src/routers/usersRouter.ts + + + + + + + + + +
+
+

All files / src/routers usersRouter.ts

+
+ +
+ 100% + Statements + 13/13 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 13/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +255x +5x +5x +  +  +  +  +  +  +  +  +5x +  +5x +  +5x +5x +5x +5x +5x +5x +5x +  +5x + 
import express from 'express';
+import { withAsync } from '../lib/withAsync';
+import {
+  register,
+  login,
+  logout,
+  getProfile,
+  patchPassword,
+  updateProfile,
+  refreshToken,
+} from '../controllers/usersController';
+import authenticate from '../middlewares/authenticate';
+ 
+const usersRouter = express.Router();
+ 
+usersRouter.post('/register', withAsync(register));
+usersRouter.post('/login', withAsync(login));
+usersRouter.post('/logout', withAsync(logout));
+usersRouter.post('/refresh', withAsync(refreshToken));
+usersRouter.get('/me', authenticate(), withAsync(getProfile));
+usersRouter.patch('/me', authenticate(), withAsync(updateProfile));
+usersRouter.patch('/me/password', authenticate(), withAsync(patchPassword));
+ 
+export default usersRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/services/articleService.ts.html b/mission9-10-11/coverage/src/services/articleService.ts.html new file mode 100644 index 000000000..add761584 --- /dev/null +++ b/mission9-10-11/coverage/src/services/articleService.ts.html @@ -0,0 +1,505 @@ + + + + + + Code coverage report for src/services/articleService.ts + + + + + + + + + +
+
+

All files / src/services articleService.ts

+
+ +
+ 88.13% + Statements + 52/59 +
+ + +
+ 41.17% + Branches + 14/34 +
+ + +
+ 100% + Functions + 10/10 +
+ + +
+ 87.71% + Lines + 50/57 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +1415x +  +5x +5x +5x +5x +  +5x +  +  +5x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +2x +1x +1x +1x +  +  +  +  +  +  +2x +2x +1x +  +1x +  +  +2x +2x +1x +  +1x +  +  +  +  +  +  +  +  +6x +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +6x +8x +8x +  +  +  +8x +8x +  +  +  +  +6x +  +  +  +6x +  +  +1x +1x +  +  +  +  +1x +1x +  +  +  +  +  +1x +  +  +  +  +  +  +2x +2x +2x +2x +2x +2x +  +  +  +1x +1x +1x +  +  +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +1x +  +  +5x + 
import { articleRepo } from '../repositories/articleRepository';
+import { ArticleLikesAndCount, ArticleListResponse, ArticleResponse } from '../../types/article';
+import { AlreadyLikeError, AlreadyUnlikeError, ForbiddenError } from '../lib/errors/customErrors';
+import { commentRepo } from '../repositories/commentRepository';
+import { likeRepo } from '../repositories/likeRepository';
+import { Prisma, Article, Comment } from '@prisma/client';
+import type { CursorPaginated } from '../../types/cursorPaginated';
+import { notificationService } from './notificationService';
+ 
+//객체로 주면 콘트롤러에서 인자순서 상관없이 적용되지만, ()형태로 반환하게되면 인자순서를 서비스형태와 동일하게 넣어야 함
+export class ArticleService {
+  async createArticle(
+    userId: number,
+    title: string,
+    content: string,
+    image?: string | null,
+  ): Promise<Article> {
+    return articleRepo.create({
+      title,
+      content,
+      image,
+      user: { connect: { id: userId } },
+    });
+  }
+  async getArticle(articleId: number, userId?: number): Promise<ArticleResponse> {
+    const article: ArticleLikesAndCount = await articleRepo.findByIdWithLikes(articleId, userId);
+    const { likes, _count, ...articleData } = article;
+    const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined;
+    return { ...articleData, likeCount: _count.likes, isLiked };
+  }
+  async updateArticle(
+    articleId: number,
+    userId: number,
+    data: { title?: string; content?: string; image?: string | null },
+  ): Promise<Article> {
+    const article = await articleRepo.findById(articleId);
+    if (article.userId !== userId) {
+      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
+    }
+    return articleRepo.update(articleId, data);
+  }
+  async deleteArticle(articleId: number, userId: number): Promise<void> {
+    const article = await articleRepo.findById(articleId);
+    if (article.userId !== userId) {
+      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
+    }
+    await articleRepo.delete(articleId);
+  }
+  async getArticleList(
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+    keyword?: string,
+    userId?: number,
+  ): Promise<ArticleListResponse> {
+    const where = keyword
+      ? {
+          OR: [{ title: { contains: keyword } }, { content: { contains: keyword } }],
+        }
+      : {};
+    const [totalCount, articles] = await Promise.all([
+      articleRepo.count(where),
+      articleRepo.findArticleListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId,
+      }),
+    ]);
+    const list: ArticleResponse[] = articles.map((m) => {
+      const { _count, likes, ...basicArticleData } = m;
+      const response: ArticleResponse = {
+        ...basicArticleData,
+        likeCount: _count.likes,
+      };
+      Eif (!userId) {
+        return response;
+      }
+      const isLiked = (likes ?? []).length > 0;
+      return { ...basicArticleData, isLiked, likeCount: _count.likes };
+    });
+    const response: ArticleListResponse = {
+      list,
+      totalCount,
+    };
+    return response;
+  }
+  async createComment(userId: number, articleId: number, content: string): Promise<Comment> {
+    await articleRepo.findById(articleId);
+    const comment = await commentRepo.create({
+      content,
+      user: { connect: { id: userId } },
+      article: { connect: { id: articleId } },
+    });
+    const article = await articleRepo.findById(articleId);
+    Iif (article.userId !== userId) {
+      await notificationService.createNotification(
+        article.userId,
+        `내 게시글 "${article.title}"에 새로운 댓글이 달렸습니다.`,
+      );
+    }
+    return comment;
+  }
+  async getCommentList(
+    articleId: number,
+    limit: number,
+    cursor?: number,
+  ): Promise<CursorPaginated<Comment>> {
+    await articleRepo.findById(articleId);
+    const commentsWithCursor = await commentRepo.findCommentListQuery({ articleId }, limit, cursor);
+    const comments = commentsWithCursor.slice(0, limit);
+    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
+    const nextCursor = cursorComment ? cursorComment.id : null;
+    return { list: comments, nextCursor };
+  }
+  //like , unlike 둘다 message를 반환해버려서 이게..프로미스로 타입 설정하는 것이 의미가 있는지...로직 수정 생각해봐야할 듯
+  async likeArticle(userId: number, articleId: number): Promise<{ message: string }> {
+    const article = await articleRepo.findById(articleId);
+    const existingLike = await likeRepo.findLike(userId, { articleId });
+    Iif (existingLike) {
+      throw new AlreadyLikeError();
+    }
+    await likeRepo.createLike(userId, { articleId });
+    return { message: `${article.title}게시글에 좋아요를 눌렀습니다.` };
+  }
+  async unlikeArticle(userId: number, articleId: number): Promise<{ message: string }> {
+    const article = await articleRepo.findById(articleId);
+    try {
+      await likeRepo.deleteLike(userId, { articleId });
+    } catch (error: unknown) {
+      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
+        throw new AlreadyUnlikeError();
+      }
+      throw error;
+    }
+    return { message: `${article.title}게시글의 좋아요를 취소했습니다` };
+  }
+}
+export const articleService = new ArticleService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/services/commentService.ts.html b/mission9-10-11/coverage/src/services/commentService.ts.html new file mode 100644 index 000000000..d697ad1ae --- /dev/null +++ b/mission9-10-11/coverage/src/services/commentService.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for src/services/commentService.ts + + + + + + + + + +
+
+

All files / src/services commentService.ts

+
+ +
+ 33.33% + Statements + 4/12 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 33.33% + Lines + 4/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +235x +5x +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x + 
import { commentRepo } from '../repositories/commentRepository';
+import { ForbiddenError } from '../lib/errors/customErrors';
+import { Comment } from '@prisma/client';
+ 
+export class CommentService {
+  async updateComment(commentId: number, userId: number, content?: string): Promise<Comment> {
+    const comment = await commentRepo.findById(commentId);
+    if (comment.userId !== userId) {
+      throw new ForbiddenError('해당 댓글을 수정할 권한이 없습니다.');
+    }
+    return commentRepo.update(commentId, content);
+  }
+  async deleteComment(commentId: number, userId: number): Promise<void> {
+    const comment = await commentRepo.findById(commentId);
+    if (comment.userId !== userId) {
+      throw new ForbiddenError('해당 댓글을 삭제할 권한이 없습니다.');
+    }
+    await commentRepo.delete(commentId);
+  }
+}
+ 
+export const commnetService = new CommentService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/services/imageService.ts.html b/mission9-10-11/coverage/src/services/imageService.ts.html new file mode 100644 index 000000000..d11cab840 --- /dev/null +++ b/mission9-10-11/coverage/src/services/imageService.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for src/services/imageService.ts + + + + + + + + + +
+
+

All files / src/services imageService.ts

+
+ +
+ 38.46% + Statements + 5/13 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 38.46% + Lines + 5/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { uploadImageResponse } from '../../types/image';
+import { Request } from 'express';
+import { BadRequestError } from '../lib/errors/customErrors';
+import path from 'path';
+import { STATIC_PATH } from '../lib/constants';
+ 
+export class ImageService {
+  buildImageUrl(req: Request): uploadImageResponse {
+    const host = req.get('host');
+    if (!host) {
+      throw new BadRequestError('요청 헤더에 host 정보가 없습니다.');
+    }
+    if (!req.file) {
+      throw new BadRequestError();
+    }
+    const filePath = path.join(host, STATIC_PATH, req.file.filename);
+    const url = `http://${filePath}`;
+    return { url };
+  }
+}
+ 
+export const imageService = new ImageService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/services/index.html b/mission9-10-11/coverage/src/services/index.html new file mode 100644 index 000000000..c091268ea --- /dev/null +++ b/mission9-10-11/coverage/src/services/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/services + + + + + + + + + +
+
+

All files src/services

+
+ +
+ 67.09% + Statements + 157/234 +
+ + +
+ 44.44% + Branches + 64/144 +
+ + +
+ 68.42% + Functions + 26/38 +
+ + +
+ 68.8% + Lines + 150/218 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articleService.ts +
+
88.13%52/5941.17%14/34100%10/1087.71%50/57
commentService.ts +
+
33.33%4/120%0/40%0/233.33%4/12
notificationService.ts +
+
33.33%5/150%0/20%0/435.71%5/14
productService.ts +
+
90%63/7066.66%32/48100%10/1089.7%61/68
userService.ts +
+
42.3%33/7832.14%18/5650%6/1244.77%30/67
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/services/notificationService.ts.html b/mission9-10-11/coverage/src/services/notificationService.ts.html new file mode 100644 index 000000000..8d579d208 --- /dev/null +++ b/mission9-10-11/coverage/src/services/notificationService.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for src/services/notificationService.ts + + + + + + + + + +
+
+

All files / src/services notificationService.ts

+
+ +
+ 33.33% + Statements + 5/15 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 35.71% + Lines + 5/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +275x +5x +5x +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x + 
import { UnauthorizedError } from '../lib/errors/customErrors';
+import { notificationRepo } from '../repositories/notificationRepository';
+import { getIO } from '../socket';
+import type { Notification as PrismaNotification } from '@prisma/client';
+ 
+export class NotificationService {
+  async getNotifications(userId: number): Promise<PrismaNotification[]> {
+    return notificationRepo.getNotification(userId);
+  }
+  async getUnreadCount(userId: number): Promise<number> {
+    return notificationRepo.getUnreadCount(userId);
+  }
+  async createNotification(userId: number, message: string): Promise<PrismaNotification> {
+    const notification = await notificationRepo.create(userId, message);
+    const io = getIO();
+    io.to(`user-${userId}`).emit('notification', notification);
+    return notification;
+  }
+  async markAsRead(notificationId: number, userId: number): Promise<PrismaNotification> {
+    const notification = await notificationRepo.findByIds(notificationId, userId);
+    if (!notification) throw new UnauthorizedError();
+    return notificationRepo.updateRead(notificationId);
+  }
+}
+ 
+export const notificationService = new NotificationService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/services/productService.ts.html b/mission9-10-11/coverage/src/services/productService.ts.html new file mode 100644 index 000000000..284300d3e --- /dev/null +++ b/mission9-10-11/coverage/src/services/productService.ts.html @@ -0,0 +1,616 @@ + + + + + + Code coverage report for src/services/productService.ts + + + + + + + + + +
+
+

All files / src/services productService.ts

+
+ +
+ 90% + Statements + 63/70 +
+ + +
+ 66.66% + Branches + 32/48 +
+ + +
+ 100% + Functions + 10/10 +
+ + +
+ 89.7% + Lines + 61/68 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178  +6x +  +  +6x +6x +  +  +6x +6x +6x +6x +  +  +  +6x +  +  +  +  +  +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +3x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +3x +1x +  +2x +  +2x +1x +1x +2x +1x +  +  +  +  +  +  +2x +  +  +2x +2x +1x +  +1x +  +  +  +  +  +  +  +  +11x +  +  +  +  +  +  +  +  +11x +  +  +  +  +  +  +  +  +  +11x +14x +14x +  +  +  +14x +13x +  +1x +1x +  +11x +  +  +  +11x +  +  +2x +2x +  +  +  +  +2x +2x +  +  +  +  +  +2x +  +  +  +  +  +  +2x +2x +2x +2x +2x +2x +  +  +2x +2x +2x +  +  +2x +2x +  +  +1x +1x +1x +  +  +  +  +  +  +1x +  +  +  +6x + 
import { ProductLikesAndCount } from '../../types/product';
+import { productRepo } from '../repositories/productRepository';
+import { Product } from '@prisma/client';
+import type { ProductListResponse, ProductResponse } from '../../types/product';
+import { ForbiddenError } from '../lib/errors/customErrors';
+import { commentRepo } from '../repositories/commentRepository';
+import type { Comment } from '@prisma/client';
+import type { CursorPaginated } from '../../types/cursorPaginated';
+import { AlreadyLikeError, AlreadyUnlikeError } from '../lib/errors/customErrors';
+import { likeRepo } from '../repositories/likeRepository';
+import { Prisma } from '@prisma/client';
+import { notificationService } from './notificationService';
+ 
+//인자 순서가 옵셔널 다음 필수파라미터가 들어오면 컴파일에러가 발생함
+//객체로 묶어 보내기, 이러면 필수인 userid의 파라미터 순서를 바꾸지 않아도 됨
+export class ProductService {
+  async createProduct(params: {
+    name: string;
+    description: string;
+    price: number;
+    tags?: string[];
+    images?: string[];
+    userId: number;
+  }): Promise<Product> {
+    const { name, description, price, tags, images, userId } = params;
+    return productRepo.create({
+      name,
+      description,
+      price,
+      tags: tags ?? [],
+      images: images ?? [],
+      user: { connect: { id: userId } },
+    });
+  }
+  async getProduct(productId: number, userId?: number): Promise<ProductResponse> {
+    const product: ProductLikesAndCount = await productRepo.findByIdWithLikes(productId, userId);
+    const { likes, _count, ...productData } = product;
+    const baseResponse = { ...productData, likeCount: _count.likes };
+    Eif (!userId) {
+      return baseResponse;
+    }
+    const isLiked = (likes?.length ?? 0) > 0;
+    return { ...baseResponse, isLiked };
+  }
+  async updateProduct(
+    productId: number,
+    userId: number,
+    data: {
+      name?: string;
+      description?: string;
+      price?: number;
+      tags?: string[];
+      images?: string[];
+    },
+  ): Promise<Product> {
+    const product = await productRepo.findById(productId);
+    if (product.userId !== userId) {
+      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
+    }
+    const updateProduct = await productRepo.update(productId, data);
+    //undefined가 아니면서 기존가격과 다른 경우
+    if (data.price !== undefined && product.price !== data.price) {
+      const likers = await likeRepo.getLikers({ productId });
+      for (const liker of likers) {
+        if (liker.userId !== userId) {
+          await notificationService.createNotification(
+            liker.userId,
+            `관심 상품 "${product.name}"의 가격이 변동되었습니다.`,
+          );
+        }
+      }
+    }
+    return updateProduct;
+  }
+  async deleteProduct(productId: number, userId: number): Promise<void> {
+    const product = await productRepo.findById(productId);
+    if (product.userId !== userId) {
+      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
+    }
+    await productRepo.delete(productId);
+  }
+  async getProductList(
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+    keyword?: string,
+    userId?: number,
+  ): Promise<ProductListResponse> {
+    const where = keyword
+      ? {
+          OR: [
+            { name: { contains: keyword } },
+            { description: { contains: keyword } },
+            { tags: { has: keyword } },
+          ],
+        }
+      : {};
+    const [totalCount, products] = await Promise.all([
+      productRepo.count(where),
+      productRepo.findProductListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId,
+      }),
+    ]);
+    const list: ProductResponse[] = products.map((m) => {
+      const { _count, likes, ...basicProductData } = m;
+      const response: ProductResponse = {
+        ...basicProductData,
+        likeCount: _count.likes,
+      };
+      if (!userId) {
+        return response;
+      }
+      const isLiked = (likes ?? []).length > 0;
+      return { ...basicProductData, isLiked, likeCount: _count.likes };
+    });
+    const response: ProductListResponse = {
+      list,
+      totalCount,
+    };
+    return response;
+  }
+  async createComment(userId: number, productId: number, content: string): Promise<Comment> {
+    await productRepo.findById(productId);
+    const comment = await commentRepo.create({
+      content,
+      user: { connect: { id: userId } },
+      product: { connect: { id: productId } },
+    });
+    const product = await productRepo.findById(productId);
+    Iif (product.userId !== userId) {
+      await notificationService.createNotification(
+        product.userId,
+        `내 상품 "${product.name}"에 새로운 댓글이 달렸습니다.`,
+      );
+    }
+    return comment;
+  }
+  async getCommentList(
+    productId: number,
+    limit: number,
+    cursor?: number,
+  ): Promise<CursorPaginated<Comment>> {
+    await productRepo.findById(productId);
+    const commentsWithCursor = await commentRepo.findCommentListQuery({ productId }, limit, cursor);
+    const comments = commentsWithCursor.slice(0, limit);
+    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
+    const nextCursor = cursorComment ? cursorComment.id : null;
+    return { list: comments, nextCursor };
+  }
+  async likeProduct(userId: number, productId: number): Promise<{ message: string }> {
+    const product = await productRepo.findById(productId);
+    const existingLike = await likeRepo.findLike(userId, { productId });
+    Iif (existingLike) {
+      throw new AlreadyLikeError();
+    }
+    await likeRepo.createLike(userId, { productId });
+    return { message: `${product.name}상품에 좋아요를 눌렀습니다.` };
+  }
+  async unlikeProduct(userId: number, productId: number): Promise<{ message: string }> {
+    const product = await productRepo.findById(productId);
+    try {
+      await likeRepo.deleteLike(userId, { productId });
+    } catch (error: unknown) {
+      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
+        throw new AlreadyUnlikeError();
+      }
+      throw error;
+    }
+    return { message: `${product.name}상품의 좋아요를 취소했습니다` };
+  }
+}
+ 
+export const productService = new ProductService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/services/userService.ts.html b/mission9-10-11/coverage/src/services/userService.ts.html new file mode 100644 index 000000000..d77f9ed9a --- /dev/null +++ b/mission9-10-11/coverage/src/services/userService.ts.html @@ -0,0 +1,721 @@ + + + + + + Code coverage report for src/services/userService.ts + + + + + + + + + +
+
+

All files / src/services userService.ts

+
+ +
+ 42.3% + Statements + 33/78 +
+ + +
+ 32.14% + Branches + 18/56 +
+ + +
+ 50% + Functions + 6/12 +
+ + +
+ 44.77% + Lines + 30/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +2135x +5x +  +5x +5x +5x +  +  +  +  +  +  +  +  +  +  +21x +21x +21x +  +  +  +  +  +20x +20x +  +  +  +  +  +18x +18x +  +  +  +18x +18x +1x +  +17x +17x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +2x +2x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +1x +  +  +  +5x + 
import bcrypt from 'bcrypt';
+import { userRepo } from '../repositories/userRepository';
+import type { Prisma, User } from '@prisma/client';
+import { ForbiddenError, UnauthorizedError } from '../lib/errors/customErrors';
+import { generateToken, verifyRefreshToken } from '../lib/token';
+import { productRepo } from '../repositories/productRepository';
+import type { ProductListResponse } from '../../types/product';
+import { ProfileResponse } from '../../types/user';
+ 
+class UserService {
+  async register(
+    nickname: string,
+    email: string,
+    password: string,
+    image?: string,
+  ): Promise<Omit<User, 'password'>> {
+    const salt = await bcrypt.genSalt(10);
+    const hashedPassword = await bcrypt.hash(password, salt);
+    const user = await userRepo.create({
+      nickname,
+      email,
+      password: hashedPassword,
+      image,
+    });
+    const { password: _, ...userWithoutPassword } = user;
+    return userWithoutPassword;
+  }
+  async login(
+    email: string,
+    password: string,
+  ): Promise<{ tokens: { accessToken: string; refreshToken: string }; message: string }> {
+    const user = await userRepo.findByEmail(email);
+    Iif (!user) {
+      //이메일, 비밀번호 검증에 대한 에러를 같은 메세지로 던짐으로써 좀 더 방어적으로 설계
+      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
+    }
+    const isPasswordValid = await bcrypt.compare(password, user.password);
+    if (!isPasswordValid) {
+      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
+    }
+    const tokens = generateToken(user.id);
+    return { tokens, message: '로그인에 성공했습니다.' };
+  }
+  async getProfile(myId: number): Promise<ProfileResponse> {
+    const user = await userRepo.findById(myId);
+    if (!user) throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
+    const { password: _, ...userInfo } = user;
+    const [myProductCount, myLikeProductCount, recentProductsRaw, recentLikedProductsRaw] =
+      await Promise.all([
+        productRepo.count({ userId: myId }),
+        productRepo.count({ likes: { some: { userId: myId } } }),
+        productRepo.findProductListWithLikes({
+          skip: 0,
+          take: 5,
+          orderBy: { createdAt: 'desc' },
+          where: { userId: myId },
+          userId: myId,
+        }),
+        productRepo.findProductListWithLikes({
+          skip: 0,
+          take: 5,
+          orderBy: { createdAt: 'desc' },
+          where: { likes: { some: { userId: myId } } },
+          userId: myId,
+        }),
+      ]);
+    const myRecentProducts = recentProductsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    const myRecentLikeProducts = recentLikedProductsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    return {
+      user: userInfo,
+      myProducts: {
+        list: myRecentProducts,
+        totalCount: myProductCount,
+      },
+      myLikedProducts: {
+        list: myRecentLikeProducts,
+        totalCount: myLikeProductCount,
+      },
+    };
+  }
+ 
+  async updateProfile(
+    userId: number,
+    nickname?: string,
+    email?: string,
+    image?: string | null,
+  ): Promise<Omit<User, 'password'>> {
+    const data: Prisma.UserUpdateInput = {};
+    if (nickname !== undefined) data.nickname = nickname;
+    if (email !== undefined) data.email = email;
+    if (image !== undefined) data.image = image;
+    const update = await userRepo.update(userId, data);
+    const { password: _, ...userWithoutPassword } = update;
+    return userWithoutPassword;
+  }
+  async patchPassword(userId: number, currentPassword: string, newPassword: string): Promise<void> {
+    const user = await userRepo.findById(userId);
+    if (!user) {
+      throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
+    }
+    const isPasswordValid = await bcrypt.compare(currentPassword, user.password);
+    if (!isPasswordValid) {
+      throw new ForbiddenError('현재 비밀번호가 올바르지 않습니다.');
+    }
+    const salt = await bcrypt.genSalt(10);
+    const hashedNewPassword = await bcrypt.hash(newPassword, salt);
+    await userRepo.update(userId, { password: hashedNewPassword });
+  }
+  async getMyProductList(
+    myId: number,
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+    keyword?: string,
+  ): Promise<ProductListResponse> {
+    const where = {
+      userId: myId,
+      ...(keyword
+        ? {
+            OR: [
+              { name: { contains: keyword } },
+              { description: { contains: keyword } },
+              { tags: { has: keyword } },
+            ],
+          }
+        : {}),
+    };
+    const [totalCount, productsRaw] = await Promise.all([
+      productRepo.count(where),
+      productRepo.findProductListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId: myId,
+      }),
+    ]);
+    const list = productsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    return { list, totalCount };
+  }
+  async refreshToken(refreshToken: string) {
+    let userId: number;
+    try {
+      const payload = verifyRefreshToken(refreshToken);
+      userId = payload.userId;
+    } catch (error) {
+      throw new UnauthorizedError('유효하지 않은 리프레시 토큰입니다.');
+    }
+    const user = await userRepo.findById(userId);
+    if (!user) {
+      throw new UnauthorizedError('존재하지 않는 사용자입니다.');
+    }
+    const tokens = generateToken(user.id);
+    return tokens;
+  }
+  async getMyLikedProducts(
+    myId: number,
+    page: number,
+    pageSize: number,
+    orderBy?: 'recent' | 'desc' | 'asc',
+  ): Promise<ProductListResponse> {
+    const where = {
+      likes: {
+        some: {
+          userId: myId,
+        },
+      },
+    };
+    const [totalCount, productsRaw] = await Promise.all([
+      productRepo.count(where),
+      productRepo.findProductListWithLikes({
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
+        where,
+        userId: myId,
+      }),
+    ]);
+    const list = productsRaw.map((m) => {
+      const { _count, likes, ...rest } = m;
+      return {
+        ...rest,
+        likeCount: _count.likes,
+        isLiked: (likes?.length ?? 0) > 0,
+      };
+    });
+    return { list, totalCount };
+  }
+}
+ 
+export const userService = new UserService();
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/socket.ts.html b/mission9-10-11/coverage/src/socket.ts.html new file mode 100644 index 000000000..7dcdc9ac8 --- /dev/null +++ b/mission9-10-11/coverage/src/socket.ts.html @@ -0,0 +1,214 @@ + + + + + + Code coverage report for src/socket.ts + + + + + + + + + +
+
+

All files / src socket.ts

+
+ +
+ 27.58% + Statements + 8/29 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 24% + Lines + 6/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +441x +  +1x +1x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  + 
import { Server as SocketIOServer } from 'socket.io';
+import { Server as HttpServer } from 'http';
+import { verifyAccessToken } from './lib/token';
+import { UnauthorizedError } from './lib/errors/customErrors';
+ 
+let io: SocketIOServer | null = null;
+ 
+export const initSocket = (Server: HttpServer) => {
+  io = new SocketIOServer(Server, {
+    cors: {
+      origin: '*',
+      methods: ['GET', 'POST'],
+    },
+  });
+ 
+  io.use((socket, next) => {
+    try {
+      const token = socket.handshake.auth.accessToken;
+      if (!token) return next(new UnauthorizedError());
+      const { userId } = verifyAccessToken(token);
+      if (!userId) return next(new UnauthorizedError());
+      socket.data.userId = userId;
+      next();
+    } catch (e) {
+      next(new UnauthorizedError());
+    }
+  });
+ 
+  io.on('connection', (socket) => {
+    const userId = socket.data.userId;
+    console.log('User connected', socket.id);
+    socket.join(`user-${userId}`);
+    console.log(`User ${userId} joined room user-${userId}`);
+  });
+  return io;
+};
+ 
+export const getIO = () => {
+  if (!io) {
+    throw new Error('Socket.IO 서버가 초기화되지 않았습니다.');
+  }
+  return io;
+};
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/structs/articlesStructs.ts.html b/mission9-10-11/coverage/src/structs/articlesStructs.ts.html new file mode 100644 index 000000000..120a77143 --- /dev/null +++ b/mission9-10-11/coverage/src/structs/articlesStructs.ts.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for src/structs/articlesStructs.ts + + + + + + + + + +
+
+

All files / src/structs articlesStructs.ts

+
+ +
+ 83.33% + Statements + 5/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 83.33% + Lines + 5/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +131x +1x +  +1x +  +1x +  +  +  +  +  +1x + 
import { coerce, nonempty, nullable, object, partial, string } from 'superstruct';
+import { PageParamsStruct } from './commonStructs';
+ 
+export const GetArticleListParamsStruct = PageParamsStruct;
+ 
+export const CreateArticleBodyStruct = object({
+  title: coerce(nonempty(string()), string(), (value) => value.trim()),
+  content: nonempty(string()),
+  image: nullable(string()),
+});
+ 
+export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct);
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/structs/commentsStruct.ts.html b/mission9-10-11/coverage/src/structs/commentsStruct.ts.html new file mode 100644 index 000000000..27619246e --- /dev/null +++ b/mission9-10-11/coverage/src/structs/commentsStruct.ts.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/structs/commentsStruct.ts + + + + + + + + + +
+
+

All files / src/structs commentsStruct.ts

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +  +1x +  +  +  +1x +  +1x + 
import { nonempty, object, partial, string } from 'superstruct';
+import { CursorParamsStruct } from './commonStructs';
+ 
+export const CreateCommentBodyStruct = object({
+  content: nonempty(string()),
+});
+ 
+export const GetCommentListParamsStruct = CursorParamsStruct;
+ 
+export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct);
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/structs/commonStructs.ts.html b/mission9-10-11/coverage/src/structs/commonStructs.ts.html new file mode 100644 index 000000000..d83d00745 --- /dev/null +++ b/mission9-10-11/coverage/src/structs/commonStructs.ts.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for src/structs/commonStructs.ts + + + + + + + + + +
+
+

All files / src/structs commonStructs.ts

+
+ +
+ 83.33% + Statements + 5/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +221x +  +1x +  +1x +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  + 
import { coerce, integer, object, string, defaulted, optional, enums, nonempty } from 'superstruct';
+ 
+const integerString = coerce(integer(), string(), (value) => parseInt(value));
+ 
+export const IdParamsStruct = object({
+  id: integerString,
+});
+ 
+export const PageParamsStruct = object({
+  page: defaulted(integerString, 1),
+  pageSize: defaulted(integerString, 10),
+  orderBy: optional(enums(['recent'])),
+  keyword: optional(nonempty(string())),
+});
+ 
+export const CursorParamsStruct = object({
+  cursor: defaulted(integerString, 0),
+  limit: defaulted(integerString, 10),
+  orderBy: optional(enums(['recent'])),
+  keyword: optional(nonempty(string())),
+});
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/structs/index.html b/mission9-10-11/coverage/src/structs/index.html new file mode 100644 index 000000000..de1e47be2 --- /dev/null +++ b/mission9-10-11/coverage/src/structs/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/structs + + + + + + + + + +
+
+

All files src/structs

+
+ +
+ 81.81% + Statements + 36/44 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 87.8% + Lines + 36/41 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesStructs.ts +
+
83.33%5/6100%0/00%0/183.33%5/6
commentsStruct.ts +
+
100%5/5100%0/0100%0/0100%5/5
commonStructs.ts +
+
83.33%5/6100%0/00%0/1100%5/5
productsStruct.ts +
+
85.71%6/7100%0/00%0/185.71%6/7
usersStructs.ts +
+
75%15/200%0/40%0/583.33%15/18
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/structs/productsStruct.ts.html b/mission9-10-11/coverage/src/structs/productsStruct.ts.html new file mode 100644 index 000000000..01ca56f56 --- /dev/null +++ b/mission9-10-11/coverage/src/structs/productsStruct.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for src/structs/productsStruct.ts + + + + + + + + + +
+
+

All files / src/structs productsStruct.ts

+
+ +
+ 85.71% + Statements + 6/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 85.71% + Lines + 6/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +1x +  +1x +  +1x + 
import {
+  coerce,
+  partial,
+  object,
+  string,
+  min,
+  nonempty,
+  array,
+  integer,
+  optional,
+} from 'superstruct';
+import { PageParamsStruct } from './commonStructs';
+ 
+export const CreateProductBodyStruct = object({
+  name: coerce(nonempty(string()), string(), (value) => value.trim()),
+  description: nonempty(string()),
+  price: min(integer(), 0),
+  tags: optional(array(string())),
+  images: optional(array(string())),
+});
+ 
+export const GetProductListParamsStruct = PageParamsStruct;
+ 
+export const UpdateProductBodyStruct = partial(CreateProductBodyStruct);
+ 
+export const LikeProductParamsStruct = PageParamsStruct;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/coverage/src/structs/usersStructs.ts.html b/mission9-10-11/coverage/src/structs/usersStructs.ts.html new file mode 100644 index 000000000..79a230ceb --- /dev/null +++ b/mission9-10-11/coverage/src/structs/usersStructs.ts.html @@ -0,0 +1,229 @@ + + + + + + Code coverage report for src/structs/usersStructs.ts + + + + + + + + + +
+
+

All files / src/structs usersStructs.ts

+
+ +
+ 75% + Statements + 15/20 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 83.33% + Lines + 15/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +491x +1x +  +1x +  +  +1x +  +1x +  +  +  +1x +1x +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +1x +  +1x + 
import * as s from 'superstruct';
+import { PageParamsStruct } from './commonStructs';
+ 
+const CoercedNumber = s.coerce(s.number(), s.union([s.string(), s.number()]), (value) =>
+  Number(value),
+);
+const Integer = s.refine(CoercedNumber, 'Integer', (value) => Number.isInteger(value) && value > 0);
+ 
+export const userIdStruct = s.object({
+  userId: Integer,
+});
+//이메일: 기본적인 이메일 형식 체크, 닉네임: 영어 + 숫자 + 한글, 2~10글자, 비밀번호: 8~16글자
+const email = s.refine(s.string(), 'Email', (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value));
+const nickname = s.refine(s.string(), 'Nickname', (value) =>
+  /^[A-Za-z0-9가-힣]{2,10}$/.test(value),
+);
+const password = s.refine(
+  s.string(),
+  'Password',
+  (value) => value.length >= 8 && value.length <= 16,
+);
+ 
+export const CreateUserBodyStruct = s.object({
+  nickname: nickname,
+  email: email,
+  password: password,
+  image: s.optional(s.string()),
+});
+ 
+export const UpdateUserBodyStruct = s.partial(CreateUserBodyStruct);
+ 
+export const LoginBodyStruct = s.object({
+  email: email,
+  password: password,
+});
+ 
+export const ChangePasswordBodyStruct = s.object({
+  currentPassword: password,
+  newPassword: password,
+});
+ 
+export const RefreshTokenBodyStruct = s.object({
+  refreshToken: s.string(),
+});
+ 
+export const GetMyProductListParamsStruct = PageParamsStruct;
+ 
+export const GetMyLikedProductListParamsStruct = PageParamsStruct;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/mission9-10-11/infra/ec2/ecosystem.config.js b/mission9-10-11/infra/ec2/ecosystem.config.js new file mode 100644 index 000000000..435b50ec8 --- /dev/null +++ b/mission9-10-11/infra/ec2/ecosystem.config.js @@ -0,0 +1,17 @@ +module.exports = { + apps: [ + { + name: 'mission9-10', + script: 'dist/main.js', + cwd: '/home/ec2-user/6-sprint-mission/mission9-10', + instances: 1, + exec_mode: 'fork', + autorestart: true, + watch: false, + max_memory_restart: '300M', + env: { + NODE_ENV: 'production', + }, + }, + ], +}; diff --git a/mission9-10-11/infra/ec2/nginx.conf b/mission9-10-11/infra/ec2/nginx.conf new file mode 100644 index 000000000..6794d6a6a --- /dev/null +++ b/mission9-10-11/infra/ec2/nginx.conf @@ -0,0 +1,74 @@ +# server블록만 수정했습니다. + +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log notice; +pid /run/nginx.pid; + +# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. +include /usr/share/nginx/modules/*.conf; + +events { + worker_connections 1024; +} + +http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + access_log /var/log/nginx/access.log main; + + sendfile on; + tcp_nopush on; + keepalive_timeout 65; + types_hash_max_size 4096; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # Load modular configuration files from the /etc/nginx/conf.d directory. + # See http://nginx.org/en/docs/ngx_core_module.html#include + # for more information. + include /etc/nginx/conf.d/*.conf; + + server { + listen 80; + + location / { + proxy_pass http://localhost:3000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } + } + +# Settings for a TLS enabled server. +# +# server { +# listen 443 ssl; +# listen [::]:443 ssl; +# http2 on; +# server_name _; +# root /usr/share/nginx/html; +# +# ssl_certificate "/etc/pki/nginx/server.crt"; +# ssl_certificate_key "/etc/pki/nginx/private/server.key"; +# ssl_session_cache shared:SSL:1m; +# ssl_session_timeout 10m; +# ssl_ciphers PROFILE=SYSTEM; +# ssl_prefer_server_ciphers on; +# +# # Load configuration files for the default server block. +# include /etc/nginx/default.d/*.conf; +# +# error_page 404 /404.html; +# location = /404.html { +# } +# +# error_page 500 502 503 504 /50x.html; +# location = /50x.html { +# } +# } +} \ No newline at end of file diff --git a/mission9-10-11/infra/ec2/secure-group-inbound.png b/mission9-10-11/infra/ec2/secure-group-inbound.png new file mode 100644 index 0000000000000000000000000000000000000000..52dbdc15bfeb1ea9862c9dab2ed12dbde992e2fc GIT binary patch literal 90868 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%0Dw>2-Uj-MSXj7j7Z;Yy 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�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 IxY39I19mT-^#A|> literal 0 HcmV?d00001 diff --git a/mission9-10-11/infra/s3/policy.png b/mission9-10-11/infra/s3/policy.png new file mode 100644 index 0000000000000000000000000000000000000000..65ac248503b348447a2dece167792db057033fb3 GIT binary patch literal 208287 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ìpLRD9dwqQZUp^SJIoA6o&?2s97A^b{ABb z?8A}gk8-E%d|_&w>qL0g*dkkhz>~_=^40@P1L;k*B&uYv6T6xG`lsy?_`-BAH?N_HjJM9gkM5A zEgFa?L0a4=0iYXQkAHiQ&dY|}FRl1Ucwr8hCXJt;0GgY(mOS@6r%$?swJo+*3vT+e zQWOp_hkYKRiNV@=@v{Z13H>o_S?_Z9Z}#GKi{olG zb>B^`X8aZUmdI4~Z?QJ${tBw^08ScCW!)aAR*BXkaUy9RL3w5!k^ z$Z|@aGzSo$V8toBH#Ceh?t5MruI{apm+Zo=32vi%2YlK24C*D7d5(M%zETHA$mb!@ zOO1TTof>AI0UW(uFc8^@Y6;!v$Px8Lo&95NDt@Pyt%nUlHcz2BQk8hwGk=}Z%){$V zOMy2eLmSy|^U}U?327;Cz4Rs!OuI>m%Zh&;0cM_VJvT2*8qXFi#A6NVfBmEI>3ujz z3KlOA^Lei^krXcpuP&5p+Z*^AjPv|lXxz`6@#!b&6nTJF+Rg|$13Z|7(gx>YcY`UE zd*CPW=&)1xGUGxwR$P?JvYY*yI-dhauM1~KUfbAy`?)-MTFe7``&%B0vhx?vI$PG8 z9Q0Z4?1`r$8|oN*W1O@712xvD6umhnl|0dBbzU9&^6I}AWo>!JZQR-Q1I#z^9sZ8K-zr>0$FaT*J@cQme zn`6&$dn{DMi(w%3=1Q1oIE7b_>|W09ch5wkv$2HGY+HXV7&5zw5hvNU_6-q>dU^b? z<9C-a9+xP6XXyrF!eVS2`zH%6;-e#iTxP_oDY;Z5I1mskV@#J7|T@BPFA zjtOaj^(Ha-+VNZ;t)0Wt1n}?y3J+8vXn3yTg&|AW0R-Wh>n40=F-X6&`v~ z3m|+Cz+rkmM;GS(+g$Nyk9sUtVdbgSG#`;LH(u`xT2yM;#F#&(eXAdc{jJZ4zN1Rv zrg#IrcrW|R87@rbTukx@UoeFpWXKdyaZ1D}|Io+<2OLT?+@b&m{a-9?<=>{o=m{;0B(i>(plpa`DI+V-AF+OOU&X@XrgVuraD#?Z&euyC zCY>TSi}_nfpzXX({nMpdcy=JVn<))Y!@wpd+CJwCU9NP9j1V>DJ@e~bqxw})84cAb zXJ)}^mDlFg^l43ZY$J?&gM_&XX+s=snp;_tFb;U7Du_~--#85sws;dvXB+0N!*uu@ z5l@!d77v^;FdfrG8A7A_AZFZa&YB{3jLsY~9ZA4!xsj#8w91U=i_(oLa6G^LJo<)> z7%EEoRBc}y^#+H{ni8<{LX@z$u*x875?~D zgUj4LVzb}bAeVaMT?~T@>JKkmdemGf?^zpKkQNamrEt4UXOBP%mr|(v66!AP%|6#R zT!IdBjs55R++G=>wX#udrY!4!Q1f8#L-D`}kB)N;dC(7S)U<2!ES%lYDAlgDG2cyX zl>ITq8$L|wIA^g@#k@2oS^xb^2*81QVcYW4Nr!)$K~hzOah?+;kIxyYw%K~3tzfI; z1^pe8t%cbrB>hU_lR#WhG7#d&PJE(g za;)I>P@Y9wBe)T<(;;7Wb)j5y=8f-s`Aq8E<9kUkiNob3UjK7-x31xLL3`X4o0HF4 zQ(WHexYhh{A+r*nu)IW2GGZ9zisebHUCr;6fZ<@lEE9&F5g8=P82}OMf=lN_GFH47 z6r)Zft%#!c=XV%E;qDHP>7&oh?8WROFwZ|8rsR$yo$@WB8r^bNJ!Q3{?8iC9Bbw3q zNKoiI9uE%**!~CYenK9*n$A@9ckiJTz^@y2cNljdfo<;?W;S_USY(r}k{p#$6d+ZF zAf>^!&rNQ1(gG|L9^yrNgb*Pw29I2w^JH(vK1_EuUiv=smY!$Yhl`>Yq8*LBBZ_kP z2YXjF$~8eTvWWek@)o&~!tCBl>hbI5_|W-P(vtpc=YO@j;S%WJUxIxrH|mmz!AR3a z^-f}2sad>Ke`MD+!XZ4N?P*C+5^8kUoWE{$&bh7Z7VraUfN4M;k#=j#sxzWw%K~c+ zu`tcxun8IGoqgil(fV!C=N8-_y`pNbnVV#bdAD~i41J{UV>(PQg;W4j1wn*dA^_N@WZS#eB}4XD9XG z{{2UQAS0+SvCENTH$do~#+-^=)@5pRSSPGE?!~VQzFJb}LG(d4$z%!r&nA=;mvq(} zERDG(I-P6cad`M>n5uO-i9Wx0AZTUxU zt+SNXg$Vo;@poTUb(`{?nx+sd^1VGh6e8sNy7_u3BN-PrZmn;17PBi0w95D->ggVc z2SOw~RYH$)0$-ZlIW%7}Czm99W;TY#lm%V-vvV^^m6K!F-6tykrYUB|>{|$RUi`!yj17Ld1S4IQ04cTnWaD25upeWmLfegS8Ov}_ik7( z*X{ybsmseNzYLeCcZIx7JEdFyFtoH`opZbz0Cz};)DW#~BpJRL7N`Y+7(aGe%e31gSB(zSJP-5ORgt-d6a9_|tGyMI^r%iiXnPZ&P8|palKppS4bdj;AYp-L!45zC;1ULY4Uavotl<*H05CtNRXS3`+on!>W zI1|~;$3_=()CBajReKK;C_6UzUiCMmJ=$eB$WzX`^YisjE^!*y+N2d;UEaD#wy#VI zco?{eEsm7O=Q;DgZ@NxyscGBhaO^#^^~|oBAmv?BeSfc8=f>@XftlXpKl3C!*i3Yd zY>v;;qSz@X8!3wftS@D zCr}LUk9$8nvr1-t9ugJURi`K=(u8ujJ0#0H%nRQ35@2x3zE`3X)o`Bqsf>{W*%Fqv z4wX-TtIg)lbJaR}U@E^XI@uF6`+)_ZgqNaTjGA9?h_lZ~0HZ4?Qf?K*!;-`L!#Cdj z8xH;^u*F3}#ItRKW*u%il@1J>v%7zkCX>*N$^%MUg9FJrK1U|d{@yz+AqXAZs$ z_hD3tNHfMwQklS?0EMH97$_X1${Oi8R+iflJkh;( z9K)<6Vo}0c2--A)O8m^I~yan0kld ze22uuGu}L0tb#9TJAltWm}DgqH{RB85hiz-uSM%S{2>j04Bx#x3!(UFN}1=Ns-$-0 z%q9kr)nW|YH7A`YwK-ndN2+;>f~;18eDll@mk^I zk3_#oi0_1KJmAT(?YTKSYUE*wExErVxHG(Vc_M~(&q_Xht5fy#j)!1Lt1QPMQL*Dy z_RTi`z!r<@_0O6l822#~%R~eN9V7LSNoxuEVwAOkRs|GC@*g$e~> zJ}?h-?+w@?+9u7tfP3Kb<|GF1H>L`lzl)fTnsgO+ZyQ5d0MMYU`9%v-CFr-o zg}NC>rH!DB5&R-F43iav7(c1wI8)!+=V~2A)*w?};kpYyyG2bKWT}~^(2~&p3IcT7 zcM-BG?*mpcQMqSG_Q!v;{O-!OP89%@Qkv|z9B8rdTo9HROKoS@WG_7;g=-;?9>{(q zPtgq17lvv~1cxAClpOA=OYBpAev-m}4Sm6`uoZQlP<*eVXbx|k3lk?%5QMW{HE9-w z5pQ4CTFY)Skx`Cg8@vWc03{nZF+N~kC@F+lxT8mDFtB@&Jf8e)U*IxFv*nG%%?F1d zB9ATWv(-NiQ%7T(We}|PT{p&`87p>D=5cOXLKzw*NeOKOlzN+&Vs2LLJAa6i{D>l} z{)s5l-MeXA5tsD5^w4n$wg83er1u|L+0pkgEMGMrq$-C-t}3-i8wMsTp8ZwPC42_R zAMcWo@v}bq1bT~=*T{VM^U%sR*JYNz-$|!RnRi=rbm+lNFRKLv2Nkkx$h!+sElLT0 z@+G7z-En1WkQ@?&Vk#A2pSurikN%ZFw$_N^QNY(M#mP!0$j%^-JqqSi^5Gt~ToSyM zaV9?XKe6rdrw8e*0O>XajY_eH-sBLbqylcuY;6~R!;K4%pIaKyfosVNLUHN)k2I7# z-4F%dW@ea%?UOKZz?$fgrO-F7)a@mhE+L{hU<1w)6A}rwYd;uc?LX=VU~{PVw=*$AhfQSj~1B=#D!EOxH#QJ zzdOki%}tWQs8L+R)inprdBj-kaZ~#x$|DBf*$V^a;-m<*ym`-fur1F*&DA&xrkjQ@ z+S|M);UzleGzaP!kZdvovSXvm^8W~eh-RC&wunUS!)~sPoSMEU(POxwCAmiVua0Qa zKT|uPhUMW}62~QifthG#JT^~eU=Pv&fo5)W2$_t%K*5U)iEEymg9Zdw)qAic?Qw!| zcp1o(DxH35Kew148#Sy_Owr$(BJk*A9sN7Hq)~*PW1L3~cLIl)PWq?zvCJSg^3zw$ zu`B*M&YvOP>JPC}aU$1f0iRavR@`rqh0d8Q-Uov63rMOxZ-8{xuuH#r*R)$6M>yF_CVx(gxeV(|v8`*J{Nu8enX^*kZAH2PeBGgp%;I z(m8ysWT0?<##+b_>BHGLdSj-Dmg9c?JS&{*M3Bv-y=4;7yV707@=c?jfu5!Bv97NO z2}@ce?bkvirm&{2`e9-mRxEw29D3cx`zVD%nOPLUy=K{T2t6_3d#{a#O8W3Z6el*q zEq9ur{0GxMh{=G-$F;+?E`J1L6sb@6LvI*a+z0aD#7u25$+YE=Mar>YA!OYpv~Q58`qEr5S_V zn{0M_#4S)W{%HE+Tgs-nJfB#QMhqRZhxiQZ-(YEWLaPLMjAnaRmDHy*04?`#!$lv1h-AKJyUK{o!j6#I>$QUf8TK&7-a$kQmq2#(TBlnx(q5!Qkxsk#B zru|{CQSJU_`@D{J;IG7b^iYzY6djB6vy_VcMDJKG;m0<@+zJy+%vCP4Vx=UvdQ3cO zTi4Y|LD*j)h`SYiNNS_VF*U5B%7ZF7h}H{qdUlAv!5`y1&vftpc?bS4JHrdPs4P#$;JgIOn?OJHygwC-Dj2Vq_ym^nV+HoK3>(4SVnH> z=ZKnbWnGYvF}iQo{7HavsPaL41sj3h4W+6o_Dts=tMmrjW|J7f=%O2Sd}e$SXu$*i zhn#lmOJQ_&^GBK)X7Lg)=_P7*Tc|^%mfk}$`syMhG(d)Ajs&T)0OlB4ND34u)PfE3 zNz>Us+1Y?*Upk@#YkzmX#MJOQSrL$8+!$PZj)78R(IyQQ1GGM_hoVg($Oa<~io<3F z5*9^?p)@X%ApnGxcpX#nG z+fxsIl_&1RQW&FYirGeW2D8brc~HnBo@CJovFF?DJ<^!uL%VN_!F z!s=RF^#gsPnS5xW=c6ears8?UpOsW9;9}K&jv&p9h)(Am*^W!{^fE5unD651V5%Br z!_ru$P8!G!9Q?|D|5ALBpc5I?nkA>ou2WkXTN)uQQfdNQPQ#u?cgxcl4m~W2B@_6S zu@euza;pa$`NH_xl#s1SqU&QR@pn|Dj^pdG_bob%)BRe1s%pjZDpqcp2dwCB^zT98 zo3>r=$(uC7lTU<=9jpc5r0I47YE*jRV>%Ur6+{Z~^?CHRm?8sB)ED@f4%K`p=1wyn zaFDp~K>m}{xVgNkCuCF20!MxU4rcxFz*4qMN{)Q*vEYR6KpOX!B&#&N%=JmItomcjByciqm8jMSNGXa8OjTd zk?N0}uDe|fr*f?o#N=&OYo1QYvUE$^c-{J#H{^H_ld%A%1m7W*$f;ln9!|lV&4uZG zBH4oHH@GTJQS^q+KGEa2WNE6`ljlhVZs`7p>A+Tu5OHfWKG}<6#tV z6FWZ=3hzLgJ52Otrx*XikVZin!fZRigr;q-rqc-N{s9kYsDyZB?v00Vd+DW+>tdC@ z@bjPlVQq{nf4?F|F@MB5Lv@oQz+%;>RK6(_)#t|;y4<$UwC(g<`zql(+lptCFBLDKRYClKP?GMNC(%G(n-8`POpID zU#rdTR!qI9tGFMoZq^=pYaTs{yL}+nIS$xK-ozQRtlAuG6VMyMXtm`{{^biB?30al zS1*;DrpjrmF-FP77Iza>hdg8fh@#fPw4Uc?Sl2(c%j`)=GNWGVcjE>Du6b6X6o*_P zNI$LIDnFOkhsBqopIT)l+B~%oV>ui${AQBv4>=!)Mb^pEA<$hyZ~?-F5595wCz^VV zHW!&X!wMGn3ZEUE6~lpDEYoBf znzrF_q=vnP0 zz-z4Lw-h;8v&i`ta*=SnjdS*vE-^Ll=01rLv?a8LIMjRyHb5zdvgWR#amy|AoiYbm zgrlyvvd~+3tMf)m*1yUrI{AqV*r*;Dk7wzmB6;yCw>H+I^v zBEB&vL08GTpjf{Q63O(Z6+iwfmmN!yAEs}JYo?oHnBP(Dw&-I-^U+QSe!VaLp*sUV zL35>qn3sr`*~>)6mzi^HgF?0k(+o2!bfz4*XlF}?ZOeQu323+A0EXZ^l}LBlV!s`+ zjJo`OUU^(r zqW1e14DSg&F3{QrA3uon@hIoovqVdiwH{vEW9@&vb=xV9G^&dup~x)-++NL^C&;BJ zX}odGg&P^1#lL(ymWD$Dj>uY# z`q(-8C?S#&j6#r%BGoo*Y%85bj=4WtZ&^q*|3hCF3C+l7^pN>@nf&~#S)#~~+kD{5 z5AGryH9|nYWAhOeA#pL;r}w|o%CME%%M2#0J>$06a5>_9Cym)`!zzF<$-0;%1_2>0 zlKc)O-c;uo>D6K9$;bIsK=b9^6eDTFT*!QtXeQm$l6l!1$jy^koJy=G(|i z4eV(J4gV|g$Lv3wY847fby=QO^MR!HBQ^0nacu?>%Ih9!h8=+v$j~UoW=O0Ek+~Av zV~42A<8kT3)S=N#9EnzZ*hs;Hf$cclR~IHi<1Mz5$Y+j@;d{Yy6aA-@+mj9JHp1gWP_V3(yNyQt$>h`5n$<uL|vOGg>Mb7M3VxfNVl&+7ts>-|M_p2j?K9L7Tn@}d%T4d8c z_m`+h@%9OvK8A}rBpD^07Uzw#+H~lsOZV%d+|O0ls%(J^X2^OnNeVzZM463L=wY1k z?};FL>I-WzVMVi5^n~MW821Y;Q#zl#C>6&>+-}HxcmO#t* zMC^atc8D~biH}vf?EmJd=Q`S*Xiqa3DQ+_TuHGNsVkLoq+VOCWCmptHkj&@oUU>Y5 zp`_3w75Bh|rt|A%rCRDZ9CkrVrbV5W^Kd9jo%<=mRZHUOvS?z!IV3Ns+h1K}G4KkV zk)`cL6Jsz}&V5W#At}52yZJP4sW_W^C+@c3@J5&WHGIu%Ggnyb6?43_8L+c|xWvn_ zoAh|vbJNk&?P#nY-2!*w`d5K}x&1B8ECloJVWtH3Gi^*jbRr?zB zh6xQm4UD->v@cYhDy5?Q)RO<1=gH26ZqyO*4K(O|Wa9<`Y+fQ@2kk^X$|WVrn2Or! zDW85!e)Upj+4urL(Xii#oiU!`(&Zjq3f4!2@kQoMHlA0iQ1NoK6nZFLFDq(?3>>mL zJk~MiU5-hKxx0y<+71`^iG7#(xwxr?zn$S<-_-A4YX^RPKo3Z-ud+edY1|z+O>)3G zCsa1j;$jH3mLye4THOIRD$#y1?2uTzMo>}8xGlx@phFxlPT}9zz+G8{+y3=`mp1hO znmF`gnaRwEok5t^(CQ_1m|~lKdA4*QlGazZkX<7gC7h`HzRmC0aK$vNAoQ5DlDa8vHJ}@`PA2ZF`+L?din1<2WWe`h)|~u`_SuS%d$d zo#6S&-Z}4M$ML(sYqoFtLmjkVCbv{lW{u~f4iD9Ho#j@BTQ{bN_mjnpSG*1y0pF@S zz|`E+Nb+^d4OXiLBu-F)SkUFmlpr1RIfd!^L`Le)RBizu?H~b2hHhk*;r>V+ZZPs& z32g*vstv0FNPpl=?fA)3v+3{s<7dC|EcB1?Myf-GwV)&G+?cqTCMv1R%IvphuUsz* zr&S`N4Y`wJ`#w*?&O?Pn$BcRb?4mA~Tj9sc-T2D9*`WhHc>3pO9mP@>%+tpK8x

A*(Fi;4q5?8M44`tJI31o@lp>($c{E0&hC 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.0.0" + } + }, + "node_modules/@aws-crypto/crc32c": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.975.0.tgz", + "integrity": "sha512-aF1M/iMD29BPcpxjqoym0YFa4WR9Xie1/IhVumwOGH6TB45DaqYO7vLwantDBcYNRn/cZH6DFHksO7RmwTFBhw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/credential-provider-node": "^3.972.1", + "@aws-sdk/middleware-bucket-endpoint": "^3.972.1", + "@aws-sdk/middleware-expect-continue": "^3.972.1", + "@aws-sdk/middleware-flexible-checksums": "^3.972.1", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-location-constraint": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-sdk-s3": "^3.972.2", + "@aws-sdk/middleware-ssec": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.2", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/signature-v4-multi-region": "3.972.0", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.1", + "@smithy/eventstream-serde-browser": "^4.2.8", + "@smithy/eventstream-serde-config-resolver": "^4.3.8", + "@smithy/eventstream-serde-node": "^4.2.8", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-blob-browser": "^4.2.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/hash-stream-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/md5-js": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-retry": "^4.4.27", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.26", + "@smithy/util-defaults-mode-node": "^4.2.29", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.975.0.tgz", + "integrity": "sha512-HpgJuleH7P6uILxzJKQOmlHdwaCY+xYC6VgRDzlwVEqU/HXjo4m2gOAyjUbpXlBOCWfGgMUzfBlNJ9z3MboqEQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.2", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-retry": "^4.4.27", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.26", + "@smithy/util-defaults-mode-node": "^4.2.29", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.973.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.3.tgz", + "integrity": "sha512-ZbM2Xy8ytAcfnNpkBltr6Qdw36W/4NW5nZdZieCuTfacoBFpi/NYiwb8U05KNJvLKeZnrV9Vi696i+r2DQFORg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/xml-builder": "^3.972.2", + "@smithy/core": "^3.21.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/crc64-nvme": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.0.tgz", + "integrity": "sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.2.tgz", + "integrity": "sha512-wzH1EdrZsytG1xN9UHaK12J9+kfrnd2+c8y0LVoS4O4laEjPoie1qVK3k8/rZe7KOtvULzyMnO3FT4Krr9Z0Dg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.3.tgz", + "integrity": "sha512-IbBGWhaxiEl64fznwh5PDEB0N7YJEAvK5b6nRtPVUKdKAHlOPgo6B9XB8mqWDs8Ct0oF/E34ZLiq2U0L5xDkrg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.2.tgz", + "integrity": "sha512-Jrb8sLm6k8+L7520irBrvCtdLxNtrG7arIxe9TCeMJt/HxqMGJdbIjw8wILzkEHLMIi4MecF2FbXCln7OT1Tag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/credential-provider-env": "^3.972.2", + "@aws-sdk/credential-provider-http": "^3.972.3", + "@aws-sdk/credential-provider-login": "^3.972.2", + "@aws-sdk/credential-provider-process": "^3.972.2", + "@aws-sdk/credential-provider-sso": "^3.972.2", + "@aws-sdk/credential-provider-web-identity": "^3.972.2", + "@aws-sdk/nested-clients": "3.975.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.2.tgz", + "integrity": "sha512-mlaw2aiI3DrimW85ZMn3g7qrtHueidS58IGytZ+mbFpsYLK5wMjCAKZQtt7VatLMtSBG/dn/EY4njbnYXIDKeQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/nested-clients": "3.975.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.2.tgz", + "integrity": "sha512-Lz1J5IZdTjLYTVIcDP5DVDgi1xlgsF3p1cnvmbfKbjCRhQpftN2e2J4NFfRRvPD54W9+bZ8l5VipPXtTYK7aEg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.2", + "@aws-sdk/credential-provider-http": "^3.972.3", + "@aws-sdk/credential-provider-ini": "^3.972.2", + "@aws-sdk/credential-provider-process": "^3.972.2", + "@aws-sdk/credential-provider-sso": "^3.972.2", + "@aws-sdk/credential-provider-web-identity": "^3.972.2", + "@aws-sdk/types": "^3.973.1", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.2.tgz", + "integrity": "sha512-NLKLTT7jnUe9GpQAVkPTJO+cs2FjlQDt5fArIYS7h/Iw/CvamzgGYGFRVD2SE05nOHCMwafUSi42If8esGFV+g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.2.tgz", + "integrity": "sha512-YpwDn8g3gCGUl61cCV0sRxP2pFIwg+ZsMfWQ/GalSyjXtRkctCMFA+u0yPb/Q4uTfNEiya1Y4nm0C5rIHyPW5Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.975.0", + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/token-providers": "3.975.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.2.tgz", + "integrity": "sha512-x9DAiN9Qz+NjJ99ltDiVQ8d511M/tuF/9MFbe2jUgo7HZhD6+x4S3iT1YcP07ndwDUjmzKGmeOEgE24k4qvfdg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/nested-clients": "3.975.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.2.tgz", + "integrity": "sha512-ofuXBnitp9j8t05O4NQVrpMZDECPtUhRIWdLzR35baR5njOIPY7YqNtJE+yELVpSn2m4jt2sV1ezYMBY4/Lo+w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-arn-parser": "^3.972.2", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.2.tgz", + "integrity": "sha512-d9bBQlGk1T5j5rWfof20M2tErddOSoSLDauP2/yyuXfeOfQRCSBUZNrApSxjJ9Hw+/RDGR/XL+LEOqmXxSlV3A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.972.2.tgz", + "integrity": "sha512-GgWVZJdzXzqhXxzNAYB3TnZCj7d5rZNdovqSIV91e97nowHVaExRoyaZ3H/Ydqot7veHGPTl8nBp464zZeLDTQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/crc64-nvme": "3.972.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.2.tgz", + "integrity": "sha512-42hZ8jEXT2uR6YybCzNq9OomqHPw43YIfRfz17biZjMQA4jKSQUaHIl6VvqO2Ddl5904pXg2Yd/ku78S0Ikgog==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.2.tgz", + "integrity": "sha512-pyayzpq+VQiG1o9pEUyr6BXEJ2g2t4JIPdNxDkIHp2AhR63Gy/10WQkXTBOgRnfQ7/aLPLOnjRIWwOPp0CfUlA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.2.tgz", + "integrity": "sha512-iUzdXKOgi4JVDDEG/VvoNw50FryRCEm0qAudw12DcZoiNJWl0rN6SYVLcL1xwugMfQncCXieK5UBlG6mhH7iYA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.2.tgz", + "integrity": "sha512-/mzlyzJDtngNFd/rAYvqx29a2d0VuiYKN84Y/Mu9mGw7cfMOCyRK+896tb9wV6MoPRHUX7IXuKCIL8nzz2Pz5A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.3.tgz", + "integrity": "sha512-ZVtakKpQ7vI9l7tE2SJjQgoPYv2f/Bw/HMip5wBigsQBDvVbN300h+6nPnm0gnEQwIGGG0yJF3XCvr1/4pZW9A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-arn-parser": "^3.972.2", + "@smithy/core": "^3.21.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.2.tgz", + "integrity": "sha512-HJ3OmQnlQ1es6esrDWnx3nVPhBAN89WaFCzsDcb6oT7TMjBPUfZ5+1BpI7B0Hnme8cc6kp7qc4cgo2plrlROJA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.3.tgz", + "integrity": "sha512-zq6aTiO/BiAIOA8EH8nB+wYvvnZ14Md9Gomm5DDhParshVEVglAyNPO5ADK4ZXFQbftIoO+Vgcvf4gewW/+iYQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.2", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.972.0", + "@smithy/core": "^3.21.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.975.0.tgz", + "integrity": "sha512-OkeFHPlQj2c/Y5bQGkX14pxhDWUGUFt3LRHhjcDKsSCw6lrxKcxN3WFZN0qbJwKNydP+knL5nxvfgKiCLpTLRA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.2", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-retry": "^4.4.27", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.26", + "@smithy/util-defaults-mode-node": "^4.2.29", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.2.tgz", + "integrity": "sha512-/7vRBsfmiOlg2X67EdKrzzQGw5/SbkXb7ALHQmlQLkZh8qNgvS2G2dDC6NtF3hzFlpP3j2k+KIEtql/6VrI6JA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.972.0.tgz", + "integrity": "sha512-2udiRijmjpN81Pvajje4TsjbXDZNP6K9bYUanBYH8hXa/tZG5qfGCySD+TyX0sgDxCQmEDMg3LaQdfjNHBDEgQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.972.0", + "@aws-sdk/types": "3.972.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/core": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.972.0.tgz", + "integrity": "sha512-nEeUW2M9F+xdIaD98F5MBcQ4ITtykj3yKbgFZ6J0JtL3bq+Z90szQ6Yy8H/BLPYXTs3V4n9ifnBo8cprRDiE6A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.972.0", + "@aws-sdk/xml-builder": "3.972.0", + "@smithy/core": "^3.20.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.0.tgz", + "integrity": "sha512-0bcKFXWx+NZ7tIlOo7KjQ+O2rydiHdIQahrq+fN6k9Osky29v17guy68urUKfhTobR6iY6KvxkroFWaFtTgS5w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.972.0", + "@aws-sdk/types": "3.972.0", + "@aws-sdk/util-arn-parser": "3.972.0", + "@smithy/core": "^3.20.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz", + "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.0.tgz", + "integrity": "sha512-RM5Mmo/KJ593iMSrALlHEOcc9YOIyOsDmS5x2NLOMdEmzv1o00fcpAkCQ02IGu1eFneBFT7uX0Mpag0HI+Cz2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/xml-builder": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.0.tgz", + "integrity": "sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.975.0.tgz", + "integrity": "sha512-AWQt64hkVbDQ+CmM09wnvSk2mVyH4iRROkmYkr3/lmUtFNbE2L/fnw26sckZnUcFCsHPqbkQrcsZAnTcBLbH4w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.1", + "@aws-sdk/nested-clients": "3.975.0", + "@aws-sdk/types": "^3.973.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.2.tgz", + "integrity": "sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.972.0.tgz", + "integrity": "sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.972.0", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz", + "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.4.tgz", + "integrity": "sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.2.tgz", + "integrity": "sha512-gz76bUyebPZRxIsBHJUd/v+yiyFzm9adHbr8NykP2nm+z/rFyvQneOHajrUejtmnc5tTBeaDPL4X25TnagRk4A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.2.tgz", + "integrity": "sha512-vnxOc4C6AR7hVbwyFo1YuH0GB6dgJlWt8nIOOJpnzJAWJPkUMPJ9Zv2lnKsSU7TTZbhP2hEO8OZ4PYH59XFv8Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.2.tgz", + "integrity": "sha512-jGOOV/bV1DhkkUhHiZ3/1GZ67cZyOXaDb7d1rYD6ZiXf5V9tBNOcgqXwRRPvrCbYaFRa1pPMFb3ZjqjWpR3YfA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", + "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.2.0", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/test-result": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@prisma/client": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.0.tgz", + "integrity": "sha512-QXFT+N/bva/QI2qoXmjBzL7D6aliPffIwP+81AdTGq0FXDoLxLkWivGMawG8iM5B9BKfxLIXxfWWAF6wbuJU6g==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/config": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.0.tgz", + "integrity": "sha512-zwCayme+NzI/WfrvFEtkFhhOaZb/hI+X8TTjzjJ252VbPxAl2hWHK5NMczmnG9sXck2lsXrxIZuK524E25UNmg==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "c12": "3.1.0", + "deepmerge-ts": "7.1.5", + "effect": "3.18.4", + "empathic": "2.0.0" + } + }, + "node_modules/@prisma/debug": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.0.tgz", + "integrity": "sha512-8hAdGG7JmxrzFcTzXZajlQCidX0XNkMJkpqtfbLV54wC6LSSX6Vni25W/G+nAANwLnZ2TmwkfIuWetA7jJxJFA==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.0.tgz", + "integrity": "sha512-pMRJ+1S6NVdXoB8QJAPIGpKZevFjxhKt0paCkRDTZiczKb7F4yTgRP8M4JdVkpQwmaD4EoJf6qA+p61godDokw==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.0", + "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", + "@prisma/fetch-engine": "6.19.0", + "@prisma/get-platform": "6.19.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773.tgz", + "integrity": "sha512-gV7uOBQfAFlWDvPJdQxMT1aSRur3a0EkU/6cfbAC5isV67tKDWUrPauyaHNpB+wN1ebM4A9jn/f4gH+3iHSYSQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.0.tgz", + "integrity": "sha512-OOx2Lda0DGrZ1rodADT06ZGqHzr7HY7LNMaFE2Vp8dp146uJld58sRuasdX0OiwpHgl8SqDTUKHNUyzEq7pDdQ==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.0", + "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", + "@prisma/get-platform": "6.19.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.0.tgz", + "integrity": "sha512-ym85WDO2yDhC3fIXHWYpG3kVMBA49cL1XD2GCsCF8xbwoy2OkDQY44gEbAt2X46IQ4Apq9H6g0Ex1iFfPqEkHA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.47", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.47.tgz", + "integrity": "sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", + "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", + "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", + "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.22.0.tgz", + "integrity": "sha512-6vjCHD6vaY8KubeNw2Fg3EK0KLGQYdldG4fYgQmA0xSW0dJ8G2xFhSOdrlUakWVoP5JuWHtFODg3PNd/DN3FDA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", + "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.8.tgz", + "integrity": "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.8.tgz", + "integrity": "sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.8.tgz", + "integrity": "sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.8.tgz", + "integrity": "sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.8.tgz", + "integrity": "sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.9.tgz", + "integrity": "sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/chunked-blob-reader": "^5.2.0", + "@smithy/chunked-blob-reader-native": "^4.2.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", + "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.8.tgz", + "integrity": "sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", + "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.8.tgz", + "integrity": "sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", + "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.12.tgz", + "integrity": "sha512-9JMKHVJtW9RysTNjcBZQHDwB0p3iTP6B1IfQV4m+uCevkVd/VuLgwfqk5cnI4RHcp4cPwoIvxQqN4B1sxeHo8Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.22.0", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.4.29", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.29.tgz", + "integrity": "sha512-bmTn75a4tmKRkC5w61yYQLb3DmxNzB8qSVu9SbTYqW6GAL0WXO2bDZuMAn/GJSbOdHEdjZvWxe+9Kk015bw6Cg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/service-error-classification": "^4.2.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", + "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", + "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", + "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.8.tgz", + "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.11.1.tgz", + "integrity": "sha512-SERgNg5Z1U+jfR6/2xPYjSEHY1t3pyTHC/Ma3YQl6qWtmiL42bvNId3W/oMUWIwu7ekL2FMPdqAmwbQegM7HeQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.22.0", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.28", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.28.tgz", + "integrity": "sha512-/9zcatsCao9h6g18p/9vH9NIi5PSqhCkxQ/tb7pMgRFnqYp9XUOyOlGPDMHzr8n5ih6yYgwJEY2MLEobUgi47w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.31", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.31.tgz", + "integrity": "sha512-JTvoApUXA5kbpceI2vuqQzRjeTbLpx1eoa5R/YEZbTgtxvIB7AQZxFJ0SEyfCpgPCyVV9IT7we+ytSeIB3CyWA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.6", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", + "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", + "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", + "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.8.tgz", + "integrity": "sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookie-parser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.10.tgz", + "integrity": "sha512-B4xqkqfZ8Wek+rCOeRxsjMS9OgvzebEzzLYw7NHYuvzb7IdxOkI0ZHGgeEBX4PUM7QGVvNSK60T3OvWj3YfBRg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", + "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/multer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.0.0.tgz", + "integrity": "sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/node": { + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", + "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "license": "MIT" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", + "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/bowser": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", + "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c12": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", + "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.6.1", + "exsolve": "^1.0.7", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001765", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz", + "integrity": "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-cli": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-11.0.0.tgz", + "integrity": "sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "dotenv": "^17.1.0", + "dotenv-expand": "^12.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "dotenv": "cli.js" + } + }, + "node_modules/dotenv-cli/node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.3.tgz", + "integrity": "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/effect": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", + "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.5.tgz", + "integrity": "sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.18.3" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-list-endpoints": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/express-list-endpoints/-/express-list-endpoints-7.1.1.tgz", + "integrity": "sha512-SA6YHH1r6DrioJ4fFJNqiwu1FweGFqJZO9KBApMzwPosoSGPOX2AW0wiMepOXjojjEXDuP9whIvckomheErbJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/express/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/express/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-uuid": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-uuid/-/is-uuid-1.0.2.tgz", + "integrity": "sha512-tCByphFcJgf2qmiMo5hMCgNAquNSagOetVetDvBXswGkNfoyEMvGH1yDlF8cbZbKnbVBr4Y5/rlpMz9umxyBkQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", + "import-local": "^3.2.0", + "jest-cli": "30.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.2.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "p-limit": "^3.1.0", + "pretty-format": "30.2.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/jest-cli": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-leak-detector": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.2.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", + "object-assign": "^4.1.1", + "type-is": "^1.6.18", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", + "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nypm": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", + "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.2", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "tinyexec": "^1.0.1" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.0.tgz", + "integrity": "sha512-F3eX7K+tWpkbhl3l4+VkFtrwJlLXbAM+f9jolgoUZbFcm1DgHZ4cq9AgVEgUym2au5Ad/TDLN8lg83D+M10ycw==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/config": "6.19.0", + "@prisma/engines": "6.19.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/socket.io": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", + "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", + "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", + "license": "MIT", + "dependencies": { + "debug": "~4.4.1", + "ws": "~8.18.3" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz", + "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/superagent": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", + "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.5", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.14.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/supertest": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz", + "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-signature": "^1.2.2", + "methods": "^1.1.2", + "superagent": "^10.3.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supertest/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-jest": { + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/mission9-10-11/package.json b/mission9-10-11/package.json new file mode 100644 index 000000000..435f38267 --- /dev/null +++ b/mission9-10-11/package.json @@ -0,0 +1,60 @@ +{ + "name": "sprint-mission", + "version": "1.0.0", + "description": "", + "keywords": [], + "license": "ISC", + "author": "", + "main": "src/main.js", + "scripts": { + "dev": "nodemon --watch src --exec ts-node src/main.ts", + "build": "tsc -p tsconfig.build.json", + "start": "node dist/main.js", + "test": "dotenv -e .env.test -- npm run prisma:migrate && dotenv -e .env.test -- jest --runInBand", + "test:coverage": "jest --coverage", + "prisma:generate": "prisma generate", + "prisma:migrate": "prisma migrate dev", + "prisma:seed": "ts-node prisma/seed.ts" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.975.0", + "@prisma/client": "^6.19.0", + "bcrypt": "^6.0.0", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "dotenv": "^16.6.1", + "dotenv-cli": "^11.0.0", + "express": "^5.2.1", + "fs": "^0.0.1-security", + "is-uuid": "^1.0.2", + "jsonwebtoken": "^9.0.2", + "multer": "^2.0.2", + "socket.io": "^4.8.3", + "superstruct": "^2.0.2", + "tslib": "^2.8.1", + "uuid": "^13.0.0" + }, + "devDependencies": { + "@types/bcrypt": "^6.0.0", + "@types/cookie-parser": "^1.4.10", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/jest": "^30.0.0", + "@types/jsonwebtoken": "^9.0.10", + "@types/mocha": "^10.0.10", + "@types/multer": "^2.0.0", + "@types/node": "^24.10.1", + "@types/supertest": "^6.0.3", + "express-list-endpoints": "^7.1.1", + "jest": "^30.2.0", + "nodemon": "^3.1.11", + "prisma": "^6.19.0", + "supertest": "^7.2.2", + "ts-jest": "^29.4.6", + "ts-node": "^10.9.2", + "typescript": "^5.9.3" + }, + "prisma": { + "schema": "prisma/schema.prisma" + } +} diff --git a/mission9-10-11/prisma/migrations/20260119073239_add_notification/migration.sql b/mission9-10-11/prisma/migrations/20260119073239_add_notification/migration.sql new file mode 100644 index 000000000..fc7d680ba --- /dev/null +++ b/mission9-10-11/prisma/migrations/20260119073239_add_notification/migration.sql @@ -0,0 +1,114 @@ +-- CreateTable +CREATE TABLE "Article" ( + "id" SERIAL NOT NULL, + "title" TEXT NOT NULL, + "content" TEXT NOT NULL, + "image" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "userId" INTEGER NOT NULL, + + CONSTRAINT "Article_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Product" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT NOT NULL, + "price" INTEGER NOT NULL, + "tags" TEXT[], + "images" TEXT[], + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "userId" INTEGER NOT NULL, + + CONSTRAINT "Product_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Comment" ( + "id" SERIAL NOT NULL, + "content" TEXT NOT NULL, + "productId" INTEGER, + "articleId" INTEGER, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "userId" INTEGER NOT NULL, + + CONSTRAINT "Comment_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "email" TEXT NOT NULL, + "nickname" TEXT NOT NULL, + "image" TEXT, + "password" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Like" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "productId" INTEGER, + "articleId" INTEGER, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Like_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Notification" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "message" TEXT NOT NULL, + "isRead" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Notification_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_nickname_key" ON "User"("nickname"); + +-- CreateIndex +CREATE UNIQUE INDEX "Like_userId_productId_key" ON "Like"("userId", "productId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Like_userId_articleId_key" ON "Like"("userId", "articleId"); + +-- AddForeignKey +ALTER TABLE "Article" ADD CONSTRAINT "Article_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Product" ADD CONSTRAINT "Product_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Comment" ADD CONSTRAINT "Comment_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Comment" ADD CONSTRAINT "Comment_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Comment" ADD CONSTRAINT "Comment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Like" ADD CONSTRAINT "Like_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Like" ADD CONSTRAINT "Like_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Like" ADD CONSTRAINT "Like_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/mission9-10-11/prisma/migrations/migration_lock.toml b/mission9-10-11/prisma/migrations/migration_lock.toml new file mode 100644 index 000000000..044d57cdb --- /dev/null +++ b/mission9-10-11/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql" diff --git a/mission9-10-11/prisma/schema.prisma b/mission9-10-11/prisma/schema.prisma new file mode 100644 index 000000000..f78c7da69 --- /dev/null +++ b/mission9-10-11/prisma/schema.prisma @@ -0,0 +1,93 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? +// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model Article { + id Int @id @default(autoincrement()) + title String + content String + image String? + articleComment Comment[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + user User @relation(fields: [userId], references: [id]) + userId Int + likes Like[] +} + +model Product { + id Int @id @default(autoincrement()) + name String + description String + price Int + tags String[] + images String[] + productComment Comment[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + user User @relation(fields: [userId], references: [id]) + userId Int + likes Like[] +} + +model Comment { + id Int @id @default(autoincrement()) + content String + product Product? @relation(fields: [productId], references: [id], onDelete: Cascade) + productId Int? + article Article? @relation(fields: [articleId], references: [id], onDelete: Cascade) + articleId Int? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + user User @relation(fields: [userId], references: [id]) + userId Int +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + nickname String @unique + image String? + password String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + products Product[] + articles Article[] + comments Comment[] + likes Like[] + notifications Notification[] +} + +model Like { + id Int @id @default(autoincrement()) + user User @relation(fields: [userId], references: [id]) + userId Int + product Product? @relation(fields: [productId], references: [id], onDelete: Cascade) + productId Int? + article Article? @relation(fields: [articleId], references: [id], onDelete: Cascade) + articleId Int? + createdAt DateTime @default(now()) + + @@unique([userId, productId]) + @@unique([userId, articleId]) +} + +model Notification { + id Int @id @default(autoincrement()) + userId Int + user User @relation(fields: [userId], references: [id]) + message String + isRead Boolean @default(false) + createdAt DateTime @default(now()) +} diff --git a/mission9-10-11/public/.gitkeep b/mission9-10-11/public/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/mission9-10-11/public/4f3edda9-25e4-462b-b18b-a45bb5f789ca.png b/mission9-10-11/public/4f3edda9-25e4-462b-b18b-a45bb5f789ca.png new file mode 100644 index 0000000000000000000000000000000000000000..35a7b5616a6b18773cb64d62627874b0bde02271 GIT binary patch literal 6066 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 + + + + + Document + + +

Socket.IO client test

+
+ + +
+ + + + + diff --git a/mission9-10-11/readme.md b/mission9-10-11/readme.md new file mode 100644 index 000000000..886574b32 --- /dev/null +++ b/mission9-10-11/readme.md @@ -0,0 +1,163 @@ +# 스프린트 미션5 + +- 미션8 소켓io를 활용한 알림 api 기능 개발 + +## 추가된 주요 기능 + +- 자신의 알림 목록 조회 +- 자신이 읽지 않은 알림 개수 조회 +- 자신의 알림 읽음 처리 +- 클라이언트 실시간 알림 기능 +- 좋아요한 상품의 가격 변동 알림 +- 자신이 작성한 게시글의 댓글 알림 + +## ERD 다이어그램 + +```mermaid +erDiagram + USER { + Int id PK + String email "UNIQUE" + String nickname "UNIQUE" + String image "nullable" + String password + DateTime createdAt + DateTime updatedAt + } + + ARTICLE { + Int id PK + String title + String content + String image "nullable" + DateTime createdAt + DateTime updatedAt + Int userId FK + } + + PRODUCT { + Int id PK + String name + String description + Int price + String[] tags + String[] images + DateTime createdAt + DateTime updatedAt + Int userId FK + } + + COMMENT { + Int id PK + String content + Int productId FK "nullable" + Int articleId FK "nullable" + DateTime createdAt + DateTime updatedAt + Int userId FK + } + + LIKE { + Int id PK + Int userId FK + Int productId FK "nullable" + Int articleId FK "nullable" + DateTime createdAt + } + + NOTIFICATION { + Int id PK + Int userId FK + String message + Boolean isRead + DateTime createdAt + } + + USER ||--o{ ARTICLE : writes + USER ||--o{ PRODUCT : sells + USER ||--o{ COMMENT : writes + USER ||--o{ LIKE : creates + USER ||--o{ NOTIFICATION : receives + + ARTICLE ||--o{ COMMENT : has + PRODUCT ||--o{ COMMENT : has + + ARTICLE ||--o{ LIKE : likedBy + PRODUCT ||--o{ LIKE : likedBy + +``` + +- 한 유저는 같은 Product/Article 에 한 번만 좋아요를 누를 수 있습니다. (unique 제약) + +## 프로젝트 구조 + +``` +mission8 +├── prisma +│ ├── migrations +│ └── schema.prisma +├── public +│ └──socket-client-test.html +├── src +│ ├── controllers +│ │ ├── articlesController.ts +│ │ ├── commentsController.ts +│ │ ├── errorController.ts +│ │ ├── imagesController.ts +│ │ ├── notificationController.ts +│ │ ├── productsController.ts +│ │ └── usersController.ts +│ │ +│ ├── lib +│ │ ├── errors +│ │ │ ├── customErrors.ts +│ │ │ └── errorUtils.ts +│ │ ├── constants.ts +│ │ ├── cookies.ts +│ │ ├── prismaClient.ts +│ │ ├── token.ts +│ │ └── withAsync.ts +│ │ +│ ├── middlewares +│ │ └── authenticate.ts +│ │ +│ ├── repositories +│ │ ├── articleRepository.ts +│ │ ├── commentRepository.ts +│ │ ├── likeRepository.ts +│ │ ├── notificationRepository.ts +│ │ ├── productRepository.ts +│ │ └── userRepository.ts +│ │ +│ ├── routers +│ │ ├── articlesRouter.ts +│ │ ├── commentsRouter.ts +│ │ ├── imagesRouter.ts +│ │ ├── notificationRepository.ts +│ │ ├── productsRouter.ts +│ │ └── usersRouter.ts +│ │ +│ ├── services +│ │ ├── articleService.ts +│ │ ├── commentService.ts +│ │ ├── imageService.ts +│ │ ├── notificationService.ts +│ │ ├── productService.ts +│ │ └── userService.ts +│ │ +│ ├── structs +│ │ ├── articlesStructs.ts +│ │ ├── commentsStructs.ts +│ │ ├── commonStructs.ts +│ │ ├── productsStructs.ts +│ │ └── usersStructs.ts +│ │ +│ ├── socket.ts +│ └── main.ts +│ +├── tests +├── types +├── package.json +├── package-lock.json +└── readme.md +``` diff --git a/mission9-10-11/src/app.ts b/mission9-10-11/src/app.ts new file mode 100644 index 000000000..740e4bc17 --- /dev/null +++ b/mission9-10-11/src/app.ts @@ -0,0 +1,30 @@ +import express from 'express'; +import cors from 'cors'; +import articlesRouter from './routers/articlesRouter'; +import productsRouter from './routers/productsRouter'; +import commentsRouter from './routers/commentsRouter'; +import imagesRouter from './routers/imagesRouter'; +import usersRouter from './routers/usersRouter'; +import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController'; +import cookieParser from 'cookie-parser'; +import notificationRouter from './routers/notificationRouter'; +import { setupStatic } from './lib/setupStatic'; + +const app = express(); + +app.use(cors()); +app.use(cookieParser()); +app.use(express.json()); +setupStatic(app); + +app.use('/articles', articlesRouter); +app.use('/products', productsRouter); +app.use('/comments', commentsRouter); +app.use('/images', imagesRouter); +app.use('/users', usersRouter); +app.use('/notifications', notificationRouter); + +app.use(defaultNotFoundHandler); +app.use(globalErrorHandler); + +export default app; diff --git a/mission9-10-11/src/controllers/articlesController.ts b/mission9-10-11/src/controllers/articlesController.ts new file mode 100644 index 000000000..688e97352 --- /dev/null +++ b/mission9-10-11/src/controllers/articlesController.ts @@ -0,0 +1,97 @@ +import { create } from 'superstruct'; +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { IdParamsStruct } from '../structs/commonStructs'; +import { + CreateArticleBodyStruct, + UpdateArticleBodyStruct, + GetArticleListParamsStruct, +} from '../structs/articlesStructs'; +import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct'; +import { Request, Response } from 'express'; +import { articleService } from '../services/articleService'; + +//게시물 생성 +export async function createArticle(req: Request, res: Response) { + const { title, content, image } = create(req.body, CreateArticleBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const article = await articleService.createArticle(user.id, title, content, image); + return res.status(201).send(article); +} +// 게시글 조회(좋아요 포함) +export async function getArticle(req: Request, res: Response) { + const { id } = create(req.params, IdParamsStruct); + const user = req.user; + const article = await articleService.getArticle(id, user?.id); + return res.send(article); +} +//게시물 수정 +export async function updateArticle(req: Request, res: Response) { + const { id } = create(req.params, IdParamsStruct); + const data = create(req.body, UpdateArticleBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const updated = await articleService.updateArticle(id, user.id, data); + return res.send(updated); +} +//게시물 삭제 +export async function deleteArticle(req: Request, res: Response) { + const { id } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + await articleService.deleteArticle(id, user.id); + return res.status(204).send(); +} + +//게시글 목록 조회(좋아요 포함) +export async function getArticleList(req: Request, res: Response) { + const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct); + const user = req.user; + const articles = await articleService.getArticleList(page, pageSize, orderBy, keyword, user?.id); + return res.send(articles); +} +//댓글 등록 +export async function createComment(req: Request, res: Response) { + const { id: articleId } = create(req.params, IdParamsStruct); + const { content } = create(req.body, CreateCommentBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const comment = await articleService.createComment(user.id, articleId, content); + return res.status(201).send(comment); +} +//댓글 목록 조회 +export async function getCommentList(req: Request, res: Response) { + const { id: articleId } = create(req.params, IdParamsStruct); + const { cursor, limit } = create(req.query, GetCommentListParamsStruct); + const commnetsList = await articleService.getCommentList(articleId, limit, cursor); + return res.send(commnetsList); +} +//게시글 좋아요 등록 +export async function likeArticle(req: Request, res: Response) { + const { id: articleId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const articleLike = await articleService.likeArticle(user.id, articleId); + return res.status(200).send(articleLike); +} + +//게시글 좋아요 취소 +export async function unlikeArticle(req: Request, res: Response) { + const { id: articleId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const articleUnlike = await articleService.unlikeArticle(user.id, articleId); + return res.status(200).send(articleUnlike); +} diff --git a/mission9-10-11/src/controllers/commentsController.ts b/mission9-10-11/src/controllers/commentsController.ts new file mode 100644 index 000000000..ad89524bc --- /dev/null +++ b/mission9-10-11/src/controllers/commentsController.ts @@ -0,0 +1,29 @@ +import { create } from 'superstruct'; +import { UpdateCommentBodyStruct } from '../structs/commentsStruct'; +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { IdParamsStruct } from '../structs/commonStructs'; +import { Request, Response } from 'express'; +import { commnetService } from '../services/commentService'; + +//댓글 수정 +export async function updateComment(req: Request, res: Response) { + const { id: commentId } = create(req.params, IdParamsStruct); + const { content } = create(req.body, UpdateCommentBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const updatedComment = await commnetService.updateComment(commentId, user.id, content); + return res.send(updatedComment); +} + +//댓글 삭제 +export async function deleteComment(req: Request, res: Response) { + const { id: commentId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + await commnetService.deleteComment(commentId, user.id); + return res.status(204).send(); +} diff --git a/mission9-10-11/src/controllers/errorController.ts b/mission9-10-11/src/controllers/errorController.ts new file mode 100644 index 000000000..0ebb1e34a --- /dev/null +++ b/mission9-10-11/src/controllers/errorController.ts @@ -0,0 +1,46 @@ +import { StructError } from 'superstruct'; +import { + NotFoundError, + BadRequestError, + ForbiddenError, + UnauthorizedError, +} from '../lib/errors/customErrors'; +import { Prisma } from '@prisma/client'; +import { Request, Response, NextFunction } from 'express'; +import { isSyntaxJsonError } from '../lib/errors/errorUtils'; + +//404 처리 미들웨어 +export function defaultNotFoundHandler(req: Request, res: Response, next: NextFunction) { + return res.status(404).send({ message: '존재하지 않습니다' }); +} +//전역 에러 처리 미들웨어(400,401,403,404,500) +export function globalErrorHandler(err: unknown, req: Request, res: Response, next: NextFunction) { + if (err instanceof StructError || err instanceof BadRequestError) { + return res.status(400).send({ message: '잘못된 요청입니다' }); + } + if (isSyntaxJsonError(err)) { + return res.status(400).send({ message: '잘못된 요청입니다' }); + } + if (err instanceof UnauthorizedError) { + return res.status(401).json({ message: err.message }); + } + if (err instanceof ForbiddenError) { + return res.status(403).json({ message: err.message }); + } + if (err instanceof NotFoundError) { + return res.status(404).send({ message: err.message }); + } + //프리즈마 코드 에러, 그 외 known 에러 500처리 + if (err instanceof Prisma.PrismaClientKnownRequestError) { + if (err.code === 'P2025') { + return res.status(404).json({ message: '존재하지 않습니다' }); + } + if (err.code === 'P2002') { + return res.status(400).json({ message: '잘못된 요청입니다' }); + } + return res.status(500).json({ message: '데이터 처리 중 오류가 발생했습니다' }); + } + + console.error(err); + return res.status(500).send({ message: '데이터 처리 중 오류가 발생했습니다' }); +} diff --git a/mission9-10-11/src/controllers/imagesController.ts b/mission9-10-11/src/controllers/imagesController.ts new file mode 100644 index 000000000..b34821e61 --- /dev/null +++ b/mission9-10-11/src/controllers/imagesController.ts @@ -0,0 +1,7 @@ +import { Request, Response } from 'express'; +import { imageService } from '../services/imageService'; + +export async function uploadImage(req: Request, res: Response) { + const response = await imageService.buildImageUrl(req); + return res.send(response); +} diff --git a/mission9-10-11/src/controllers/notificationController.ts b/mission9-10-11/src/controllers/notificationController.ts new file mode 100644 index 000000000..18917a816 --- /dev/null +++ b/mission9-10-11/src/controllers/notificationController.ts @@ -0,0 +1,33 @@ +import { Request, Response } from 'express'; +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { notificationService } from '../services/notificationService'; +import { IdParamsStruct } from '../structs/commonStructs'; +import { create } from 'superstruct'; + +export async function getNotifications(req: Request, res: Response) { + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const notifications = await notificationService.getNotifications(user.id); + return res.send(notifications); +} + +export async function getUnreadCount(req: Request, res: Response) { + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const count = await notificationService.getUnreadCount(user.id); + return res.send({ count }); +} + +export async function markAsRead(req: Request, res: Response) { + const { id: notificationId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const notification = await notificationService.markAsRead(notificationId, user.id); + return res.send(notification); +} diff --git a/mission9-10-11/src/controllers/productsController.ts b/mission9-10-11/src/controllers/productsController.ts new file mode 100644 index 000000000..de9f9f6da --- /dev/null +++ b/mission9-10-11/src/controllers/productsController.ts @@ -0,0 +1,103 @@ +import { create } from 'superstruct'; +import { IdParamsStruct } from '../structs/commonStructs'; +import { + CreateProductBodyStruct, + GetProductListParamsStruct, + UpdateProductBodyStruct, +} from '../structs/productsStruct'; +import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct'; +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { Request, Response } from 'express'; +import { productService } from '../services/productService'; + +//상품 등록 +export async function createProduct(req: Request, res: Response) { + const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const product = await productService.createProduct({ + name, + description, + price, + tags, + images, + userId: user.id, + }); + return res.status(201).send(product); +} +//특정 상품 조회(좋아요 포함) +export async function getProduct(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const user = req.user; + const product = await productService.getProduct(productId, user?.id); + return res.send(product); +} +//상품 수정 +export async function updateProduct(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const data = create(req.body, UpdateProductBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const updatedProduct = await productService.updateProduct(productId, user.id, data); + return res.send(updatedProduct); +} +//상품 삭제 +export async function deleteProduct(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + await productService.deleteProduct(productId, user.id); + return res.status(204).send(); +} +//상품 목록 조회(좋아요 포함) +export async function getProductList(req: Request, res: Response) { + const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct); + const user = req.user; + const products = await productService.getProductList(page, pageSize, orderBy, keyword, user?.id); + return res.send(products); +} + +//댓글 등록 +export async function createComment(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const { content } = create(req.body, CreateCommentBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const comment = await productService.createComment(user.id, productId, content); + return res.status(201).send(comment); +} +//상품 댓글 목록 조회 +export async function getCommentList(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const { cursor, limit } = create(req.query, GetCommentListParamsStruct); + const commentList = await productService.getCommentList(productId, limit, cursor); + return res.send(commentList); +} +//상품 좋아요 등록 +export async function likeProduct(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const productLike = await productService.likeProduct(user.id, productId); + return res.status(200).send(productLike); +} +//상품 좋아요 취소 +export async function unlikeProduct(req: Request, res: Response) { + const { id: productId } = create(req.params, IdParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const productUnliked = await productService.unlikeProduct(user.id, productId); + return res.send(productUnliked); +} diff --git a/mission9-10-11/src/controllers/usersController.ts b/mission9-10-11/src/controllers/usersController.ts new file mode 100644 index 000000000..fe8a9898b --- /dev/null +++ b/mission9-10-11/src/controllers/usersController.ts @@ -0,0 +1,92 @@ +import { + CreateUserBodyStruct, + UpdateUserBodyStruct, + LoginBodyStruct, + ChangePasswordBodyStruct, + GetMyProductListParamsStruct, + GetMyLikedProductListParamsStruct, +} from '../structs/usersStructs'; +import { create } from 'superstruct'; +import { clearTokenCookies, setTokenCookies } from '../lib/cookies'; +import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants'; +import { Request, Response } from 'express'; +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { userService } from '../services/userService'; + +//회원가입 +export async function register(req: Request, res: Response) { + const { nickname, email, password, image } = create(req.body, CreateUserBodyStruct); + const user = await userService.register(nickname, email, password, image); + return res.status(201).send(user); +} +//로그인 +export async function login(req: Request, res: Response) { + const { email, password } = create(req.body, LoginBodyStruct); + const result = await userService.login(email, password); + setTokenCookies(res, result.tokens.accessToken, result.tokens.refreshToken); + return res.status(200).send({ message: result.message }); +} +//로그아웃 +export async function logout(req: Request, res: Response) { + clearTokenCookies(res); + return res.status(200).send({ message: '로그아웃에 성공했습니다.' }); +} +//내 프로필 조회 (최근 등록한 상품 5개, 최근 좋아요한 상품 5개 포함) +export async function getProfile(req: Request, res: Response) { + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const profile = await userService.getProfile(user.id); + return res.send(profile); +} +//내 프로필 수정 +export async function updateProfile(req: Request, res: Response) { + const { nickname, email, image } = create(req.body, UpdateUserBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const update = await userService.updateProfile(user.id, nickname, email, image); + return res.send(update); +} +//내 비밀번호 변경 +export async function patchPassword(req: Request, res: Response) { + const { currentPassword, newPassword } = create(req.body, ChangePasswordBodyStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + await userService.patchPassword(user.id, currentPassword, newPassword); + return res.status(200).send({ message: '비밀번호가 성공적으로 변경되었습니다.' }); +} +//내가 등록한 상품 목록 조회 (상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능) +export async function getMyProductList(req: Request, res: Response) { + const { page, pageSize, orderBy, keyword } = create(req.query, GetMyProductListParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const myProducts = await userService.getMyProductList(user.id, page, pageSize, orderBy, keyword); + return res.send(myProducts); +} +//토큰 갱신(리프레시) +export async function refreshToken(req: Request, res: Response) { + const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME]; + if (!refreshToken) { + throw new UnauthorizedError('리프레시 토큰이 없습니다.'); + } + const tokens = await userService.refreshToken(refreshToken); + setTokenCookies(res, tokens.accessToken, tokens.refreshToken); + return res.status(200).send({ message: '토큰이 성공적으로 갱신되었습니다.' }); +} +//내가 좋아요한 상품 목록 조회(상품이 꽤 많이 있을 경우 페이징 처리) +export async function getMyLikedProducts(req: Request, res: Response) { + const { page, pageSize, orderBy } = create(req.query, GetMyLikedProductListParamsStruct); + const user = req.user; + if (!user) { + throw new UnauthorizedError(); + } + const myLikedProducts = await userService.getMyLikedProducts(user.id, page, pageSize, orderBy); + return res.send(myLikedProducts); +} diff --git a/mission9-10-11/src/lib/constants.ts b/mission9-10-11/src/lib/constants.ts new file mode 100644 index 000000000..51abd9949 --- /dev/null +++ b/mission9-10-11/src/lib/constants.ts @@ -0,0 +1,26 @@ +import dotenv from 'dotenv'; +dotenv.config(); + +const DATABASE_URL = process.env.DATABASE_URL; +const NODE_ENV = process.env.NODE_ENV || 'development'; +const PORT = process.env.PORT || 3000; +const PUBLIC_PATH = 'public'; +const STATIC_PATH = '/public'; +const JWT_ACCESS_TOKEN_SECRET = + process.env.JWT_ACCESS_TOKEN_SECRET || 'your_jwt_access_token_secret'; +const JWT_REFRESH_TOKEN_SECRET = + process.env.JWT_REFRESH_TOKEN_SECRET || 'your_jwt_refresh_token_secret'; +const ACCESS_TOKEN_COOKIE_NAME = 'access-token'; +const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token'; + +export { + DATABASE_URL, + NODE_ENV, + PORT, + PUBLIC_PATH, + STATIC_PATH, + JWT_ACCESS_TOKEN_SECRET, + JWT_REFRESH_TOKEN_SECRET, + ACCESS_TOKEN_COOKIE_NAME, + REFRESH_TOKEN_COOKIE_NAME, +}; diff --git a/mission9-10-11/src/lib/cookies.ts b/mission9-10-11/src/lib/cookies.ts new file mode 100644 index 000000000..36311f1b2 --- /dev/null +++ b/mission9-10-11/src/lib/cookies.ts @@ -0,0 +1,28 @@ +import { NODE_ENV, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from './constants'; +import { Response } from 'express'; + +export function setTokenCookies(res: Response, accessToken: string, refreshToken: string) { + res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, { + httpOnly: true, + secure: NODE_ENV === 'production', + maxAge: 1 * 60 * 60 * 1000, // 1시간 + }); + res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, { + httpOnly: true, + secure: NODE_ENV === 'production', + maxAge: 7 * 24 * 60 * 60 * 1000, // 7일 + path: '/users/refresh', + }); +} + +export function clearTokenCookies(res: Response) { + res.clearCookie(ACCESS_TOKEN_COOKIE_NAME, { + httpOnly: true, + secure: NODE_ENV === 'production', + }); + res.clearCookie(REFRESH_TOKEN_COOKIE_NAME, { + httpOnly: true, + secure: NODE_ENV === 'production', + path: '/users/refresh', + }); +} diff --git a/mission9-10-11/src/lib/errors/customErrors.ts b/mission9-10-11/src/lib/errors/customErrors.ts new file mode 100644 index 000000000..8bde3cfe8 --- /dev/null +++ b/mission9-10-11/src/lib/errors/customErrors.ts @@ -0,0 +1,46 @@ +export class BaseError extends Error { + statusCode: number; + constructor(message: string, statusCode: number) { + super(message); + this.name = new.target.name; + this.statusCode = statusCode; + } +} + +export class NotFoundError extends BaseError { + constructor(message = '존재하지 않습니다') { + super(message, 404); + } +} + +export class UnauthorizedError extends BaseError { + constructor(message = '인증이 필요합니다') { + super(message, 401); + } +} + +export class BadRequestError extends BaseError { + constructor(message = '잘못된 요청입니다') { + super(message, 400); + } +} + +export class ForbiddenError extends BaseError { + constructor(message = '비밀번호가 틀렸습니다') { + super(message, 403); + } +} + +export class AlreadyLikeError extends ForbiddenError { + constructor(message = '이미 좋아요를 눌렀습니다.') { + super(message); + this.name = new.target.name; + } +} + +export class AlreadyUnlikeError extends ForbiddenError { + constructor(message = '좋아요가 존재하지 않습니다.') { + super(message); + this.name = new.target.name; + } +} diff --git a/mission9-10-11/src/lib/errors/errorUtils.ts b/mission9-10-11/src/lib/errors/errorUtils.ts new file mode 100644 index 000000000..55c11df26 --- /dev/null +++ b/mission9-10-11/src/lib/errors/errorUtils.ts @@ -0,0 +1,13 @@ +interface SyntaxJsonError extends SyntaxError { + status?: number; + body?: unknown; +} + +export function isSyntaxJsonError(err: unknown): err is SyntaxJsonError { + if (!(err instanceof SyntaxError)) return false; + const e = err as Partial; + return typeof e.status === 'number' && 'body' in e; +} +// Partial; +// 얘는 SyntaxJsonError의 일부 프로퍼티만 가지고 있을 수도 있어” +// 라고 TS에게 알려서 e.status, e.body 같은 속성 접근을 가능하게 해주는 장치 diff --git a/mission9-10-11/src/lib/prismaClient.ts b/mission9-10-11/src/lib/prismaClient.ts new file mode 100644 index 000000000..9b6c4ce30 --- /dev/null +++ b/mission9-10-11/src/lib/prismaClient.ts @@ -0,0 +1,3 @@ +import { PrismaClient } from '@prisma/client'; + +export const prisma = new PrismaClient(); diff --git a/mission9-10-11/src/lib/setupStatic.ts b/mission9-10-11/src/lib/setupStatic.ts new file mode 100644 index 000000000..06121ff65 --- /dev/null +++ b/mission9-10-11/src/lib/setupStatic.ts @@ -0,0 +1,8 @@ +import express from 'express'; +import path from 'path'; +import { PUBLIC_PATH, STATIC_PATH } from './constants'; + +export function setupStatic(app: express.Express) { + if (process.env.UPLOAD_PROVIDER === 's3') return; + app.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH))); +} diff --git a/mission9-10-11/src/lib/token.ts b/mission9-10-11/src/lib/token.ts new file mode 100644 index 000000000..0e16839c3 --- /dev/null +++ b/mission9-10-11/src/lib/token.ts @@ -0,0 +1,22 @@ +import jwt, { JwtPayload } from 'jsonwebtoken'; +import { JWT_ACCESS_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET } from './constants'; + +interface TokenPayload extends JwtPayload { + id: number; +} + +export function generateToken(userId: number) { + const accessToken = jwt.sign({ id: userId }, JWT_ACCESS_TOKEN_SECRET, { expiresIn: '1h' }); + const refreshToken = jwt.sign({ id: userId }, JWT_REFRESH_TOKEN_SECRET, { expiresIn: '1d' }); + return { accessToken, refreshToken }; +} + +export function verifyAccessToken(token: string) { + const decoded = jwt.verify(token, JWT_ACCESS_TOKEN_SECRET) as TokenPayload; + return { userId: decoded.id }; +} + +export function verifyRefreshToken(token: string) { + const decoded = jwt.verify(token, JWT_REFRESH_TOKEN_SECRET) as TokenPayload; + return { userId: decoded.id }; +} diff --git a/mission9-10-11/src/lib/withAsync.ts b/mission9-10-11/src/lib/withAsync.ts new file mode 100644 index 000000000..500839366 --- /dev/null +++ b/mission9-10-11/src/lib/withAsync.ts @@ -0,0 +1,13 @@ +import type { Request, Response, NextFunction, RequestHandler } from 'express'; + +export function withAsync( + handler: (req: Request, res: Response, next: NextFunction) => Promise, +): RequestHandler { + return async (req, res, next) => { + try { + await handler(req, res, next); + } catch (e) { + next(e); + } + }; +} diff --git a/mission9-10-11/src/main.ts b/mission9-10-11/src/main.ts new file mode 100644 index 000000000..8ed2dac0e --- /dev/null +++ b/mission9-10-11/src/main.ts @@ -0,0 +1,12 @@ +import { createServer } from 'http'; +import app from './app'; +import { PORT } from './lib/constants'; +import { initSocket } from './socket'; + +const server = createServer(app); + +initSocket(server); + +server.listen(PORT, () => { + console.log(`Server started on port ${PORT}`); +}); diff --git a/mission9-10-11/src/middlewares/authenticate.ts b/mission9-10-11/src/middlewares/authenticate.ts new file mode 100644 index 000000000..5c70effec --- /dev/null +++ b/mission9-10-11/src/middlewares/authenticate.ts @@ -0,0 +1,30 @@ +import { prisma } from '../lib/prismaClient'; +import { verifyAccessToken } from '../lib/token'; +import { ACCESS_TOKEN_COOKIE_NAME } from '../lib/constants'; +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { NextFunction, Request, Response } from 'express'; + +function authenticate(options = { optional: false }) { + return async (req: Request, res: Response, next: NextFunction) => { + const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME]; + if (!accessToken) { + if (options.optional) { + return next(); + } + return next(new UnauthorizedError()); + } + try { + const { userId } = verifyAccessToken(accessToken); //디코딩 된 토큰에서 user id 추출 + const user = await prisma.user.findUniqueOrThrow({ where: { id: userId } }); + req.user = user; + } catch (error) { + if (options.optional) { + return next(); + } + return next(new UnauthorizedError()); + } + next(); + }; +} + +export default authenticate; diff --git a/mission9-10-11/src/middlewares/upload.ts b/mission9-10-11/src/middlewares/upload.ts new file mode 100644 index 000000000..c9f773f69 --- /dev/null +++ b/mission9-10-11/src/middlewares/upload.ts @@ -0,0 +1,44 @@ +import multer from 'multer'; +import path from 'path/win32'; +import { PUBLIC_PATH } from '../lib/constants'; +import { BadRequestError } from '../lib/errors/customErrors'; +import { v4 as uuidv4 } from 'uuid'; + +const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg']; +const FILE_SIZE_LIMIT = 5 * 1024 * 1024; +const uploadProvider = process.env.UPLOAD_PROVIDER ?? 'local'; + +function fileFilter(req: any, file: any, cb: any) { + if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) { + return cb(new BadRequestError('Only png, jpeg, and jpg are allowed')); + } + cb(null, true); +} + +function makeFilename(originalname: string) { + const ext = path.extname(originalname); + return `${uuidv4()}${ext}`; +} + +// local: 디스크 저장 +const localUpload = multer({ + storage: multer.diskStorage({ + destination(req, file, cb) { + cb(null, PUBLIC_PATH); + }, + filename(req, file, cb) { + cb(null, makeFilename(file.originalname)); + }, + }), + limits: { fileSize: FILE_SIZE_LIMIT }, + fileFilter, +}); + +// s3: memoryStorage (S3로 업로드는 서비스에서 처리) +const s3Upload = multer({ + storage: multer.memoryStorage(), + limits: { fileSize: FILE_SIZE_LIMIT }, + fileFilter, +}); + +export const upload = uploadProvider === 's3' ? s3Upload : localUpload; diff --git a/mission9-10-11/src/repositories/articleRepository.ts b/mission9-10-11/src/repositories/articleRepository.ts new file mode 100644 index 000000000..3505e0393 --- /dev/null +++ b/mission9-10-11/src/repositories/articleRepository.ts @@ -0,0 +1,57 @@ +import { Prisma } from '@prisma/client'; +import { prisma } from '../lib/prismaClient'; +import { ArticleLikesAndCount } from '../../types/article'; + +export class ArticleRepository { + async create(data: Prisma.ArticleCreateInput) { + return prisma.article.create({ data }); + } + async findById(id: number) { + return prisma.article.findUniqueOrThrow({ where: { id } }); + } + async findByIdWithLikes(id: number, userId?: number): Promise { + return prisma.article.findUniqueOrThrow({ + where: { id }, + include: { + _count: { select: { likes: true } }, + likes: { + //비로그인 시 -1을 줘서 []을 뱉도록 + where: { userId: userId ?? -1 }, + select: { id: true }, + }, + }, + }); + } + async findArticleListWithLikes(params: { + skip: number; + take: number; + orderBy: Prisma.ArticleOrderByWithRelationInput; + where: Prisma.ArticleWhereInput; + userId?: number; + }): Promise { + return prisma.article.findMany({ + skip: params.skip, + take: params.take, + orderBy: params.orderBy, + where: params.where, + include: { + _count: { select: { likes: true } }, + likes: { + where: { userId: params.userId ?? -1 }, + select: { id: true }, + }, + }, + }); + } + async count(where: Prisma.ArticleWhereInput) { + return prisma.article.count({ where }); + } + async update(id: number, data: Prisma.ArticleUpdateInput) { + return prisma.article.update({ where: { id }, data }); + } + async delete(id: number) { + return prisma.article.delete({ where: { id } }); + } +} + +export const articleRepo = new ArticleRepository(); diff --git a/mission9-10-11/src/repositories/commentRepository.ts b/mission9-10-11/src/repositories/commentRepository.ts new file mode 100644 index 000000000..cc81be921 --- /dev/null +++ b/mission9-10-11/src/repositories/commentRepository.ts @@ -0,0 +1,31 @@ +import { Prisma } from '@prisma/client'; +import { prisma } from '../lib/prismaClient'; + +export class CommentRepository { + async create(data: Prisma.CommentCreateInput) { + return prisma.comment.create({ data }); + } + async findCommentListQuery( + whereCondition: { articleId: number } | { productId: number }, + limit: number, + cursor?: number, + ) { + return prisma.comment.findMany({ + cursor: cursor ? { id: cursor } : undefined, + take: limit + 1, + where: whereCondition, + orderBy: { createdAt: 'desc' }, + }); + } + async findById(id: number) { + return prisma.comment.findUniqueOrThrow({ where: { id } }); + } + async update(id: number, content?: string) { + return prisma.comment.update({ where: { id }, data: { content } }); + } + async delete(id: number) { + return prisma.comment.delete({ where: { id } }); + } +} + +export const commentRepo = new CommentRepository(); diff --git a/mission9-10-11/src/repositories/likeRepository.ts b/mission9-10-11/src/repositories/likeRepository.ts new file mode 100644 index 000000000..033015eaf --- /dev/null +++ b/mission9-10-11/src/repositories/likeRepository.ts @@ -0,0 +1,36 @@ +import { LikeTarget } from '../../types/like'; +import { prisma } from '../lib/prismaClient'; + +class LikdeRepository { + async findLike(userId: number, target: LikeTarget) { + const whereCondition = + 'articleId' in target + ? { userId_articleId: { userId, articleId: target.articleId } } + : { userId_productId: { userId, productId: target.productId } }; + return prisma.like.findUnique({ + where: whereCondition, + }); + } + async createLike(userId: number, target: LikeTarget) { + return prisma.like.create({ data: { userId, ...target } }); + } + async deleteLike(userId: number, target: LikeTarget) { + const whereCondition = + 'articleId' in target + ? { userId_articleId: { userId, articleId: target.articleId } } + : { userId_productId: { userId, productId: target.productId } }; + return prisma.like.delete({ + where: whereCondition, + }); + } + async getLikers(target: LikeTarget) { + const whereCondition = + 'articleId' in target ? { articleId: target.articleId } : { productId: target.productId }; + return prisma.like.findMany({ + where: whereCondition, + select: { userId: true }, + }); + } +} + +export const likeRepo = new LikdeRepository(); diff --git a/mission9-10-11/src/repositories/notificationRepository.ts b/mission9-10-11/src/repositories/notificationRepository.ts new file mode 100644 index 000000000..945c2b5ac --- /dev/null +++ b/mission9-10-11/src/repositories/notificationRepository.ts @@ -0,0 +1,26 @@ +import { prisma } from '../lib/prismaClient'; + +export class NotificationRepository { + async getNotification(userId: number) { + return prisma.notification.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } }); + } + async getUnreadCount(userId: number) { + return prisma.notification.count({ where: { userId, isRead: false } }); + } + async create(userId: number, message: string) { + return prisma.notification.create({ data: { userId, message } }); + } + async findByIds(notificationId: number, userId: number) { + return prisma.notification.findFirst({ + where: { id: notificationId, userId }, + }); + } + async updateRead(notificationId: number) { + return prisma.notification.update({ + where: { id: notificationId }, + data: { isRead: true }, + }); + } +} + +export const notificationRepo = new NotificationRepository(); diff --git a/mission9-10-11/src/repositories/productRepository.ts b/mission9-10-11/src/repositories/productRepository.ts new file mode 100644 index 000000000..a461c300b --- /dev/null +++ b/mission9-10-11/src/repositories/productRepository.ts @@ -0,0 +1,65 @@ +import { ProductLikesAndCount } from '../../types/product'; +import { prisma } from '../lib/prismaClient'; +import { Prisma } from '@prisma/client'; +import type { ProductRecentType } from '../../types/product'; + +class ProductRepository { + async create(data: Prisma.ProductCreateInput) { + return prisma.product.create({ data }); + } + async findById(id: number) { + return prisma.product.findUniqueOrThrow({ where: { id } }); + } + async findByIdWithLikes(id: number, userId?: number): Promise { + return prisma.product.findUniqueOrThrow({ + where: { id }, + include: { + _count: { select: { likes: true } }, + likes: { + where: { userId: userId ?? -1 }, + select: { id: true }, + }, + }, + }); + } + async update(id: number, data: Prisma.ProductUpdateInput) { + return prisma.product.update({ where: { id }, data }); + } + async delete(id: number) { + return prisma.product.delete({ where: { id } }); + } + async findProductListWithLikes(params: { + skip: number; + take: number; + orderBy: Prisma.ProductOrderByWithRelationInput; + where: Prisma.ProductWhereInput; + userId?: number; + }): Promise { + return prisma.product.findMany({ + skip: params.skip, + take: params.take, + orderBy: params.orderBy, + where: params.where, + include: { + _count: { select: { likes: true } }, + likes: { + where: { userId: params.userId ?? -1 }, + select: { id: true }, + }, + }, + }); + } + async count(where: Prisma.ProductWhereInput) { + return prisma.product.count({ where }); + } + async findRecentProduct(userId: number, limit: number, type: ProductRecentType) { + const whereCondition = type === 'myUploaded' ? { userId } : { likes: { some: { userId } } }; + return prisma.product.findMany({ + where: whereCondition, + orderBy: { createdAt: 'desc' }, + take: limit, + }); + } +} + +export const productRepo = new ProductRepository(); diff --git a/mission9-10-11/src/repositories/userRepository.ts b/mission9-10-11/src/repositories/userRepository.ts new file mode 100644 index 000000000..0f337d690 --- /dev/null +++ b/mission9-10-11/src/repositories/userRepository.ts @@ -0,0 +1,19 @@ +import { prisma } from '../lib/prismaClient'; +import { Prisma } from '@prisma/client'; + +class UserRepository { + async create(data: Prisma.UserCreateInput) { + return prisma.user.create({ data }); + } + async findByEmail(email: string) { + return prisma.user.findUnique({ where: { email } }); + } + async update(id: number, data: Prisma.UserUpdateInput) { + return prisma.user.update({ where: { id }, data }); + } + async findById(id: number) { + return prisma.user.findUnique({ where: { id } }); + } +} + +export const userRepo = new UserRepository(); diff --git a/mission9-10-11/src/routers/articlesRouter.ts b/mission9-10-11/src/routers/articlesRouter.ts new file mode 100644 index 000000000..1b4989b36 --- /dev/null +++ b/mission9-10-11/src/routers/articlesRouter.ts @@ -0,0 +1,28 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync'; +import { + createArticle, + getArticleList, + getArticle, + updateArticle, + deleteArticle, + createComment, + getCommentList, + likeArticle, + unlikeArticle, +} from '../controllers/articlesController'; +import authenticate from '../middlewares/authenticate'; + +const articlesRouter = express.Router(); + +articlesRouter.post('/', authenticate(), withAsync(createArticle)); +articlesRouter.get('/', authenticate({ optional: true }), withAsync(getArticleList)); +articlesRouter.get('/:id', authenticate({ optional: true }), withAsync(getArticle)); +articlesRouter.patch('/:id', authenticate(), withAsync(updateArticle)); +articlesRouter.delete('/:id', authenticate(), withAsync(deleteArticle)); +articlesRouter.post('/:id/comments', authenticate(), withAsync(createComment)); +articlesRouter.get('/:id/comments', withAsync(getCommentList)); +articlesRouter.post('/:id/like', authenticate(), withAsync(likeArticle)); +articlesRouter.delete('/:id/like', authenticate(), withAsync(unlikeArticle)); + +export default articlesRouter; diff --git a/mission9-10-11/src/routers/commentsRouter.ts b/mission9-10-11/src/routers/commentsRouter.ts new file mode 100644 index 000000000..f0da623c4 --- /dev/null +++ b/mission9-10-11/src/routers/commentsRouter.ts @@ -0,0 +1,11 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync'; +import { updateComment, deleteComment } from '../controllers/commentsController'; +import authenticate from '../middlewares/authenticate'; + +const commentsRouter = express.Router(); + +commentsRouter.patch('/:id', authenticate(), withAsync(updateComment)); +commentsRouter.delete('/:id', authenticate(), withAsync(deleteComment)); + +export default commentsRouter; diff --git a/mission9-10-11/src/routers/imagesRouter.ts b/mission9-10-11/src/routers/imagesRouter.ts new file mode 100644 index 000000000..5a848d5f7 --- /dev/null +++ b/mission9-10-11/src/routers/imagesRouter.ts @@ -0,0 +1,10 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync'; +import { uploadImage } from '../controllers/imagesController'; +import { upload } from '../middlewares/upload'; + +const imagesRouter = express.Router(); + +imagesRouter.post('/upload', upload.single('image'), withAsync(uploadImage)); + +export default imagesRouter; diff --git a/mission9-10-11/src/routers/notificationRouter.ts b/mission9-10-11/src/routers/notificationRouter.ts new file mode 100644 index 000000000..35209701a --- /dev/null +++ b/mission9-10-11/src/routers/notificationRouter.ts @@ -0,0 +1,16 @@ +import express from 'express'; +import authenticate from '../middlewares/authenticate'; +import { withAsync } from '../lib/withAsync'; +import { + getNotifications, + getUnreadCount, + markAsRead, +} from '../controllers/notificationController'; + +const notificationRouter = express.Router(); + +notificationRouter.get('/', authenticate(), withAsync(getNotifications)); +notificationRouter.get('/unread-count', authenticate(), withAsync(getUnreadCount)); +notificationRouter.patch('/:id/read', authenticate(), withAsync(markAsRead)); + +export default notificationRouter; diff --git a/mission9-10-11/src/routers/productsRouter.ts b/mission9-10-11/src/routers/productsRouter.ts new file mode 100644 index 000000000..f4907ccca --- /dev/null +++ b/mission9-10-11/src/routers/productsRouter.ts @@ -0,0 +1,31 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync'; +import { + createProduct, + getProduct, + updateProduct, + deleteProduct, + getProductList, + createComment, + getCommentList, + likeProduct, + unlikeProduct, +} from '../controllers/productsController'; +import authenticate from '../middlewares/authenticate'; +import { getMyLikedProducts, getMyProductList } from '../controllers/usersController'; + +const productsRouter = express.Router(); + +productsRouter.get('/me', authenticate(), withAsync(getMyProductList)); +productsRouter.get('/me/likes', authenticate(), withAsync(getMyLikedProducts)); +productsRouter.get('/', authenticate({ optional: true }), withAsync(getProductList)); +productsRouter.post('/', authenticate(), withAsync(createProduct)); +productsRouter.get('/:id', authenticate({ optional: true }), withAsync(getProduct)); +productsRouter.patch('/:id', authenticate(), withAsync(updateProduct)); +productsRouter.delete('/:id', authenticate(), withAsync(deleteProduct)); +productsRouter.post('/:id/comments', authenticate(), withAsync(createComment)); +productsRouter.get('/:id/comments', withAsync(getCommentList)); +productsRouter.post('/:id/like', authenticate(), withAsync(likeProduct)); +productsRouter.delete('/:id/like', authenticate(), withAsync(unlikeProduct)); + +export default productsRouter; diff --git a/mission9-10-11/src/routers/usersRouter.ts b/mission9-10-11/src/routers/usersRouter.ts new file mode 100644 index 000000000..1a4a28f8f --- /dev/null +++ b/mission9-10-11/src/routers/usersRouter.ts @@ -0,0 +1,24 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync'; +import { + register, + login, + logout, + getProfile, + patchPassword, + updateProfile, + refreshToken, +} from '../controllers/usersController'; +import authenticate from '../middlewares/authenticate'; + +const usersRouter = express.Router(); + +usersRouter.post('/register', withAsync(register)); +usersRouter.post('/login', withAsync(login)); +usersRouter.post('/logout', withAsync(logout)); +usersRouter.post('/refresh', withAsync(refreshToken)); +usersRouter.get('/me', authenticate(), withAsync(getProfile)); +usersRouter.patch('/me', authenticate(), withAsync(updateProfile)); +usersRouter.patch('/me/password', authenticate(), withAsync(patchPassword)); + +export default usersRouter; diff --git a/mission9-10-11/src/services/articleService.ts b/mission9-10-11/src/services/articleService.ts new file mode 100644 index 000000000..1c1e9c016 --- /dev/null +++ b/mission9-10-11/src/services/articleService.ts @@ -0,0 +1,140 @@ +import { articleRepo } from '../repositories/articleRepository'; +import { ArticleLikesAndCount, ArticleListResponse, ArticleResponse } from '../../types/article'; +import { AlreadyLikeError, AlreadyUnlikeError, ForbiddenError } from '../lib/errors/customErrors'; +import { commentRepo } from '../repositories/commentRepository'; +import { likeRepo } from '../repositories/likeRepository'; +import { Prisma, Article, Comment } from '@prisma/client'; +import type { CursorPaginated } from '../../types/cursorPaginated'; +import { notificationService } from './notificationService'; + +//객체로 주면 콘트롤러에서 인자순서 상관없이 적용되지만, ()형태로 반환하게되면 인자순서를 서비스형태와 동일하게 넣어야 함 +export class ArticleService { + async createArticle( + userId: number, + title: string, + content: string, + image?: string | null, + ): Promise
{ + return articleRepo.create({ + title, + content, + image, + user: { connect: { id: userId } }, + }); + } + async getArticle(articleId: number, userId?: number): Promise { + const article: ArticleLikesAndCount = await articleRepo.findByIdWithLikes(articleId, userId); + const { likes, _count, ...articleData } = article; + const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined; + return { ...articleData, likeCount: _count.likes, isLiked }; + } + async updateArticle( + articleId: number, + userId: number, + data: { title?: string; content?: string; image?: string | null }, + ): Promise
{ + const article = await articleRepo.findById(articleId); + if (article.userId !== userId) { + throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.'); + } + return articleRepo.update(articleId, data); + } + async deleteArticle(articleId: number, userId: number): Promise { + const article = await articleRepo.findById(articleId); + if (article.userId !== userId) { + throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.'); + } + await articleRepo.delete(articleId); + } + async getArticleList( + page: number, + pageSize: number, + orderBy?: 'recent' | 'desc' | 'asc', + keyword?: string, + userId?: number, + ): Promise { + const where = keyword + ? { + OR: [{ title: { contains: keyword } }, { content: { contains: keyword } }], + } + : {}; + const [totalCount, articles] = await Promise.all([ + articleRepo.count(where), + articleRepo.findArticleListWithLikes({ + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, + where, + userId, + }), + ]); + const list: ArticleResponse[] = articles.map((m) => { + const { _count, likes, ...basicArticleData } = m; + const response: ArticleResponse = { + ...basicArticleData, + likeCount: _count.likes, + }; + if (!userId) { + return response; + } + const isLiked = (likes ?? []).length > 0; + return { ...basicArticleData, isLiked, likeCount: _count.likes }; + }); + const response: ArticleListResponse = { + list, + totalCount, + }; + return response; + } + async createComment(userId: number, articleId: number, content: string): Promise { + await articleRepo.findById(articleId); + const comment = await commentRepo.create({ + content, + user: { connect: { id: userId } }, + article: { connect: { id: articleId } }, + }); + const article = await articleRepo.findById(articleId); + if (article.userId !== userId) { + await notificationService.createNotification( + article.userId, + `내 게시글 "${article.title}"에 새로운 댓글이 달렸습니다.`, + ); + } + return comment; + } + async getCommentList( + articleId: number, + limit: number, + cursor?: number, + ): Promise> { + await articleRepo.findById(articleId); + const commentsWithCursor = await commentRepo.findCommentListQuery({ articleId }, limit, cursor); + const comments = commentsWithCursor.slice(0, limit); + const cursorComment = commentsWithCursor[commentsWithCursor.length - 1]; + const nextCursor = cursorComment ? cursorComment.id : null; + return { list: comments, nextCursor }; + } + //like , unlike 둘다 message를 반환해버려서 이게..프로미스로 타입 설정하는 것이 의미가 있는지...로직 수정 생각해봐야할 듯 + async likeArticle(userId: number, articleId: number): Promise<{ message: string }> { + const article = await articleRepo.findById(articleId); + const existingLike = await likeRepo.findLike(userId, { articleId }); + if (existingLike) { + throw new AlreadyLikeError(); + } + await likeRepo.createLike(userId, { articleId }); + return { message: `${article.title}게시글에 좋아요를 눌렀습니다.` }; + } + async unlikeArticle(userId: number, articleId: number): Promise<{ message: string }> { + const article = await articleRepo.findById(articleId); + try { + await likeRepo.deleteLike(userId, { articleId }); + } catch (error: unknown) { + if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') { + throw new AlreadyUnlikeError(); + } + throw error; + } + return { message: `${article.title}게시글의 좋아요를 취소했습니다` }; + } +} +export const articleService = new ArticleService(); diff --git a/mission9-10-11/src/services/commentService.ts b/mission9-10-11/src/services/commentService.ts new file mode 100644 index 000000000..24581974f --- /dev/null +++ b/mission9-10-11/src/services/commentService.ts @@ -0,0 +1,22 @@ +import { commentRepo } from '../repositories/commentRepository'; +import { ForbiddenError } from '../lib/errors/customErrors'; +import { Comment } from '@prisma/client'; + +export class CommentService { + async updateComment(commentId: number, userId: number, content?: string): Promise { + const comment = await commentRepo.findById(commentId); + if (comment.userId !== userId) { + throw new ForbiddenError('해당 댓글을 수정할 권한이 없습니다.'); + } + return commentRepo.update(commentId, content); + } + async deleteComment(commentId: number, userId: number): Promise { + const comment = await commentRepo.findById(commentId); + if (comment.userId !== userId) { + throw new ForbiddenError('해당 댓글을 삭제할 권한이 없습니다.'); + } + await commentRepo.delete(commentId); + } +} + +export const commnetService = new CommentService(); diff --git a/mission9-10-11/src/services/imageService.ts b/mission9-10-11/src/services/imageService.ts new file mode 100644 index 000000000..1adab9d10 --- /dev/null +++ b/mission9-10-11/src/services/imageService.ts @@ -0,0 +1,82 @@ +import { uploadImageResponse } from '../../types/image'; +import { BadRequestError } from '../lib/errors/customErrors'; +import path from 'path'; +import { STATIC_PATH } from '../lib/constants'; +import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3'; +import type { MulterRequest } from '../../types/multer'; + +export class ImageService { + s3: S3Client | null; + constructor() { + if (process.env.UPLOAD_PROVIDER === 's3') { + this.s3 = new S3Client({ + region: process.env.AWS_REGION, + credentials: { + accessKeyId: process.env.AWS_ACCESS_KEY_ID ?? '', + secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY ?? '', + }, + }); + } else { + this.s3 = null; + } + } + + async buildImageUrl(req: MulterRequest): Promise { + if (process.env.UPLOAD_PROVIDER === 's3') { + return await this.buildImageUrlFromS3(req); + } + return this.buildImageUrlFromLocal(req); + } + + // 로컬 : static URL 생성 + buildImageUrlFromLocal(req: MulterRequest): uploadImageResponse { + const host = req.get('host'); + if (!host) { + throw new BadRequestError('요청 헤더에 host 정보가 없습니다.'); + } + + if (!req.file?.filename) { + throw new BadRequestError('업로드된 파일이 없습니다.'); + } + + const baseUrl = `${req.protocol}://${host}`; + const url = `${baseUrl}/${STATIC_PATH}/${req.file.filename}`; + return { url }; + } + + // 프로덕션 : 업로드하고 S3 URL 반환 + async buildImageUrlFromS3(req: MulterRequest): Promise { + if (!this.s3) { + throw new BadRequestError('S3 설정이 없습니다.'); + } + + const bucket = process.env.AWS_S3_BUCKET; + const region = process.env.AWS_REGION; + + if (!bucket || !region) { + throw new BadRequestError('S3 환경 변수가 없습니다.'); + } + + if (!req.file?.buffer || !req.file.originalname) { + throw new BadRequestError('S3 업로드용 파일이 없습니다.'); + } + + const ext = path.extname(req.file.originalname); + //s3에 uploads 폴더를 만들어서 그 안에 파일들이 들어가도록 설정 + const key = `uploads/${Date.now()}-${Math.random().toString(16).slice(2)}${ext}`; + + await this.s3.send( + new PutObjectCommand({ + Bucket: bucket, + Key: key, + Body: req.file.buffer, + ContentType: req.file.mimetype ?? 'application/octet-stream', + }), + ); + + const url = `https://${bucket}.s3.${region}.amazonaws.com/${key}`; + return { url }; + } +} + +export const imageService = new ImageService(); diff --git a/mission9-10-11/src/services/notificationService.ts b/mission9-10-11/src/services/notificationService.ts new file mode 100644 index 000000000..bff17da06 --- /dev/null +++ b/mission9-10-11/src/services/notificationService.ts @@ -0,0 +1,26 @@ +import { UnauthorizedError } from '../lib/errors/customErrors'; +import { notificationRepo } from '../repositories/notificationRepository'; +import { getIO } from '../socket'; +import type { Notification as PrismaNotification } from '@prisma/client'; + +export class NotificationService { + async getNotifications(userId: number): Promise { + return notificationRepo.getNotification(userId); + } + async getUnreadCount(userId: number): Promise { + return notificationRepo.getUnreadCount(userId); + } + async createNotification(userId: number, message: string): Promise { + const notification = await notificationRepo.create(userId, message); + const io = getIO(); + io.to(`user-${userId}`).emit('notification', notification); + return notification; + } + async markAsRead(notificationId: number, userId: number): Promise { + const notification = await notificationRepo.findByIds(notificationId, userId); + if (!notification) throw new UnauthorizedError(); + return notificationRepo.updateRead(notificationId); + } +} + +export const notificationService = new NotificationService(); diff --git a/mission9-10-11/src/services/productService.ts b/mission9-10-11/src/services/productService.ts new file mode 100644 index 000000000..922a43d57 --- /dev/null +++ b/mission9-10-11/src/services/productService.ts @@ -0,0 +1,177 @@ +import { ProductLikesAndCount } from '../../types/product'; +import { productRepo } from '../repositories/productRepository'; +import { Product } from '@prisma/client'; +import type { ProductListResponse, ProductResponse } from '../../types/product'; +import { ForbiddenError } from '../lib/errors/customErrors'; +import { commentRepo } from '../repositories/commentRepository'; +import type { Comment } from '@prisma/client'; +import type { CursorPaginated } from '../../types/cursorPaginated'; +import { AlreadyLikeError, AlreadyUnlikeError } from '../lib/errors/customErrors'; +import { likeRepo } from '../repositories/likeRepository'; +import { Prisma } from '@prisma/client'; +import { notificationService } from './notificationService'; + +//인자 순서가 옵셔널 다음 필수파라미터가 들어오면 컴파일에러가 발생함 +//객체로 묶어 보내기, 이러면 필수인 userid의 파라미터 순서를 바꾸지 않아도 됨 +export class ProductService { + async createProduct(params: { + name: string; + description: string; + price: number; + tags?: string[]; + images?: string[]; + userId: number; + }): Promise { + const { name, description, price, tags, images, userId } = params; + return productRepo.create({ + name, + description, + price, + tags: tags ?? [], + images: images ?? [], + user: { connect: { id: userId } }, + }); + } + async getProduct(productId: number, userId?: number): Promise { + const product: ProductLikesAndCount = await productRepo.findByIdWithLikes(productId, userId); + const { likes, _count, ...productData } = product; + const baseResponse = { ...productData, likeCount: _count.likes }; + if (!userId) { + return baseResponse; + } + const isLiked = (likes?.length ?? 0) > 0; + return { ...baseResponse, isLiked }; + } + async updateProduct( + productId: number, + userId: number, + data: { + name?: string; + description?: string; + price?: number; + tags?: string[]; + images?: string[]; + }, + ): Promise { + const product = await productRepo.findById(productId); + if (product.userId !== userId) { + throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.'); + } + const updateProduct = await productRepo.update(productId, data); + //undefined가 아니면서 기존가격과 다른 경우 + if (data.price !== undefined && product.price !== data.price) { + const likers = await likeRepo.getLikers({ productId }); + for (const liker of likers) { + if (liker.userId !== userId) { + await notificationService.createNotification( + liker.userId, + `관심 상품 "${product.name}"의 가격이 변동되었습니다.`, + ); + } + } + } + return updateProduct; + } + async deleteProduct(productId: number, userId: number): Promise { + const product = await productRepo.findById(productId); + if (product.userId !== userId) { + throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.'); + } + await productRepo.delete(productId); + } + async getProductList( + page: number, + pageSize: number, + orderBy?: 'recent' | 'desc' | 'asc', + keyword?: string, + userId?: number, + ): Promise { + const where = keyword + ? { + OR: [ + { name: { contains: keyword } }, + { description: { contains: keyword } }, + { tags: { has: keyword } }, + ], + } + : {}; + const [totalCount, products] = await Promise.all([ + productRepo.count(where), + productRepo.findProductListWithLikes({ + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, + where, + userId, + }), + ]); + const list: ProductResponse[] = products.map((m) => { + const { _count, likes, ...basicProductData } = m; + const response: ProductResponse = { + ...basicProductData, + likeCount: _count.likes, + }; + if (!userId) { + return response; + } + const isLiked = (likes ?? []).length > 0; + return { ...basicProductData, isLiked, likeCount: _count.likes }; + }); + const response: ProductListResponse = { + list, + totalCount, + }; + return response; + } + async createComment(userId: number, productId: number, content: string): Promise { + await productRepo.findById(productId); + const comment = await commentRepo.create({ + content, + user: { connect: { id: userId } }, + product: { connect: { id: productId } }, + }); + const product = await productRepo.findById(productId); + if (product.userId !== userId) { + await notificationService.createNotification( + product.userId, + `내 상품 "${product.name}"에 새로운 댓글이 달렸습니다.`, + ); + } + return comment; + } + async getCommentList( + productId: number, + limit: number, + cursor?: number, + ): Promise> { + await productRepo.findById(productId); + const commentsWithCursor = await commentRepo.findCommentListQuery({ productId }, limit, cursor); + const comments = commentsWithCursor.slice(0, limit); + const cursorComment = commentsWithCursor[commentsWithCursor.length - 1]; + const nextCursor = cursorComment ? cursorComment.id : null; + return { list: comments, nextCursor }; + } + async likeProduct(userId: number, productId: number): Promise<{ message: string }> { + const product = await productRepo.findById(productId); + const existingLike = await likeRepo.findLike(userId, { productId }); + if (existingLike) { + throw new AlreadyLikeError(); + } + await likeRepo.createLike(userId, { productId }); + return { message: `${product.name}상품에 좋아요를 눌렀습니다.` }; + } + async unlikeProduct(userId: number, productId: number): Promise<{ message: string }> { + const product = await productRepo.findById(productId); + try { + await likeRepo.deleteLike(userId, { productId }); + } catch (error: unknown) { + if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') { + throw new AlreadyUnlikeError(); + } + throw error; + } + return { message: `${product.name}상품의 좋아요를 취소했습니다` }; + } +} + +export const productService = new ProductService(); diff --git a/mission9-10-11/src/services/userService.ts b/mission9-10-11/src/services/userService.ts new file mode 100644 index 000000000..850dad53b --- /dev/null +++ b/mission9-10-11/src/services/userService.ts @@ -0,0 +1,212 @@ +import bcrypt from 'bcrypt'; +import { userRepo } from '../repositories/userRepository'; +import type { Prisma, User } from '@prisma/client'; +import { ForbiddenError, UnauthorizedError } from '../lib/errors/customErrors'; +import { generateToken, verifyRefreshToken } from '../lib/token'; +import { productRepo } from '../repositories/productRepository'; +import type { ProductListResponse } from '../../types/product'; +import { ProfileResponse } from '../../types/user'; + +class UserService { + async register( + nickname: string, + email: string, + password: string, + image?: string, + ): Promise> { + const salt = await bcrypt.genSalt(10); + const hashedPassword = await bcrypt.hash(password, salt); + const user = await userRepo.create({ + nickname, + email, + password: hashedPassword, + image, + }); + const { password: _, ...userWithoutPassword } = user; + return userWithoutPassword; + } + async login( + email: string, + password: string, + ): Promise<{ tokens: { accessToken: string; refreshToken: string }; message: string }> { + const user = await userRepo.findByEmail(email); + if (!user) { + //이메일, 비밀번호 검증에 대한 에러를 같은 메세지로 던짐으로써 좀 더 방어적으로 설계 + throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.'); + } + const isPasswordValid = await bcrypt.compare(password, user.password); + if (!isPasswordValid) { + throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.'); + } + const tokens = generateToken(user.id); + return { tokens, message: '로그인에 성공했습니다.' }; + } + async getProfile(myId: number): Promise { + const user = await userRepo.findById(myId); + if (!user) throw new UnauthorizedError('사용자를 찾을 수 없습니다.'); + const { password: _, ...userInfo } = user; + const [myProductCount, myLikeProductCount, recentProductsRaw, recentLikedProductsRaw] = + await Promise.all([ + productRepo.count({ userId: myId }), + productRepo.count({ likes: { some: { userId: myId } } }), + productRepo.findProductListWithLikes({ + skip: 0, + take: 5, + orderBy: { createdAt: 'desc' }, + where: { userId: myId }, + userId: myId, + }), + productRepo.findProductListWithLikes({ + skip: 0, + take: 5, + orderBy: { createdAt: 'desc' }, + where: { likes: { some: { userId: myId } } }, + userId: myId, + }), + ]); + const myRecentProducts = recentProductsRaw.map((m) => { + const { _count, likes, ...rest } = m; + return { + ...rest, + likeCount: _count.likes, + isLiked: (likes?.length ?? 0) > 0, + }; + }); + const myRecentLikeProducts = recentLikedProductsRaw.map((m) => { + const { _count, likes, ...rest } = m; + return { + ...rest, + likeCount: _count.likes, + isLiked: (likes?.length ?? 0) > 0, + }; + }); + return { + user: userInfo, + myProducts: { + list: myRecentProducts, + totalCount: myProductCount, + }, + myLikedProducts: { + list: myRecentLikeProducts, + totalCount: myLikeProductCount, + }, + }; + } + + async updateProfile( + userId: number, + nickname?: string, + email?: string, + image?: string | null, + ): Promise> { + const data: Prisma.UserUpdateInput = {}; + if (nickname !== undefined) data.nickname = nickname; + if (email !== undefined) data.email = email; + if (image !== undefined) data.image = image; + const update = await userRepo.update(userId, data); + const { password: _, ...userWithoutPassword } = update; + return userWithoutPassword; + } + async patchPassword(userId: number, currentPassword: string, newPassword: string): Promise { + const user = await userRepo.findById(userId); + if (!user) { + throw new UnauthorizedError('사용자를 찾을 수 없습니다.'); + } + const isPasswordValid = await bcrypt.compare(currentPassword, user.password); + if (!isPasswordValid) { + throw new ForbiddenError('현재 비밀번호가 올바르지 않습니다.'); + } + const salt = await bcrypt.genSalt(10); + const hashedNewPassword = await bcrypt.hash(newPassword, salt); + await userRepo.update(userId, { password: hashedNewPassword }); + } + async getMyProductList( + myId: number, + page: number, + pageSize: number, + orderBy?: 'recent' | 'desc' | 'asc', + keyword?: string, + ): Promise { + const where = { + userId: myId, + ...(keyword + ? { + OR: [ + { name: { contains: keyword } }, + { description: { contains: keyword } }, + { tags: { has: keyword } }, + ], + } + : {}), + }; + const [totalCount, productsRaw] = await Promise.all([ + productRepo.count(where), + productRepo.findProductListWithLikes({ + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, + where, + userId: myId, + }), + ]); + const list = productsRaw.map((m) => { + const { _count, likes, ...rest } = m; + return { + ...rest, + likeCount: _count.likes, + isLiked: (likes?.length ?? 0) > 0, + }; + }); + return { list, totalCount }; + } + async refreshToken(refreshToken: string) { + let userId: number; + try { + const payload = verifyRefreshToken(refreshToken); + userId = payload.userId; + } catch (error) { + throw new UnauthorizedError('유효하지 않은 리프레시 토큰입니다.'); + } + const user = await userRepo.findById(userId); + if (!user) { + throw new UnauthorizedError('존재하지 않는 사용자입니다.'); + } + const tokens = generateToken(user.id); + return tokens; + } + async getMyLikedProducts( + myId: number, + page: number, + pageSize: number, + orderBy?: 'recent' | 'desc' | 'asc', + ): Promise { + const where = { + likes: { + some: { + userId: myId, + }, + }, + }; + const [totalCount, productsRaw] = await Promise.all([ + productRepo.count(where), + productRepo.findProductListWithLikes({ + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, + where, + userId: myId, + }), + ]); + const list = productsRaw.map((m) => { + const { _count, likes, ...rest } = m; + return { + ...rest, + likeCount: _count.likes, + isLiked: (likes?.length ?? 0) > 0, + }; + }); + return { list, totalCount }; + } +} + +export const userService = new UserService(); diff --git a/mission9-10-11/src/socket.ts b/mission9-10-11/src/socket.ts new file mode 100644 index 000000000..cc35975ce --- /dev/null +++ b/mission9-10-11/src/socket.ts @@ -0,0 +1,43 @@ +import { Server as SocketIOServer } from 'socket.io'; +import { Server as HttpServer } from 'http'; +import { verifyAccessToken } from './lib/token'; +import { UnauthorizedError } from './lib/errors/customErrors'; + +let io: SocketIOServer | null = null; + +export const initSocket = (Server: HttpServer) => { + io = new SocketIOServer(Server, { + cors: { + origin: '*', + methods: ['GET', 'POST'], + }, + }); + + io.use((socket, next) => { + try { + const token = socket.handshake.auth.accessToken; + if (!token) return next(new UnauthorizedError()); + const { userId } = verifyAccessToken(token); + if (!userId) return next(new UnauthorizedError()); + socket.data.userId = userId; + next(); + } catch (e) { + next(new UnauthorizedError()); + } + }); + + io.on('connection', (socket) => { + const userId = socket.data.userId; + console.log('User connected', socket.id); + socket.join(`user-${userId}`); + console.log(`User ${userId} joined room user-${userId}`); + }); + return io; +}; + +export const getIO = () => { + if (!io) { + throw new Error('Socket.IO 서버가 초기화되지 않았습니다.'); + } + return io; +}; diff --git a/mission9-10-11/src/structs/articlesStructs.ts b/mission9-10-11/src/structs/articlesStructs.ts new file mode 100644 index 000000000..3d25131b5 --- /dev/null +++ b/mission9-10-11/src/structs/articlesStructs.ts @@ -0,0 +1,12 @@ +import { coerce, nonempty, nullable, object, partial, string } from 'superstruct'; +import { PageParamsStruct } from './commonStructs'; + +export const GetArticleListParamsStruct = PageParamsStruct; + +export const CreateArticleBodyStruct = object({ + title: coerce(nonempty(string()), string(), (value) => value.trim()), + content: nonempty(string()), + image: nullable(string()), +}); + +export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct); diff --git a/mission9-10-11/src/structs/commentsStruct.ts b/mission9-10-11/src/structs/commentsStruct.ts new file mode 100644 index 000000000..dce57521b --- /dev/null +++ b/mission9-10-11/src/structs/commentsStruct.ts @@ -0,0 +1,10 @@ +import { nonempty, object, partial, string } from 'superstruct'; +import { CursorParamsStruct } from './commonStructs'; + +export const CreateCommentBodyStruct = object({ + content: nonempty(string()), +}); + +export const GetCommentListParamsStruct = CursorParamsStruct; + +export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct); diff --git a/mission9-10-11/src/structs/commonStructs.ts b/mission9-10-11/src/structs/commonStructs.ts new file mode 100644 index 000000000..00f563f2b --- /dev/null +++ b/mission9-10-11/src/structs/commonStructs.ts @@ -0,0 +1,21 @@ +import { coerce, integer, object, string, defaulted, optional, enums, nonempty } from 'superstruct'; + +const integerString = coerce(integer(), string(), (value) => parseInt(value)); + +export const IdParamsStruct = object({ + id: integerString, +}); + +export const PageParamsStruct = object({ + page: defaulted(integerString, 1), + pageSize: defaulted(integerString, 10), + orderBy: optional(enums(['recent'])), + keyword: optional(nonempty(string())), +}); + +export const CursorParamsStruct = object({ + cursor: defaulted(integerString, 0), + limit: defaulted(integerString, 10), + orderBy: optional(enums(['recent'])), + keyword: optional(nonempty(string())), +}); diff --git a/mission9-10-11/src/structs/productsStruct.ts b/mission9-10-11/src/structs/productsStruct.ts new file mode 100644 index 000000000..6c3f9781e --- /dev/null +++ b/mission9-10-11/src/structs/productsStruct.ts @@ -0,0 +1,26 @@ +import { + coerce, + partial, + object, + string, + min, + nonempty, + array, + integer, + optional, +} from 'superstruct'; +import { PageParamsStruct } from './commonStructs'; + +export const CreateProductBodyStruct = object({ + name: coerce(nonempty(string()), string(), (value) => value.trim()), + description: nonempty(string()), + price: min(integer(), 0), + tags: optional(array(string())), + images: optional(array(string())), +}); + +export const GetProductListParamsStruct = PageParamsStruct; + +export const UpdateProductBodyStruct = partial(CreateProductBodyStruct); + +export const LikeProductParamsStruct = PageParamsStruct; diff --git a/mission9-10-11/src/structs/usersStructs.ts b/mission9-10-11/src/structs/usersStructs.ts new file mode 100644 index 000000000..10740ff77 --- /dev/null +++ b/mission9-10-11/src/structs/usersStructs.ts @@ -0,0 +1,48 @@ +import * as s from 'superstruct'; +import { PageParamsStruct } from './commonStructs'; + +const CoercedNumber = s.coerce(s.number(), s.union([s.string(), s.number()]), (value) => + Number(value), +); +const Integer = s.refine(CoercedNumber, 'Integer', (value) => Number.isInteger(value) && value > 0); + +export const userIdStruct = s.object({ + userId: Integer, +}); +//이메일: 기본적인 이메일 형식 체크, 닉네임: 영어 + 숫자 + 한글, 2~10글자, 비밀번호: 8~16글자 +const email = s.refine(s.string(), 'Email', (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)); +const nickname = s.refine(s.string(), 'Nickname', (value) => + /^[A-Za-z0-9가-힣]{2,10}$/.test(value), +); +const password = s.refine( + s.string(), + 'Password', + (value) => value.length >= 8 && value.length <= 16, +); + +export const CreateUserBodyStruct = s.object({ + nickname: nickname, + email: email, + password: password, + image: s.optional(s.string()), +}); + +export const UpdateUserBodyStruct = s.partial(CreateUserBodyStruct); + +export const LoginBodyStruct = s.object({ + email: email, + password: password, +}); + +export const ChangePasswordBodyStruct = s.object({ + currentPassword: password, + newPassword: password, +}); + +export const RefreshTokenBodyStruct = s.object({ + refreshToken: s.string(), +}); + +export const GetMyProductListParamsStruct = PageParamsStruct; + +export const GetMyLikedProductListParamsStruct = PageParamsStruct; diff --git a/mission9-10-11/tests/articles.auth.test.ts b/mission9-10-11/tests/articles.auth.test.ts new file mode 100644 index 000000000..f2df46476 --- /dev/null +++ b/mission9-10-11/tests/articles.auth.test.ts @@ -0,0 +1,170 @@ +import request from 'supertest'; +import app from '../src/app'; +import { prisma } from '../src/lib/prismaClient'; +import { cleanDb, disconnectDb } from './utils/cleanDb'; + +jest.mock('uuid', () => ({ + v4: () => 'test-uuid', +})); + +async function registerAndLogin(email: string, nickname: string) { + const agent = request.agent(app); + await agent.post('/users/register').send({ + email, + nickname, + password: 'password1', + }); + await agent.post('/users/login').send({ + email, + password: 'password1', + }); + return agent; +} + +describe('인증이 필요한 게시글 API 통합 테스트', () => { + beforeAll(async () => { + await cleanDb(); + }); + + beforeEach(async () => { + await prisma.like.deleteMany(); + await prisma.comment.deleteMany(); + await prisma.article.deleteMany(); + await prisma.user.deleteMany(); + }); + + afterAll(async () => { + await cleanDb(); + await disconnectDb(); + }); + + describe('POST /articles', () => { + test('로그인 없이 요청하면 401을 반환한다', async () => { + const res = await request(app).post('/articles').send({ + title: 'NoAuth', + content: 'x', + image: null, + }); + expect(res.status).toBe(401); + }); + + test('로그인 상태면 201과 게시글 정보를 반환한다', async () => { + const agent = await registerAndLogin('owner-a@example.com', 'ownerA'); + const res = await agent.post('/articles').send({ + title: 'MyArticle', + content: 'content', + image: null, + }); + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body).toHaveProperty('title', 'MyArticle'); + }); + }); + + describe('PATCH /articles/:id', () => { + test('본인 게시글이면 수정된다', async () => { + const agent = await registerAndLogin('owner-b@example.com', 'ownerB'); + const article = await prisma.article.create({ + data: { + title: 'Old', + content: 'old', + image: null, + user: { connect: { email: 'owner-b@example.com' } }, + }, + }); + const res = await agent.patch(`/articles/${article.id}`).send({ title: 'New' }); + expect(res.status).toBe(200); + expect(res.body.title).toBe('New'); + }); + + test('다른 사람 게시글이면 403을 반환한다', async () => { + await prisma.user.create({ + data: { email: 'owner-c@example.com', nickname: 'ownerC', password: 'pw' }, + }); + const article = await prisma.article.create({ + data: { + title: 'Other', + content: 'x', + image: null, + user: { connect: { email: 'owner-c@example.com' } }, + }, + }); + const agent = await registerAndLogin('user-a@example.com', 'userA'); + const res = await agent.patch(`/articles/${article.id}`).send({ title: 'Nope' }); + expect(res.status).toBe(403); + }); + }); + + describe('DELETE /articles/:id', () => { + test('본인 게시글이면 삭제된다', async () => { + const agent = await registerAndLogin('owner-d@example.com', 'ownerD'); + const article = await prisma.article.create({ + data: { + title: 'DeleteMe', + content: 'x', + image: null, + user: { connect: { email: 'owner-d@example.com' } }, + }, + }); + const res = await agent.delete(`/articles/${article.id}`); + expect(res.status).toBe(204); + }); + + test('다른 사람 게시글이면 403을 반환한다', async () => { + await prisma.user.create({ + data: { email: 'owner-e@example.com', nickname: 'ownerE', password: 'pw' }, + }); + const article = await prisma.article.create({ + data: { + title: 'Other', + content: 'x', + image: null, + user: { connect: { email: 'owner-e@example.com' } }, + }, + }); + const agent = await registerAndLogin('user-b@example.com', 'userB'); + const res = await agent.delete(`/articles/${article.id}`); + expect(res.status).toBe(403); + }); + }); + + describe('POST /articles/:id/comments', () => { + test('로그인 상태면 댓글이 등록된다', async () => { + const agent = await registerAndLogin('owner-f@example.com', 'ownerF'); + const article = await prisma.article.create({ + data: { + title: 'WithComment', + content: 'x', + image: null, + user: { connect: { email: 'owner-f@example.com' } }, + }, + }); + + const res = await agent.post(`/articles/${article.id}/comments`).send({ content: 'hello' }); + + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body).toHaveProperty('content', 'hello'); + }); + }); + + describe('POST/DELETE /articles/:id/like', () => { + test('좋아요 등록/취소가 동작한다', async () => { + const agent = await registerAndLogin('owner-g@example.com', 'ownerG'); + const article = await prisma.article.create({ + data: { + title: 'LikeMe', + content: 'x', + image: null, + user: { connect: { email: 'owner-g@example.com' } }, + }, + }); + + const likeRes = await agent.post(`/articles/${article.id}/like`); + expect(likeRes.status).toBe(200); + + const unlikeRes = await agent.delete(`/articles/${article.id}/like`); + expect(unlikeRes.status).toBe(200); + }); + }); +}); diff --git a/mission9-10-11/tests/articles.public.test.ts b/mission9-10-11/tests/articles.public.test.ts new file mode 100644 index 000000000..4c8b3582b --- /dev/null +++ b/mission9-10-11/tests/articles.public.test.ts @@ -0,0 +1,188 @@ +import request from 'supertest'; +import app from '../src/app'; +import { prisma } from '../src/lib/prismaClient'; +import { createSeedUser } from './utils/createUser'; +import { cleanDb, disconnectDb } from './utils/cleanDb'; + +jest.mock('uuid', () => ({ + v4: () => 'test-uuid', +})); + +describe('인증이 필요하지 않은 게시글 API 통합 테스트', () => { + let ownerId: number; + + beforeAll(async () => { + await cleanDb(); + const owner = await createSeedUser(); + ownerId = owner.id; + }); + + beforeEach(async () => { + await prisma.like.deleteMany(); + await prisma.comment.deleteMany(); + await prisma.article.deleteMany(); + }); + + afterAll(async () => { + await cleanDb(); + await disconnectDb(); + }); + + describe('GET /articles (공개 조회)', () => { + it('게시글이 없으면 { list: [], totalCount: 0 }을 반환한다', async () => { + const res = await request(app).get('/articles'); + + expect(res.status).toBe(200); + expect(res.body).toEqual({ list: [], totalCount: 0 }); + }); + + it('여러 개의 게시글이 있으면 list/totalCount를 올바르게 반환한다', async () => { + await prisma.article.createMany({ + data: [ + { title: '글1', content: '내용1', image: null, userId: ownerId }, + { title: '글2', content: '내용2', image: null, userId: ownerId }, + ], + }); + + const res = await request(app) + .get('/articles') + .query({ page: 1, pageSize: 10, orderBy: 'recent' }); + + expect(res.status).toBe(200); + expect(res.body.totalCount).toBe(2); + expect(res.body.list).toHaveLength(2); + expect(res.body.list).toEqual( + expect.arrayContaining([ + expect.objectContaining({ title: '글1', content: '내용1' }), + expect.objectContaining({ title: '글2', content: '내용2' }), + ]), + ); + }); + + it('page/pageSize로 페이징이 된다', async () => { + await prisma.article.createMany({ + data: [ + { title: 'A1', content: 'C1', image: null, userId: ownerId }, + { title: 'A2', content: 'C2', image: null, userId: ownerId }, + { title: 'A3', content: 'C3', image: null, userId: ownerId }, + { title: 'A4', content: 'C4', image: null, userId: ownerId }, + { title: 'A5', content: 'C5', image: null, userId: ownerId }, + ], + }); + + const res1 = await request(app) + .get('/articles') + .query({ page: 1, pageSize: 2, orderBy: 'recent' }); + expect(res1.status).toBe(200); + expect(res1.body.totalCount).toBe(5); + expect(res1.body.list).toHaveLength(2); + + const res2 = await request(app) + .get('/articles') + .query({ page: 2, pageSize: 2, orderBy: 'recent' }); + expect(res2.status).toBe(200); + expect(res2.body.totalCount).toBe(5); + expect(res2.body.list).toHaveLength(2); + + // 실제로 다른 페이지인지 확인 + expect(res1.body.list[0].id).not.toBe(res2.body.list[0].id); + }); + + it("orderBy='asc' 같은 값은 허용되지 않아 400을 반환한다(Struct 기준)", async () => { + const res = await request(app) + .get('/articles') + .query({ page: 1, pageSize: 10, orderBy: 'asc' }); + + expect(res.status).toBe(400); + }); + + it('keyword 검색은 title/content에 매칭되면 포함된다', async () => { + await prisma.article.createMany({ + data: [ + { title: 'Apple Story', content: 'fresh', image: null, userId: ownerId }, + { title: 'Banana', content: 'yellowDescOnly', image: null, userId: ownerId }, + { title: 'Car', content: 'vehicle', image: null, userId: ownerId }, + ], + }); + + const r1 = await request(app) + .get('/articles') + .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'Apple' }); + expect(r1.status).toBe(200); + expect(r1.body.totalCount).toBe(1); + expect(r1.body.list[0].title).toContain('Apple'); + + const r2 = await request(app) + .get('/articles') + .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'yellowDescOnly' }); + expect(r2.status).toBe(200); + expect(r2.body.totalCount).toBe(1); + expect(r2.body.list[0].title).toBe('Banana'); + }); + + it('잘못된 쿼리(page가 숫자가 아님)는 400(또는 스펙 코드)을 반환한다', async () => { + const res = await request(app).get('/articles').query({ page: 'abc', pageSize: 10 }); + expect([400, 422]).toContain(res.status); + }); + }); + + describe('GET /articles/:id (공개 상세 조회)', () => { + it('ID로 게시글 상세를 반환한다', async () => { + const article = await prisma.article.create({ + data: { title: 'Detail', content: 'Detail content', image: null, userId: ownerId }, + }); + + const res = await request(app).get(`/articles/${article.id}`); + + expect(res.status).toBe(200); + expect(res.body.title).toBe('Detail'); + expect(res.body.content).toBe('Detail content'); + }); + + it('존재하지 않는 id면 404(또는 400)를 반환한다', async () => { + const res = await request(app).get('/articles/999999999'); + expect([404, 400]).toContain(res.status); + }); + }); + + describe('GET /articles/:id/comments (공개 댓글 목록 조회)', () => { + it('댓글이 없으면 빈 목록을 반환한다', async () => { + const article = await prisma.article.create({ + data: { title: 'A', content: 'C', image: null, userId: ownerId }, + }); + + const res = await request(app) + .get(`/articles/${article.id}/comments`) + .query({ cursor: 0, limit: 10 }); + + expect(res.status).toBe(200); + expect(res.body).toEqual({ list: [], nextCursor: null }); + }); + + it('cursor/limit로 페이지네이션이 된다(구현되어 있다면)', async () => { + const article = await prisma.article.create({ + data: { title: 'A', content: 'C', image: null, userId: ownerId }, + }); + + const commenter = await prisma.user.create({ + data: { email: `c+${Date.now()}@ex.com`, nickname: `c_${Date.now()}`, password: 'pw' }, + }); + + await prisma.comment.createMany({ + data: [ + { content: 'c1', articleId: article.id, userId: commenter.id }, + { content: 'c2', articleId: article.id, userId: commenter.id }, + { content: 'c3', articleId: article.id, userId: commenter.id }, + ], + }); + + const res = await request(app) + .get(`/articles/${article.id}/comments`) + .query({ cursor: 0, limit: 2 }); + + expect(res.status).toBe(200); + expect(res.body.list).toHaveLength(2); + expect(res.body.nextCursor).toBeTruthy(); + }); + }); +}); diff --git a/mission9-10-11/tests/auth.test.ts b/mission9-10-11/tests/auth.test.ts new file mode 100644 index 000000000..acc5bd9f3 --- /dev/null +++ b/mission9-10-11/tests/auth.test.ts @@ -0,0 +1,103 @@ +import request from 'supertest'; +import app from '../src/app'; +import { prisma } from '../src/lib/prismaClient'; +import { cleanDb, disconnectDb } from './utils/cleanDb'; + +jest.mock('uuid', () => ({ + v4: () => 'test-uuid', +})); + +describe('인증 API 통합 테스트 (회원가입/로그인)', () => { + beforeAll(async () => { + await cleanDb(); + }); + + beforeEach(async () => { + await prisma.user.deleteMany(); + }); + + afterAll(async () => { + await cleanDb(); + await disconnectDb(); + }); + + describe('POST /users/register', () => { + test('정상 입력이면 201과 사용자 정보를 반환한다', async () => { + const res = await request(app).post('/users/register').send({ + email: 'newuser@example.com', + nickname: 'user01', + password: 'password1', + image: 'https://example.com/profile.png', + }); + + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body).toHaveProperty('email', 'newuser@example.com'); + expect(res.body).toHaveProperty('nickname', 'user01'); + expect(res.body).not.toHaveProperty('password'); + }); + + test('이메일 형식이 틀리면 400을 반환한다', async () => { + const res = await request(app).post('/users/register').send({ + email: 'invalid-email', + nickname: 'user01', + password: 'password1', + }); + + expect(res.status).toBe(400); + }); + + test('중복 이메일이면 400을 반환한다', async () => { + await request(app).post('/users/register').send({ + email: 'dup@example.com', + nickname: 'user01', + password: 'password1', + }); + + const res = await request(app).post('/users/register').send({ + email: 'dup@example.com', + nickname: 'user02', + password: 'password1', + }); + + expect(res.status).toBe(400); + }); + }); + + describe('POST /users/login', () => { + test('올바른 이메일/비밀번호면 200과 쿠키를 반환한다', async () => { + await request(app).post('/users/register').send({ + email: 'login@example.com', + nickname: 'login01', + password: 'password1', + }); + + const res = await request(app).post('/users/login').send({ + email: 'login@example.com', + password: 'password1', + }); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('message'); + const setCookie = res.headers['set-cookie'] ?? []; + const cookieHeader = Array.isArray(setCookie) ? setCookie.join(';') : setCookie; + expect(cookieHeader).toContain('access-token='); + expect(cookieHeader).toContain('refresh-token='); + }); + + test('잘못된 비밀번호면 401을 반환한다', async () => { + await request(app).post('/users/register').send({ + email: 'wrongpw@example.com', + nickname: 'wrongpw', + password: 'password1', + }); + + const res = await request(app).post('/users/login').send({ + email: 'wrongpw@example.com', + password: 'password2', + }); + + expect(res.status).toBe(401); + }); + }); +}); diff --git a/mission9-10-11/tests/product.service.unit.test.ts b/mission9-10-11/tests/product.service.unit.test.ts new file mode 100644 index 000000000..57aacc178 --- /dev/null +++ b/mission9-10-11/tests/product.service.unit.test.ts @@ -0,0 +1,175 @@ +import { productService } from '../src/services/productService'; +import { productRepo } from '../src/repositories/productRepository'; +import { likeRepo } from '../src/repositories/likeRepository'; +import { commentRepo } from '../src/repositories/commentRepository'; +import { notificationService } from '../src/services/notificationService'; + +jest.mock('../src/repositories/productRepository', () => ({ + productRepo: { + create: jest.fn(), + findById: jest.fn(), + findByIdWithLikes: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + findProductListWithLikes: jest.fn(), + count: jest.fn(), + }, +})); + +jest.mock('../src/repositories/likeRepository', () => ({ + likeRepo: { + findLike: jest.fn(), + createLike: jest.fn(), + deleteLike: jest.fn(), + getLikers: jest.fn(), + }, +})); + +jest.mock('../src/repositories/commentRepository', () => ({ + commentRepo: { + create: jest.fn(), + findCommentListQuery: jest.fn(), + }, +})); + +jest.mock('../src/services/notificationService', () => ({ + notificationService: { + createNotification: jest.fn(), + }, +})); + +const mockedProductRepo = productRepo as jest.Mocked; +const mockedLikeRepo = likeRepo as jest.Mocked; +const mockedCommentRepo = commentRepo as jest.Mocked; +const mockedNotificationService = notificationService as jest.Mocked; + +describe('ProductService (unit)', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('createProduct: tags/images가 없으면 빈 배열로 저장한다', async () => { + mockedProductRepo.create.mockResolvedValueOnce({ + id: 1, + name: 'P', + description: 'D', + price: 100, + tags: [], + images: [], + userId: 1, + } as any); + + await productService.createProduct({ + name: 'P', + description: 'D', + price: 100, + userId: 1, + }); + + expect(mockedProductRepo.create).toHaveBeenCalledWith({ + name: 'P', + description: 'D', + price: 100, + tags: [], + images: [], + user: { connect: { id: 1 } }, + }); + }); + + test('getProduct: 비로그인은 isLiked 키가 내려오지 않는다', async () => { + mockedProductRepo.findByIdWithLikes.mockResolvedValueOnce({ + id: 1, + name: 'P', + description: 'D', + price: 100, + tags: [], + images: [], + userId: 1, + likes: [], + _count: { likes: 0 }, + } as any); + + const res = await productService.getProduct(1); + + expect(res.likeCount).toBe(0); + expect(res).not.toHaveProperty('isLiked'); + }); + + test('updateProduct: 가격 변경 시 좋아요 누른 유저에게 알림을 보낸다', async () => { + mockedProductRepo.findById.mockResolvedValueOnce({ + id: 1, + name: 'P', + description: 'D', + price: 100, + tags: [], + images: [], + userId: 1, + } as any); + mockedProductRepo.update.mockResolvedValueOnce({ + id: 1, + name: 'P', + description: 'D', + price: 200, + tags: [], + images: [], + userId: 1, + } as any); + mockedLikeRepo.getLikers.mockResolvedValueOnce([{ userId: 2 }, { userId: 1 }]); + + await productService.updateProduct(1, 1, { price: 200 }); + + expect(mockedNotificationService.createNotification).toHaveBeenCalledTimes(1); + expect(mockedNotificationService.createNotification).toHaveBeenCalledWith( + 2, + '관심 상품 "P"의 가격이 변동되었습니다.', + ); + }); + + test('getProductList: 로그인 유저는 isLiked를 포함한다', async () => { + mockedProductRepo.count.mockResolvedValueOnce(1); + mockedProductRepo.findProductListWithLikes.mockResolvedValueOnce([ + { + id: 1, + name: 'P', + description: 'D', + price: 100, + tags: [], + images: [], + userId: 1, + likes: [{ id: 99 }], + _count: { likes: 1 }, + }, + ] as any); + + const res = await productService.getProductList(1, 10, 'recent', undefined, 1); + + expect(res.totalCount).toBe(1); + expect(res.list[0].isLiked).toBe(true); + expect(res.list[0].likeCount).toBe(1); + }); + + test('createComment: 댓글이 등록된다', async () => { + mockedProductRepo.findById.mockResolvedValue({ + id: 1, + name: 'P', + description: 'D', + price: 100, + tags: [], + images: [], + userId: 1, + } as any); + mockedCommentRepo.create.mockResolvedValueOnce({ + id: 10, + content: 'c1', + } as any); + + const res = await productService.createComment(1, 1, 'c1'); + + expect(res).toHaveProperty('id', 10); + expect(mockedCommentRepo.create).toHaveBeenCalledWith({ + content: 'c1', + user: { connect: { id: 1 } }, + product: { connect: { id: 1 } }, + }); + }); +}); diff --git a/mission9-10-11/tests/products.auth.test.ts b/mission9-10-11/tests/products.auth.test.ts new file mode 100644 index 000000000..c80535280 --- /dev/null +++ b/mission9-10-11/tests/products.auth.test.ts @@ -0,0 +1,254 @@ +import request from 'supertest'; +import app from '../src/app'; +import { prisma } from '../src/lib/prismaClient'; +import { cleanDb, disconnectDb } from './utils/cleanDb'; + +jest.mock('uuid', () => ({ + v4: () => 'test-uuid', +})); + +async function registerAndLogin(email: string, nickname: string) { + const agent = request.agent(app); + await agent.post('/users/register').send({ + email, + nickname, + password: 'password1', + }); + await agent.post('/users/login').send({ + email, + password: 'password1', + }); + return agent; +} + +describe('인증이 필요한 상품 API 통합 테스트', () => { + beforeAll(async () => { + await cleanDb(); + }); + + beforeEach(async () => { + await prisma.like.deleteMany(); + await prisma.comment.deleteMany(); + await prisma.product.deleteMany(); + await prisma.user.deleteMany(); + }); + + afterAll(async () => { + await cleanDb(); + await disconnectDb(); + }); + + describe('POST /products', () => { + test('로그인 없이 요청하면 401을 반환한다', async () => { + const res = await request(app).post('/products').send({ + name: 'NoAuth', + description: 'x', + price: 100, + tags: [], + images: [], + }); + expect(res.status).toBe(401); + }); + + test('로그인 상태면 201과 상품 정보를 반환한다', async () => { + const agent = await registerAndLogin('owner@example.com', 'owner01'); + const res = await agent.post('/products').send({ + name: 'MyProduct', + description: 'desc', + price: 1000, + tags: ['t1'], + images: ['i1'], + }); + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body).toHaveProperty('name', 'MyProduct'); + }); + }); + + describe('PATCH /products/:id', () => { + test('본인 상품이면 수정된다', async () => { + const agent = await registerAndLogin('owner2@example.com', 'owner02'); + const product = await prisma.product.create({ + data: { + name: 'Old', + description: 'old', + price: 1, + tags: [], + images: [], + user: { connect: { email: 'owner2@example.com' } }, + }, + }); + const res = await agent.patch(`/products/${product.id}`).send({ name: 'New' }); + expect(res.status).toBe(200); + expect(res.body.name).toBe('New'); + }); + + test('다른 사람 상품이면 403을 반환한다', async () => { + await prisma.user.create({ + data: { email: 'owner3@example.com', nickname: 'owner03', password: 'pw' }, + }); + const product = await prisma.product.create({ + data: { + name: 'Other', + description: 'x', + price: 1, + tags: [], + images: [], + user: { connect: { email: 'owner3@example.com' } }, + }, + }); + const agent = await registerAndLogin('user@example.com', 'user01'); + const res = await agent.patch(`/products/${product.id}`).send({ name: 'Nope' }); + expect(res.status).toBe(403); + }); + }); + + describe('DELETE /products/:id', () => { + test('본인 상품이면 삭제된다', async () => { + const agent = await registerAndLogin('owner4@example.com', 'owner04'); + const product = await prisma.product.create({ + data: { + name: 'DeleteMe', + description: 'x', + price: 1, + tags: [], + images: [], + user: { connect: { email: 'owner4@example.com' } }, + }, + }); + const res = await agent.delete(`/products/${product.id}`); + expect(res.status).toBe(204); + }); + + test('다른 사람 상품이면 403을 반환한다', async () => { + await prisma.user.create({ + data: { email: 'owner5@example.com', nickname: 'owner05', password: 'pw' }, + }); + const product = await prisma.product.create({ + data: { + name: 'Other', + description: 'x', + price: 1, + tags: [], + images: [], + user: { connect: { email: 'owner5@example.com' } }, + }, + }); + const agent = await registerAndLogin('user2@example.com', 'user02'); + const res = await agent.delete(`/products/${product.id}`); + expect(res.status).toBe(403); + }); + }); + + describe('POST /products/:id/comments', () => { + test('로그인 상태면 댓글이 등록된다', async () => { + const agent = await registerAndLogin('owner6@example.com', 'owner06'); + const product = await prisma.product.create({ + data: { + name: 'WithComment', + description: 'x', + price: 1, + tags: [], + images: [], + user: { connect: { email: 'owner6@example.com' } }, + }, + }); + + const res = await agent.post(`/products/${product.id}/comments`).send({ content: 'hello' }); + + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body).toHaveProperty('content', 'hello'); + }); + }); + + describe('POST/DELETE /products/:id/like', () => { + test('좋아요 등록/취소가 동작한다', async () => { + const agent = await registerAndLogin('owner7@example.com', 'owner07'); + const product = await prisma.product.create({ + data: { + name: 'LikeMe', + description: 'x', + price: 1, + tags: [], + images: [], + user: { connect: { email: 'owner7@example.com' } }, + }, + }); + + const likeRes = await agent.post(`/products/${product.id}/like`); + expect(likeRes.status).toBe(200); + + const unlikeRes = await agent.delete(`/products/${product.id}/like`); + expect(unlikeRes.status).toBe(200); + }); + }); + + describe('GET /products/me', () => { + test('내가 등록한 상품 목록을 반환한다', async () => { + const agent = await registerAndLogin('owner8@example.com', 'owner08'); + const owner = await prisma.user.findUnique({ + where: { email: 'owner8@example.com' }, + select: { id: true }, + }); + if (!owner) { + throw new Error('Test user not found'); + } + await prisma.product.createMany({ + data: [ + { + name: 'Mine1', + description: 'x', + price: 1, + tags: [], + images: [], + userId: owner.id, + }, + { + name: 'Mine2', + description: 'x', + price: 2, + tags: [], + images: [], + userId: owner.id, + }, + ], + }); + + const res = await agent + .get('/products/me') + .query({ page: 1, pageSize: 10, orderBy: 'recent' }); + expect(res.status).toBe(200); + expect(res.body.totalCount).toBe(2); + expect(res.body.list).toHaveLength(2); + }); + }); + + describe('GET /products/me/likes', () => { + test('내가 좋아요한 상품 목록을 반환한다', async () => { + const agent = await registerAndLogin('owner9@example.com', 'owner09'); + const product = await prisma.product.create({ + data: { + name: 'Liked', + description: 'x', + price: 1, + tags: [], + images: [], + user: { + create: { email: 'seller@example.com', nickname: 'seller01', password: 'pw' }, + }, + }, + }); + + await agent.post(`/products/${product.id}/like`); + + const res = await agent + .get('/products/me/likes') + .query({ page: 1, pageSize: 10, orderBy: 'recent' }); + expect(res.status).toBe(200); + expect(res.body.totalCount).toBe(1); + expect(res.body.list).toHaveLength(1); + expect(res.body.list[0].id).toBe(product.id); + }); + }); +}); diff --git a/mission9-10-11/tests/products.public.test.ts b/mission9-10-11/tests/products.public.test.ts new file mode 100644 index 000000000..f1aeffecc --- /dev/null +++ b/mission9-10-11/tests/products.public.test.ts @@ -0,0 +1,275 @@ +import request from 'supertest'; +import app from '../src/app'; +import { prisma } from '../src/lib/prismaClient'; +import { createSeedUser } from './utils/createUser'; +import { cleanDb, disconnectDb } from './utils/cleanDb'; + +jest.mock('uuid', () => ({ + v4: () => 'test-uuid', +})); + +describe('인증이 필요하지 않은 상품 API 통합 테스트', () => { + let ownerId: number; + + beforeAll(async () => { + await cleanDb(); + const owner = await createSeedUser(); + ownerId = owner.id; + }); + + beforeEach(async () => { + await prisma.like.deleteMany(); + await prisma.comment.deleteMany(); + await prisma.product.deleteMany(); + }); + + afterAll(async () => { + await cleanDb(); + await disconnectDb(); + }); + + test('상품이 없을 때, { list: [], totalCount: 0 }을 반환한다', async () => { + const res = await request(app).get('/products'); + + expect(res.status).toBe(200); + expect(res.body).toEqual({ list: [], totalCount: 0 }); + }); + + test('여러 개의 상품이 있을 때, list/totalCount를 올바르게 반환한다', async () => { + await prisma.product.createMany({ + data: [ + { name: '상품1', price: 1000, description: '설명1', tags: [], images: [], userId: ownerId }, + { name: '상품2', price: 2000, description: '설명2', tags: [], images: [], userId: ownerId }, + ], + }); + + const res = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10, orderBy: 'recent' }); + + expect(res.status).toBe(200); + expect(res.body.totalCount).toBe(2); + expect(res.body.list).toHaveLength(2); + expect(res.body.list[0]).toHaveProperty('likeCount'); + expect(res.body.list).toEqual( + expect.arrayContaining([ + expect.objectContaining({ name: '상품1', price: 1000, description: '설명1' }), + expect.objectContaining({ name: '상품2', price: 2000, description: '설명2' }), + ]), + ); + }); + + test('page/pageSize로 페이징이 된다', async () => { + await prisma.product.createMany({ + data: [ + { name: 'P1', price: 1, description: 'D1', tags: [], images: [], userId: ownerId }, + { name: 'P2', price: 2, description: 'D2', tags: [], images: [], userId: ownerId }, + { name: 'P3', price: 3, description: 'D3', tags: [], images: [], userId: ownerId }, + { name: 'P4', price: 4, description: 'D4', tags: [], images: [], userId: ownerId }, + { name: 'P5', price: 5, description: 'D5', tags: [], images: [], userId: ownerId }, + ], + }); + + const res1 = await request(app) + .get('/products') + .query({ page: 1, pageSize: 2, orderBy: 'recent' }); + expect(res1.status).toBe(200); + expect(res1.body.totalCount).toBe(5); + expect(res1.body.list).toHaveLength(2); + + const res2 = await request(app) + .get('/products') + .query({ page: 2, pageSize: 2, orderBy: 'recent' }); + expect(res2.status).toBe(200); + expect(res2.body.totalCount).toBe(5); + expect(res2.body.list).toHaveLength(2); + + const res3 = await request(app) + .get('/products') + .query({ page: 3, pageSize: 2, orderBy: 'recent' }); + expect(res3.status).toBe(200); + expect(res3.body.totalCount).toBe(5); + expect(res3.body.list).toHaveLength(1); + }); + + test('orderBy를 안 주면(기본) createdAt 오래된 순(오름차순)이다', async () => { + const oldOne = await prisma.product.create({ + data: { name: 'Old', price: 1, description: 'old', tags: [], images: [], userId: ownerId }, + }); + await new Promise((r) => setTimeout(r, 30)); + const newOne = await prisma.product.create({ + data: { name: 'New', price: 2, description: 'new', tags: [], images: [], userId: ownerId }, + }); + + const res = await request(app).get('/products').query({ page: 1, pageSize: 10 }); //orderBy 생략 + + expect(res.status).toBe(200); + expect(res.body.list[0].id).toBe(oldOne.id); + expect(res.body.list[1].id).toBe(newOne.id); + }); + + test("orderBy에 'asc' 같은 값은 허용되지 않아서 400을 반환한다", async () => { + const res = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10, orderBy: 'asc' }); + + expect(res.status).toBe(400); + }); + + test('keyword 검색은 name/description/tags 중 하나라도 매칭되면 포함된다', async () => { + await prisma.product.createMany({ + data: [ + { + name: 'Apple', + price: 100, + description: 'fresh', + tags: ['fruitTagOnly'], + images: [], + userId: ownerId, + }, + { + name: 'Banana', + price: 200, + description: 'yellowDescOnly', + tags: ['tasty'], + images: [], + userId: ownerId, + }, + { + name: 'Car', + price: 300, + description: 'vehicle', + tags: ['transport'], + images: [], + userId: ownerId, + }, + ], + }); + + const r1 = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'App' }); + expect(r1.status).toBe(200); + expect(r1.body.totalCount).toBe(1); + expect(r1.body.list[0].name).toBe('Apple'); + + const r2 = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'yellowDescOnly' }); + expect(r2.status).toBe(200); + expect(r2.body.totalCount).toBe(1); + expect(r2.body.list[0].name).toBe('Banana'); + + const r3 = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'fruitTagOnly' }); + expect(r3.status).toBe(200); + expect(r3.body.totalCount).toBe(1); + expect(r3.body.list[0].name).toBe('Apple'); + }); + + test('공개 조회에서는 isLiked 필드가 내려오지 않는다(로그인 안 함)', async () => { + await prisma.product.create({ + data: { name: 'NoAuth', price: 10, description: 'x', tags: [], images: [], userId: ownerId }, + }); + + const res = await request(app) + .get('/products') + .query({ page: 1, pageSize: 10, orderBy: 'recent' }); + expect(res.status).toBe(200); + + // list 내 isLiked가 없어야 함 + for (const item of res.body.list) { + expect(item).not.toHaveProperty('isLiked'); + expect(item).toHaveProperty('likeCount'); + } + }); + + test('잘못된 쿼리(page가 숫자가 아님)는 400을 반환한다', async () => { + const res = await request(app).get('/products').query({ page: 'abc', pageSize: 10 }); + expect([400, 422]).toContain(res.status); + }); + + describe('GET /products/:id (공개 상세 조회)', () => { + test('ID로 상품 상세를 반환한다', async () => { + const product = await prisma.product.create({ + data: { + name: 'Detail', + description: 'Detail desc', + price: 123, + tags: [], + images: [], + userId: ownerId, + }, + }); + + const res = await request(app).get(`/products/${product.id}`); + + expect(res.status).toBe(200); + expect(res.body.name).toBe('Detail'); + expect(res.body.description).toBe('Detail desc'); + expect(res.body).toHaveProperty('likeCount'); + expect(res.body).not.toHaveProperty('isLiked'); + }); + + test('존재하지 않는 id면 404(또는 400)를 반환한다', async () => { + const res = await request(app).get('/products/999999999'); + expect([404, 400]).toContain(res.status); + }); + }); + + describe('GET /products/:id/comments (공개 댓글 목록 조회)', () => { + test('댓글이 없으면 빈 목록을 반환한다', async () => { + const product = await prisma.product.create({ + data: { + name: 'NoComment', + description: 'x', + price: 1, + tags: [], + images: [], + userId: ownerId, + }, + }); + + const res = await request(app) + .get(`/products/${product.id}/comments`) + .query({ cursor: 0, limit: 10 }); + + expect(res.status).toBe(200); + expect(res.body).toEqual({ list: [], nextCursor: null }); + }); + + test('cursor/limit로 페이지네이션이 된다', async () => { + const product = await prisma.product.create({ + data: { + name: 'WithComments', + description: 'x', + price: 1, + tags: [], + images: [], + userId: ownerId, + }, + }); + + const commenter = await prisma.user.create({ + data: { email: `c+${Date.now()}@ex.com`, nickname: `c_${Date.now()}`, password: 'pw' }, + }); + + await prisma.comment.createMany({ + data: [ + { content: 'c1', productId: product.id, userId: commenter.id }, + { content: 'c2', productId: product.id, userId: commenter.id }, + { content: 'c3', productId: product.id, userId: commenter.id }, + ], + }); + + const res = await request(app) + .get(`/products/${product.id}/comments`) + .query({ cursor: 0, limit: 2 }); + + expect(res.status).toBe(200); + expect(res.body.list).toHaveLength(2); + expect(res.body.nextCursor).toBeTruthy(); + }); + }); +}); diff --git a/mission9-10-11/tests/test.http b/mission9-10-11/tests/test.http new file mode 100644 index 000000000..82dfa1bf8 --- /dev/null +++ b/mission9-10-11/tests/test.http @@ -0,0 +1,210 @@ +### Article 목록 조회하기(좋아요 포함) +GET http://localhost:3000/articles/?page=1&pageSize=3&orderBy=recent&keyword=이것은 +Accept: application/json + +### 새로운 Article 만들기 +POST http://localhost:3000/articles +Content-Type: application/json + +{ + "title": "새로운 Article2 제목입니다.", + "content": "이것은 새로운 Article의 내용입니다.", + "image": "https://example.com/image.jpg" +} + +### 특정 ID의 Article 가져오기(좋아요 포함) +GET http://localhost:3000/articles/4 +Accept: application/json + +### Article 업데이트하기 +PATCH http://localhost:3000/articles/9 +Content-Type: application/json + +{ + "title": "Article 2 업데이트", + "content": "이것은 업데이트된 내용입니다." +} + +### Article 삭제하기 +DELETE http://localhost:3000/articles/9 +Accept: application/json + +### Article에 Comment 달기 테스트 +POST http://localhost:3000/articles/1/comments +Content-Type: application/json + +{ + "content": "이것은 Article에 대한 테스트 Comment입니다." +} + +### Article의 Comment 가져오기 테스트 +GET http://localhost:3000/articles/2/comments?limit=200 +Accept: application/json + +### Comment 업데이트 테스트 +PATCH http://localhost:3000/comments/6 +Content-Type: application/json + +{ + "content": "이것은 업데이트된 테스트 Comment입니다." +} + +### Comment 삭제 테스트 +DELETE http://localhost:3000/comments/7 +Accept: application/json + +### 새로운 Product 만들기 테스트 +POST http://localhost:3000/products +Content-Type: application/json + +{ + "name": "2025년 최신형 세탁기", + "description": "신상품입니다.", + "price": 2000000, + "tags": ["세탁기"], + "images": ["image1.png", "image2.png"] +} + +### 모든 Product 가져오기 테스트 +GET http://localhost:3000/products/?page=1&pageSize=10&orderBy=recent& +Accept: application/json + +### 특정 Product 조회 (좋아요 포함) +GET http://localhost:3000/products/4 +Accept: application/json + +### Product 업데이트하기 테스트 +PATCH http://localhost:3000/products/1 +Content-Type: application/json + +{ + "name": "업데이트된 테스트 Product", + "description": "이것은 업데이트된 테스트 Product 설명입니다.", + "price": 3000000, + "tags": ["업데이트", "Product"], + "images": ["업데이트된_image1.png"] +} + +### Product 삭제하기 테스트 +DELETE http://localhost:3000/products/60 +Accept: application/json + +### Product에 Comment 달기 테스트 +POST http://localhost:3000/products/1/comments +Content-Type: application/json + +{ + "content": "이것은 Product에 대한 테스트 Comment입니다." +} + +### Product의 Comment 가져오기 테스트 +GET http://localhost:3000/products/1/comments +Accept: application/json + + +### Comment 업데이트하기 테스트 +PATCH http://localhost:3000/comments/7 +Content-Type: application/json + +{ + "content": "이것은 업데이트된 테스트 Comment입니다." +} + +### Comment 삭제하기 테스트 +DELETE http://localhost:3000/comments/4 +Accept: application/json + +### 이미지 업로드 테스트(s3) +POST http://localhost:3000/images/upload +Content-Type: multipart/form-data; boundary=boundary + +--boundary +Content-Disposition: form-data; name="image"; filename="test.png" +Content-Type: image/png + +< ./test.png +--boundary-- + +### 사용자 등록 테스트 +POST http://localhost:3000/users/register +Content-Type: application/json + +{ + "email": "alstn7@gmail.com", + "password": "password123", + "nickname": "민수bingsu7" +} + +### 사용자 로그인 테스트 +POST http://localhost:3000/users/login +Content-Type: application/json + +{ + "email": "alstn6@gmail.com", + "password": "password123" +} + +### 사용자 로그아웃 테스트 +POST http://localhost:3000/users/logout + +### 사용자 정보 가져오기 테스트(최근 등록 상품 5개 포함, 최근 좋아요 상품 5개 포함) +GET http://localhost:3000/users/me +Accept: application/json + +### 사용자 정보 업데이트 테스트 +PATCH http://localhost:3000/users/me +Content-Type: application/json + +{ + "email": "chlalstn@gmail.com", + "nickname": "수정한닉네임", + "image": "https://example.com/newprofile.jpg" +} + +### 비밀번호 변경 테스트 +PATCH http://localhost:3000/users/me/password +Content-Type: application/json + +{ + "currentPassword": "password123", + "newPassword": "newpassword123" +} + +###refresh token 테스트 +POST http://localhost:3000/users/refresh + +###상품like 테스트 +POST http://localhost:3000/products/1/like +Accept: application/json + +###상품unlike 테스트 , 취소가 됐음에도 불구하고 다시 시도하는 경우 에러메세지(존재하지 않습니다) 변경 고려 +DELETE http://localhost:3000/products/35/like +Accept: application/json + +### Article like 테스트 +POST http://localhost:3000/articles/8/like +Accept: application/json + +### Article unlike 테스트 +DELETE http://localhost:3000/articles/8/like +Accept: application/json + +### 내가 좋아요한 product 목록 가져오기 테스트(상품이 꽤 많이 있을 경우 페이징 처리) +GET http://localhost:3000/products/me/likes/?page=1&pageSize=10&orderBy=recent +Accept: application/json + +### 내가 등록한 상품 목록 가져오기 테스트, &keword=세탁기(상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능) +GET http://localhost:3000/products/me/?page=1&pageSize=10&orderBy=recent +Accept: application/json + +### 알림 목록 조회 테스트 +GET http://localhost:3000/notifications +Accept: application/json + +### 안 읽은 알림 개수 조회 테스트 +GET http://localhost:3000/notifications/unread-count +Accept: application/json + +### 알림 읽음 처리 테스트 +PATCH http://localhost:3000/notifications/6/read +Accept: application/json diff --git a/mission9-10-11/tests/test.js b/mission9-10-11/tests/test.js new file mode 100644 index 000000000..8cd82dc8c --- /dev/null +++ b/mission9-10-11/tests/test.js @@ -0,0 +1,68 @@ +async function bulkArticleCreate() { + for (let i = 1; i <= 100; i++) { + await fetch(`http://localhost:3000/articles`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + title: `Article ${i}`, + content: `This is the content of article ${i}.`, + image: `https://example.com/image${i}.jpg`, + }), + }); + } +} + +async function bulkArticleCommentCreate(articleId) { + for (let i = 1; i <= 100; i++) { + await fetch(`http://localhost:3000/articles/${articleId}/comments`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + content: `This is the content of article ${articleId} comment${i}.`, + }), + }); + } +} + +async function bulkProductCreate() { + for (let i = 1; i <= 100; i++) { + await fetch(`http://localhost:3000/products`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + name: `Test Product ${i}`, + description: `This is a test product description ${i}.`, + price: 100, + tags: ['test', 'product'], + images: ['image1.png', 'image2.png'], + }), + }); + } +} + +async function bulkProductCommentCreate(productId) { + for (let i = 1; i <= 100; i++) { + await fetch(`http://localhost:3000/products/${productId}/comments`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + content: `This is the content of product ${productId} comment${i}.`, + }), + }); + } +} + +bulkArticleCreate(); +bulkArticleCommentCreate(1); +bulkArticleCommentCreate(2); +bulkProductCreate(); +bulkProductCommentCreate(1); +bulkProductCommentCreate(2); diff --git a/mission9-10-11/tests/test.png b/mission9-10-11/tests/test.png new file mode 100644 index 0000000000000000000000000000000000000000..35a7b5616a6b18773cb64d62627874b0bde02271 GIT binary patch literal 6066 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 부모" 순서로 삭제해야 함 +// 스키마 기준: Like/Notification/Comment -> Product/Article -> User +export async function cleanDb() { + await prisma.like.deleteMany(); + await prisma.notification.deleteMany(); + await prisma.comment.deleteMany(); + await prisma.product.deleteMany(); + await prisma.article.deleteMany(); + await prisma.user.deleteMany(); +} +// 테스트 종료 시 prisma 연결 종료 +export async function disconnectDb() { + await prisma.$disconnect(); +} diff --git a/mission9-10-11/tests/utils/createUser.ts b/mission9-10-11/tests/utils/createUser.ts new file mode 100644 index 000000000..2a5f37cd0 --- /dev/null +++ b/mission9-10-11/tests/utils/createUser.ts @@ -0,0 +1,12 @@ +import { prisma } from '../../src/lib/prismaClient'; + +export async function createSeedUser() { + const now = Date.now(); + return prisma.user.create({ + data: { + email: `seed+${now}@example.com`, + nickname: `seed_${now}`, + password: 'seed-password', + }, + }); +} diff --git a/mission9-10-11/tsconfig.build.json b/mission9-10-11/tsconfig.build.json new file mode 100644 index 000000000..e4c703bb8 --- /dev/null +++ b/mission9-10-11/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": ["node"], + "rootDir": "./src", + "outDir": "./dist", + "noEmit": false + }, + "include": ["src"], + "exclude": ["tests", "node_modules", "dist"] +} diff --git a/mission9-10-11/tsconfig.json b/mission9-10-11/tsconfig.json new file mode 100644 index 000000000..d9c28d604 --- /dev/null +++ b/mission9-10-11/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + "rootDir": "." /* Allow src + tests in this tsconfig */, + "outDir": "./dist", + "baseUrl": ".", + "paths": { + "superstruct/src/*": ["node_modules/superstruct/dist/*"] + }, + "typeRoots": [ + "./types", + "./node_modules/@types" + ] /* Specify multiple folders that act like './node_modules/@types'. */, + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": ["src", "tests"], + "exclude": ["node_modules", "dist"] +} diff --git a/mission9-10-11/tsconfig.test.json b/mission9-10-11/tsconfig.test.json new file mode 100644 index 000000000..fd329ed6a --- /dev/null +++ b/mission9-10-11/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": ["jest", "node"], + "noEmit": true + }, + "include": ["tests", "src", "types"] +} diff --git a/mission9-10-11/types/article.d.ts b/mission9-10-11/types/article.d.ts new file mode 100644 index 000000000..f57178922 --- /dev/null +++ b/mission9-10-11/types/article.d.ts @@ -0,0 +1,34 @@ +import { Prisma, Article, Comment } from '@prisma/client'; + +type ArticleLikesAndCount = Prisma.ArticleGetPayload<{ + include: { + _count: { + select: { + likes: true; + }; + }; + likes: { + select: { + id: true; + }; + }; + }; +}>; + +//db는 주방 냉장고, 클라이언트는 손님, dto는 서빙되는 접시(플레이팅된 요리) +//DTO 주방에서 재료를 꺼내 손님이 먹기 좋게 가공, 예쁜 그릇에 담은 상태 +//기술적인 의미로는 데이터베이스에 저장된 원본 데이터와 클라이언트가 실제로 받는 데이터의 모양이 다를때 dto사용 + +// DB/내부 모델을 ‘그대로’ 밖으로 내보내지 않고, +// 외부(프론트/외부 API)가 쓰기 좋은 모양으로 +// 한 번 가공해서 내보내는 역할을 하는 타입/객체 + +interface ArticleResponse extends Article { + likeCount: number; + isLiked?: boolean; +} + +interface ArticleListResponse { + list: ArticleResponse[]; + totalCount: number; +} diff --git a/mission9-10-11/types/cursorPaginated.d.ts b/mission9-10-11/types/cursorPaginated.d.ts new file mode 100644 index 000000000..1b168ea24 --- /dev/null +++ b/mission9-10-11/types/cursorPaginated.d.ts @@ -0,0 +1,4 @@ +export type CursorPaginated = { + list: T[]; + nextCursor: number | null; +}; diff --git a/mission9-10-11/types/express.d.ts b/mission9-10-11/types/express.d.ts new file mode 100644 index 000000000..04e33bd43 --- /dev/null +++ b/mission9-10-11/types/express.d.ts @@ -0,0 +1,17 @@ +import type { User } from '@prisma/client'; + +declare global { + namespace Express { + interface Request { + user?: User; + } + } +} + +export {}; + +/*tsconfig에서 Include로 type경로를 지정해버리면 +실행 코드로 인식해버려 소스 코드가 되어버림, 심지어 d.ts 파일인데 import/export 구조 때문에 node가 실제 모듈처럼 취급하고 실행 경로에 영향을 줌. +실제 내가 사용하려고했던 글로벌 타입(확장)선언이 컴파일러 입장에서는 '타입이 아니고 실행모듈이네?'로 인식하게 된다는 것임. +결과적으로 내가 의도한 타입선언이 제대로 이루어지지 않은 것. +그래서 include를 제거하고 typeRoots : "./types" 해당 경로를 통하게 되면, 타입선언 전용으로만 참여하게 됨. => 정상작동*/ diff --git a/mission9-10-11/types/image.d.ts b/mission9-10-11/types/image.d.ts new file mode 100644 index 000000000..5045caa2d --- /dev/null +++ b/mission9-10-11/types/image.d.ts @@ -0,0 +1,3 @@ +export interface uploadImageResponse { + url: string; +} diff --git a/mission9-10-11/types/like.d.ts b/mission9-10-11/types/like.d.ts new file mode 100644 index 000000000..d2a0203d7 --- /dev/null +++ b/mission9-10-11/types/like.d.ts @@ -0,0 +1 @@ +export type LikeTarget = { articleId: number } | { productId: number }; diff --git a/mission9-10-11/types/multer.ts b/mission9-10-11/types/multer.ts new file mode 100644 index 000000000..6c52fe127 --- /dev/null +++ b/mission9-10-11/types/multer.ts @@ -0,0 +1,10 @@ +import { Request } from 'express'; + +export type MulterRequest = Request & { + file?: { + filename?: string; + buffer?: Buffer; + originalname?: string; + mimetype?: string; + }; +}; diff --git a/mission9-10-11/types/product.d.ts b/mission9-10-11/types/product.d.ts new file mode 100644 index 000000000..4d483852f --- /dev/null +++ b/mission9-10-11/types/product.d.ts @@ -0,0 +1,28 @@ +import { Prisma, Product } from '@prisma/client'; + +type ProductLikesAndCount = Prisma.ProductGetPayload<{ + include: { + _count: { + select: { + likes: true; + }; + }; + likes: { + select: { + id: true; + }; + }; + }; +}>; + +type ProductRecentType = 'myUploaded' | 'myliked'; + +interface ProductResponse extends Product { + likeCount: number; + isLiked?: boolean; +} + +interface ProductListResponse { + list: ProductResponse[]; + totalCount: number; +} diff --git a/mission9-10-11/types/user.d.ts b/mission9-10-11/types/user.d.ts new file mode 100644 index 000000000..57314d2c5 --- /dev/null +++ b/mission9-10-11/types/user.d.ts @@ -0,0 +1,11 @@ +export interface ProfileResponse { + user: Omit; + myProducts: { + list: ProductResponse[]; + totalCount: number; + }; + myLikedProducts: { + list: ProductResponse[]; + totalCount: number; + }; +} From 13bcc7a17c2d35877c8b32cccece9354505e2ad4 Mon Sep 17 00:00:00 2001 From: Minsoo Choi Date: Thu, 12 Feb 2026 22:13:30 +0900 Subject: [PATCH 07/17] mission11 --- .dockerignore | 14 + .github/PULL_REQUEST_TEMPLATE.md | 97 - .github/workflows/deploy.yml | 27 + .github/workflows/test.yml | 56 + ...0-17 \354\230\244\355\233\204 1.34.51.png" | Bin 190610 -> 0 bytes ...0-17 \354\230\244\355\233\204 1.35.25.png" | Bin 49215 -> 0 bytes ...17 \354\230\244\355\233\204 1.36.25-1.png" | Bin 325336 -> 0 bytes ...0-17 \354\230\244\355\233\204 1.36.25.png" | Bin 325336 -> 0 bytes Dockerfile | 28 + docker-compose.yaml | 33 + mission9-10-11/coverage/index.html | 10 +- mission9-10-11/coverage/src/app.ts.html | 15 +- .../controllers/articlesController.ts.html | 2 +- .../controllers/commentsController.ts.html | 2 +- .../coverage/src/controllers/index.html | 2 +- .../notificationController.ts.html | 2 +- .../controllers/productsController.ts.html | 2 +- .../src/controllers/usersController.ts.html | 2 +- mission9-10-11/coverage/src/index.html | 10 +- .../repositories/articleRepository.ts.html | 2 +- .../repositories/commentRepository.ts.html | 2 +- .../coverage/src/repositories/index.html | 2 +- .../src/repositories/likeRepository.ts.html | 2 +- .../notificationRepository.ts.html | 2 +- .../repositories/productRepository.ts.html | 2 +- .../src/repositories/userRepository.ts.html | 2 +- .../src/routers/articlesRouter.ts.html | 2 +- .../src/routers/commentsRouter.ts.html | 2 +- .../coverage/src/routers/imagesRouter.ts.html | 13 +- .../coverage/src/routers/index.html | 10 +- .../src/routers/notificationRouter.ts.html | 2 +- .../src/routers/productsRouter.ts.html | 2 +- .../coverage/src/routers/usersRouter.ts.html | 2 +- .../src/services/articleService.ts.html | 2 +- .../src/services/commentService.ts.html | 2 +- .../coverage/src/services/index.html | 2 +- .../src/services/notificationService.ts.html | 2 +- .../src/services/productService.ts.html | 2 +- .../coverage/src/services/userService.ts.html | 2 +- mission9-10-11/package.json | 8 +- mission9-10-11/tsconfig.build.json | 5 +- mission9-10/.env.example | 8 - mission9-10/.env.production.example | 11 - mission9-10/.env.test.example | 1 - mission9-10/.prettierrc | 9 - mission9-10/coverage/base.css | 224 - mission9-10/coverage/block-navigation.js | 87 - mission9-10/coverage/clover.xml | 6 - .../controllers/articlesController.ts.html | 376 - .../controllers/commentsController.ts.html | 172 - .../controllers/errorController.ts.html | 223 - .../controllers/imagesController.ts.html | 211 - mission9-10/coverage/controllers/index.html | 206 - .../notificationController.ts.html | 184 - .../controllers/productsController.ts.html | 394 - .../controllers/usersController.ts.html | 361 - mission9-10/coverage/coverage-final.json | 1 - mission9-10/coverage/favicon.png | Bin 445 -> 0 bytes mission9-10/coverage/index.html | 176 - mission9-10/coverage/lcov-report/base.css | 224 - .../coverage/lcov-report/block-navigation.js | 87 - mission9-10/coverage/lcov-report/favicon.png | Bin 445 -> 0 bytes mission9-10/coverage/lcov-report/index.html | 101 - mission9-10/coverage/lcov-report/prettify.css | 1 - mission9-10/coverage/lcov-report/prettify.js | 2 - .../lcov-report/sort-arrow-sprite.png | Bin 138 -> 0 bytes mission9-10/coverage/lcov-report/sorter.js | 210 - mission9-10/coverage/lcov.info | 0 mission9-10/coverage/lib/constants.ts.html | 163 - mission9-10/coverage/lib/cookies.ts.html | 169 - .../coverage/lib/errors/customErrors.ts.html | 223 - .../coverage/lib/errors/errorUtils.ts.html | 124 - mission9-10/coverage/lib/errors/index.html | 131 - mission9-10/coverage/lib/index.html | 176 - mission9-10/coverage/lib/prismaClient.ts.html | 94 - mission9-10/coverage/lib/token.ts.html | 151 - mission9-10/coverage/lib/withAsync.ts.html | 124 - .../coverage/middlewares/authenticate.ts.html | 175 - mission9-10/coverage/middlewares/index.html | 116 - mission9-10/coverage/prettify.css | 1 - mission9-10/coverage/prettify.js | 2 - .../repositories/articleRepository.ts.html | 256 - .../repositories/commentRepository.ts.html | 178 - mission9-10/coverage/repositories/index.html | 191 - .../repositories/likeRepository.ts.html | 193 - .../notificationRepository.ts.html | 163 - .../repositories/productRepository.ts.html | 280 - .../repositories/userRepository.ts.html | 142 - .../coverage/services/articleService.ts.html | 499 - .../coverage/services/commentService.ts.html | 151 - .../coverage/services/imageService.ts.html | 151 - mission9-10/coverage/services/index.html | 191 - .../services/notificationService.ts.html | 163 - .../coverage/services/productService.ts.html | 604 -- .../coverage/services/userService.ts.html | 721 -- mission9-10/coverage/sort-arrow-sprite.png | Bin 138 -> 0 bytes mission9-10/coverage/sorter.js | 210 - mission9-10/coverage/src/app.ts.html | 178 - .../controllers/articlesController.ts.html | 376 - .../controllers/commentsController.ts.html | 172 - .../src/controllers/errorController.ts.html | 223 - .../src/controllers/imagesController.ts.html | 211 - .../coverage/src/controllers/index.html | 176 - .../notificationController.ts.html | 184 - .../controllers/productsController.ts.html | 394 - .../src/controllers/usersController.ts.html | 361 - mission9-10/coverage/src/index.html | 116 - .../coverage/src/lib/constants.ts.html | 163 - mission9-10/coverage/src/lib/cookies.ts.html | 169 - .../src/lib/errors/customErrors.ts.html | 223 - .../src/lib/errors/errorUtils.ts.html | 124 - .../coverage/src/lib/errors/index.html | 131 - mission9-10/coverage/src/lib/index.html | 176 - .../coverage/src/lib/prismaClient.ts.html | 94 - mission9-10/coverage/src/lib/token.ts.html | 151 - .../coverage/src/lib/withAsync.ts.html | 124 - .../src/middlewares/authenticate.ts.html | 175 - .../coverage/src/middlewares/index.html | 116 - .../repositories/articleRepository.ts.html | 256 - .../repositories/commentRepository.ts.html | 178 - .../coverage/src/repositories/index.html | 191 - .../src/repositories/likeRepository.ts.html | 193 - .../notificationRepository.ts.html | 163 - .../repositories/productRepository.ts.html | 280 - .../src/repositories/userRepository.ts.html | 142 - .../src/routers/articlesRouter.ts.html | 169 - .../src/routers/commentsRouter.ts.html | 118 - .../coverage/src/routers/imagesRouter.ts.html | 112 - mission9-10/coverage/src/routers/index.html | 191 - .../src/routers/notificationRouter.ts.html | 133 - .../src/routers/productsRouter.ts.html | 178 - .../coverage/src/routers/usersRouter.ts.html | 157 - .../src/services/articleService.ts.html | 505 - .../src/services/commentService.ts.html | 151 - .../src/services/imageService.ts.html | 151 - mission9-10/coverage/src/services/index.html | 176 - .../src/services/notificationService.ts.html | 163 - .../src/services/productService.ts.html | 616 -- .../coverage/src/services/userService.ts.html | 721 -- mission9-10/coverage/src/socket.ts.html | 214 - .../src/structs/articlesStructs.ts.html | 121 - .../src/structs/commentsStruct.ts.html | 115 - .../src/structs/commonStructs.ts.html | 148 - mission9-10/coverage/src/structs/index.html | 176 - .../src/structs/productsStruct.ts.html | 163 - .../coverage/src/structs/usersStructs.ts.html | 229 - mission9-10/infra/ec2/ecosystem.config.js | 17 - mission9-10/infra/ec2/nginx.conf | 74 - .../infra/ec2/secure-group-inbound.png | Bin 90868 -> 0 bytes .../infra/ec2/secure-gruop-outbound.png | Bin 65630 -> 0 bytes mission9-10/infra/ec2/start.sh | 20 - .../infra/rds/secure-group-inbound.png | Bin 95011 -> 0 bytes .../infra/rds/secure-gruop-outbound.png | Bin 91869 -> 0 bytes mission9-10/infra/s3/policy.png | Bin 208287 -> 0 bytes mission9-10/infra/test | 0 mission9-10/jest.config.js | 33 - mission9-10/package-lock.json | 9108 ----------------- mission9-10/package.json | 60 - .../migration.sql | 114 - .../prisma/migrations/migration_lock.toml | 3 - mission9-10/prisma/schema.prisma | 93 - mission9-10/public/.gitkeep | 0 .../4f3edda9-25e4-462b-b18b-a45bb5f789ca.png | Bin 6066 -> 0 bytes mission9-10/public/socket-client-test.html | 37 - mission9-10/readme.md | 163 - mission9-10/src/app.ts | 30 - .../src/controllers/articlesController.ts | 97 - .../src/controllers/commentsController.ts | 29 - .../src/controllers/errorController.ts | 46 - .../src/controllers/imagesController.ts | 7 - .../src/controllers/notificationController.ts | 33 - .../src/controllers/productsController.ts | 103 - .../src/controllers/usersController.ts | 92 - mission9-10/src/lib/constants.ts | 26 - mission9-10/src/lib/cookies.ts | 28 - mission9-10/src/lib/errors/customErrors.ts | 46 - mission9-10/src/lib/errors/errorUtils.ts | 13 - mission9-10/src/lib/prismaClient.ts | 3 - mission9-10/src/lib/setupStatic.ts | 8 - mission9-10/src/lib/token.ts | 22 - mission9-10/src/lib/withAsync.ts | 13 - mission9-10/src/main.ts | 12 - mission9-10/src/middlewares/authenticate.ts | 30 - mission9-10/src/middlewares/upload.ts | 44 - .../src/repositories/articleRepository.ts | 57 - .../src/repositories/commentRepository.ts | 31 - .../src/repositories/likeRepository.ts | 36 - .../repositories/notificationRepository.ts | 26 - .../src/repositories/productRepository.ts | 65 - .../src/repositories/userRepository.ts | 19 - mission9-10/src/routers/articlesRouter.ts | 28 - mission9-10/src/routers/commentsRouter.ts | 11 - mission9-10/src/routers/imagesRouter.ts | 10 - mission9-10/src/routers/notificationRouter.ts | 16 - mission9-10/src/routers/productsRouter.ts | 31 - mission9-10/src/routers/usersRouter.ts | 24 - mission9-10/src/services/articleService.ts | 140 - mission9-10/src/services/commentService.ts | 22 - mission9-10/src/services/imageService.ts | 82 - .../src/services/notificationService.ts | 26 - mission9-10/src/services/productService.ts | 177 - mission9-10/src/services/userService.ts | 212 - mission9-10/src/socket.ts | 43 - mission9-10/src/structs/articlesStructs.ts | 12 - mission9-10/src/structs/commentsStruct.ts | 10 - mission9-10/src/structs/commonStructs.ts | 21 - mission9-10/src/structs/productsStruct.ts | 26 - mission9-10/src/structs/usersStructs.ts | 48 - mission9-10/tests/articles.auth.test.ts | 170 - mission9-10/tests/articles.public.test.ts | 188 - mission9-10/tests/auth.test.ts | 103 - .../tests/product.service.unit.test.ts | 175 - mission9-10/tests/products.auth.test.ts | 254 - mission9-10/tests/products.public.test.ts | 275 - mission9-10/tests/test.http | 210 - mission9-10/tests/test.js | 68 - mission9-10/tests/test.png | Bin 6066 -> 0 bytes mission9-10/tests/utils/cleanDb.ts | 17 - mission9-10/tests/utils/createUser.ts | 12 - mission9-10/tsconfig.build.json | 11 - mission9-10/tsconfig.json | 24 - mission9-10/tsconfig.test.json | 8 - mission9-10/types/article.d.ts | 34 - mission9-10/types/cursorPaginated.d.ts | 4 - mission9-10/types/express.d.ts | 17 - mission9-10/types/image.d.ts | 3 - mission9-10/types/like.d.ts | 1 - mission9-10/types/multer.ts | 10 - mission9-10/types/product.d.ts | 28 - mission9-10/types/user.d.ts | 11 - 230 files changed, 218 insertions(+), 32520 deletions(-) create mode 100644 .dockerignore delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/deploy.yml create mode 100644 .github/workflows/test.yml delete mode 100644 ".github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.34.51.png" delete mode 100644 ".github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.35.25.png" delete mode 100644 ".github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.36.25-1.png" delete mode 100644 ".github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.36.25.png" create mode 100644 Dockerfile create mode 100644 docker-compose.yaml delete mode 100644 mission9-10/.env.example delete mode 100644 mission9-10/.env.production.example delete mode 100644 mission9-10/.env.test.example delete mode 100644 mission9-10/.prettierrc delete mode 100644 mission9-10/coverage/base.css delete mode 100644 mission9-10/coverage/block-navigation.js delete mode 100644 mission9-10/coverage/clover.xml delete mode 100644 mission9-10/coverage/controllers/articlesController.ts.html delete mode 100644 mission9-10/coverage/controllers/commentsController.ts.html delete mode 100644 mission9-10/coverage/controllers/errorController.ts.html delete mode 100644 mission9-10/coverage/controllers/imagesController.ts.html delete mode 100644 mission9-10/coverage/controllers/index.html delete mode 100644 mission9-10/coverage/controllers/notificationController.ts.html delete mode 100644 mission9-10/coverage/controllers/productsController.ts.html delete mode 100644 mission9-10/coverage/controllers/usersController.ts.html delete mode 100644 mission9-10/coverage/coverage-final.json delete mode 100644 mission9-10/coverage/favicon.png delete mode 100644 mission9-10/coverage/index.html delete mode 100644 mission9-10/coverage/lcov-report/base.css delete mode 100644 mission9-10/coverage/lcov-report/block-navigation.js delete mode 100644 mission9-10/coverage/lcov-report/favicon.png delete mode 100644 mission9-10/coverage/lcov-report/index.html delete mode 100644 mission9-10/coverage/lcov-report/prettify.css delete mode 100644 mission9-10/coverage/lcov-report/prettify.js delete mode 100644 mission9-10/coverage/lcov-report/sort-arrow-sprite.png delete mode 100644 mission9-10/coverage/lcov-report/sorter.js delete mode 100644 mission9-10/coverage/lcov.info delete mode 100644 mission9-10/coverage/lib/constants.ts.html delete mode 100644 mission9-10/coverage/lib/cookies.ts.html delete mode 100644 mission9-10/coverage/lib/errors/customErrors.ts.html delete mode 100644 mission9-10/coverage/lib/errors/errorUtils.ts.html delete mode 100644 mission9-10/coverage/lib/errors/index.html delete mode 100644 mission9-10/coverage/lib/index.html delete mode 100644 mission9-10/coverage/lib/prismaClient.ts.html delete mode 100644 mission9-10/coverage/lib/token.ts.html delete mode 100644 mission9-10/coverage/lib/withAsync.ts.html delete mode 100644 mission9-10/coverage/middlewares/authenticate.ts.html delete mode 100644 mission9-10/coverage/middlewares/index.html delete mode 100644 mission9-10/coverage/prettify.css delete mode 100644 mission9-10/coverage/prettify.js delete mode 100644 mission9-10/coverage/repositories/articleRepository.ts.html delete mode 100644 mission9-10/coverage/repositories/commentRepository.ts.html delete mode 100644 mission9-10/coverage/repositories/index.html delete mode 100644 mission9-10/coverage/repositories/likeRepository.ts.html delete mode 100644 mission9-10/coverage/repositories/notificationRepository.ts.html delete mode 100644 mission9-10/coverage/repositories/productRepository.ts.html delete mode 100644 mission9-10/coverage/repositories/userRepository.ts.html delete mode 100644 mission9-10/coverage/services/articleService.ts.html delete mode 100644 mission9-10/coverage/services/commentService.ts.html delete mode 100644 mission9-10/coverage/services/imageService.ts.html delete mode 100644 mission9-10/coverage/services/index.html delete mode 100644 mission9-10/coverage/services/notificationService.ts.html delete mode 100644 mission9-10/coverage/services/productService.ts.html delete mode 100644 mission9-10/coverage/services/userService.ts.html delete mode 100644 mission9-10/coverage/sort-arrow-sprite.png delete mode 100644 mission9-10/coverage/sorter.js delete mode 100644 mission9-10/coverage/src/app.ts.html delete mode 100644 mission9-10/coverage/src/controllers/articlesController.ts.html delete mode 100644 mission9-10/coverage/src/controllers/commentsController.ts.html delete mode 100644 mission9-10/coverage/src/controllers/errorController.ts.html delete mode 100644 mission9-10/coverage/src/controllers/imagesController.ts.html delete mode 100644 mission9-10/coverage/src/controllers/index.html delete mode 100644 mission9-10/coverage/src/controllers/notificationController.ts.html delete mode 100644 mission9-10/coverage/src/controllers/productsController.ts.html delete mode 100644 mission9-10/coverage/src/controllers/usersController.ts.html delete mode 100644 mission9-10/coverage/src/index.html delete mode 100644 mission9-10/coverage/src/lib/constants.ts.html delete mode 100644 mission9-10/coverage/src/lib/cookies.ts.html delete mode 100644 mission9-10/coverage/src/lib/errors/customErrors.ts.html delete mode 100644 mission9-10/coverage/src/lib/errors/errorUtils.ts.html delete mode 100644 mission9-10/coverage/src/lib/errors/index.html delete mode 100644 mission9-10/coverage/src/lib/index.html delete mode 100644 mission9-10/coverage/src/lib/prismaClient.ts.html delete mode 100644 mission9-10/coverage/src/lib/token.ts.html delete mode 100644 mission9-10/coverage/src/lib/withAsync.ts.html delete mode 100644 mission9-10/coverage/src/middlewares/authenticate.ts.html delete mode 100644 mission9-10/coverage/src/middlewares/index.html delete mode 100644 mission9-10/coverage/src/repositories/articleRepository.ts.html delete mode 100644 mission9-10/coverage/src/repositories/commentRepository.ts.html delete mode 100644 mission9-10/coverage/src/repositories/index.html delete mode 100644 mission9-10/coverage/src/repositories/likeRepository.ts.html delete mode 100644 mission9-10/coverage/src/repositories/notificationRepository.ts.html delete mode 100644 mission9-10/coverage/src/repositories/productRepository.ts.html delete mode 100644 mission9-10/coverage/src/repositories/userRepository.ts.html delete mode 100644 mission9-10/coverage/src/routers/articlesRouter.ts.html delete mode 100644 mission9-10/coverage/src/routers/commentsRouter.ts.html delete mode 100644 mission9-10/coverage/src/routers/imagesRouter.ts.html delete mode 100644 mission9-10/coverage/src/routers/index.html delete mode 100644 mission9-10/coverage/src/routers/notificationRouter.ts.html delete mode 100644 mission9-10/coverage/src/routers/productsRouter.ts.html delete mode 100644 mission9-10/coverage/src/routers/usersRouter.ts.html delete mode 100644 mission9-10/coverage/src/services/articleService.ts.html delete mode 100644 mission9-10/coverage/src/services/commentService.ts.html delete mode 100644 mission9-10/coverage/src/services/imageService.ts.html delete mode 100644 mission9-10/coverage/src/services/index.html delete mode 100644 mission9-10/coverage/src/services/notificationService.ts.html delete mode 100644 mission9-10/coverage/src/services/productService.ts.html delete mode 100644 mission9-10/coverage/src/services/userService.ts.html delete mode 100644 mission9-10/coverage/src/socket.ts.html delete mode 100644 mission9-10/coverage/src/structs/articlesStructs.ts.html delete mode 100644 mission9-10/coverage/src/structs/commentsStruct.ts.html delete mode 100644 mission9-10/coverage/src/structs/commonStructs.ts.html delete mode 100644 mission9-10/coverage/src/structs/index.html delete mode 100644 mission9-10/coverage/src/structs/productsStruct.ts.html delete mode 100644 mission9-10/coverage/src/structs/usersStructs.ts.html delete mode 100644 mission9-10/infra/ec2/ecosystem.config.js delete mode 100644 mission9-10/infra/ec2/nginx.conf delete mode 100644 mission9-10/infra/ec2/secure-group-inbound.png delete mode 100644 mission9-10/infra/ec2/secure-gruop-outbound.png delete mode 100644 mission9-10/infra/ec2/start.sh delete mode 100644 mission9-10/infra/rds/secure-group-inbound.png delete mode 100644 mission9-10/infra/rds/secure-gruop-outbound.png delete mode 100644 mission9-10/infra/s3/policy.png delete mode 100644 mission9-10/infra/test delete mode 100644 mission9-10/jest.config.js delete mode 100644 mission9-10/package-lock.json delete mode 100644 mission9-10/package.json delete mode 100644 mission9-10/prisma/migrations/20260119073239_add_notification/migration.sql delete mode 100644 mission9-10/prisma/migrations/migration_lock.toml delete mode 100644 mission9-10/prisma/schema.prisma delete mode 100644 mission9-10/public/.gitkeep delete mode 100644 mission9-10/public/4f3edda9-25e4-462b-b18b-a45bb5f789ca.png delete mode 100644 mission9-10/public/socket-client-test.html delete mode 100644 mission9-10/readme.md delete mode 100644 mission9-10/src/app.ts delete mode 100644 mission9-10/src/controllers/articlesController.ts delete mode 100644 mission9-10/src/controllers/commentsController.ts delete mode 100644 mission9-10/src/controllers/errorController.ts delete mode 100644 mission9-10/src/controllers/imagesController.ts delete mode 100644 mission9-10/src/controllers/notificationController.ts delete mode 100644 mission9-10/src/controllers/productsController.ts delete mode 100644 mission9-10/src/controllers/usersController.ts delete mode 100644 mission9-10/src/lib/constants.ts delete mode 100644 mission9-10/src/lib/cookies.ts delete mode 100644 mission9-10/src/lib/errors/customErrors.ts delete mode 100644 mission9-10/src/lib/errors/errorUtils.ts delete mode 100644 mission9-10/src/lib/prismaClient.ts delete mode 100644 mission9-10/src/lib/setupStatic.ts delete mode 100644 mission9-10/src/lib/token.ts delete mode 100644 mission9-10/src/lib/withAsync.ts delete mode 100644 mission9-10/src/main.ts delete mode 100644 mission9-10/src/middlewares/authenticate.ts delete mode 100644 mission9-10/src/middlewares/upload.ts delete mode 100644 mission9-10/src/repositories/articleRepository.ts delete mode 100644 mission9-10/src/repositories/commentRepository.ts delete mode 100644 mission9-10/src/repositories/likeRepository.ts delete mode 100644 mission9-10/src/repositories/notificationRepository.ts delete mode 100644 mission9-10/src/repositories/productRepository.ts delete mode 100644 mission9-10/src/repositories/userRepository.ts delete mode 100644 mission9-10/src/routers/articlesRouter.ts delete mode 100644 mission9-10/src/routers/commentsRouter.ts delete mode 100644 mission9-10/src/routers/imagesRouter.ts delete mode 100644 mission9-10/src/routers/notificationRouter.ts delete mode 100644 mission9-10/src/routers/productsRouter.ts delete mode 100644 mission9-10/src/routers/usersRouter.ts delete mode 100644 mission9-10/src/services/articleService.ts delete mode 100644 mission9-10/src/services/commentService.ts delete mode 100644 mission9-10/src/services/imageService.ts delete mode 100644 mission9-10/src/services/notificationService.ts delete mode 100644 mission9-10/src/services/productService.ts delete mode 100644 mission9-10/src/services/userService.ts delete mode 100644 mission9-10/src/socket.ts delete mode 100644 mission9-10/src/structs/articlesStructs.ts delete mode 100644 mission9-10/src/structs/commentsStruct.ts delete mode 100644 mission9-10/src/structs/commonStructs.ts delete mode 100644 mission9-10/src/structs/productsStruct.ts delete mode 100644 mission9-10/src/structs/usersStructs.ts delete mode 100644 mission9-10/tests/articles.auth.test.ts delete mode 100644 mission9-10/tests/articles.public.test.ts delete mode 100644 mission9-10/tests/auth.test.ts delete mode 100644 mission9-10/tests/product.service.unit.test.ts delete mode 100644 mission9-10/tests/products.auth.test.ts delete mode 100644 mission9-10/tests/products.public.test.ts delete mode 100644 mission9-10/tests/test.http delete mode 100644 mission9-10/tests/test.js delete mode 100644 mission9-10/tests/test.png delete mode 100644 mission9-10/tests/utils/cleanDb.ts delete mode 100644 mission9-10/tests/utils/createUser.ts delete mode 100644 mission9-10/tsconfig.build.json delete mode 100644 mission9-10/tsconfig.json delete mode 100644 mission9-10/tsconfig.test.json delete mode 100644 mission9-10/types/article.d.ts delete mode 100644 mission9-10/types/cursorPaginated.d.ts delete mode 100644 mission9-10/types/express.d.ts delete mode 100644 mission9-10/types/image.d.ts delete mode 100644 mission9-10/types/like.d.ts delete mode 100644 mission9-10/types/multer.ts delete mode 100644 mission9-10/types/product.d.ts delete mode 100644 mission9-10/types/user.d.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..3e254b032 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +**/.DS_Store +.git +.github +node_modules +mission2 +mission3 +mission4 +mission5 +mission8 +mission9-10-11/node_modules +mission9-10-11/dist +mission9-10-11/coverage +mission9-10-11/.env* +mission9-10-11/.git diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 4ed8a24dc..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,97 +0,0 @@ -# 요구사항 - -### 클래스 구현하기 - -- [x] class 키워드를 이용해서 Product 클래스와 ElectronicProduct 클래스를 만들어 주세요. - - [x] Product 클래스는 name(상품명) description(상품 설명), price(판매 가격), tags(해시태그 배열), images(이미지 배열), - favoriteCount (찜하기 수)프로퍼티를 가집니다. - - [x] Product 클래스는 favorite 메소드를 가집니다. favorite 메소드가 호출될 경우 찜하기 수가 1 증가합니다. - - [x] ElectronicProduct 클래스는 Product를 상속하며, 추가로 manufacturer(제조사) 프로퍼티를 가집니다. -- [x] class 키워드를 이용해서 Article 클래스를 만들어 주세요. - - [x] Article 클래스는 title(제목), content(내용), writer(작성자), likeCount(좋아요 수) 프로퍼티를 가집니다. - - [x] Article 클래스는 like 메소드를 가집니다. like 메소드가 호출될 경우 좋아요 수가 1 증가합니다. - - [x] 각 클래스 마다 constructor를 작성해 주세요. - - [x] 추상화/캡슐화/상속/다형성을 고려하여 코드를 작성해 주세요. - -### Article 요청 함수 구현하기 - -- [x] https://panda-market-api-crud.vercel.app/docs 의 Article API를 이용하여 아래 함수들을 구현해 주세요. - - [x] getArticleList() : GET 메소드를 사용해 주세요. - - [x] page, pageSize, keyword 쿼리 파라미터를 이용해 주세요. - - [x] getArticle() : GET 메소드를 사용해 주세요. - - [x] createArticle() : POST 메소드를 사용해 주세요. - - [x] request body에 title, content, image 를 포함해 주세요. - - [x] patchArticle() : PATCH 메소드를 사용해 주세요. - - [x] deleteArticle() : DELETE 메소드를 사용해 주세요. -- [x] fetch 혹은 axios를 이용해 주세요. - - [x] 응답의 상태 코드가 2XX가 아닐 경우, 에러 메시지를 콘솔에 출력해 주세요. -- [x] .then() 메소드를 이용하여 비동기 처리를 해주세요. -- [x] .catch() 를 이용하여 오류 처리를 해주세요. - -### Product 요청 함수 구현하기 - -- [x] https://panda-market-api-crud.vercel.app/docs 의 Product API를 이용하여 아래 함수들을 구현해 주세요. - - [x] getProductList() : GET 메소드를 사용해 주세요. - - [x] page, pageSize, keyword 쿼리 파라미터를 이용해 주세요. - - [x] getProduct() : GET 메소드를 사용해 주세요. - - [x] createProduct() : POST 메소드를 사용해 주세요. - - [x] request body에 name, description, price, tags, images 를 포함해 주세요. - - [x] patchProduct() : PATCH 메소드를 사용해 주세요. - - [x] deleteProduct() : DELETE 메소드를 사용해 주세요. -- [x] async/await 을 이용하여 비동기 처리를 해주세요. -- [x] try/catch 를 이용하여 오류 처리를 해주세요. -- [x] getProductList()를 통해서 받아온 상품 리스트를 각각 인스턴스로 만들어 products 배열에 저장해 주세요. - - [x] 해시태그에 "전자제품"이 포함되어 있는 상품들은 Product 클래스 대신 ElectronicProduct 클래스를 사용해 인스턴스를 생성해 주세요. - - [x] 나머지 상품들은 모두 Product 클래스를 사용해 인스턴스를 생성해 주세요. -- [x] 구현한 함수들을 아래와 같이 파일을 분리해 주세요. - - [x] export를 활용해 주세요. - - [x] ProductService.js 파일 Product API 관련 함수들을 작성해 주세요. - - [x] ArticleService.js 파일에 Article API 관련 함수들을 작성해 주세요. -- [x] 이외의 코드들은 모두 main.js 파일에 작성해 주세요. - - [x] import를 활용해 주세요. - - [x] 각 함수를 실행하는 코드를 작성하고, 제대로 동작하는지 확인해 주세요. - -### (심화)Article 요청 함수 구현하기 - -- [x] Article 클래스에 createdAt(생성일자) 프로퍼티를 만들어 주세요. - - [x] 새로운 객체가 생성되어 constructor가 호출될 시 createdAt에 현재 시간을 저장합니다 - ---- - -## Git과 Github 활용하기 - -- [x] README.md 파일을 작성해 주세요 - - [x] 마크다운 언어를 숙지하여 작성해 주세요. - - [x] 내용은 자유롭게 작성해 주세요. -- [x] 본인 브랜치(ex)홍길동)에 스프린트 미션을 업로드 해 주세요. -- [x] 적절한 커밋 메시지를 남겨 주세요. -- [x] N-Sprint-Mission 레포지토리를 fork 합니다. (e.g. 2기면 2-Sprint-Mission) -- [x] GitHub에 PR(Pull Request)을 생성해 upstream의 본인 브랜치(ex)홍길동)에 미션을 제출합니다. -- [x] PR 커멘트에 아래 내용들을 포함해 주세요. - - [x] 스프린트 미션 요구사항 체크리스트 - - [x] 체크리스트(- [ ]) 를 만듭니다. - - [x] 완료한 만큼 체크 표시 (- [x]) 를 해 주세요. - ---- - -## 주요 변경사항 - -- Article 요청 함수는 axios를 활용해 만들었습니다. -- 코드를 작성하면서 잘 모르겠는 부분이나, 모범 답안을 참고하여 작성한 코드는 주석 처리하여 표기했습니다. -- 계속 코드를 수정하며 완료된 부분, 정돈된 부분들은 주석을 삭제하겠습니다. - ---- - -## 스크린샷 - -### ![alt text](<스크린샷 2025-10-17 오후 1.34.51.png>) - -### ![alt text](<스크린샷 2025-10-17 오후 1.35.25.png>) - -### ![alt text](<스크린샷 2025-10-17 오후 1.36.25-1.png>) - ---- - -## 멘토에게 - -- 코드 작성하면서 잘 몰랐던 부분들이나 이해가 필요한 부분 등등, 특이사항은 주석처리하여 작성했습니다. 감사합니다. diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 000000000..843dcbac1 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,27 @@ +name: Deploy to EC2 + +on: + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Deploy to EC2 + uses: appleboy/ssh-action@v0.1.6 + with: + host: ${{ secrets.EC2_HOST }} + username: ${{ secrets.EC2_USER }} + key: ${{ secrets.EC2_PRIVATE_KEY }} + port: 22 + script: | + cd /home/ec2-user/6-sprint-mission/mission9-10-11 + git pull origin main + npm install + npm run build + npm run prisma:migrate:deploy + pm2 reload panda-market + echo "Deployment successful!" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..54c1597da --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,56 @@ +name: Test + +on: + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + # 모든 run 단계의 기본 작업 디렉토리를 mission9-10-11로 지정 + defaults: + run: + working-directory: mission9-10-11 + + services: + postgres: + image: postgres:15 + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: mission_test + ports: + - 5432:5432 + options: >- + --health-cmd "pg_isready -U postgres -d mission_test" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + env: + DATABASE_URL: postgresql://postgres:postgres@localhost:5432/mission_test + NODE_ENV: test + JWT_ACCESS_TOKEN_SECRET: test-secret + JWT_REFRESH_TOKEN_SECRET: test-refresh-secret + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + check-latest: true + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Create CI .env.test + # CI 전용 .env.test 생성 (로컬/운영 비밀값과 분리) + run: | + echo 'DATABASE_URL="postgresql://postgres:postgres@localhost:5432/mission_test"' > .env.test + + - name: Type Check + run: npm run typecheck + + - name: Run Tests + run: npm run test diff --git "a/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.34.51.png" "b/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.34.51.png" deleted file mode 100644 index dbd19bdafbb4a775e7c53ed3913c82e2cb4ccda0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190610 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 z 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


y9k2=^?UT69Hc9ao>O9Ro(p3{bLBKJ)2OQOq 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
>#=H<6eEMxe$ke77d>~q=UOM@%U zATC~kCZ6Ufcx;DnL~U>dXtI1jez%TLft$HyBD7y@5A6}pUc0B}WKp-}&p$x97d+rU zHQv(A)2wd*6%co&C<=U|n;0j>Al6fXAAq3YLOrTQg(e)G!WNPB;qio}>-Q*kt0e_h zF9unz{q$`O7^wclNeE`1KbU7+Unu*y4odA0dn*CJMZt34iapxw_EiWEebOyb(MjY; zv*=5IB|^BnhK*v06*1~-3*`9nm()e=<6xlOi!CHkhhN0gXo|BA&D53#i$b*XPF>?{ zj@1qR&F3K{=>@d3T$J3bA>OFwy0!CPv4x|f{;_u}gT`y?`?bdUC7L_z7=OfWf6U&) zGUz7({f**dn0AH6D)e1Z|yM4WScJo)z{uO^227TEWvNZCjo)a|#Tpl06j) z)Sj{s|1?}L&rv3dajlvA^lVvj^)#gBJsl=WsvV`5WwfWBLz+PKw=E?y^K)S~ZTOqu9@Gn*-A3YB9?sMM(w6*5x`}7@{0RcD$ zg{j%r;b0MS;jA`W^*5IB-}(s@!D<<0mjg|6!ndX>9oI&p+ERI7*boQ-_^j>6uC}FF zolT?*#h?jaDxS5(SaW?s?$QvLlE_bYs?!d=}te~2kgQfOlYT_AyU&+&{E zKZPG-VM9_OG@CD?-Y?_|8H9<_tLJT*7q{=EG%aPP$oN~SF&Z^q~a zyt26QfJ^YHFsda-CguoAEGkC*2`MLZ8Bn%a&TB%^ZDcvxw{ts0eF$r8rNZz^>{oS= zcG>qR(!I8xRuoeuGLq{>a=B$yfI>-p^}EZ7rjI|!5hjB~9Cm`SlEOxn89~9%vkPBD z2y4vj=F#5+)JR#xzEOwkPlo3)@+{Jq6_EA`Be|S;=MJC%$YH{1Iom$Ju3hsF_-=+} zEE*}*Qz0qxP3CPMDBMNySw|JH24kDUii3Zf0q6{8>}VUaj`mzZ3n|bgoB_yNNu>ZP zcR)77f0E00(OL^Ur6rnbE)Ib1hU99^b0tRvD*<{ZHx1H>pAX*l#Qf4F7Qwl!P|mUl z(;Be~_qVQC5Ao<*(nYa!UfAz~m|qhQ|_HsXZ&bxna_|Lm|!u|9Ie zX(Ex!R*aYB%9Xqibiyw?++x|?{WIR#? zyFwhP6$4^J>b}McL}R_{ZA)V@#WDovB|Q80kcN2AI;KX(s%=(O->WEB=4c%(x!z~a z^Bv5%cu>gkg?x`_hQzA?P;4w~)*aX+jl6VV41+mMM489(AA0%2wdfXM3w$8okC1Oa zv9AKAY7#+@Gvv3t)<(LfcVZc1S+C9k|*;p@DuUpqjuCB%@mt;6-KnhGYg>nrk>ZgpQR=C!L{dpt#2sT z)MP>h#mZo+73U*!1S1??fh(R?(}}x*of+DIAVjLg?-N+XG78^lTRG_iZ2NXef994n zfw%E3GUdx{@!?BC6AX?*Q(hDOeyRcKpGLOt%%(e3;Vtg6F2dkG%q|o48BMe9?M&wz z%~$g@u7k#oiL;XjRl}+SFDFILtb#W%8G-|rFS}TQq`>_?bK$Jt6KYu_;;;o7{->*%+SpyBNB!eB*OLcRX%o3VF~P|8%0lu2 z1}@Khr}kP#9=#sjX&grd!MlawIOcOtYRQ0XC%ED+OCnW6t>aPG)^OQXFxS4>);>@K z&j9ktv8|{03G}e%NYwsI<(j%4lhk@ma&pldp#uP&G!*J)YFipfNHS#mmdz;^v=~XU zlKNDh%wijWv2t9fa6{BI+e;H$iM)=>?p_E4GVcI^IUB#-7j2zpn!1o4sIK7N-eqQM zt+(^};1JDD%|`MZRyBy3!*+z)U9yHI1lQ(=eF**B3#sseP6q^571FXH;QnQwm@e?U zjq<5dFQebg`5(z({b3;U0jS(!9m=PPY}Zv$FIAzZ;y@_GuWAGPw!APri_6}ViCXFk z-5QZUI?78@IK2Qic27FLOh+isJB=+Swp6NNOl~Q?KSZThR%7*U-Ts=bY*Od`=zVb?_NhVG|deZth2eq9uaTP2iVEAW4{~Pp3973Ty-Zs7k|XKhm7022OaEjuIj9Vq`YNMp<;$wkg%O3+BBMSMRfVDL|#aXO9tFP9vig_7-?OyhT3XV#<#hsVb-yImc&ly~puh~d3lnnG>|s|tKO>M$GMVb1#L z-P^QUUO*)tJdpTv9knnn{RY)S%ZT2-7^GX{NNr5sB(KBOkGfmoo?LFH&m61quszl5 zxHd)S=3edY4%^k~QP}l0q_*_qo+C1zsV$5x0>qZrR@OU^eKs2PXePifILWtb%~$XQ za6$OxM`-|lnlqU${dk|^Wx;_Lmig}1^ORv{mx$blDP;+vX49NjfDs)S>VaRgfJNb@ z2ev&4sb##d^gBBs4&EiOsV4yM&NG$fIRrOR=(FYAt}2Db0}`;H@v!rQq;|j7?gWkn#o6~sPKsxzH?sbS#-0fLMk<1E8!3l7%i!F)K#%c2UP1!UG^K8JB+9iUF@!yhkYEtRDfLw zh!|DZg3Y&Ev(LI=2oo55G}nF6v;try{h9KNGQoFET*=yIAAX_MQ9I{^;7f$)#yQf1 z2R87Bd6y4Z%J#z+kbwL5`Skj17gp{Wkjh@{Im^u^U@)+B-?97LV)CE{l5rlox3hY3_ET4nJq6hhc&>2x-41t0t7y?2IBIz>+GRw<>0(*chW1*B+> zZv-qvngpmS8}i(M+Jt@T2^M5SKNIMp;lh|uUCK<*Rx^5KW259uBc2YBy3aH#m44(r zXBo`ve+4|wwdF41DMJsdAt!&^%KlJu;_hP91^t1gwz|j+qh7%g%#uVlqyd0i*Or zdl|n9pGXiFDug$z¥M%~b>q|6wYx+w@-6U$P3HM2s7L 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 diff --git "a/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.35.25.png" "b/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.35.25.png" deleted file mode 100644 index 071c53457180116a6561b3a54b5c57a05cd443c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49215 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

$!rd>2J0)!88 zMeQ(Zl($~Yr#p1(O9fG&%#J7&f&Wyt3Ul_W^bb(CBG)|wG9l;O;;!qAk1rVDIhHkl zIA#>yCJ73zU0j~4H!Ol8b;m26Y`+9_rHW+%6<5@6lXh{e_DBL5qaMZpA=>=DC^JyHX1FfXdS!*T=oncc1Q1(F)1u8-0$M)RY!0! z^&b>oLu|g{MCImw^0aB^9vo3vQf(q6Jnii~piJe)Cd-$x8oM?uMm3Gb2R#SMWz&4# zO8UHsxP>$NJlz(8tJ!zY&o>M5U@nUL9^SYAT~lZYv4Jp4yd0PRC;9g`1%Rr!@R{~$ z#+q~|XzYHgaJ|{vmUa!-mZN~TH*LvZN{4*>2stkUE*w@=E6}BSIojHMEk>CO2QVZJ zW5=~eKH@>QfhagSHR@mOr1kL;`{ji$D%Ah`>cl5u9JQQR85BuN^z;x8ZSJ&bfbPVO! zK68;@E|Mt!SptDkT-*hqM*8!=H!^>R2{Nw$v>UYV@E_XYr!)W)!ilbjvf{Lo0Q_L- z=xx6?bn!YG06&Y#MPG9`{~P2r^g#H3B1sete=BjwM}Im$AgdZpR#NeKzQkL<{|DQ5 BmfHXT diff --git "a/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.36.25-1.png" "b/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.36.25-1.png" deleted file mode 100644 index 7658aff6a5130477dc2b9bfcdb3c26be2c4b629e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325336 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�eG>XrF$XWDk*Ihe3uNWAQA!&m@58+R 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 F>|f(|`ZE9k diff --git "a/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.36.25.png" "b/.github/\354\212\244\355\201\254\353\246\260\354\203\267 2025-10-17 \354\230\244\355\233\204 1.36.25.png" deleted file mode 100644 index 7658aff6a5130477dc2b9bfcdb3c26be2c4b629e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325336 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�eG>XrF$XWDk*Ihe3uNWAQA!&m@58+R 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 F>|f(|`ZE9k diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..a7bcf0760 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +# 의존성 설치 +FROM node:22-alpine AS deps +WORKDIR /app +COPY mission9-10-11/package*.json ./ +RUN npm ci + +# 소스 복사 후 빌드 +FROM node:22-alpine AS build +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY mission9-10-11/ ./ +RUN npm run prisma:generate +RUN npm run build + +# runtime 실행에 필요한 것만 복사 +FROM node:22-alpine AS runtime +WORKDIR /app +ENV NODE_ENV=production +COPY --from=build /app/package*.json ./ +COPY --from=build /app/node_modules ./node_modules +COPY --from=build /app/dist ./dist +COPY --from=build /app/prisma ./prisma +COPY --from=build /app/public ./public + +# 컨테이너에서 3000 포트 사용 +EXPOSE 3000 + +CMD ["node", "dist/src/main.js"] diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 000000000..c91ebad8a --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,33 @@ +services: + app: + build: + context: . + dockerfile: Dockerfile + ports: + - "3000:3000" + environment: + NODE_ENV: production + PORT: 3000 + UPLOAD_PROVIDER: local + DATABASE_URL: postgresql://postgres:postgres@db:5432/mission_db?schema=public + JWT_ACCESS_TOKEN_SECRET: ${JWT_ACCESS_TOKEN_SECRET} + JWT_REFRESH_TOKEN_SECRET: ${JWT_REFRESH_TOKEN_SECRET} + depends_on: + - db + volumes: + - uploads:/app/public + + db: + image: postgres:15 + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: mission_db + ports: + - "5432:5432" + volumes: + - dbdata:/var/lib/postgresql/data + +volumes: + uploads: + dbdata: diff --git a/mission9-10-11/coverage/index.html b/mission9-10-11/coverage/index.html index c5aa52d70..962d11869 100644 --- a/mission9-10-11/coverage/index.html +++ b/mission9-10-11/coverage/index.html @@ -84,13 +84,13 @@

All files

100% - 26/26 + 25/25 100% 0/0 100% 0/0 100% - 26/26 + 25/25 @@ -129,13 +129,13 @@

All files

100% - 69/69 + 70/70 100% 0/0 100% 0/0 100% - 69/69 + 70/70 @@ -161,7 +161,7 @@

All files

- - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/controllers/commentsController.ts.html b/mission9-10/coverage/controllers/commentsController.ts.html deleted file mode 100644 index fbea65de5..000000000 --- a/mission9-10/coverage/controllers/commentsController.ts.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - Code coverage report for controllers/commentsController.ts - - - - - - - - - -
-
-

All files / controllers commentsController.ts

-
- -
- 35% - Statements - 7/20 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/2 -
- - -
- 35% - Lines - 7/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -301x -1x -1x -1x -  -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  - 
import { create } from 'superstruct';
-import { UpdateCommentBodyStruct } from '../structs/commentsStruct';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { IdParamsStruct } from '../structs/commonStructs';
-import { Request, Response } from 'express';
-import { commnetService } from '../services/commentService';
- 
-//댓글 수정
-export async function updateComment(req: Request, res: Response) {
-  const { id: commentId } = create(req.params, IdParamsStruct);
-  const { content } = create(req.body, UpdateCommentBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const updatedComment = await commnetService.updateComment(commentId, user.id, content);
-  return res.send(updatedComment);
-}
- 
-//댓글 삭제
-export async function deleteComment(req: Request, res: Response) {
-  const { id: commentId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  await commnetService.deleteComment(commentId, user.id);
-  return res.status(204).send();
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/controllers/errorController.ts.html b/mission9-10/coverage/controllers/errorController.ts.html deleted file mode 100644 index 6e37e6a71..000000000 --- a/mission9-10/coverage/controllers/errorController.ts.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Code coverage report for controllers/errorController.ts - - - - - - - - - -
-
-

All files / controllers errorController.ts

-
- -
- 24% - Statements - 6/25 -
- - -
- 0% - Branches - 0/18 -
- - -
- 0% - Functions - 0/2 -
- - -
- 24% - Lines - 6/25 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -471x -1x -  -  -  -  -  -1x -  -1x -  -  -1x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { StructError } from 'superstruct';
-import {
-  NotFoundError,
-  BadRequestError,
-  ForbiddenError,
-  UnauthorizedError,
-} from '../lib/errors/customErrors';
-import { Prisma } from '@prisma/client';
-import { Request, Response, NextFunction } from 'express';
-import { isSyntaxJsonError } from '../lib/errors/errorUtils';
- 
-//404 처리 미들웨어
-export function defaultNotFoundHandler(req: Request, res: Response, next: NextFunction) {
-  return res.status(404).send({ message: '존재하지 않습니다' });
-}
-//전역 에러 처리 미들웨어(400,401,403,404,500)
-export function globalErrorHandler(err: unknown, req: Request, res: Response, next: NextFunction) {
-  if (err instanceof StructError || err instanceof BadRequestError) {
-    return res.status(400).send({ message: '잘못된 요청입니다' });
-  }
-  if (isSyntaxJsonError(err)) {
-    return res.status(400).send({ message: '잘못된 요청입니다' });
-  }
-  if (err instanceof UnauthorizedError) {
-    return res.status(401).json({ message: err.message });
-  }
-  if (err instanceof ForbiddenError) {
-    return res.status(403).json({ message: err.message });
-  }
-  if (err instanceof NotFoundError) {
-    return res.status(404).send({ message: err.message });
-  }
-  //프리즈마 코드 에러, 그 외 known 에러 500처리
-  if (err instanceof Prisma.PrismaClientKnownRequestError) {
-    if (err.code === 'P2025') {
-      return res.status(404).json({ message: '존재하지 않습니다' });
-    }
-    if (err.code === 'P2002') {
-      return res.status(400).json({ message: '잘못된 요청입니다' });
-    }
-    return res.status(500).json({ message: '데이터 처리 중 오류가 발생했습니다' });
-  }
- 
-  console.error(err);
-  return res.status(500).send({ message: '데이터 처리 중 오류가 발생했습니다' });
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/controllers/imagesController.ts.html b/mission9-10/coverage/controllers/imagesController.ts.html deleted file mode 100644 index 220f752e1..000000000 --- a/mission9-10/coverage/controllers/imagesController.ts.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - Code coverage report for controllers/imagesController.ts - - - - - - - - - -
-
-

All files / controllers imagesController.ts

-
- -
- 50% - Statements - 10/20 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/4 -
- - -
- 50% - Lines - 10/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -431x -1x -1x -1x -1x -  -1x -  -1x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  - 
import multer from 'multer';
-import path from 'path';
-import { v4 as uuidv4 } from 'uuid';
-import { PUBLIC_PATH } from '../lib/constants';
-import { BadRequestError } from '../lib/errors/customErrors';
-import { Request, Response } from 'express';
-import { imageService } from '../services/imageService';
- 
-const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];
-const FILE_SIZE_LIMIT = 5 * 1024 * 1024;
- 
-//이미지 업로드 설정
-export const upload = multer({
-  storage: multer.diskStorage({
-    destination(req, file, cb) {
-      cb(null, PUBLIC_PATH);
-    },
-    filename(req, file, cb) {
-      const ext = path.extname(file.originalname);
-      const filename = `${uuidv4()}${ext}`;
-      cb(null, filename);
-    },
-  }),
- 
-  limits: {
-    fileSize: FILE_SIZE_LIMIT,
-  },
- 
-  fileFilter: function (req, file, cb) {
-    if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) {
-      const err = new BadRequestError('Only png, jpeg, and jpg are allowed');
-      return cb(err);
-    }
- 
-    cb(null, true);
-  },
-});
-//이미지 업로드 핸들러
-export async function uploadImage(req: Request, res: Response) {
-  const response = imageService.buildImageUrl(req);
-  return res.send(response);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/controllers/index.html b/mission9-10/coverage/controllers/index.html deleted file mode 100644 index f4c6a8fdb..000000000 --- a/mission9-10/coverage/controllers/index.html +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - Code coverage report for controllers - - - - - - - - - -
-
-

All files controllers

-
- -
- 28.51% - Statements - 79/277 -
- - -
- 3.65% - Branches - 3/82 -
- - -
- 2.63% - Functions - 1/38 -
- - -
- 28.51% - Lines - 79/277 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articlesController.ts -
-
23.07%15/650%0/200%0/923.07%15/65
commentsController.ts -
-
35%7/200%0/40%0/235%7/20
errorController.ts -
-
24%6/250%0/180%0/224%6/25
imagesController.ts -
-
50%10/200%0/20%0/450%10/20
notificationController.ts -
-
30.43%7/230%0/60%0/330.43%7/23
productsController.ts -
-
29.23%19/6515%3/2011.11%1/929.23%19/65
usersController.ts -
-
25.42%15/590%0/120%0/925.42%15/59
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/controllers/notificationController.ts.html b/mission9-10/coverage/controllers/notificationController.ts.html deleted file mode 100644 index b2919224a..000000000 --- a/mission9-10/coverage/controllers/notificationController.ts.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - Code coverage report for controllers/notificationController.ts - - - - - - - - - -
-
-

All files / controllers notificationController.ts

-
- -
- 30.43% - Statements - 7/23 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/3 -
- - -
- 30.43% - Lines - 7/23 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34  -1x -1x -1x -1x -  -1x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  - 
import { Request, Response } from 'express';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { notificationService } from '../services/notificationService';
-import { IdParamsStruct } from '../structs/commonStructs';
-import { create } from 'superstruct';
- 
-export async function getNotifications(req: Request, res: Response) {
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const notifications = await notificationService.getNotifications(user.id);
-  return res.send(notifications);
-}
- 
-export async function getUnreadCount(req: Request, res: Response) {
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const count = await notificationService.getUnreadCount(user.id);
-  return res.send({ count });
-}
- 
-export async function markAsRead(req: Request, res: Response) {
-  const { id: notificationId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const notification = await notificationService.markAsRead(notificationId, user.id);
-  return res.send(notification);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/controllers/productsController.ts.html b/mission9-10/coverage/controllers/productsController.ts.html deleted file mode 100644 index 698f62d91..000000000 --- a/mission9-10/coverage/controllers/productsController.ts.html +++ /dev/null @@ -1,394 +0,0 @@ - - - - - - Code coverage report for controllers/productsController.ts - - - - - - - - - -
-
-

All files / controllers productsController.ts

-
- -
- 29.23% - Statements - 19/65 -
- - -
- 15% - Branches - 3/20 -
- - -
- 11.11% - Functions - 1/9 -
- - -
- 29.23% - Lines - 19/65 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -1041x -1x -1x -  -  -  -  -1x -1x -  -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -2x -2x -2x -2x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  - 
import { create } from 'superstruct';
-import { IdParamsStruct } from '../structs/commonStructs';
-import {
-  CreateProductBodyStruct,
-  GetProductListParamsStruct,
-  UpdateProductBodyStruct,
-} from '../structs/productsStruct';
-import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { Request, Response } from 'express';
-import { productService } from '../services/productService';
- 
-//상품 등록
-export async function createProduct(req: Request, res: Response) {
-  const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const product = await productService.createProduct({
-    name,
-    description,
-    price,
-    tags,
-    images,
-    userId: user.id,
-  });
-  return res.status(201).send(product);
-}
-//특정 상품 조회(좋아요 포함)
-export async function getProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  const product = await productService.getProduct(productId, user?.id);
-  return res.send(product);
-}
-//상품 수정
-export async function updateProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const data = create(req.body, UpdateProductBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const updatedProduct = await productService.updateProduct(productId, user.id, data);
-  return res.send(updatedProduct);
-}
-//상품 삭제
-export async function deleteProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  await productService.deleteProduct(productId, user.id);
-  return res.status(204).send();
-}
-//상품 목록 조회(좋아요 포함)
-export async function getProductList(req: Request, res: Response) {
-  const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct);
-  const user = req.user;
-  const products = await productService.getProductList(page, pageSize, orderBy, keyword, user?.id);
-  return res.send(products);
-}
- 
-//댓글 등록
-export async function createComment(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const { content } = create(req.body, CreateCommentBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const comment = await productService.createComment(user.id, productId, content);
-  return res.status(201).send(comment);
-}
-//상품 댓글 목록 조회
-export async function getCommentList(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
-  const commentList = await productService.getCommentList(productId, limit, cursor);
-  return res.send(commentList);
-}
-//상품 좋아요 등록
-export async function likeProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const productLike = await productService.likeProduct(user.id, productId);
-  return res.status(200).send(productLike);
-}
-//상품 좋아요 취소
-export async function unlikeProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const productUnliked = await productService.unlikeProduct(user.id, productId);
-  return res.send(productUnliked);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/controllers/usersController.ts.html b/mission9-10/coverage/controllers/usersController.ts.html deleted file mode 100644 index 64d2b0e41..000000000 --- a/mission9-10/coverage/controllers/usersController.ts.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - Code coverage report for controllers/usersController.ts - - - - - - - - - -
-
-

All files / controllers usersController.ts

-
- -
- 25.42% - Statements - 15/59 -
- - -
- 0% - Branches - 0/12 -
- - -
- 0% - Functions - 0/9 -
- - -
- 25.42% - Lines - 15/59 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -931x -  -  -  -  -  -  -  -1x -1x -1x -  -1x -1x -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -1x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  - 
import {
-  CreateUserBodyStruct,
-  UpdateUserBodyStruct,
-  LoginBodyStruct,
-  ChangePasswordBodyStruct,
-  GetMyProductListParamsStruct,
-  GetMyLikedProductListParamsStruct,
-} from '../structs/usersStructs';
-import { create } from 'superstruct';
-import { clearTokenCookies, setTokenCookies } from '../lib/cookies';
-import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants';
-import { Request, Response } from 'express';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { userService } from '../services/userService';
- 
-//회원가입
-export async function register(req: Request, res: Response) {
-  const { nickname, email, password, image } = create(req.body, CreateUserBodyStruct);
-  const user = await userService.register(nickname, email, password, image);
-  return res.status(201).send(user);
-}
-//로그인
-export async function login(req: Request, res: Response) {
-  const { email, password } = create(req.body, LoginBodyStruct);
-  const result = await userService.login(email, password);
-  setTokenCookies(res, result.tokens.accessToken, result.tokens.refreshToken);
-  return res.status(200).send({ message: result.message });
-}
-//로그아웃
-export async function logout(req: Request, res: Response) {
-  clearTokenCookies(res);
-  return res.status(200).send({ message: '로그아웃에 성공했습니다.' });
-}
-//내 프로필 조회 (최근 등록한 상품 5개, 최근 좋아요한 상품 5개 포함)
-export async function getProfile(req: Request, res: Response) {
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const profile = await userService.getProfile(user.id);
-  return res.send(profile);
-}
-//내 프로필 수정
-export async function updateProfile(req: Request, res: Response) {
-  const { nickname, email, image } = create(req.body, UpdateUserBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const update = await userService.updateProfile(user.id, nickname, email, image);
-  return res.send(update);
-}
-//내 비밀번호 변경
-export async function patchPassword(req: Request, res: Response) {
-  const { currentPassword, newPassword } = create(req.body, ChangePasswordBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  await userService.patchPassword(user.id, currentPassword, newPassword);
-  return res.status(200).send({ message: '비밀번호가 성공적으로 변경되었습니다.' });
-}
-//내가 등록한 상품 목록 조회 (상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능)
-export async function getMyProductList(req: Request, res: Response) {
-  const { page, pageSize, orderBy, keyword } = create(req.query, GetMyProductListParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const myProducts = await userService.getMyProductList(user.id, page, pageSize, orderBy, keyword);
-  return res.send(myProducts);
-}
-//토큰 갱신(리프레시)
-export async function refreshToken(req: Request, res: Response) {
-  const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME];
-  if (!refreshToken) {
-    throw new UnauthorizedError('리프레시 토큰이 없습니다.');
-  }
-  const tokens = await userService.refreshToken(refreshToken);
-  setTokenCookies(res, tokens.accessToken, tokens.refreshToken);
-  return res.status(200).send({ message: '토큰이 성공적으로 갱신되었습니다.' });
-}
-//내가 좋아요한 상품 목록 조회(상품이 꽤 많이 있을 경우 페이징 처리)
-export async function getMyLikedProducts(req: Request, res: Response) {
-  const { page, pageSize, orderBy } = create(req.query, GetMyLikedProductListParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const myLikedProducts = await userService.getMyLikedProducts(user.id, page, pageSize, orderBy);
-  return res.send(myLikedProducts);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/coverage-final.json b/mission9-10/coverage/coverage-final.json deleted file mode 100644 index 0967ef424..000000000 --- a/mission9-10/coverage/coverage-final.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/mission9-10/coverage/favicon.png b/mission9-10/coverage/favicon.png deleted file mode 100644 index c1525b811a167671e9de1fa78aab9f5c0b61cef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- 74.06% - Statements - 454/613 -
- - -
- 46.55% - Branches - 108/232 -
- - -
- 66.99% - Functions - 69/103 -
- - -
- 74.87% - Lines - 447/597 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
src -
-
100%26/26100%0/0100%0/0100%26/26
src/controllers -
-
70.68%164/23241.93%26/6268.75%22/3270.68%164/232
src/repositories -
-
73.07%38/5269.23%18/2663.63%21/3373.07%38/52
src/routers -
-
100%69/69100%0/0100%0/0100%69/69
src/services -
-
67.09%157/23444.44%64/14468.42%26/3868.8%150/218
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/lcov-report/base.css b/mission9-10/coverage/lcov-report/base.css deleted file mode 100644 index f418035b4..000000000 --- a/mission9-10/coverage/lcov-report/base.css +++ /dev/null @@ -1,224 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* yellow */ -.cbranch-no { background: yellow !important; color: #111; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -.highlighted, -.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ - background: #C21F39 !important; -} -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } -/* dark yellow (gold) */ -.status-line.medium, .medium .cover-fill { background: #f9cd0b; } -.medium .chart { border:1px solid #f9cd0b; } -/* light yellow */ -.medium { background: #fff4c2; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } - -.coverage-summary td.empty { - opacity: .5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/mission9-10/coverage/lcov-report/block-navigation.js b/mission9-10/coverage/lcov-report/block-navigation.js deleted file mode 100644 index 530d1ed2b..000000000 --- a/mission9-10/coverage/lcov-report/block-navigation.js +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; - - // Elements to highlight in the file listing view - var fileListingElements = ['td.pct.low']; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` - - // Selector that finds elements on the page to which we can jump - var selector = - fileListingElements.join(', ') + - ', ' + - notSelector + - missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements - .item(currentIndex) - .classList.remove('highlighted'); - missingCoverageElements.item(index).classList.add('highlighted'); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: 'smooth', - block: 'center', - inline: 'center' - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== 'number' || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === 'number' && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - if ( - document.getElementById('fileSearch') === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener('keydown', jumpToCode); diff --git a/mission9-10/coverage/lcov-report/favicon.png b/mission9-10/coverage/lcov-report/favicon.png deleted file mode 100644 index c1525b811a167671e9de1fa78aab9f5c0b61cef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- Unknown% - Statements - 0/0 -
- - -
- Unknown% - Branches - 0/0 -
- - -
- Unknown% - Functions - 0/0 -
- - -
- Unknown% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/lcov-report/prettify.css b/mission9-10/coverage/lcov-report/prettify.css deleted file mode 100644 index b317a7cda..000000000 --- a/mission9-10/coverage/lcov-report/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/mission9-10/coverage/lcov-report/prettify.js b/mission9-10/coverage/lcov-report/prettify.js deleted file mode 100644 index b3225238f..000000000 --- a/mission9-10/coverage/lcov-report/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/mission9-10/coverage/lcov-report/sort-arrow-sprite.png b/mission9-10/coverage/lcov-report/sort-arrow-sprite.png deleted file mode 100644 index 6ed68316eb3f65dec9063332d2f69bf3093bbfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc diff --git a/mission9-10/coverage/lcov-report/sorter.js b/mission9-10/coverage/lcov-report/sorter.js deleted file mode 100644 index 4ed70ae5a..000000000 --- a/mission9-10/coverage/lcov-report/sorter.js +++ /dev/null @@ -1,210 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - - // Try to create a RegExp from the searchValue. If it fails (invalid regex), - // it will be treated as a plain text search - let searchRegex; - try { - searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive - } catch (error) { - searchRegex = null; - } - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - let isMatch = false; - - if (searchRegex) { - // If a valid regex was created, use it for matching - isMatch = searchRegex.test(row.textContent); - } else { - // Otherwise, fall back to the original plain text search - isMatch = row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()); - } - - row.style.display = isMatch ? '' : 'none'; - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/mission9-10/coverage/lcov.info b/mission9-10/coverage/lcov.info deleted file mode 100644 index e69de29bb..000000000 diff --git a/mission9-10/coverage/lib/constants.ts.html b/mission9-10/coverage/lib/constants.ts.html deleted file mode 100644 index 9e18f9c6b..000000000 --- a/mission9-10/coverage/lib/constants.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for lib/constants.ts - - - - - - - - - -
-
-

All files / lib constants.ts

-
- -
- 100% - Statements - 20/20 -
- - -
- 50% - Branches - 4/8 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 20/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -271x -1x -  -1x -1x -1x -1x -1x -  -1x -  -1x -1x -1x -  -  -1x -1x -1x -1x -1x -1x -1x -1x -1x -  - 
import dotenv from 'dotenv';
-dotenv.config();
- 
-const DATABASE_URL = process.env.DATABASE_URL;
-const NODE_ENV = process.env.NODE_ENV || 'development';
-const PORT = process.env.PORT || 3000;
-const PUBLIC_PATH = 'public';
-const STATIC_PATH = '/public';
-const JWT_ACCESS_TOKEN_SECRET =
-  process.env.JWT_ACCESS_TOKEN_SECRET || 'your_jwt_access_token_secret';
-const JWT_REFRESH_TOKEN_SECRET =
-  process.env.JWT_REFRESH_TOKEN_SECRET || 'your_jwt_refresh_token_secret';
-const ACCESS_TOKEN_COOKIE_NAME = 'access-token';
-const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token';
- 
-export {
-  DATABASE_URL,
-  NODE_ENV,
-  PORT,
-  PUBLIC_PATH,
-  STATIC_PATH,
-  JWT_ACCESS_TOKEN_SECRET,
-  JWT_REFRESH_TOKEN_SECRET,
-  ACCESS_TOKEN_COOKIE_NAME,
-  REFRESH_TOKEN_COOKIE_NAME,
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/lib/cookies.ts.html b/mission9-10/coverage/lib/cookies.ts.html deleted file mode 100644 index 7c2e7eaed..000000000 --- a/mission9-10/coverage/lib/cookies.ts.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - Code coverage report for lib/cookies.ts - - - - - - - - - -
-
-

All files / lib cookies.ts

-
- -
- 42.85% - Statements - 3/7 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 42.85% - Lines - 3/7 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -291x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  - 
import { NODE_ENV, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from './constants';
-import { Response } from 'express';
- 
-export function setTokenCookies(res: Response, accessToken: string, refreshToken: string) {
-  res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-    maxAge: 1 * 60 * 60 * 1000, // 1시간
-  });
-  res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-    maxAge: 7 * 24 * 60 * 60 * 1000, // 7일
-    path: '/users/refresh',
-  });
-}
- 
-export function clearTokenCookies(res: Response) {
-  res.clearCookie(ACCESS_TOKEN_COOKIE_NAME, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-  });
-  res.clearCookie(REFRESH_TOKEN_COOKIE_NAME, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-    path: '/users/refresh',
-  });
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/lib/errors/customErrors.ts.html b/mission9-10/coverage/lib/errors/customErrors.ts.html deleted file mode 100644 index 98442b49b..000000000 --- a/mission9-10/coverage/lib/errors/customErrors.ts.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Code coverage report for lib/errors/customErrors.ts - - - - - - - - - -
-
-

All files / lib/errors customErrors.ts

-
- -
- 38.88% - Statements - 7/18 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/7 -
- - -
- 38.88% - Lines - 7/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -471x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  - 
export class BaseError extends Error {
-  statusCode: number;
-  constructor(message: string, statusCode: number) {
-    super(message);
-    this.name = new.target.name;
-    this.statusCode = statusCode;
-  }
-}
- 
-export class NotFoundError extends BaseError {
-  constructor(message = '존재하지 않습니다') {
-    super(message, 404);
-  }
-}
- 
-export class UnauthorizedError extends BaseError {
-  constructor(message = '인증이 필요합니다') {
-    super(message, 401);
-  }
-}
- 
-export class BadRequestError extends BaseError {
-  constructor(message = '잘못된 요청입니다') {
-    super(message, 400);
-  }
-}
- 
-export class ForbiddenError extends BaseError {
-  constructor(message = '비밀번호가 틀렸습니다') {
-    super(message, 403);
-  }
-}
- 
-export class AlreadyLikeError extends ForbiddenError {
-  constructor(message = '이미 좋아요를 눌렀습니다.') {
-    super(message);
-    this.name = new.target.name;
-  }
-}
- 
-export class AlreadyUnlikeError extends ForbiddenError {
-  constructor(message = '좋아요가 존재하지 않습니다.') {
-    super(message);
-    this.name = new.target.name;
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/lib/errors/errorUtils.ts.html b/mission9-10/coverage/lib/errors/errorUtils.ts.html deleted file mode 100644 index 2087af67c..000000000 --- a/mission9-10/coverage/lib/errors/errorUtils.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for lib/errors/errorUtils.ts - - - - - - - - - -
-
-

All files / lib/errors errorUtils.ts

-
- -
- 20% - Statements - 1/5 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 25% - Lines - 1/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -  -  -  -1x -  -  -  -  -  -  -  - 
interface SyntaxJsonError extends SyntaxError {
-  status?: number;
-  body?: unknown;
-}
- 
-export function isSyntaxJsonError(err: unknown): err is SyntaxJsonError {
-  if (!(err instanceof SyntaxError)) return false;
-  const e = err as Partial<SyntaxJsonError>;
-  return typeof e.status === 'number' && 'body' in e;
-}
-// Partial<SyntaxJsonError>;
-// 얘는 SyntaxJsonError의 일부 프로퍼티만 가지고 있을 수도 있어”
-// 라고 TS에게 알려서 e.status, e.body 같은 속성 접근을 가능하게 해주는 장치
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/lib/errors/index.html b/mission9-10/coverage/lib/errors/index.html deleted file mode 100644 index cd59b19a2..000000000 --- a/mission9-10/coverage/lib/errors/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for lib/errors - - - - - - - - - -
-
-

All files lib/errors

-
- -
- 34.78% - Statements - 8/23 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/8 -
- - -
- 36.36% - Lines - 8/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
customErrors.ts -
-
38.88%7/180%0/60%0/738.88%7/18
errorUtils.ts -
-
20%1/50%0/40%0/125%1/4
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/lib/index.html b/mission9-10/coverage/lib/index.html deleted file mode 100644 index ecde2e77e..000000000 --- a/mission9-10/coverage/lib/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for lib - - - - - - - - - -
-
-

All files lib

-
- -
- 74.46% - Statements - 35/47 -
- - -
- 50% - Branches - 4/8 -
- - -
- 37.5% - Functions - 3/8 -
- - -
- 73.91% - Lines - 34/46 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
constants.ts -
-
100%20/2050%4/8100%0/0100%20/20
cookies.ts -
-
42.85%3/7100%0/00%0/242.85%3/7
prismaClient.ts -
-
100%2/2100%0/0100%0/0100%2/2
token.ts -
-
41.66%5/12100%0/00%0/341.66%5/12
withAsync.ts -
-
83.33%5/6100%0/0100%3/380%4/5
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/lib/prismaClient.ts.html b/mission9-10/coverage/lib/prismaClient.ts.html deleted file mode 100644 index 2e8063c3d..000000000 --- a/mission9-10/coverage/lib/prismaClient.ts.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - Code coverage report for lib/prismaClient.ts - - - - - - - - - -
-
-

All files / lib prismaClient.ts

-
- -
- 100% - Statements - 2/2 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 2/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -41x -  -1x - 
import { PrismaClient } from '@prisma/client';
- 
-export const prisma = new PrismaClient();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/lib/token.ts.html b/mission9-10/coverage/lib/token.ts.html deleted file mode 100644 index 372192f34..000000000 --- a/mission9-10/coverage/lib/token.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for lib/token.ts - - - - - - - - - -
-
-

All files / lib token.ts

-
- -
- 41.66% - Statements - 5/12 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/3 -
- - -
- 41.66% - Lines - 5/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -231x -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -1x -  -  -  - 
import jwt, { JwtPayload } from 'jsonwebtoken';
-import { JWT_ACCESS_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET } from './constants';
- 
-interface TokenPayload extends JwtPayload {
-  id: number;
-}
- 
-export function generateToken(userId: number) {
-  const accessToken = jwt.sign({ id: userId }, JWT_ACCESS_TOKEN_SECRET, { expiresIn: '1h' });
-  const refreshToken = jwt.sign({ id: userId }, JWT_REFRESH_TOKEN_SECRET, { expiresIn: '1d' });
-  return { accessToken, refreshToken };
-}
- 
-export function verifyAccessToken(token: string) {
-  const decoded = jwt.verify(token, JWT_ACCESS_TOKEN_SECRET) as TokenPayload;
-  return { userId: decoded.id };
-}
- 
-export function verifyRefreshToken(token: string) {
-  const decoded = jwt.verify(token, JWT_REFRESH_TOKEN_SECRET) as TokenPayload;
-  return { userId: decoded.id };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/lib/withAsync.ts.html b/mission9-10/coverage/lib/withAsync.ts.html deleted file mode 100644 index 2e7a603fd..000000000 --- a/mission9-10/coverage/lib/withAsync.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for lib/withAsync.ts - - - - - - - - - -
-
-

All files / lib withAsync.ts

-
- -
- 83.33% - Statements - 5/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 3/3 -
- - -
- 80% - Lines - 4/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -1x -  -  -33x -2x -2x -  -  -  -  -  - 
import type { Request, Response, NextFunction, RequestHandler } from 'express';
- 
-export function withAsync<T = unknown>(
-  handler: (req: Request, res: Response, next: NextFunction) => Promise<T>,
-): RequestHandler {
-  return async (req, res, next) => {
-    try {
-      await handler(req, res, next);
-    } catch (e) {
-      next(e);
-    }
-  };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/middlewares/authenticate.ts.html b/mission9-10/coverage/middlewares/authenticate.ts.html deleted file mode 100644 index 56eeaf857..000000000 --- a/mission9-10/coverage/middlewares/authenticate.ts.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - Code coverage report for middlewares/authenticate.ts - - - - - - - - - -
-
-

All files / middlewares authenticate.ts

-
- -
- 55% - Statements - 11/20 -
- - -
- 42.85% - Branches - 3/7 -
- - -
- 100% - Functions - 3/3 -
- - -
- 52.63% - Lines - 10/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -311x -1x -1x -1x -  -  -  -26x -2x -2x -2x -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { prisma } from '../lib/prismaClient';
-import { verifyAccessToken } from '../lib/token';
-import { ACCESS_TOKEN_COOKIE_NAME } from '../lib/constants';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { NextFunction, Request, Response } from 'express';
- 
-function authenticate(options = { optional: false }) {
-  return async (req: Request, res: Response, next: NextFunction) => {
-    const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME];
-    Eif (!accessToken) {
-      Eif (options.optional) {
-        return next();
-      }
-      return next(new UnauthorizedError());
-    }
-    try {
-      const { userId } = verifyAccessToken(accessToken); //디코딩 된 토큰에서 user id 추출
-      const user = await prisma.user.findUniqueOrThrow({ where: { id: userId } });
-      req.user = user;
-    } catch (error) {
-      if (options.optional) {
-        return next();
-      }
-      return next(new UnauthorizedError());
-    }
-    next();
-  };
-}
- 
-export default authenticate;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/middlewares/index.html b/mission9-10/coverage/middlewares/index.html deleted file mode 100644 index 73cd09812..000000000 --- a/mission9-10/coverage/middlewares/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for middlewares - - - - - - - - - -
-
-

All files middlewares

-
- -
- 55% - Statements - 11/20 -
- - -
- 42.85% - Branches - 3/7 -
- - -
- 100% - Functions - 3/3 -
- - -
- 52.63% - Lines - 10/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
authenticate.ts -
-
55%11/2042.85%3/7100%3/352.63%10/19
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/prettify.css b/mission9-10/coverage/prettify.css deleted file mode 100644 index b317a7cda..000000000 --- a/mission9-10/coverage/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/mission9-10/coverage/prettify.js b/mission9-10/coverage/prettify.js deleted file mode 100644 index b3225238f..000000000 --- a/mission9-10/coverage/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/mission9-10/coverage/repositories/articleRepository.ts.html b/mission9-10/coverage/repositories/articleRepository.ts.html deleted file mode 100644 index d1defbc06..000000000 --- a/mission9-10/coverage/repositories/articleRepository.ts.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - Code coverage report for repositories/articleRepository.ts - - - - - - - - - -
-
-

All files / repositories articleRepository.ts

-
- -
- 30% - Statements - 3/10 -
- - -
- 0% - Branches - 0/8 -
- - -
- 0% - Functions - 0/7 -
- - -
- 30% - Lines - 3/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58  -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { Prisma } from '@prisma/client';
-import { prisma } from '../lib/prismaClient';
-import { ArticleLikesAndCount } from '../../types/article';
- 
-export class ArticleRepository {
-  async create(data: Prisma.ArticleCreateInput) {
-    return prisma.article.create({ data });
-  }
-  async findById(id: number) {
-    return prisma.article.findUniqueOrThrow({ where: { id } });
-  }
-  async findByIdWithLikes(id: number, userId?: number): Promise<ArticleLikesAndCount> {
-    return prisma.article.findUniqueOrThrow({
-      where: { id },
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          //비로그인 시 -1을 줘서 []을 뱉도록
-          where: { userId: userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async findArticleListWithLikes(params: {
-    skip: number;
-    take: number;
-    orderBy: Prisma.ArticleOrderByWithRelationInput;
-    where: Prisma.ArticleWhereInput;
-    userId?: number;
-  }): Promise<ArticleLikesAndCount[]> {
-    return prisma.article.findMany({
-      skip: params.skip,
-      take: params.take,
-      orderBy: params.orderBy,
-      where: params.where,
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          where: { userId: params.userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async count(where: Prisma.ArticleWhereInput) {
-    return prisma.article.count({ where });
-  }
-  async update(id: number, data: Prisma.ArticleUpdateInput) {
-    return prisma.article.update({ where: { id }, data });
-  }
-  async delete(id: number) {
-    return prisma.article.delete({ where: { id } });
-  }
-}
- 
-export const articleRepo = new ArticleRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/repositories/commentRepository.ts.html b/mission9-10/coverage/repositories/commentRepository.ts.html deleted file mode 100644 index 9d84f7d08..000000000 --- a/mission9-10/coverage/repositories/commentRepository.ts.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - Code coverage report for repositories/commentRepository.ts - - - - - - - - - -
-
-

All files / repositories commentRepository.ts

-
- -
- 37.5% - Statements - 3/8 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/5 -
- - -
- 37.5% - Lines - 3/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { Prisma } from '@prisma/client';
-import { prisma } from '../lib/prismaClient';
- 
-export class CommentRepository {
-  async create(data: Prisma.CommentCreateInput) {
-    return prisma.comment.create({ data });
-  }
-  async findCommentListQuery(
-    whereCondition: { articleId: number } | { productId: number },
-    limit: number,
-    cursor?: number,
-  ) {
-    return prisma.comment.findMany({
-      cursor: cursor ? { id: cursor } : undefined,
-      take: limit + 1,
-      where: whereCondition,
-      orderBy: { createdAt: 'desc' },
-    });
-  }
-  async findById(id: number) {
-    return prisma.comment.findUniqueOrThrow({ where: { id } });
-  }
-  async update(id: number, content?: string) {
-    return prisma.comment.update({ where: { id }, data: { content } });
-  }
-  async delete(id: number) {
-    return prisma.comment.delete({ where: { id } });
-  }
-}
- 
-export const commentRepo = new CommentRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/repositories/index.html b/mission9-10/coverage/repositories/index.html deleted file mode 100644 index 0e2a502ec..000000000 --- a/mission9-10/coverage/repositories/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - Code coverage report for repositories - - - - - - - - - -
-
-

All files repositories

-
- -
- 32.69% - Statements - 17/52 -
- - -
- 11.53% - Branches - 3/26 -
- - -
- 6.06% - Functions - 2/33 -
- - -
- 32.69% - Lines - 17/52 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articleRepository.ts -
-
30%3/100%0/80%0/730%3/10
commentRepository.ts -
-
37.5%3/80%0/20%0/537.5%3/8
likeRepository.ts -
-
22.22%2/90%0/60%0/422.22%2/9
notificationRepository.ts -
-
37.5%3/8100%0/00%0/537.5%3/8
productRepository.ts -
-
36.36%4/1130%3/1025%2/836.36%4/11
userRepository.ts -
-
33.33%2/6100%0/00%0/433.33%2/6
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/repositories/likeRepository.ts.html b/mission9-10/coverage/repositories/likeRepository.ts.html deleted file mode 100644 index 426f98a4e..000000000 --- a/mission9-10/coverage/repositories/likeRepository.ts.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - Code coverage report for repositories/likeRepository.ts - - - - - - - - - -
-
-

All files / repositories likeRepository.ts

-
- -
- 22.22% - Statements - 2/9 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/4 -
- - -
- 22.22% - Lines - 2/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { LikeTarget } from '../../types/like';
-import { prisma } from '../lib/prismaClient';
- 
-class LikdeRepository {
-  async findLike(userId: number, target: LikeTarget) {
-    const whereCondition =
-      'articleId' in target
-        ? { userId_articleId: { userId, articleId: target.articleId } }
-        : { userId_productId: { userId, productId: target.productId } };
-    return prisma.like.findUnique({
-      where: whereCondition,
-    });
-  }
-  async createLike(userId: number, target: LikeTarget) {
-    return prisma.like.create({ data: { userId, ...target } });
-  }
-  async deleteLike(userId: number, target: LikeTarget) {
-    const whereCondition =
-      'articleId' in target
-        ? { userId_articleId: { userId, articleId: target.articleId } }
-        : { userId_productId: { userId, productId: target.productId } };
-    return prisma.like.delete({
-      where: whereCondition,
-    });
-  }
-  async getLikers(target: LikeTarget) {
-    const whereCondition =
-      'articleId' in target ? { articleId: target.articleId } : { productId: target.productId };
-    return prisma.like.findMany({
-      where: whereCondition,
-      select: { userId: true },
-    });
-  }
-}
- 
-export const likeRepo = new LikdeRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/repositories/notificationRepository.ts.html b/mission9-10/coverage/repositories/notificationRepository.ts.html deleted file mode 100644 index 196af5b36..000000000 --- a/mission9-10/coverage/repositories/notificationRepository.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for repositories/notificationRepository.ts - - - - - - - - - -
-
-

All files / repositories notificationRepository.ts

-
- -
- 37.5% - Statements - 3/8 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/5 -
- - -
- 37.5% - Lines - 3/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -271x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { prisma } from '../lib/prismaClient';
- 
-export class NotificationRepository {
-  async getNotification(userId: number) {
-    return prisma.notification.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } });
-  }
-  async getUnreadCount(userId: number) {
-    return prisma.notification.count({ where: { userId, isRead: false } });
-  }
-  async create(userId: number, message: string) {
-    return prisma.notification.create({ data: { userId, message } });
-  }
-  async findByIds(notificationId: number, userId: number) {
-    return prisma.notification.findFirst({
-      where: { id: notificationId, userId },
-    });
-  }
-  async updateRead(notificationId: number) {
-    return prisma.notification.update({
-      where: { id: notificationId },
-      data: { isRead: true },
-    });
-  }
-}
- 
-export const notificationRepo = new NotificationRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/repositories/productRepository.ts.html b/mission9-10/coverage/repositories/productRepository.ts.html deleted file mode 100644 index d9370bb0f..000000000 --- a/mission9-10/coverage/repositories/productRepository.ts.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - Code coverage report for repositories/productRepository.ts - - - - - - - - - -
-
-

All files / repositories productRepository.ts

-
- -
- 36.36% - Statements - 4/11 -
- - -
- 30% - Branches - 3/10 -
- - -
- 25% - Functions - 2/8 -
- - -
- 36.36% - Lines - 4/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { ProductLikesAndCount } from '../../types/product';
-import { prisma } from '../lib/prismaClient';
-import { Prisma } from '@prisma/client';
-import type { ProductRecentType } from '../../types/product';
- 
-class ProductRepository {
-  async create(data: Prisma.ProductCreateInput) {
-    return prisma.product.create({ data });
-  }
-  async findById(id: number) {
-    return prisma.product.findUniqueOrThrow({ where: { id } });
-  }
-  async findByIdWithLikes(id: number, userId?: number): Promise<ProductLikesAndCount> {
-    return prisma.product.findUniqueOrThrow({
-      where: { id },
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          where: { userId: userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async update(id: number, data: Prisma.ProductUpdateInput) {
-    return prisma.product.update({ where: { id }, data });
-  }
-  async delete(id: number) {
-    return prisma.product.delete({ where: { id } });
-  }
-  async findProductListWithLikes(params: {
-    skip: number;
-    take: number;
-    orderBy: Prisma.ProductOrderByWithRelationInput;
-    where: Prisma.ProductWhereInput;
-    userId?: number;
-  }): Promise<ProductLikesAndCount[]> {
-    return prisma.product.findMany({
-      skip: params.skip,
-      take: params.take,
-      orderBy: params.orderBy,
-      where: params.where,
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          where: { userId: params.userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async count(where: Prisma.ProductWhereInput) {
-    return prisma.product.count({ where });
-  }
-  async findRecentProduct(userId: number, limit: number, type: ProductRecentType) {
-    const whereCondition = type === 'myUploaded' ? { userId } : { likes: { some: { userId } } };
-    return prisma.product.findMany({
-      where: whereCondition,
-      orderBy: { createdAt: 'desc' },
-      take: limit,
-    });
-  }
-}
- 
-export const productRepo = new ProductRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/repositories/userRepository.ts.html b/mission9-10/coverage/repositories/userRepository.ts.html deleted file mode 100644 index babeb8a89..000000000 --- a/mission9-10/coverage/repositories/userRepository.ts.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - Code coverage report for repositories/userRepository.ts - - - - - - - - - -
-
-

All files / repositories userRepository.ts

-
- -
- 33.33% - Statements - 2/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/4 -
- - -
- 33.33% - Lines - 2/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -201x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { prisma } from '../lib/prismaClient';
-import { Prisma } from '@prisma/client';
- 
-class UserRepository {
-  async create(data: Prisma.UserCreateInput) {
-    return prisma.user.create({ data });
-  }
-  async findByEmail(email: string) {
-    return prisma.user.findUnique({ where: { email } });
-  }
-  async update(id: number, data: Prisma.UserUpdateInput) {
-    return prisma.user.update({ where: { id }, data });
-  }
-  async findById(id: number) {
-    return prisma.user.findUnique({ where: { id } });
-  }
-}
- 
-export const userRepo = new UserRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/services/articleService.ts.html b/mission9-10/coverage/services/articleService.ts.html deleted file mode 100644 index 24a14424b..000000000 --- a/mission9-10/coverage/services/articleService.ts.html +++ /dev/null @@ -1,499 +0,0 @@ - - - - - - Code coverage report for services/articleService.ts - - - - - - - - - -
-
-

All files / services articleService.ts

-
- -
- 13.55% - Statements - 8/59 -
- - -
- 0% - Branches - 0/34 -
- - -
- 0% - Functions - 0/10 -
- - -
- 14.03% - Lines - 8/57 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -1391x -  -1x -1x -1x -1x -  -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { articleRepo } from '../repositories/articleRepository';
-import { ArticleLikesAndCount, ArticleListResponse, ArticleResponse } from '../../types/article';
-import { AlreadyLikeError, AlreadyUnlikeError, ForbiddenError } from '../lib/errors/customErrors';
-import { commentRepo } from '../repositories/commentRepository';
-import { likeRepo } from '../repositories/likeRepository';
-import { Prisma, Article, Comment } from '@prisma/client';
-import type { CursorPaginated } from '../../types/cursorPaginated';
-import { notificationService } from './notificationService';
- 
-//객체로 주면 콘트롤러에서 인자순서 상관없이 적용되지만, ()형태로 반환하게되면 인자순서를 서비스형태와 동일하게 넣어야 함
-export class ArticleService {
-  async createArticle(
-    userId: number,
-    title: string,
-    content: string,
-    image?: string | null,
-  ): Promise<Article> {
-    return articleRepo.create({
-      title,
-      content,
-      image,
-      user: { connect: { id: userId } },
-    });
-  }
-  async getArticle(articleId: number, userId?: number): Promise<ArticleResponse> {
-    const article: ArticleLikesAndCount = await articleRepo.findByIdWithLikes(articleId, userId);
-    const { likes, _count, ...articleData } = article;
-    const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined;
-    return { ...articleData, likeCount: _count.likes, isLiked };
-  }
-  async updateArticle(
-    articleId: number,
-    userId: number,
-    data: { title?: string; content?: string; image?: string | null },
-  ): Promise<Article> {
-    const article = await articleRepo.findById(articleId);
-    if (article.userId !== userId) {
-      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
-    }
-    return articleRepo.update(articleId, data);
-  }
-  async deleteArticle(articleId: number, userId: number): Promise<void> {
-    const article = await articleRepo.findById(articleId);
-    if (article.userId !== userId) {
-      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
-    }
-    await articleRepo.delete(articleId);
-  }
-  async getArticleList(
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-    keyword?: string,
-    userId?: number,
-  ): Promise<ArticleListResponse> {
-    const where = {
-      title: keyword ? { contains: keyword } : undefined,
-    };
-    const [totalCount, articles] = await Promise.all([
-      articleRepo.count(where),
-      articleRepo.findArticleListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId,
-      }),
-    ]);
-    const list: ArticleResponse[] = articles.map((m) => {
-      const { _count, likes, ...basicArticleData } = m;
-      const response: ArticleResponse = {
-        ...basicArticleData,
-        likeCount: _count.likes,
-      };
-      if (!userId) {
-        return response;
-      }
-      const isLiked = (likes ?? []).length > 0;
-      return { ...basicArticleData, isLiked, likeCount: _count.likes };
-    });
-    const response: ArticleListResponse = {
-      list,
-      totalCount,
-    };
-    return response;
-  }
-  async createComment(userId: number, articleId: number, content: string): Promise<Comment> {
-    await articleRepo.findById(articleId);
-    const comment = await commentRepo.create({
-      content,
-      user: { connect: { id: userId } },
-      article: { connect: { id: articleId } },
-    });
-    const article = await articleRepo.findById(articleId);
-    if (article.userId !== userId) {
-      await notificationService.createNotification(
-        article.userId,
-        `내 게시글 "${article.title}"에 새로운 댓글이 달렸습니다.`,
-      );
-    }
-    return comment;
-  }
-  async getCommentList(
-    articleId: number,
-    limit: number,
-    cursor?: number,
-  ): Promise<CursorPaginated<Comment>> {
-    await articleRepo.findById(articleId);
-    const commentsWithCursor = await commentRepo.findCommentListQuery({ articleId }, limit, cursor);
-    const comments = commentsWithCursor.slice(0, limit);
-    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
-    const nextCursor = cursorComment ? cursorComment.id : null;
-    return { list: comments, nextCursor };
-  }
-  //like , unlike 둘다 message를 반환해버려서 이게..프로미스로 타입 설정하는 것이 의미가 있는지...로직 수정 생각해봐야할 듯
-  async likeArticle(userId: number, articleId: number): Promise<{ message: string }> {
-    const article = await articleRepo.findById(articleId);
-    const existingLike = await likeRepo.findLike(userId, { articleId });
-    if (existingLike) {
-      throw new AlreadyLikeError();
-    }
-    await likeRepo.createLike(userId, { articleId });
-    return { message: `${article.title}게시글에 좋아요를 눌렀습니다.` };
-  }
-  async unlikeArticle(userId: number, articleId: number): Promise<{ message: string }> {
-    const article = await articleRepo.findById(articleId);
-    try {
-      await likeRepo.deleteLike(userId, { articleId });
-    } catch (error: unknown) {
-      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
-        throw new AlreadyUnlikeError();
-      }
-      throw error;
-    }
-    return { message: `${article.title}게시글의 좋아요를 취소했습니다` };
-  }
-}
-export const articleService = new ArticleService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/services/commentService.ts.html b/mission9-10/coverage/services/commentService.ts.html deleted file mode 100644 index b00d0ec11..000000000 --- a/mission9-10/coverage/services/commentService.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for services/commentService.ts - - - - - - - - - -
-
-

All files / services commentService.ts

-
- -
- 33.33% - Statements - 4/12 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/2 -
- - -
- 33.33% - Lines - 4/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -231x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { commentRepo } from '../repositories/commentRepository';
-import { ForbiddenError } from '../lib/errors/customErrors';
-import { Comment } from '@prisma/client';
- 
-export class CommentService {
-  async updateComment(commentId: number, userId: number, content?: string): Promise<Comment> {
-    const comment = await commentRepo.findById(commentId);
-    if (comment.userId !== userId) {
-      throw new ForbiddenError('해당 댓글을 수정할 권한이 없습니다.');
-    }
-    return commentRepo.update(commentId, content);
-  }
-  async deleteComment(commentId: number, userId: number): Promise<void> {
-    const comment = await commentRepo.findById(commentId);
-    if (comment.userId !== userId) {
-      throw new ForbiddenError('해당 댓글을 삭제할 권한이 없습니다.');
-    }
-    await commentRepo.delete(commentId);
-  }
-}
- 
-export const commnetService = new CommentService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/services/imageService.ts.html b/mission9-10/coverage/services/imageService.ts.html deleted file mode 100644 index 6f8b0cf18..000000000 --- a/mission9-10/coverage/services/imageService.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for services/imageService.ts - - - - - - - - - -
-
-

All files / services imageService.ts

-
- -
- 38.46% - Statements - 5/13 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 38.46% - Lines - 5/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23  -  -1x -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { uploadImageResponse } from '../../types/image';
-import { Request } from 'express';
-import { BadRequestError } from '../lib/errors/customErrors';
-import path from 'path';
-import { STATIC_PATH } from '../lib/constants';
- 
-export class ImageService {
-  buildImageUrl(req: Request): uploadImageResponse {
-    const host = req.get('host');
-    if (!host) {
-      throw new BadRequestError('요청 헤더에 host 정보가 없습니다.');
-    }
-    if (!req.file) {
-      throw new BadRequestError();
-    }
-    const filePath = path.join(host, STATIC_PATH, req.file.filename);
-    const url = `http://${filePath}`;
-    return { url };
-  }
-}
- 
-export const imageService = new ImageService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/services/index.html b/mission9-10/coverage/services/index.html deleted file mode 100644 index 02ae16e1c..000000000 --- a/mission9-10/coverage/services/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - Code coverage report for services - - - - - - - - - -
-
-

All files services

-
- -
- 19.26% - Statements - 47/244 -
- - -
- 2.02% - Branches - 3/148 -
- - -
- 5.12% - Functions - 2/39 -
- - -
- 20.17% - Lines - 46/228 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articleService.ts -
-
13.55%8/590%0/340%0/1014.03%8/57
commentService.ts -
-
33.33%4/120%0/40%0/233.33%4/12
imageService.ts -
-
38.46%5/130%0/40%0/138.46%5/13
notificationService.ts -
-
33.33%5/150%0/20%0/435.71%5/14
productService.ts -
-
28.35%19/676.25%3/4820%2/1027.69%18/65
userService.ts -
-
7.69%6/780%0/560%0/128.95%6/67
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/services/notificationService.ts.html b/mission9-10/coverage/services/notificationService.ts.html deleted file mode 100644 index 92c271ff3..000000000 --- a/mission9-10/coverage/services/notificationService.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for services/notificationService.ts - - - - - - - - - -
-
-

All files / services notificationService.ts

-
- -
- 33.33% - Statements - 5/15 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/4 -
- - -
- 35.71% - Lines - 5/14 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -271x -1x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { UnauthorizedError } from '../lib/errors/customErrors';
-import { notificationRepo } from '../repositories/notificationRepository';
-import { getIO } from '../socket';
-import type { Notification as PrismaNotification } from '@prisma/client';
- 
-export class NotificationService {
-  async getNotifications(userId: number): Promise<PrismaNotification[]> {
-    return notificationRepo.getNotification(userId);
-  }
-  async getUnreadCount(userId: number): Promise<number> {
-    return notificationRepo.getUnreadCount(userId);
-  }
-  async createNotification(userId: number, message: string): Promise<PrismaNotification> {
-    const notification = await notificationRepo.create(userId, message);
-    const io = getIO();
-    io.to(`user-${userId}`).emit('notification', notification);
-    return notification;
-  }
-  async markAsRead(notificationId: number, userId: number): Promise<PrismaNotification> {
-    const notification = await notificationRepo.findByIds(notificationId, userId);
-    if (!notification) throw new UnauthorizedError();
-    return notificationRepo.updateRead(notificationId);
-  }
-}
- 
-export const notificationService = new NotificationService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/services/productService.ts.html b/mission9-10/coverage/services/productService.ts.html deleted file mode 100644 index 56fdc37ce..000000000 --- a/mission9-10/coverage/services/productService.ts.html +++ /dev/null @@ -1,604 +0,0 @@ - - - - - - Code coverage report for services/productService.ts - - - - - - - - - -
-
-

All files / services productService.ts

-
- -
- 28.35% - Statements - 19/67 -
- - -
- 6.25% - Branches - 3/48 -
- - -
- 20% - Functions - 2/10 -
- - -
- 27.69% - Lines - 18/65 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174  -1x -  -  -1x -1x -  -  -1x -1x -1x -1x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -2x -2x -2x -  -  -  -2x -2x -  -  -  -  -2x -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { ProductLikesAndCount } from '../../types/product';
-import { productRepo } from '../repositories/productRepository';
-import { Product } from '@prisma/client';
-import type { ProductListResponse, ProductResponse } from '../../types/product';
-import { ForbiddenError } from '../lib/errors/customErrors';
-import { commentRepo } from '../repositories/commentRepository';
-import type { Comment } from '@prisma/client';
-import type { CursorPaginated } from '../../types/cursorPaginated';
-import { AlreadyLikeError, AlreadyUnlikeError } from '../lib/errors/customErrors';
-import { likeRepo } from '../repositories/likeRepository';
-import { Prisma } from '@prisma/client';
-import { notificationService } from './notificationService';
- 
-//인자 순서가 옵셔널 다음 필수파라미터가 들어오면 컴파일에러가 발생함
-//객체로 묶어 보내기, 이러면 필수인 userid의 파라미터 순서를 바꾸지 않아도 됨
-export class ProductService {
-  async createProduct(params: {
-    name: string;
-    description: string;
-    price: number;
-    tags?: string[];
-    images?: string[];
-    userId: number;
-  }): Promise<Product> {
-    const { name, description, price, tags, images, userId } = params;
-    return productRepo.create({
-      name,
-      description,
-      price,
-      tags: tags ?? [],
-      images: images ?? [],
-      user: { connect: { id: userId } },
-    });
-  }
-  async getProduct(productId: number, userId?: number): Promise<ProductResponse> {
-    const product: ProductLikesAndCount = await productRepo.findByIdWithLikes(productId, userId);
-    const { likes, _count, ...productData } = product;
-    const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined;
-    return { ...productData, likeCount: _count.likes, isLiked };
-  }
-  async updateProduct(
-    productId: number,
-    userId: number,
-    data: {
-      name?: string;
-      description?: string;
-      price?: number;
-      tags?: string[];
-      images?: string[];
-    },
-  ): Promise<Product> {
-    const product = await productRepo.findById(productId);
-    if (product.userId !== userId) {
-      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
-    }
-    const updateProduct = await productRepo.update(productId, data);
-    //undefined가 아니면서 기존가격과 다른 경우
-    if (data.price !== undefined && product.price !== data.price) {
-      const likers = await likeRepo.getLikers({ productId });
-      for (const liker of likers) {
-        if (liker.userId !== userId) {
-          await notificationService.createNotification(
-            liker.userId,
-            `관심 상품 "${product.name}"의 가격이 변동되었습니다.`,
-          );
-        }
-      }
-    }
-    return updateProduct;
-  }
-  async deleteProduct(productId: number, userId: number): Promise<void> {
-    const product = await productRepo.findById(productId);
-    if (product.userId !== userId) {
-      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
-    }
-    await productRepo.delete(productId);
-  }
-  async getProductList(
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-    keyword?: string,
-    userId?: number,
-  ): Promise<ProductListResponse> {
-    const where = keyword
-      ? {
-          OR: [
-            { name: { contains: keyword } },
-            { description: { contains: keyword } },
-            { tags: { has: keyword } },
-          ],
-        }
-      : {};
-    const [totalCount, products] = await Promise.all([
-      productRepo.count(where),
-      productRepo.findProductListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId,
-      }),
-    ]);
-    const list: ProductResponse[] = products.map((m) => {
-      const { _count, likes, ...basicProductData } = m;
-      const response: ProductResponse = {
-        ...basicProductData,
-        likeCount: _count.likes,
-      };
-      Eif (!userId) {
-        return response;
-      }
-      const isLiked = (likes ?? []).length > 0;
-      return { ...basicProductData, isLiked, likeCount: _count.likes };
-    });
-    const response: ProductListResponse = {
-      list,
-      totalCount,
-    };
-    return response;
-  }
-  async createComment(userId: number, productId: number, content: string): Promise<Comment> {
-    await productRepo.findById(productId);
-    const comment = await commentRepo.create({
-      content,
-      user: { connect: { id: userId } },
-      product: { connect: { id: productId } },
-    });
-    const product = await productRepo.findById(productId);
-    if (product.userId !== userId) {
-      await notificationService.createNotification(
-        product.userId,
-        `내 상품 "${product.name}"에 새로운 댓글이 달렸습니다.`,
-      );
-    }
-    return comment;
-  }
-  async getCommentList(
-    productId: number,
-    limit: number,
-    cursor?: number,
-  ): Promise<CursorPaginated<Comment>> {
-    await productRepo.findById(productId);
-    const commentsWithCursor = await commentRepo.findCommentListQuery({ productId }, limit, cursor);
-    const comments = commentsWithCursor.slice(0, limit);
-    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
-    const nextCursor = cursorComment ? cursorComment.id : null;
-    return { list: comments, nextCursor };
-  }
-  async likeProduct(userId: number, productId: number): Promise<{ message: string }> {
-    const product = await productRepo.findById(productId);
-    const existingLike = await likeRepo.findLike(userId, { productId });
-    if (existingLike) {
-      throw new AlreadyLikeError();
-    }
-    await likeRepo.createLike(userId, { productId });
-    return { message: `${product.name}상품에 좋아요를 눌렀습니다.` };
-  }
-  async unlikeProduct(userId: number, productId: number): Promise<{ message: string }> {
-    const product = await productRepo.findById(productId);
-    try {
-      await likeRepo.deleteLike(userId, { productId });
-    } catch (error: unknown) {
-      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
-        throw new AlreadyUnlikeError();
-      }
-      throw error;
-    }
-    return { message: `${product.name}상품의 좋아요를 취소했습니다` };
-  }
-}
- 
-export const productService = new ProductService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/services/userService.ts.html b/mission9-10/coverage/services/userService.ts.html deleted file mode 100644 index 9923c4656..000000000 --- a/mission9-10/coverage/services/userService.ts.html +++ /dev/null @@ -1,721 +0,0 @@ - - - - - - Code coverage report for services/userService.ts - - - - - - - - - -
-
-

All files / services userService.ts

-
- -
- 7.69% - Statements - 6/78 -
- - -
- 0% - Branches - 0/56 -
- - -
- 0% - Functions - 0/12 -
- - -
- 8.95% - Lines - 6/67 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -2131x -1x -  -1x -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import bcrypt from 'bcrypt';
-import { userRepo } from '../repositories/userRepository';
-import type { Prisma, User } from '@prisma/client';
-import { ForbiddenError, UnauthorizedError } from '../lib/errors/customErrors';
-import { generateToken, verifyRefreshToken } from '../lib/token';
-import { productRepo } from '../repositories/productRepository';
-import type { ProductListResponse } from '../../types/product';
-import { ProfileResponse } from '../../types/user';
- 
-class UserService {
-  async register(
-    nickname: string,
-    email: string,
-    password: string,
-    image?: string,
-  ): Promise<Omit<User, 'password'>> {
-    const salt = await bcrypt.genSalt(10);
-    const hashedPassword = await bcrypt.hash(password, salt);
-    const user = await userRepo.create({
-      nickname,
-      email,
-      password: hashedPassword,
-      image,
-    });
-    const { password: _, ...userWithoutPassword } = user;
-    return userWithoutPassword;
-  }
-  async login(
-    email: string,
-    password: string,
-  ): Promise<{ tokens: { accessToken: string; refreshToken: string }; message: string }> {
-    const user = await userRepo.findByEmail(email);
-    if (!user) {
-      //이메일, 비밀번호 검증에 대한 에러를 같은 메세지로 던짐으로써 좀 더 방어적으로 설계
-      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
-    }
-    const isPasswordValid = await bcrypt.compare(password, user.password);
-    if (!isPasswordValid) {
-      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
-    }
-    const tokens = generateToken(user.id);
-    return { tokens, message: '로그인에 성공했습니다.' };
-  }
-  async getProfile(myId: number): Promise<ProfileResponse> {
-    const user = await userRepo.findById(myId);
-    if (!user) throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
-    const { password: _, ...userInfo } = user;
-    const [myProductCount, myLikeProductCount, recentProductsRaw, recentLikedProductsRaw] =
-      await Promise.all([
-        productRepo.count({ userId: myId }),
-        productRepo.count({ likes: { some: { userId: myId } } }),
-        productRepo.findProductListWithLikes({
-          skip: 0,
-          take: 5,
-          orderBy: { createdAt: 'desc' },
-          where: { userId: myId },
-          userId: myId,
-        }),
-        productRepo.findProductListWithLikes({
-          skip: 0,
-          take: 5,
-          orderBy: { createdAt: 'desc' },
-          where: { likes: { some: { userId: myId } } },
-          userId: myId,
-        }),
-      ]);
-    const myRecentProducts = recentProductsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    const myRecentLikeProducts = recentLikedProductsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    return {
-      user: userInfo,
-      myProducts: {
-        list: myRecentProducts,
-        totalCount: myProductCount,
-      },
-      myLikedProducts: {
-        list: myRecentLikeProducts,
-        totalCount: myLikeProductCount,
-      },
-    };
-  }
- 
-  async updateProfile(
-    userId: number,
-    nickname?: string,
-    email?: string,
-    image?: string | null,
-  ): Promise<Omit<User, 'password'>> {
-    const data: Prisma.UserUpdateInput = {};
-    if (nickname !== undefined) data.nickname = nickname;
-    if (email !== undefined) data.email = email;
-    if (image !== undefined) data.image = image;
-    const update = await userRepo.update(userId, data);
-    const { password: _, ...userWithoutPassword } = update;
-    return userWithoutPassword;
-  }
-  async patchPassword(userId: number, currentPassword: string, newPassword: string): Promise<void> {
-    const user = await userRepo.findById(userId);
-    if (!user) {
-      throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
-    }
-    const isPasswordValid = await bcrypt.compare(currentPassword, user.password);
-    if (!isPasswordValid) {
-      throw new ForbiddenError('현재 비밀번호가 올바르지 않습니다.');
-    }
-    const salt = await bcrypt.genSalt(10);
-    const hashedNewPassword = await bcrypt.hash(newPassword, salt);
-    await userRepo.update(userId, { password: hashedNewPassword });
-  }
-  async getMyProductList(
-    myId: number,
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-    keyword?: string,
-  ): Promise<ProductListResponse> {
-    const where = {
-      userId: myId,
-      ...(keyword
-        ? {
-            OR: [
-              { name: { contains: keyword } },
-              { description: { contains: keyword } },
-              { tags: { has: keyword } },
-            ],
-          }
-        : {}),
-    };
-    const [totalCount, productsRaw] = await Promise.all([
-      productRepo.count(where),
-      productRepo.findProductListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId: myId,
-      }),
-    ]);
-    const list = productsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    return { list, totalCount };
-  }
-  async refreshToken(refreshToken: string) {
-    let userId: number;
-    try {
-      const payload = verifyRefreshToken(refreshToken);
-      userId = payload.userId;
-    } catch (error) {
-      throw new UnauthorizedError('유효하지 않은 리프레시 토큰입니다.');
-    }
-    const user = await userRepo.findById(userId);
-    if (!user) {
-      throw new UnauthorizedError('존재하지 않는 사용자입니다.');
-    }
-    const tokens = generateToken(user.id);
-    return tokens;
-  }
-  async getMyLikedProducts(
-    myId: number,
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-  ): Promise<ProductListResponse> {
-    const where = {
-      likes: {
-        some: {
-          userId: myId,
-        },
-      },
-    };
-    const [totalCount, productsRaw] = await Promise.all([
-      productRepo.count(where),
-      productRepo.findProductListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId: myId,
-      }),
-    ]);
-    const list = productsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    return { list, totalCount };
-  }
-}
- 
-export const userService = new UserService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/sort-arrow-sprite.png b/mission9-10/coverage/sort-arrow-sprite.png deleted file mode 100644 index 6ed68316eb3f65dec9063332d2f69bf3093bbfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc diff --git a/mission9-10/coverage/sorter.js b/mission9-10/coverage/sorter.js deleted file mode 100644 index 4ed70ae5a..000000000 --- a/mission9-10/coverage/sorter.js +++ /dev/null @@ -1,210 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - - // Try to create a RegExp from the searchValue. If it fails (invalid regex), - // it will be treated as a plain text search - let searchRegex; - try { - searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive - } catch (error) { - searchRegex = null; - } - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - let isMatch = false; - - if (searchRegex) { - // If a valid regex was created, use it for matching - isMatch = searchRegex.test(row.textContent); - } else { - // Otherwise, fall back to the original plain text search - isMatch = row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()); - } - - row.style.display = isMatch ? '' : 'none'; - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/mission9-10/coverage/src/app.ts.html b/mission9-10/coverage/src/app.ts.html deleted file mode 100644 index ebbdc13c5..000000000 --- a/mission9-10/coverage/src/app.ts.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - Code coverage report for src/app.ts - - - - - - - - - -
-
-

All files / src app.ts

-
- -
- 100% - Statements - 26/26 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 26/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -325x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -  -5x -  -5x -5x -5x -5x -  -5x -5x -5x -5x -5x -5x -  -5x -5x -  -5x - 
import express from 'express';
-import cors from 'cors';
-import path from 'path';
-import { PUBLIC_PATH, STATIC_PATH } from './lib/constants';
-import articlesRouter from './routers/articlesRouter';
-import productsRouter from './routers/productsRouter';
-import commentsRouter from './routers/commentsRouter';
-import imagesRouter from './routers/imagesRouter';
-import usersRouter from './routers/usersRouter';
-import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController';
-import cookieParser from 'cookie-parser';
-import notificationRouter from './routers/notificationRouter';
- 
-const app = express();
- 
-app.use(cors());
-app.use(cookieParser());
-app.use(express.json());
-app.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH)));
- 
-app.use('/articles', articlesRouter);
-app.use('/products', productsRouter);
-app.use('/comments', commentsRouter);
-app.use('/images', imagesRouter);
-app.use('/users', usersRouter);
-app.use('/notifications', notificationRouter);
- 
-app.use(defaultNotFoundHandler);
-app.use(globalErrorHandler);
- 
-export default app;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/articlesController.ts.html b/mission9-10/coverage/src/controllers/articlesController.ts.html deleted file mode 100644 index ee8c380d1..000000000 --- a/mission9-10/coverage/src/controllers/articlesController.ts.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - Code coverage report for src/controllers/articlesController.ts - - - - - - - - - -
-
-

All files / src/controllers articlesController.ts

-
- -
- 90.76% - Statements - 59/65 -
- - -
- 60% - Branches - 12/20 -
- - -
- 100% - Functions - 9/9 -
- - -
- 90.76% - Lines - 59/65 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -985x -5x -5x -5x -  -  -  -  -5x -  -5x -  -  -5x -1x -1x -1x -  -  -1x -1x -  -  -5x -2x -2x -2x -1x -  -  -5x -2x -2x -2x -2x -  -  -2x -1x -  -  -5x -2x -2x -2x -  -  -2x -1x -  -  -  -5x -8x -6x -6x -6x -  -  -5x -1x -1x -1x -1x -  -  -1x -1x -  -  -5x -2x -2x -2x -2x -  -  -5x -1x -1x -1x -  -  -1x -1x -  -  -  -5x -1x -1x -1x -  -  -1x -1x -  - 
import { create } from 'superstruct';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { IdParamsStruct } from '../structs/commonStructs';
-import {
-  CreateArticleBodyStruct,
-  UpdateArticleBodyStruct,
-  GetArticleListParamsStruct,
-} from '../structs/articlesStructs';
-import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
-import { Request, Response } from 'express';
-import { articleService } from '../services/articleService';
- 
-//게시물 생성
-export async function createArticle(req: Request, res: Response) {
-  const { title, content, image } = create(req.body, CreateArticleBodyStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const article = await articleService.createArticle(user.id, title, content, image);
-  return res.status(201).send(article);
-}
-// 게시글 조회(좋아요 포함)
-export async function getArticle(req: Request, res: Response) {
-  const { id } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  const article = await articleService.getArticle(id, user?.id);
-  return res.send(article);
-}
-//게시물 수정
-export async function updateArticle(req: Request, res: Response) {
-  const { id } = create(req.params, IdParamsStruct);
-  const data = create(req.body, UpdateArticleBodyStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const updated = await articleService.updateArticle(id, user.id, data);
-  return res.send(updated);
-}
-//게시물 삭제
-export async function deleteArticle(req: Request, res: Response) {
-  const { id } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  await articleService.deleteArticle(id, user.id);
-  return res.status(204).send();
-}
- 
-//게시글 목록 조회(좋아요 포함)
-export async function getArticleList(req: Request, res: Response) {
-  const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct);
-  const user = req.user;
-  const articles = await articleService.getArticleList(page, pageSize, orderBy, keyword, user?.id);
-  return res.send(articles);
-}
-//댓글 등록
-export async function createComment(req: Request, res: Response) {
-  const { id: articleId } = create(req.params, IdParamsStruct);
-  const { content } = create(req.body, CreateCommentBodyStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const comment = await articleService.createComment(user.id, articleId, content);
-  return res.status(201).send(comment);
-}
-//댓글 목록 조회
-export async function getCommentList(req: Request, res: Response) {
-  const { id: articleId } = create(req.params, IdParamsStruct);
-  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
-  const commnetsList = await articleService.getCommentList(articleId, limit, cursor);
-  return res.send(commnetsList);
-}
-//게시글 좋아요 등록
-export async function likeArticle(req: Request, res: Response) {
-  const { id: articleId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const articleLike = await articleService.likeArticle(user.id, articleId);
-  return res.status(200).send(articleLike);
-}
- 
-//게시글 좋아요 취소
-export async function unlikeArticle(req: Request, res: Response) {
-  const { id: articleId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const articleUnlike = await articleService.unlikeArticle(user.id, articleId);
-  return res.status(200).send(articleUnlike);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/commentsController.ts.html b/mission9-10/coverage/src/controllers/commentsController.ts.html deleted file mode 100644 index 9ef895178..000000000 --- a/mission9-10/coverage/src/controllers/commentsController.ts.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - Code coverage report for src/controllers/commentsController.ts - - - - - - - - - -
-
-

All files / src/controllers commentsController.ts

-
- -
- 35% - Statements - 7/20 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/2 -
- - -
- 35% - Lines - 7/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -305x -5x -5x -5x -  -5x -  -  -5x -  -  -  -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  - 
import { create } from 'superstruct';
-import { UpdateCommentBodyStruct } from '../structs/commentsStruct';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { IdParamsStruct } from '../structs/commonStructs';
-import { Request, Response } from 'express';
-import { commnetService } from '../services/commentService';
- 
-//댓글 수정
-export async function updateComment(req: Request, res: Response) {
-  const { id: commentId } = create(req.params, IdParamsStruct);
-  const { content } = create(req.body, UpdateCommentBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const updatedComment = await commnetService.updateComment(commentId, user.id, content);
-  return res.send(updatedComment);
-}
- 
-//댓글 삭제
-export async function deleteComment(req: Request, res: Response) {
-  const { id: commentId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  await commnetService.deleteComment(commentId, user.id);
-  return res.status(204).send();
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/errorController.ts.html b/mission9-10/coverage/src/controllers/errorController.ts.html deleted file mode 100644 index 86af6b171..000000000 --- a/mission9-10/coverage/src/controllers/errorController.ts.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Code coverage report for src/controllers/errorController.ts - - - - - - - - - -
-
-

All files / src/controllers errorController.ts

-
- -
- 24% - Statements - 6/25 -
- - -
- 0% - Branches - 0/18 -
- - -
- 0% - Functions - 0/2 -
- - -
- 24% - Lines - 6/25 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -471x -1x -  -  -  -  -  -1x -  -1x -  -  -1x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { StructError } from 'superstruct';
-import {
-  NotFoundError,
-  BadRequestError,
-  ForbiddenError,
-  UnauthorizedError,
-} from '../lib/errors/customErrors';
-import { Prisma } from '@prisma/client';
-import { Request, Response, NextFunction } from 'express';
-import { isSyntaxJsonError } from '../lib/errors/errorUtils';
- 
-//404 처리 미들웨어
-export function defaultNotFoundHandler(req: Request, res: Response, next: NextFunction) {
-  return res.status(404).send({ message: '존재하지 않습니다' });
-}
-//전역 에러 처리 미들웨어(400,401,403,404,500)
-export function globalErrorHandler(err: unknown, req: Request, res: Response, next: NextFunction) {
-  if (err instanceof StructError || err instanceof BadRequestError) {
-    return res.status(400).send({ message: '잘못된 요청입니다' });
-  }
-  if (isSyntaxJsonError(err)) {
-    return res.status(400).send({ message: '잘못된 요청입니다' });
-  }
-  if (err instanceof UnauthorizedError) {
-    return res.status(401).json({ message: err.message });
-  }
-  if (err instanceof ForbiddenError) {
-    return res.status(403).json({ message: err.message });
-  }
-  if (err instanceof NotFoundError) {
-    return res.status(404).send({ message: err.message });
-  }
-  //프리즈마 코드 에러, 그 외 known 에러 500처리
-  if (err instanceof Prisma.PrismaClientKnownRequestError) {
-    if (err.code === 'P2025') {
-      return res.status(404).json({ message: '존재하지 않습니다' });
-    }
-    if (err.code === 'P2002') {
-      return res.status(400).json({ message: '잘못된 요청입니다' });
-    }
-    return res.status(500).json({ message: '데이터 처리 중 오류가 발생했습니다' });
-  }
- 
-  console.error(err);
-  return res.status(500).send({ message: '데이터 처리 중 오류가 발생했습니다' });
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/imagesController.ts.html b/mission9-10/coverage/src/controllers/imagesController.ts.html deleted file mode 100644 index 9de297b28..000000000 --- a/mission9-10/coverage/src/controllers/imagesController.ts.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - Code coverage report for src/controllers/imagesController.ts - - - - - - - - - -
-
-

All files / src/controllers imagesController.ts

-
- -
- 50% - Statements - 10/20 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/4 -
- - -
- 50% - Lines - 10/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -431x -1x -1x -1x -1x -  -1x -  -1x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  - 
import multer from 'multer';
-import path from 'path';
-import { v4 as uuidv4 } from 'uuid';
-import { PUBLIC_PATH } from '../lib/constants';
-import { BadRequestError } from '../lib/errors/customErrors';
-import { Request, Response } from 'express';
-import { imageService } from '../services/imageService';
- 
-const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];
-const FILE_SIZE_LIMIT = 5 * 1024 * 1024;
- 
-//이미지 업로드 설정
-export const upload = multer({
-  storage: multer.diskStorage({
-    destination(req, file, cb) {
-      cb(null, PUBLIC_PATH);
-    },
-    filename(req, file, cb) {
-      const ext = path.extname(file.originalname);
-      const filename = `${uuidv4()}${ext}`;
-      cb(null, filename);
-    },
-  }),
- 
-  limits: {
-    fileSize: FILE_SIZE_LIMIT,
-  },
- 
-  fileFilter: function (req, file, cb) {
-    if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) {
-      const err = new BadRequestError('Only png, jpeg, and jpg are allowed');
-      return cb(err);
-    }
- 
-    cb(null, true);
-  },
-});
-//이미지 업로드 핸들러
-export async function uploadImage(req: Request, res: Response) {
-  const response = imageService.buildImageUrl(req);
-  return res.send(response);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/index.html b/mission9-10/coverage/src/controllers/index.html deleted file mode 100644 index 68a331014..000000000 --- a/mission9-10/coverage/src/controllers/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/controllers - - - - - - - - - -
-
-

All files src/controllers

-
- -
- 70.68% - Statements - 164/232 -
- - -
- 41.93% - Branches - 26/62 -
- - -
- 68.75% - Functions - 22/32 -
- - -
- 70.68% - Lines - 164/232 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articlesController.ts -
-
90.76%59/6560%12/20100%9/990.76%59/65
commentsController.ts -
-
35%7/200%0/40%0/235%7/20
notificationController.ts -
-
30.43%7/230%0/60%0/330.43%7/23
productsController.ts -
-
90.76%59/6560%12/20100%9/990.76%59/65
usersController.ts -
-
54.23%32/5916.66%2/1244.44%4/954.23%32/59
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/notificationController.ts.html b/mission9-10/coverage/src/controllers/notificationController.ts.html deleted file mode 100644 index 3432fbb90..000000000 --- a/mission9-10/coverage/src/controllers/notificationController.ts.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - Code coverage report for src/controllers/notificationController.ts - - - - - - - - - -
-
-

All files / src/controllers notificationController.ts

-
- -
- 30.43% - Statements - 7/23 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/3 -
- - -
- 30.43% - Lines - 7/23 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34  -5x -5x -5x -5x -  -5x -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  - 
import { Request, Response } from 'express';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { notificationService } from '../services/notificationService';
-import { IdParamsStruct } from '../structs/commonStructs';
-import { create } from 'superstruct';
- 
-export async function getNotifications(req: Request, res: Response) {
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const notifications = await notificationService.getNotifications(user.id);
-  return res.send(notifications);
-}
- 
-export async function getUnreadCount(req: Request, res: Response) {
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const count = await notificationService.getUnreadCount(user.id);
-  return res.send({ count });
-}
- 
-export async function markAsRead(req: Request, res: Response) {
-  const { id: notificationId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const notification = await notificationService.markAsRead(notificationId, user.id);
-  return res.send(notification);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/productsController.ts.html b/mission9-10/coverage/src/controllers/productsController.ts.html deleted file mode 100644 index 11058dda7..000000000 --- a/mission9-10/coverage/src/controllers/productsController.ts.html +++ /dev/null @@ -1,394 +0,0 @@ - - - - - - Code coverage report for src/controllers/productsController.ts - - - - - - - - - -
-
-

All files / src/controllers productsController.ts

-
- -
- 90.76% - Statements - 59/65 -
- - -
- 60% - Branches - 12/20 -
- - -
- 100% - Functions - 9/9 -
- - -
- 90.76% - Lines - 59/65 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -1045x -5x -5x -  -  -  -  -5x -5x -  -5x -  -  -5x -1x -1x -1x -  -  -1x -  -  -  -  -  -  -  -1x -  -  -5x -2x -2x -2x -1x -  -  -5x -2x -2x -2x -2x -  -  -2x -1x -  -  -5x -2x -2x -2x -  -  -2x -1x -  -  -5x -12x -10x -10x -10x -  -  -  -5x -1x -1x -1x -1x -  -  -1x -1x -  -  -5x -2x -2x -2x -2x -  -  -5x -2x -2x -2x -  -  -2x -2x -  -  -5x -1x -1x -1x -  -  -1x -1x -  - 
import { create } from 'superstruct';
-import { IdParamsStruct } from '../structs/commonStructs';
-import {
-  CreateProductBodyStruct,
-  GetProductListParamsStruct,
-  UpdateProductBodyStruct,
-} from '../structs/productsStruct';
-import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { Request, Response } from 'express';
-import { productService } from '../services/productService';
- 
-//상품 등록
-export async function createProduct(req: Request, res: Response) {
-  const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const product = await productService.createProduct({
-    name,
-    description,
-    price,
-    tags,
-    images,
-    userId: user.id,
-  });
-  return res.status(201).send(product);
-}
-//특정 상품 조회(좋아요 포함)
-export async function getProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  const product = await productService.getProduct(productId, user?.id);
-  return res.send(product);
-}
-//상품 수정
-export async function updateProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const data = create(req.body, UpdateProductBodyStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const updatedProduct = await productService.updateProduct(productId, user.id, data);
-  return res.send(updatedProduct);
-}
-//상품 삭제
-export async function deleteProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  await productService.deleteProduct(productId, user.id);
-  return res.status(204).send();
-}
-//상품 목록 조회(좋아요 포함)
-export async function getProductList(req: Request, res: Response) {
-  const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct);
-  const user = req.user;
-  const products = await productService.getProductList(page, pageSize, orderBy, keyword, user?.id);
-  return res.send(products);
-}
- 
-//댓글 등록
-export async function createComment(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const { content } = create(req.body, CreateCommentBodyStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const comment = await productService.createComment(user.id, productId, content);
-  return res.status(201).send(comment);
-}
-//상품 댓글 목록 조회
-export async function getCommentList(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
-  const commentList = await productService.getCommentList(productId, limit, cursor);
-  return res.send(commentList);
-}
-//상품 좋아요 등록
-export async function likeProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const productLike = await productService.likeProduct(user.id, productId);
-  return res.status(200).send(productLike);
-}
-//상품 좋아요 취소
-export async function unlikeProduct(req: Request, res: Response) {
-  const { id: productId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const productUnliked = await productService.unlikeProduct(user.id, productId);
-  return res.send(productUnliked);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/controllers/usersController.ts.html b/mission9-10/coverage/src/controllers/usersController.ts.html deleted file mode 100644 index 543581ad1..000000000 --- a/mission9-10/coverage/src/controllers/usersController.ts.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - Code coverage report for src/controllers/usersController.ts - - - - - - - - - -
-
-

All files / src/controllers usersController.ts

-
- -
- 54.23% - Statements - 32/59 -
- - -
- 16.66% - Branches - 2/12 -
- - -
- 44.44% - Functions - 4/9 -
- - -
- 54.23% - Lines - 32/59 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -935x -  -  -  -  -  -  -  -5x -5x -5x -  -5x -5x -  -  -5x -22x -21x -20x -  -  -5x -18x -18x -17x -17x -  -  -5x -  -  -  -  -5x -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  -  -5x -  -  -  -  -  -  -  -  -  -5x -1x -1x -1x -  -  -1x -1x -  -  -5x -  -  -  -  -  -  -  -  -  -5x -1x -1x -1x -  -  -1x -1x -  - 
import {
-  CreateUserBodyStruct,
-  UpdateUserBodyStruct,
-  LoginBodyStruct,
-  ChangePasswordBodyStruct,
-  GetMyProductListParamsStruct,
-  GetMyLikedProductListParamsStruct,
-} from '../structs/usersStructs';
-import { create } from 'superstruct';
-import { clearTokenCookies, setTokenCookies } from '../lib/cookies';
-import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants';
-import { Request, Response } from 'express';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { userService } from '../services/userService';
- 
-//회원가입
-export async function register(req: Request, res: Response) {
-  const { nickname, email, password, image } = create(req.body, CreateUserBodyStruct);
-  const user = await userService.register(nickname, email, password, image);
-  return res.status(201).send(user);
-}
-//로그인
-export async function login(req: Request, res: Response) {
-  const { email, password } = create(req.body, LoginBodyStruct);
-  const result = await userService.login(email, password);
-  setTokenCookies(res, result.tokens.accessToken, result.tokens.refreshToken);
-  return res.status(200).send({ message: result.message });
-}
-//로그아웃
-export async function logout(req: Request, res: Response) {
-  clearTokenCookies(res);
-  return res.status(200).send({ message: '로그아웃에 성공했습니다.' });
-}
-//내 프로필 조회 (최근 등록한 상품 5개, 최근 좋아요한 상품 5개 포함)
-export async function getProfile(req: Request, res: Response) {
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const profile = await userService.getProfile(user.id);
-  return res.send(profile);
-}
-//내 프로필 수정
-export async function updateProfile(req: Request, res: Response) {
-  const { nickname, email, image } = create(req.body, UpdateUserBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const update = await userService.updateProfile(user.id, nickname, email, image);
-  return res.send(update);
-}
-//내 비밀번호 변경
-export async function patchPassword(req: Request, res: Response) {
-  const { currentPassword, newPassword } = create(req.body, ChangePasswordBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  await userService.patchPassword(user.id, currentPassword, newPassword);
-  return res.status(200).send({ message: '비밀번호가 성공적으로 변경되었습니다.' });
-}
-//내가 등록한 상품 목록 조회 (상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능)
-export async function getMyProductList(req: Request, res: Response) {
-  const { page, pageSize, orderBy, keyword } = create(req.query, GetMyProductListParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const myProducts = await userService.getMyProductList(user.id, page, pageSize, orderBy, keyword);
-  return res.send(myProducts);
-}
-//토큰 갱신(리프레시)
-export async function refreshToken(req: Request, res: Response) {
-  const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME];
-  if (!refreshToken) {
-    throw new UnauthorizedError('리프레시 토큰이 없습니다.');
-  }
-  const tokens = await userService.refreshToken(refreshToken);
-  setTokenCookies(res, tokens.accessToken, tokens.refreshToken);
-  return res.status(200).send({ message: '토큰이 성공적으로 갱신되었습니다.' });
-}
-//내가 좋아요한 상품 목록 조회(상품이 꽤 많이 있을 경우 페이징 처리)
-export async function getMyLikedProducts(req: Request, res: Response) {
-  const { page, pageSize, orderBy } = create(req.query, GetMyLikedProductListParamsStruct);
-  const user = req.user;
-  Iif (!user) {
-    throw new UnauthorizedError();
-  }
-  const myLikedProducts = await userService.getMyLikedProducts(user.id, page, pageSize, orderBy);
-  return res.send(myLikedProducts);
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/index.html b/mission9-10/coverage/src/index.html deleted file mode 100644 index e19a66f1f..000000000 --- a/mission9-10/coverage/src/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src - - - - - - - - - -
-
-

All files src

-
- -
- 100% - Statements - 26/26 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 26/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
app.ts -
-
100%26/26100%0/0100%0/0100%26/26
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/constants.ts.html b/mission9-10/coverage/src/lib/constants.ts.html deleted file mode 100644 index e54059ce3..000000000 --- a/mission9-10/coverage/src/lib/constants.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for src/lib/constants.ts - - - - - - - - - -
-
-

All files / src/lib constants.ts

-
- -
- 100% - Statements - 20/20 -
- - -
- 50% - Branches - 4/8 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 20/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -271x -1x -  -1x -1x -1x -1x -1x -  -1x -  -1x -1x -1x -  -  -1x -1x -1x -1x -1x -1x -1x -1x -1x -  - 
import dotenv from 'dotenv';
-dotenv.config();
- 
-const DATABASE_URL = process.env.DATABASE_URL;
-const NODE_ENV = process.env.NODE_ENV || 'development';
-const PORT = process.env.PORT || 3000;
-const PUBLIC_PATH = 'public';
-const STATIC_PATH = '/public';
-const JWT_ACCESS_TOKEN_SECRET =
-  process.env.JWT_ACCESS_TOKEN_SECRET || 'your_jwt_access_token_secret';
-const JWT_REFRESH_TOKEN_SECRET =
-  process.env.JWT_REFRESH_TOKEN_SECRET || 'your_jwt_refresh_token_secret';
-const ACCESS_TOKEN_COOKIE_NAME = 'access-token';
-const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token';
- 
-export {
-  DATABASE_URL,
-  NODE_ENV,
-  PORT,
-  PUBLIC_PATH,
-  STATIC_PATH,
-  JWT_ACCESS_TOKEN_SECRET,
-  JWT_REFRESH_TOKEN_SECRET,
-  ACCESS_TOKEN_COOKIE_NAME,
-  REFRESH_TOKEN_COOKIE_NAME,
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/cookies.ts.html b/mission9-10/coverage/src/lib/cookies.ts.html deleted file mode 100644 index b4382c51e..000000000 --- a/mission9-10/coverage/src/lib/cookies.ts.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - Code coverage report for src/lib/cookies.ts - - - - - - - - - -
-
-

All files / src/lib cookies.ts

-
- -
- 42.85% - Statements - 3/7 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 42.85% - Lines - 3/7 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -291x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  - 
import { NODE_ENV, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from './constants';
-import { Response } from 'express';
- 
-export function setTokenCookies(res: Response, accessToken: string, refreshToken: string) {
-  res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-    maxAge: 1 * 60 * 60 * 1000, // 1시간
-  });
-  res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-    maxAge: 7 * 24 * 60 * 60 * 1000, // 7일
-    path: '/users/refresh',
-  });
-}
- 
-export function clearTokenCookies(res: Response) {
-  res.clearCookie(ACCESS_TOKEN_COOKIE_NAME, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-  });
-  res.clearCookie(REFRESH_TOKEN_COOKIE_NAME, {
-    httpOnly: true,
-    secure: NODE_ENV === 'production',
-    path: '/users/refresh',
-  });
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/errors/customErrors.ts.html b/mission9-10/coverage/src/lib/errors/customErrors.ts.html deleted file mode 100644 index 7992d9e0a..000000000 --- a/mission9-10/coverage/src/lib/errors/customErrors.ts.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Code coverage report for src/lib/errors/customErrors.ts - - - - - - - - - -
-
-

All files / src/lib/errors customErrors.ts

-
- -
- 38.88% - Statements - 7/18 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/7 -
- - -
- 38.88% - Lines - 7/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -471x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  - 
export class BaseError extends Error {
-  statusCode: number;
-  constructor(message: string, statusCode: number) {
-    super(message);
-    this.name = new.target.name;
-    this.statusCode = statusCode;
-  }
-}
- 
-export class NotFoundError extends BaseError {
-  constructor(message = '존재하지 않습니다') {
-    super(message, 404);
-  }
-}
- 
-export class UnauthorizedError extends BaseError {
-  constructor(message = '인증이 필요합니다') {
-    super(message, 401);
-  }
-}
- 
-export class BadRequestError extends BaseError {
-  constructor(message = '잘못된 요청입니다') {
-    super(message, 400);
-  }
-}
- 
-export class ForbiddenError extends BaseError {
-  constructor(message = '비밀번호가 틀렸습니다') {
-    super(message, 403);
-  }
-}
- 
-export class AlreadyLikeError extends ForbiddenError {
-  constructor(message = '이미 좋아요를 눌렀습니다.') {
-    super(message);
-    this.name = new.target.name;
-  }
-}
- 
-export class AlreadyUnlikeError extends ForbiddenError {
-  constructor(message = '좋아요가 존재하지 않습니다.') {
-    super(message);
-    this.name = new.target.name;
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/errors/errorUtils.ts.html b/mission9-10/coverage/src/lib/errors/errorUtils.ts.html deleted file mode 100644 index 27ac22c0a..000000000 --- a/mission9-10/coverage/src/lib/errors/errorUtils.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/lib/errors/errorUtils.ts - - - - - - - - - -
-
-

All files / src/lib/errors errorUtils.ts

-
- -
- 20% - Statements - 1/5 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 25% - Lines - 1/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -  -  -  -1x -  -  -  -  -  -  -  - 
interface SyntaxJsonError extends SyntaxError {
-  status?: number;
-  body?: unknown;
-}
- 
-export function isSyntaxJsonError(err: unknown): err is SyntaxJsonError {
-  if (!(err instanceof SyntaxError)) return false;
-  const e = err as Partial<SyntaxJsonError>;
-  return typeof e.status === 'number' && 'body' in e;
-}
-// Partial<SyntaxJsonError>;
-// 얘는 SyntaxJsonError의 일부 프로퍼티만 가지고 있을 수도 있어”
-// 라고 TS에게 알려서 e.status, e.body 같은 속성 접근을 가능하게 해주는 장치
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/errors/index.html b/mission9-10/coverage/src/lib/errors/index.html deleted file mode 100644 index 2bab3a8f0..000000000 --- a/mission9-10/coverage/src/lib/errors/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/lib/errors - - - - - - - - - -
-
-

All files src/lib/errors

-
- -
- 34.78% - Statements - 8/23 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/8 -
- - -
- 36.36% - Lines - 8/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
customErrors.ts -
-
38.88%7/180%0/60%0/738.88%7/18
errorUtils.ts -
-
20%1/50%0/40%0/125%1/4
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/index.html b/mission9-10/coverage/src/lib/index.html deleted file mode 100644 index 1cd991112..000000000 --- a/mission9-10/coverage/src/lib/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/lib - - - - - - - - - -
-
-

All files src/lib

-
- -
- 74.46% - Statements - 35/47 -
- - -
- 50% - Branches - 4/8 -
- - -
- 37.5% - Functions - 3/8 -
- - -
- 73.91% - Lines - 34/46 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
constants.ts -
-
100%20/2050%4/8100%0/0100%20/20
cookies.ts -
-
42.85%3/7100%0/00%0/242.85%3/7
prismaClient.ts -
-
100%2/2100%0/0100%0/0100%2/2
token.ts -
-
41.66%5/12100%0/00%0/341.66%5/12
withAsync.ts -
-
83.33%5/6100%0/0100%3/380%4/5
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/prismaClient.ts.html b/mission9-10/coverage/src/lib/prismaClient.ts.html deleted file mode 100644 index 2b46ffc58..000000000 --- a/mission9-10/coverage/src/lib/prismaClient.ts.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - Code coverage report for src/lib/prismaClient.ts - - - - - - - - - -
-
-

All files / src/lib prismaClient.ts

-
- -
- 100% - Statements - 2/2 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 2/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -41x -  -1x - 
import { PrismaClient } from '@prisma/client';
- 
-export const prisma = new PrismaClient();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/token.ts.html b/mission9-10/coverage/src/lib/token.ts.html deleted file mode 100644 index 7f237a0d4..000000000 --- a/mission9-10/coverage/src/lib/token.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/lib/token.ts - - - - - - - - - -
-
-

All files / src/lib token.ts

-
- -
- 41.66% - Statements - 5/12 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/3 -
- - -
- 41.66% - Lines - 5/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -231x -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -1x -  -  -  - 
import jwt, { JwtPayload } from 'jsonwebtoken';
-import { JWT_ACCESS_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET } from './constants';
- 
-interface TokenPayload extends JwtPayload {
-  id: number;
-}
- 
-export function generateToken(userId: number) {
-  const accessToken = jwt.sign({ id: userId }, JWT_ACCESS_TOKEN_SECRET, { expiresIn: '1h' });
-  const refreshToken = jwt.sign({ id: userId }, JWT_REFRESH_TOKEN_SECRET, { expiresIn: '1d' });
-  return { accessToken, refreshToken };
-}
- 
-export function verifyAccessToken(token: string) {
-  const decoded = jwt.verify(token, JWT_ACCESS_TOKEN_SECRET) as TokenPayload;
-  return { userId: decoded.id };
-}
- 
-export function verifyRefreshToken(token: string) {
-  const decoded = jwt.verify(token, JWT_REFRESH_TOKEN_SECRET) as TokenPayload;
-  return { userId: decoded.id };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/lib/withAsync.ts.html b/mission9-10/coverage/src/lib/withAsync.ts.html deleted file mode 100644 index 809cf0593..000000000 --- a/mission9-10/coverage/src/lib/withAsync.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/lib/withAsync.ts - - - - - - - - - -
-
-

All files / src/lib withAsync.ts

-
- -
- 83.33% - Statements - 5/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 3/3 -
- - -
- 80% - Lines - 4/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -1x -  -  -33x -2x -2x -  -  -  -  -  - 
import type { Request, Response, NextFunction, RequestHandler } from 'express';
- 
-export function withAsync<T = unknown>(
-  handler: (req: Request, res: Response, next: NextFunction) => Promise<T>,
-): RequestHandler {
-  return async (req, res, next) => {
-    try {
-      await handler(req, res, next);
-    } catch (e) {
-      next(e);
-    }
-  };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/middlewares/authenticate.ts.html b/mission9-10/coverage/src/middlewares/authenticate.ts.html deleted file mode 100644 index 357387e1e..000000000 --- a/mission9-10/coverage/src/middlewares/authenticate.ts.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - Code coverage report for src/middlewares/authenticate.ts - - - - - - - - - -
-
-

All files / src/middlewares authenticate.ts

-
- -
- 55% - Statements - 11/20 -
- - -
- 42.85% - Branches - 3/7 -
- - -
- 100% - Functions - 3/3 -
- - -
- 52.63% - Lines - 10/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -311x -1x -1x -1x -  -  -  -26x -2x -2x -2x -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { prisma } from '../lib/prismaClient';
-import { verifyAccessToken } from '../lib/token';
-import { ACCESS_TOKEN_COOKIE_NAME } from '../lib/constants';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { NextFunction, Request, Response } from 'express';
- 
-function authenticate(options = { optional: false }) {
-  return async (req: Request, res: Response, next: NextFunction) => {
-    const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME];
-    Eif (!accessToken) {
-      Eif (options.optional) {
-        return next();
-      }
-      return next(new UnauthorizedError());
-    }
-    try {
-      const { userId } = verifyAccessToken(accessToken); //디코딩 된 토큰에서 user id 추출
-      const user = await prisma.user.findUniqueOrThrow({ where: { id: userId } });
-      req.user = user;
-    } catch (error) {
-      if (options.optional) {
-        return next();
-      }
-      return next(new UnauthorizedError());
-    }
-    next();
-  };
-}
- 
-export default authenticate;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/middlewares/index.html b/mission9-10/coverage/src/middlewares/index.html deleted file mode 100644 index 3c8f540d7..000000000 --- a/mission9-10/coverage/src/middlewares/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/middlewares - - - - - - - - - -
-
-

All files src/middlewares

-
- -
- 55% - Statements - 11/20 -
- - -
- 42.85% - Branches - 3/7 -
- - -
- 100% - Functions - 3/3 -
- - -
- 52.63% - Lines - 10/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
authenticate.ts -
-
55%11/2042.85%3/7100%3/352.63%10/19
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/articleRepository.ts.html b/mission9-10/coverage/src/repositories/articleRepository.ts.html deleted file mode 100644 index f3d106be9..000000000 --- a/mission9-10/coverage/src/repositories/articleRepository.ts.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - Code coverage report for src/repositories/articleRepository.ts - - - - - - - - - -
-
-

All files / src/repositories articleRepository.ts

-
- -
- 100% - Statements - 10/10 -
- - -
- 75% - Branches - 6/8 -
- - -
- 100% - Functions - 7/7 -
- - -
- 100% - Lines - 10/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58  -5x -  -  -5x -  -1x -  -  -10x -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -6x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -6x -  -  -1x -  -  -1x -  -  -  -5x - 
import { Prisma } from '@prisma/client';
-import { prisma } from '../lib/prismaClient';
-import { ArticleLikesAndCount } from '../../types/article';
- 
-export class ArticleRepository {
-  async create(data: Prisma.ArticleCreateInput) {
-    return prisma.article.create({ data });
-  }
-  async findById(id: number) {
-    return prisma.article.findUniqueOrThrow({ where: { id } });
-  }
-  async findByIdWithLikes(id: number, userId?: number): Promise<ArticleLikesAndCount> {
-    return prisma.article.findUniqueOrThrow({
-      where: { id },
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          //비로그인 시 -1을 줘서 []을 뱉도록
-          where: { userId: userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async findArticleListWithLikes(params: {
-    skip: number;
-    take: number;
-    orderBy: Prisma.ArticleOrderByWithRelationInput;
-    where: Prisma.ArticleWhereInput;
-    userId?: number;
-  }): Promise<ArticleLikesAndCount[]> {
-    return prisma.article.findMany({
-      skip: params.skip,
-      take: params.take,
-      orderBy: params.orderBy,
-      where: params.where,
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          where: { userId: params.userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async count(where: Prisma.ArticleWhereInput) {
-    return prisma.article.count({ where });
-  }
-  async update(id: number, data: Prisma.ArticleUpdateInput) {
-    return prisma.article.update({ where: { id }, data });
-  }
-  async delete(id: number) {
-    return prisma.article.delete({ where: { id } });
-  }
-}
- 
-export const articleRepo = new ArticleRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/commentRepository.ts.html b/mission9-10/coverage/src/repositories/commentRepository.ts.html deleted file mode 100644 index 7b20732b8..000000000 --- a/mission9-10/coverage/src/repositories/commentRepository.ts.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - Code coverage report for src/repositories/commentRepository.ts - - - - - - - - - -
-
-

All files / src/repositories commentRepository.ts

-
- -
- 62.5% - Statements - 5/8 -
- - -
- 50% - Branches - 1/2 -
- - -
- 40% - Functions - 2/5 -
- - -
- 62.5% - Lines - 5/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32  -5x -  -5x -  -2x -  -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x - 
import { Prisma } from '@prisma/client';
-import { prisma } from '../lib/prismaClient';
- 
-export class CommentRepository {
-  async create(data: Prisma.CommentCreateInput) {
-    return prisma.comment.create({ data });
-  }
-  async findCommentListQuery(
-    whereCondition: { articleId: number } | { productId: number },
-    limit: number,
-    cursor?: number,
-  ) {
-    return prisma.comment.findMany({
-      cursor: cursor ? { id: cursor } : undefined,
-      take: limit + 1,
-      where: whereCondition,
-      orderBy: { createdAt: 'desc' },
-    });
-  }
-  async findById(id: number) {
-    return prisma.comment.findUniqueOrThrow({ where: { id } });
-  }
-  async update(id: number, content?: string) {
-    return prisma.comment.update({ where: { id }, data: { content } });
-  }
-  async delete(id: number) {
-    return prisma.comment.delete({ where: { id } });
-  }
-}
- 
-export const commentRepo = new CommentRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/index.html b/mission9-10/coverage/src/repositories/index.html deleted file mode 100644 index 582634d54..000000000 --- a/mission9-10/coverage/src/repositories/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - Code coverage report for src/repositories - - - - - - - - - -
-
-

All files src/repositories

-
- -
- 73.07% - Statements - 38/52 -
- - -
- 69.23% - Branches - 18/26 -
- - -
- 63.63% - Functions - 21/33 -
- - -
- 73.07% - Lines - 38/52 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articleRepository.ts -
-
100%10/1075%6/8100%7/7100%10/10
commentRepository.ts -
-
62.5%5/850%1/240%2/562.5%5/8
likeRepository.ts -
-
77.77%7/966.66%4/675%3/477.77%7/9
notificationRepository.ts -
-
37.5%3/8100%0/00%0/537.5%3/8
productRepository.ts -
-
81.81%9/1170%7/1087.5%7/881.81%9/11
userRepository.ts -
-
66.66%4/6100%0/050%2/466.66%4/6
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/likeRepository.ts.html b/mission9-10/coverage/src/repositories/likeRepository.ts.html deleted file mode 100644 index 72f19bc21..000000000 --- a/mission9-10/coverage/src/repositories/likeRepository.ts.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - Code coverage report for src/repositories/likeRepository.ts - - - - - - - - - -
-
-

All files / src/repositories likeRepository.ts

-
- -
- 77.77% - Statements - 7/9 -
- - -
- 66.66% - Branches - 4/6 -
- - -
- 75% - Functions - 3/4 -
- - -
- 77.77% - Lines - 7/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37  -5x -  -  -  -  -3x -  -  -3x -  -  -  -  -3x -  -  -  -2x -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -5x - 
import { LikeTarget } from '../../types/like';
-import { prisma } from '../lib/prismaClient';
- 
-class LikdeRepository {
-  async findLike(userId: number, target: LikeTarget) {
-    const whereCondition =
-      'articleId' in target
-        ? { userId_articleId: { userId, articleId: target.articleId } }
-        : { userId_productId: { userId, productId: target.productId } };
-    return prisma.like.findUnique({
-      where: whereCondition,
-    });
-  }
-  async createLike(userId: number, target: LikeTarget) {
-    return prisma.like.create({ data: { userId, ...target } });
-  }
-  async deleteLike(userId: number, target: LikeTarget) {
-    const whereCondition =
-      'articleId' in target
-        ? { userId_articleId: { userId, articleId: target.articleId } }
-        : { userId_productId: { userId, productId: target.productId } };
-    return prisma.like.delete({
-      where: whereCondition,
-    });
-  }
-  async getLikers(target: LikeTarget) {
-    const whereCondition =
-      'articleId' in target ? { articleId: target.articleId } : { productId: target.productId };
-    return prisma.like.findMany({
-      where: whereCondition,
-      select: { userId: true },
-    });
-  }
-}
- 
-export const likeRepo = new LikdeRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/notificationRepository.ts.html b/mission9-10/coverage/src/repositories/notificationRepository.ts.html deleted file mode 100644 index 145a57f7c..000000000 --- a/mission9-10/coverage/src/repositories/notificationRepository.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for src/repositories/notificationRepository.ts - - - - - - - - - -
-
-

All files / src/repositories notificationRepository.ts

-
- -
- 37.5% - Statements - 3/8 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/5 -
- - -
- 37.5% - Lines - 3/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -275x -  -5x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x - 
import { prisma } from '../lib/prismaClient';
- 
-export class NotificationRepository {
-  async getNotification(userId: number) {
-    return prisma.notification.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } });
-  }
-  async getUnreadCount(userId: number) {
-    return prisma.notification.count({ where: { userId, isRead: false } });
-  }
-  async create(userId: number, message: string) {
-    return prisma.notification.create({ data: { userId, message } });
-  }
-  async findByIds(notificationId: number, userId: number) {
-    return prisma.notification.findFirst({
-      where: { id: notificationId, userId },
-    });
-  }
-  async updateRead(notificationId: number) {
-    return prisma.notification.update({
-      where: { id: notificationId },
-      data: { isRead: true },
-    });
-  }
-}
- 
-export const notificationRepo = new NotificationRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/productRepository.ts.html b/mission9-10/coverage/src/repositories/productRepository.ts.html deleted file mode 100644 index 9e6abc4a2..000000000 --- a/mission9-10/coverage/src/repositories/productRepository.ts.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - Code coverage report for src/repositories/productRepository.ts - - - - - - - - - -
-
-

All files / src/repositories productRepository.ts

-
- -
- 81.81% - Statements - 9/11 -
- - -
- 70% - Branches - 7/10 -
- - -
- 87.5% - Functions - 7/8 -
- - -
- 81.81% - Lines - 9/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66  -5x -  -  -  -  -  -1x -  -  -11x -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -1x -  -  -  -  -  -  -  -  -12x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -12x -  -  -  -  -  -  -  -  -  -  -  -5x - 
import { ProductLikesAndCount } from '../../types/product';
-import { prisma } from '../lib/prismaClient';
-import { Prisma } from '@prisma/client';
-import type { ProductRecentType } from '../../types/product';
- 
-class ProductRepository {
-  async create(data: Prisma.ProductCreateInput) {
-    return prisma.product.create({ data });
-  }
-  async findById(id: number) {
-    return prisma.product.findUniqueOrThrow({ where: { id } });
-  }
-  async findByIdWithLikes(id: number, userId?: number): Promise<ProductLikesAndCount> {
-    return prisma.product.findUniqueOrThrow({
-      where: { id },
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          where: { userId: userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async update(id: number, data: Prisma.ProductUpdateInput) {
-    return prisma.product.update({ where: { id }, data });
-  }
-  async delete(id: number) {
-    return prisma.product.delete({ where: { id } });
-  }
-  async findProductListWithLikes(params: {
-    skip: number;
-    take: number;
-    orderBy: Prisma.ProductOrderByWithRelationInput;
-    where: Prisma.ProductWhereInput;
-    userId?: number;
-  }): Promise<ProductLikesAndCount[]> {
-    return prisma.product.findMany({
-      skip: params.skip,
-      take: params.take,
-      orderBy: params.orderBy,
-      where: params.where,
-      include: {
-        _count: { select: { likes: true } },
-        likes: {
-          where: { userId: params.userId ?? -1 },
-          select: { id: true },
-        },
-      },
-    });
-  }
-  async count(where: Prisma.ProductWhereInput) {
-    return prisma.product.count({ where });
-  }
-  async findRecentProduct(userId: number, limit: number, type: ProductRecentType) {
-    const whereCondition = type === 'myUploaded' ? { userId } : { likes: { some: { userId } } };
-    return prisma.product.findMany({
-      where: whereCondition,
-      orderBy: { createdAt: 'desc' },
-      take: limit,
-    });
-  }
-}
- 
-export const productRepo = new ProductRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/repositories/userRepository.ts.html b/mission9-10/coverage/src/repositories/userRepository.ts.html deleted file mode 100644 index 97525f6a6..000000000 --- a/mission9-10/coverage/src/repositories/userRepository.ts.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - Code coverage report for src/repositories/userRepository.ts - - - - - - - - - -
-
-

All files / src/repositories userRepository.ts

-
- -
- 66.66% - Statements - 4/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 50% - Functions - 2/4 -
- - -
- 66.66% - Lines - 4/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -205x -  -  -  -  -21x -  -  -18x -  -  -  -  -  -  -  -  -  -5x - 
import { prisma } from '../lib/prismaClient';
-import { Prisma } from '@prisma/client';
- 
-class UserRepository {
-  async create(data: Prisma.UserCreateInput) {
-    return prisma.user.create({ data });
-  }
-  async findByEmail(email: string) {
-    return prisma.user.findUnique({ where: { email } });
-  }
-  async update(id: number, data: Prisma.UserUpdateInput) {
-    return prisma.user.update({ where: { id }, data });
-  }
-  async findById(id: number) {
-    return prisma.user.findUnique({ where: { id } });
-  }
-}
- 
-export const userRepo = new UserRepository();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/articlesRouter.ts.html b/mission9-10/coverage/src/routers/articlesRouter.ts.html deleted file mode 100644 index 79e08a796..000000000 --- a/mission9-10/coverage/src/routers/articlesRouter.ts.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - Code coverage report for src/routers/articlesRouter.ts - - - - - - - - - -
-
-

All files / src/routers articlesRouter.ts

-
- -
- 100% - Statements - 15/15 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 15/15 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -295x -5x -5x -  -  -  -  -  -  -  -  -  -  -5x -  -5x -  -5x -5x -5x -5x -5x -5x -5x -5x -5x -  -5x - 
import express from 'express';
-import { withAsync } from '../lib/withAsync';
-import {
-  createArticle,
-  getArticleList,
-  getArticle,
-  updateArticle,
-  deleteArticle,
-  createComment,
-  getCommentList,
-  likeArticle,
-  unlikeArticle,
-} from '../controllers/articlesController';
-import authenticate from '../middlewares/authenticate';
- 
-const articlesRouter = express.Router();
- 
-articlesRouter.post('/', authenticate(), withAsync(createArticle));
-articlesRouter.get('/', authenticate({ optional: true }), withAsync(getArticleList));
-articlesRouter.get('/:id', authenticate({ optional: true }), withAsync(getArticle));
-articlesRouter.patch('/:id', authenticate(), withAsync(updateArticle));
-articlesRouter.delete('/:id', authenticate(), withAsync(deleteArticle));
-articlesRouter.post('/:id/comments', authenticate(), withAsync(createComment));
-articlesRouter.get('/:id/comments', withAsync(getCommentList));
-articlesRouter.post('/:id/like', authenticate(), withAsync(likeArticle));
-articlesRouter.delete('/:id/like', authenticate(), withAsync(unlikeArticle));
- 
-export default articlesRouter;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/commentsRouter.ts.html b/mission9-10/coverage/src/routers/commentsRouter.ts.html deleted file mode 100644 index 8802d62a2..000000000 --- a/mission9-10/coverage/src/routers/commentsRouter.ts.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - Code coverage report for src/routers/commentsRouter.ts - - - - - - - - - -
-
-

All files / src/routers commentsRouter.ts

-
- -
- 100% - Statements - 8/8 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 8/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -125x -5x -5x -5x -  -5x -  -5x -5x -  -5x - 
import express from 'express';
-import { withAsync } from '../lib/withAsync';
-import { updateComment, deleteComment } from '../controllers/commentsController';
-import authenticate from '../middlewares/authenticate';
- 
-const commentsRouter = express.Router();
- 
-commentsRouter.patch('/:id', authenticate(), withAsync(updateComment));
-commentsRouter.delete('/:id', authenticate(), withAsync(deleteComment));
- 
-export default commentsRouter;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/imagesRouter.ts.html b/mission9-10/coverage/src/routers/imagesRouter.ts.html deleted file mode 100644 index 8754a8533..000000000 --- a/mission9-10/coverage/src/routers/imagesRouter.ts.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - Code coverage report for src/routers/imagesRouter.ts - - - - - - - - - -
-
-

All files / src/routers imagesRouter.ts

-
- -
- 100% - Statements - 6/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 6/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -105x -5x -5x -  -5x -  -5x -  -5x - 
import express from 'express';
-import { withAsync } from '../lib/withAsync';
-import { upload, uploadImage } from '../controllers/imagesController';
- 
-const imagesRouter = express.Router();
- 
-imagesRouter.post('/upload', upload.single('image'), withAsync(uploadImage));
- 
-export default imagesRouter;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/index.html b/mission9-10/coverage/src/routers/index.html deleted file mode 100644 index 547f536b5..000000000 --- a/mission9-10/coverage/src/routers/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - Code coverage report for src/routers - - - - - - - - - -
-
-

All files src/routers

-
- -
- 100% - Statements - 69/69 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 69/69 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articlesRouter.ts -
-
100%15/15100%0/0100%0/0100%15/15
commentsRouter.ts -
-
100%8/8100%0/0100%0/0100%8/8
imagesRouter.ts -
-
100%6/6100%0/0100%0/0100%6/6
notificationRouter.ts -
-
100%9/9100%0/0100%0/0100%9/9
productsRouter.ts -
-
100%18/18100%0/0100%0/0100%18/18
usersRouter.ts -
-
100%13/13100%0/0100%0/0100%13/13
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/notificationRouter.ts.html b/mission9-10/coverage/src/routers/notificationRouter.ts.html deleted file mode 100644 index 1756ffb34..000000000 --- a/mission9-10/coverage/src/routers/notificationRouter.ts.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - Code coverage report for src/routers/notificationRouter.ts - - - - - - - - - -
-
-

All files / src/routers notificationRouter.ts

-
- -
- 100% - Statements - 9/9 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 9/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -175x -5x -5x -5x -  -  -  -  -  -5x -  -5x -5x -5x -  -5x - 
import express from 'express';
-import authenticate from '../middlewares/authenticate';
-import { withAsync } from '../lib/withAsync';
-import {
-  getNotifications,
-  getUnreadCount,
-  markAsRead,
-} from '../controllers/notificationController';
- 
-const notificationRouter = express.Router();
- 
-notificationRouter.get('/', authenticate(), withAsync(getNotifications));
-notificationRouter.get('/unread-count', authenticate(), withAsync(getUnreadCount));
-notificationRouter.patch('/:id/read', authenticate(), withAsync(markAsRead));
- 
-export default notificationRouter;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/productsRouter.ts.html b/mission9-10/coverage/src/routers/productsRouter.ts.html deleted file mode 100644 index 9236e4c1a..000000000 --- a/mission9-10/coverage/src/routers/productsRouter.ts.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - Code coverage report for src/routers/productsRouter.ts - - - - - - - - - -
-
-

All files / src/routers productsRouter.ts

-
- -
- 100% - Statements - 18/18 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 18/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -325x -5x -5x -  -  -  -  -  -  -  -  -  -  -5x -5x -  -5x -  -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -5x -  -5x - 
import express from 'express';
-import { withAsync } from '../lib/withAsync';
-import {
-  createProduct,
-  getProduct,
-  updateProduct,
-  deleteProduct,
-  getProductList,
-  createComment,
-  getCommentList,
-  likeProduct,
-  unlikeProduct,
-} from '../controllers/productsController';
-import authenticate from '../middlewares/authenticate';
-import { getMyLikedProducts, getMyProductList } from '../controllers/usersController';
- 
-const productsRouter = express.Router();
- 
-productsRouter.get('/me', authenticate(), withAsync(getMyProductList));
-productsRouter.get('/me/likes', authenticate(), withAsync(getMyLikedProducts));
-productsRouter.get('/', authenticate({ optional: true }), withAsync(getProductList));
-productsRouter.post('/', authenticate(), withAsync(createProduct));
-productsRouter.get('/:id', authenticate({ optional: true }), withAsync(getProduct));
-productsRouter.patch('/:id', authenticate(), withAsync(updateProduct));
-productsRouter.delete('/:id', authenticate(), withAsync(deleteProduct));
-productsRouter.post('/:id/comments', authenticate(), withAsync(createComment));
-productsRouter.get('/:id/comments', withAsync(getCommentList));
-productsRouter.post('/:id/like', authenticate(), withAsync(likeProduct));
-productsRouter.delete('/:id/like', authenticate(), withAsync(unlikeProduct));
- 
-export default productsRouter;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/routers/usersRouter.ts.html b/mission9-10/coverage/src/routers/usersRouter.ts.html deleted file mode 100644 index 3f6d130f9..000000000 --- a/mission9-10/coverage/src/routers/usersRouter.ts.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Code coverage report for src/routers/usersRouter.ts - - - - - - - - - -
-
-

All files / src/routers usersRouter.ts

-
- -
- 100% - Statements - 13/13 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 13/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -255x -5x -5x -  -  -  -  -  -  -  -  -5x -  -5x -  -5x -5x -5x -5x -5x -5x -5x -  -5x - 
import express from 'express';
-import { withAsync } from '../lib/withAsync';
-import {
-  register,
-  login,
-  logout,
-  getProfile,
-  patchPassword,
-  updateProfile,
-  refreshToken,
-} from '../controllers/usersController';
-import authenticate from '../middlewares/authenticate';
- 
-const usersRouter = express.Router();
- 
-usersRouter.post('/register', withAsync(register));
-usersRouter.post('/login', withAsync(login));
-usersRouter.post('/logout', withAsync(logout));
-usersRouter.post('/refresh', withAsync(refreshToken));
-usersRouter.get('/me', authenticate(), withAsync(getProfile));
-usersRouter.patch('/me', authenticate(), withAsync(updateProfile));
-usersRouter.patch('/me/password', authenticate(), withAsync(patchPassword));
- 
-export default usersRouter;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/services/articleService.ts.html b/mission9-10/coverage/src/services/articleService.ts.html deleted file mode 100644 index add761584..000000000 --- a/mission9-10/coverage/src/services/articleService.ts.html +++ /dev/null @@ -1,505 +0,0 @@ - - - - - - Code coverage report for src/services/articleService.ts - - - - - - - - - -
-
-

All files / src/services articleService.ts

-
- -
- 88.13% - Statements - 52/59 -
- - -
- 41.17% - Branches - 14/34 -
- - -
- 100% - Functions - 10/10 -
- - -
- 87.71% - Lines - 50/57 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -1415x -  -5x -5x -5x -5x -  -5x -  -  -5x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -2x -1x -1x -1x -  -  -  -  -  -  -2x -2x -1x -  -1x -  -  -2x -2x -1x -  -1x -  -  -  -  -  -  -  -  -6x -  -  -  -  -6x -  -  -  -  -  -  -  -  -  -6x -8x -8x -  -  -  -8x -8x -  -  -  -  -6x -  -  -  -6x -  -  -1x -1x -  -  -  -  -1x -1x -  -  -  -  -  -1x -  -  -  -  -  -  -2x -2x -2x -2x -2x -2x -  -  -  -1x -1x -1x -  -  -1x -1x -  -  -1x -1x -1x -  -  -  -  -  -  -1x -  -  -5x - 
import { articleRepo } from '../repositories/articleRepository';
-import { ArticleLikesAndCount, ArticleListResponse, ArticleResponse } from '../../types/article';
-import { AlreadyLikeError, AlreadyUnlikeError, ForbiddenError } from '../lib/errors/customErrors';
-import { commentRepo } from '../repositories/commentRepository';
-import { likeRepo } from '../repositories/likeRepository';
-import { Prisma, Article, Comment } from '@prisma/client';
-import type { CursorPaginated } from '../../types/cursorPaginated';
-import { notificationService } from './notificationService';
- 
-//객체로 주면 콘트롤러에서 인자순서 상관없이 적용되지만, ()형태로 반환하게되면 인자순서를 서비스형태와 동일하게 넣어야 함
-export class ArticleService {
-  async createArticle(
-    userId: number,
-    title: string,
-    content: string,
-    image?: string | null,
-  ): Promise<Article> {
-    return articleRepo.create({
-      title,
-      content,
-      image,
-      user: { connect: { id: userId } },
-    });
-  }
-  async getArticle(articleId: number, userId?: number): Promise<ArticleResponse> {
-    const article: ArticleLikesAndCount = await articleRepo.findByIdWithLikes(articleId, userId);
-    const { likes, _count, ...articleData } = article;
-    const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined;
-    return { ...articleData, likeCount: _count.likes, isLiked };
-  }
-  async updateArticle(
-    articleId: number,
-    userId: number,
-    data: { title?: string; content?: string; image?: string | null },
-  ): Promise<Article> {
-    const article = await articleRepo.findById(articleId);
-    if (article.userId !== userId) {
-      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
-    }
-    return articleRepo.update(articleId, data);
-  }
-  async deleteArticle(articleId: number, userId: number): Promise<void> {
-    const article = await articleRepo.findById(articleId);
-    if (article.userId !== userId) {
-      throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.');
-    }
-    await articleRepo.delete(articleId);
-  }
-  async getArticleList(
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-    keyword?: string,
-    userId?: number,
-  ): Promise<ArticleListResponse> {
-    const where = keyword
-      ? {
-          OR: [{ title: { contains: keyword } }, { content: { contains: keyword } }],
-        }
-      : {};
-    const [totalCount, articles] = await Promise.all([
-      articleRepo.count(where),
-      articleRepo.findArticleListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId,
-      }),
-    ]);
-    const list: ArticleResponse[] = articles.map((m) => {
-      const { _count, likes, ...basicArticleData } = m;
-      const response: ArticleResponse = {
-        ...basicArticleData,
-        likeCount: _count.likes,
-      };
-      Eif (!userId) {
-        return response;
-      }
-      const isLiked = (likes ?? []).length > 0;
-      return { ...basicArticleData, isLiked, likeCount: _count.likes };
-    });
-    const response: ArticleListResponse = {
-      list,
-      totalCount,
-    };
-    return response;
-  }
-  async createComment(userId: number, articleId: number, content: string): Promise<Comment> {
-    await articleRepo.findById(articleId);
-    const comment = await commentRepo.create({
-      content,
-      user: { connect: { id: userId } },
-      article: { connect: { id: articleId } },
-    });
-    const article = await articleRepo.findById(articleId);
-    Iif (article.userId !== userId) {
-      await notificationService.createNotification(
-        article.userId,
-        `내 게시글 "${article.title}"에 새로운 댓글이 달렸습니다.`,
-      );
-    }
-    return comment;
-  }
-  async getCommentList(
-    articleId: number,
-    limit: number,
-    cursor?: number,
-  ): Promise<CursorPaginated<Comment>> {
-    await articleRepo.findById(articleId);
-    const commentsWithCursor = await commentRepo.findCommentListQuery({ articleId }, limit, cursor);
-    const comments = commentsWithCursor.slice(0, limit);
-    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
-    const nextCursor = cursorComment ? cursorComment.id : null;
-    return { list: comments, nextCursor };
-  }
-  //like , unlike 둘다 message를 반환해버려서 이게..프로미스로 타입 설정하는 것이 의미가 있는지...로직 수정 생각해봐야할 듯
-  async likeArticle(userId: number, articleId: number): Promise<{ message: string }> {
-    const article = await articleRepo.findById(articleId);
-    const existingLike = await likeRepo.findLike(userId, { articleId });
-    Iif (existingLike) {
-      throw new AlreadyLikeError();
-    }
-    await likeRepo.createLike(userId, { articleId });
-    return { message: `${article.title}게시글에 좋아요를 눌렀습니다.` };
-  }
-  async unlikeArticle(userId: number, articleId: number): Promise<{ message: string }> {
-    const article = await articleRepo.findById(articleId);
-    try {
-      await likeRepo.deleteLike(userId, { articleId });
-    } catch (error: unknown) {
-      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
-        throw new AlreadyUnlikeError();
-      }
-      throw error;
-    }
-    return { message: `${article.title}게시글의 좋아요를 취소했습니다` };
-  }
-}
-export const articleService = new ArticleService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/services/commentService.ts.html b/mission9-10/coverage/src/services/commentService.ts.html deleted file mode 100644 index d697ad1ae..000000000 --- a/mission9-10/coverage/src/services/commentService.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/services/commentService.ts - - - - - - - - - -
-
-

All files / src/services commentService.ts

-
- -
- 33.33% - Statements - 4/12 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/2 -
- - -
- 33.33% - Lines - 4/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -235x -5x -  -  -5x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x - 
import { commentRepo } from '../repositories/commentRepository';
-import { ForbiddenError } from '../lib/errors/customErrors';
-import { Comment } from '@prisma/client';
- 
-export class CommentService {
-  async updateComment(commentId: number, userId: number, content?: string): Promise<Comment> {
-    const comment = await commentRepo.findById(commentId);
-    if (comment.userId !== userId) {
-      throw new ForbiddenError('해당 댓글을 수정할 권한이 없습니다.');
-    }
-    return commentRepo.update(commentId, content);
-  }
-  async deleteComment(commentId: number, userId: number): Promise<void> {
-    const comment = await commentRepo.findById(commentId);
-    if (comment.userId !== userId) {
-      throw new ForbiddenError('해당 댓글을 삭제할 권한이 없습니다.');
-    }
-    await commentRepo.delete(commentId);
-  }
-}
- 
-export const commnetService = new CommentService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/services/imageService.ts.html b/mission9-10/coverage/src/services/imageService.ts.html deleted file mode 100644 index d11cab840..000000000 --- a/mission9-10/coverage/src/services/imageService.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/services/imageService.ts - - - - - - - - - -
-
-

All files / src/services imageService.ts

-
- -
- 38.46% - Statements - 5/13 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 38.46% - Lines - 5/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23  -  -1x -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x - 
import { uploadImageResponse } from '../../types/image';
-import { Request } from 'express';
-import { BadRequestError } from '../lib/errors/customErrors';
-import path from 'path';
-import { STATIC_PATH } from '../lib/constants';
- 
-export class ImageService {
-  buildImageUrl(req: Request): uploadImageResponse {
-    const host = req.get('host');
-    if (!host) {
-      throw new BadRequestError('요청 헤더에 host 정보가 없습니다.');
-    }
-    if (!req.file) {
-      throw new BadRequestError();
-    }
-    const filePath = path.join(host, STATIC_PATH, req.file.filename);
-    const url = `http://${filePath}`;
-    return { url };
-  }
-}
- 
-export const imageService = new ImageService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/services/index.html b/mission9-10/coverage/src/services/index.html deleted file mode 100644 index c091268ea..000000000 --- a/mission9-10/coverage/src/services/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/services - - - - - - - - - -
-
-

All files src/services

-
- -
- 67.09% - Statements - 157/234 -
- - -
- 44.44% - Branches - 64/144 -
- - -
- 68.42% - Functions - 26/38 -
- - -
- 68.8% - Lines - 150/218 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articleService.ts -
-
88.13%52/5941.17%14/34100%10/1087.71%50/57
commentService.ts -
-
33.33%4/120%0/40%0/233.33%4/12
notificationService.ts -
-
33.33%5/150%0/20%0/435.71%5/14
productService.ts -
-
90%63/7066.66%32/48100%10/1089.7%61/68
userService.ts -
-
42.3%33/7832.14%18/5650%6/1244.77%30/67
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/services/notificationService.ts.html b/mission9-10/coverage/src/services/notificationService.ts.html deleted file mode 100644 index 8d579d208..000000000 --- a/mission9-10/coverage/src/services/notificationService.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for src/services/notificationService.ts - - - - - - - - - -
-
-

All files / src/services notificationService.ts

-
- -
- 33.33% - Statements - 5/15 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/4 -
- - -
- 35.71% - Lines - 5/14 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -275x -5x -5x -  -  -5x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -5x - 
import { UnauthorizedError } from '../lib/errors/customErrors';
-import { notificationRepo } from '../repositories/notificationRepository';
-import { getIO } from '../socket';
-import type { Notification as PrismaNotification } from '@prisma/client';
- 
-export class NotificationService {
-  async getNotifications(userId: number): Promise<PrismaNotification[]> {
-    return notificationRepo.getNotification(userId);
-  }
-  async getUnreadCount(userId: number): Promise<number> {
-    return notificationRepo.getUnreadCount(userId);
-  }
-  async createNotification(userId: number, message: string): Promise<PrismaNotification> {
-    const notification = await notificationRepo.create(userId, message);
-    const io = getIO();
-    io.to(`user-${userId}`).emit('notification', notification);
-    return notification;
-  }
-  async markAsRead(notificationId: number, userId: number): Promise<PrismaNotification> {
-    const notification = await notificationRepo.findByIds(notificationId, userId);
-    if (!notification) throw new UnauthorizedError();
-    return notificationRepo.updateRead(notificationId);
-  }
-}
- 
-export const notificationService = new NotificationService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/services/productService.ts.html b/mission9-10/coverage/src/services/productService.ts.html deleted file mode 100644 index 284300d3e..000000000 --- a/mission9-10/coverage/src/services/productService.ts.html +++ /dev/null @@ -1,616 +0,0 @@ - - - - - - Code coverage report for src/services/productService.ts - - - - - - - - - -
-
-

All files / src/services productService.ts

-
- -
- 90% - Statements - 63/70 -
- - -
- 66.66% - Branches - 32/48 -
- - -
- 100% - Functions - 10/10 -
- - -
- 89.7% - Lines - 61/68 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178  -6x -  -  -6x -6x -  -  -6x -6x -6x -6x -  -  -  -6x -  -  -  -  -  -  -  -  -2x -2x -  -  -  -  -  -  -  -  -  -3x -2x -2x -2x -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -3x -3x -1x -  -2x -  -2x -1x -1x -2x -1x -  -  -  -  -  -  -2x -  -  -2x -2x -1x -  -1x -  -  -  -  -  -  -  -  -11x -  -  -  -  -  -  -  -  -11x -  -  -  -  -  -  -  -  -  -11x -14x -14x -  -  -  -14x -13x -  -1x -1x -  -11x -  -  -  -11x -  -  -2x -2x -  -  -  -  -2x -2x -  -  -  -  -  -2x -  -  -  -  -  -  -2x -2x -2x -2x -2x -2x -  -  -2x -2x -2x -  -  -2x -2x -  -  -1x -1x -1x -  -  -  -  -  -  -1x -  -  -  -6x - 
import { ProductLikesAndCount } from '../../types/product';
-import { productRepo } from '../repositories/productRepository';
-import { Product } from '@prisma/client';
-import type { ProductListResponse, ProductResponse } from '../../types/product';
-import { ForbiddenError } from '../lib/errors/customErrors';
-import { commentRepo } from '../repositories/commentRepository';
-import type { Comment } from '@prisma/client';
-import type { CursorPaginated } from '../../types/cursorPaginated';
-import { AlreadyLikeError, AlreadyUnlikeError } from '../lib/errors/customErrors';
-import { likeRepo } from '../repositories/likeRepository';
-import { Prisma } from '@prisma/client';
-import { notificationService } from './notificationService';
- 
-//인자 순서가 옵셔널 다음 필수파라미터가 들어오면 컴파일에러가 발생함
-//객체로 묶어 보내기, 이러면 필수인 userid의 파라미터 순서를 바꾸지 않아도 됨
-export class ProductService {
-  async createProduct(params: {
-    name: string;
-    description: string;
-    price: number;
-    tags?: string[];
-    images?: string[];
-    userId: number;
-  }): Promise<Product> {
-    const { name, description, price, tags, images, userId } = params;
-    return productRepo.create({
-      name,
-      description,
-      price,
-      tags: tags ?? [],
-      images: images ?? [],
-      user: { connect: { id: userId } },
-    });
-  }
-  async getProduct(productId: number, userId?: number): Promise<ProductResponse> {
-    const product: ProductLikesAndCount = await productRepo.findByIdWithLikes(productId, userId);
-    const { likes, _count, ...productData } = product;
-    const baseResponse = { ...productData, likeCount: _count.likes };
-    Eif (!userId) {
-      return baseResponse;
-    }
-    const isLiked = (likes?.length ?? 0) > 0;
-    return { ...baseResponse, isLiked };
-  }
-  async updateProduct(
-    productId: number,
-    userId: number,
-    data: {
-      name?: string;
-      description?: string;
-      price?: number;
-      tags?: string[];
-      images?: string[];
-    },
-  ): Promise<Product> {
-    const product = await productRepo.findById(productId);
-    if (product.userId !== userId) {
-      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
-    }
-    const updateProduct = await productRepo.update(productId, data);
-    //undefined가 아니면서 기존가격과 다른 경우
-    if (data.price !== undefined && product.price !== data.price) {
-      const likers = await likeRepo.getLikers({ productId });
-      for (const liker of likers) {
-        if (liker.userId !== userId) {
-          await notificationService.createNotification(
-            liker.userId,
-            `관심 상품 "${product.name}"의 가격이 변동되었습니다.`,
-          );
-        }
-      }
-    }
-    return updateProduct;
-  }
-  async deleteProduct(productId: number, userId: number): Promise<void> {
-    const product = await productRepo.findById(productId);
-    if (product.userId !== userId) {
-      throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.');
-    }
-    await productRepo.delete(productId);
-  }
-  async getProductList(
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-    keyword?: string,
-    userId?: number,
-  ): Promise<ProductListResponse> {
-    const where = keyword
-      ? {
-          OR: [
-            { name: { contains: keyword } },
-            { description: { contains: keyword } },
-            { tags: { has: keyword } },
-          ],
-        }
-      : {};
-    const [totalCount, products] = await Promise.all([
-      productRepo.count(where),
-      productRepo.findProductListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId,
-      }),
-    ]);
-    const list: ProductResponse[] = products.map((m) => {
-      const { _count, likes, ...basicProductData } = m;
-      const response: ProductResponse = {
-        ...basicProductData,
-        likeCount: _count.likes,
-      };
-      if (!userId) {
-        return response;
-      }
-      const isLiked = (likes ?? []).length > 0;
-      return { ...basicProductData, isLiked, likeCount: _count.likes };
-    });
-    const response: ProductListResponse = {
-      list,
-      totalCount,
-    };
-    return response;
-  }
-  async createComment(userId: number, productId: number, content: string): Promise<Comment> {
-    await productRepo.findById(productId);
-    const comment = await commentRepo.create({
-      content,
-      user: { connect: { id: userId } },
-      product: { connect: { id: productId } },
-    });
-    const product = await productRepo.findById(productId);
-    Iif (product.userId !== userId) {
-      await notificationService.createNotification(
-        product.userId,
-        `내 상품 "${product.name}"에 새로운 댓글이 달렸습니다.`,
-      );
-    }
-    return comment;
-  }
-  async getCommentList(
-    productId: number,
-    limit: number,
-    cursor?: number,
-  ): Promise<CursorPaginated<Comment>> {
-    await productRepo.findById(productId);
-    const commentsWithCursor = await commentRepo.findCommentListQuery({ productId }, limit, cursor);
-    const comments = commentsWithCursor.slice(0, limit);
-    const cursorComment = commentsWithCursor[commentsWithCursor.length - 1];
-    const nextCursor = cursorComment ? cursorComment.id : null;
-    return { list: comments, nextCursor };
-  }
-  async likeProduct(userId: number, productId: number): Promise<{ message: string }> {
-    const product = await productRepo.findById(productId);
-    const existingLike = await likeRepo.findLike(userId, { productId });
-    Iif (existingLike) {
-      throw new AlreadyLikeError();
-    }
-    await likeRepo.createLike(userId, { productId });
-    return { message: `${product.name}상품에 좋아요를 눌렀습니다.` };
-  }
-  async unlikeProduct(userId: number, productId: number): Promise<{ message: string }> {
-    const product = await productRepo.findById(productId);
-    try {
-      await likeRepo.deleteLike(userId, { productId });
-    } catch (error: unknown) {
-      if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') {
-        throw new AlreadyUnlikeError();
-      }
-      throw error;
-    }
-    return { message: `${product.name}상품의 좋아요를 취소했습니다` };
-  }
-}
- 
-export const productService = new ProductService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/services/userService.ts.html b/mission9-10/coverage/src/services/userService.ts.html deleted file mode 100644 index d77f9ed9a..000000000 --- a/mission9-10/coverage/src/services/userService.ts.html +++ /dev/null @@ -1,721 +0,0 @@ - - - - - - Code coverage report for src/services/userService.ts - - - - - - - - - -
-
-

All files / src/services userService.ts

-
- -
- 42.3% - Statements - 33/78 -
- - -
- 32.14% - Branches - 18/56 -
- - -
- 50% - Functions - 6/12 -
- - -
- 44.77% - Lines - 30/67 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -2135x -5x -  -5x -5x -5x -  -  -  -  -  -  -  -  -  -  -21x -21x -21x -  -  -  -  -  -20x -20x -  -  -  -  -  -18x -18x -  -  -  -18x -18x -1x -  -17x -17x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -2x -2x -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -1x -1x -  -  -  -  -  -1x -  -  -  -5x - 
import bcrypt from 'bcrypt';
-import { userRepo } from '../repositories/userRepository';
-import type { Prisma, User } from '@prisma/client';
-import { ForbiddenError, UnauthorizedError } from '../lib/errors/customErrors';
-import { generateToken, verifyRefreshToken } from '../lib/token';
-import { productRepo } from '../repositories/productRepository';
-import type { ProductListResponse } from '../../types/product';
-import { ProfileResponse } from '../../types/user';
- 
-class UserService {
-  async register(
-    nickname: string,
-    email: string,
-    password: string,
-    image?: string,
-  ): Promise<Omit<User, 'password'>> {
-    const salt = await bcrypt.genSalt(10);
-    const hashedPassword = await bcrypt.hash(password, salt);
-    const user = await userRepo.create({
-      nickname,
-      email,
-      password: hashedPassword,
-      image,
-    });
-    const { password: _, ...userWithoutPassword } = user;
-    return userWithoutPassword;
-  }
-  async login(
-    email: string,
-    password: string,
-  ): Promise<{ tokens: { accessToken: string; refreshToken: string }; message: string }> {
-    const user = await userRepo.findByEmail(email);
-    Iif (!user) {
-      //이메일, 비밀번호 검증에 대한 에러를 같은 메세지로 던짐으로써 좀 더 방어적으로 설계
-      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
-    }
-    const isPasswordValid = await bcrypt.compare(password, user.password);
-    if (!isPasswordValid) {
-      throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.');
-    }
-    const tokens = generateToken(user.id);
-    return { tokens, message: '로그인에 성공했습니다.' };
-  }
-  async getProfile(myId: number): Promise<ProfileResponse> {
-    const user = await userRepo.findById(myId);
-    if (!user) throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
-    const { password: _, ...userInfo } = user;
-    const [myProductCount, myLikeProductCount, recentProductsRaw, recentLikedProductsRaw] =
-      await Promise.all([
-        productRepo.count({ userId: myId }),
-        productRepo.count({ likes: { some: { userId: myId } } }),
-        productRepo.findProductListWithLikes({
-          skip: 0,
-          take: 5,
-          orderBy: { createdAt: 'desc' },
-          where: { userId: myId },
-          userId: myId,
-        }),
-        productRepo.findProductListWithLikes({
-          skip: 0,
-          take: 5,
-          orderBy: { createdAt: 'desc' },
-          where: { likes: { some: { userId: myId } } },
-          userId: myId,
-        }),
-      ]);
-    const myRecentProducts = recentProductsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    const myRecentLikeProducts = recentLikedProductsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    return {
-      user: userInfo,
-      myProducts: {
-        list: myRecentProducts,
-        totalCount: myProductCount,
-      },
-      myLikedProducts: {
-        list: myRecentLikeProducts,
-        totalCount: myLikeProductCount,
-      },
-    };
-  }
- 
-  async updateProfile(
-    userId: number,
-    nickname?: string,
-    email?: string,
-    image?: string | null,
-  ): Promise<Omit<User, 'password'>> {
-    const data: Prisma.UserUpdateInput = {};
-    if (nickname !== undefined) data.nickname = nickname;
-    if (email !== undefined) data.email = email;
-    if (image !== undefined) data.image = image;
-    const update = await userRepo.update(userId, data);
-    const { password: _, ...userWithoutPassword } = update;
-    return userWithoutPassword;
-  }
-  async patchPassword(userId: number, currentPassword: string, newPassword: string): Promise<void> {
-    const user = await userRepo.findById(userId);
-    if (!user) {
-      throw new UnauthorizedError('사용자를 찾을 수 없습니다.');
-    }
-    const isPasswordValid = await bcrypt.compare(currentPassword, user.password);
-    if (!isPasswordValid) {
-      throw new ForbiddenError('현재 비밀번호가 올바르지 않습니다.');
-    }
-    const salt = await bcrypt.genSalt(10);
-    const hashedNewPassword = await bcrypt.hash(newPassword, salt);
-    await userRepo.update(userId, { password: hashedNewPassword });
-  }
-  async getMyProductList(
-    myId: number,
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-    keyword?: string,
-  ): Promise<ProductListResponse> {
-    const where = {
-      userId: myId,
-      ...(keyword
-        ? {
-            OR: [
-              { name: { contains: keyword } },
-              { description: { contains: keyword } },
-              { tags: { has: keyword } },
-            ],
-          }
-        : {}),
-    };
-    const [totalCount, productsRaw] = await Promise.all([
-      productRepo.count(where),
-      productRepo.findProductListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId: myId,
-      }),
-    ]);
-    const list = productsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    return { list, totalCount };
-  }
-  async refreshToken(refreshToken: string) {
-    let userId: number;
-    try {
-      const payload = verifyRefreshToken(refreshToken);
-      userId = payload.userId;
-    } catch (error) {
-      throw new UnauthorizedError('유효하지 않은 리프레시 토큰입니다.');
-    }
-    const user = await userRepo.findById(userId);
-    if (!user) {
-      throw new UnauthorizedError('존재하지 않는 사용자입니다.');
-    }
-    const tokens = generateToken(user.id);
-    return tokens;
-  }
-  async getMyLikedProducts(
-    myId: number,
-    page: number,
-    pageSize: number,
-    orderBy?: 'recent' | 'desc' | 'asc',
-  ): Promise<ProductListResponse> {
-    const where = {
-      likes: {
-        some: {
-          userId: myId,
-        },
-      },
-    };
-    const [totalCount, productsRaw] = await Promise.all([
-      productRepo.count(where),
-      productRepo.findProductListWithLikes({
-        skip: (page - 1) * pageSize,
-        take: pageSize,
-        orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' },
-        where,
-        userId: myId,
-      }),
-    ]);
-    const list = productsRaw.map((m) => {
-      const { _count, likes, ...rest } = m;
-      return {
-        ...rest,
-        likeCount: _count.likes,
-        isLiked: (likes?.length ?? 0) > 0,
-      };
-    });
-    return { list, totalCount };
-  }
-}
- 
-export const userService = new UserService();
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/socket.ts.html b/mission9-10/coverage/src/socket.ts.html deleted file mode 100644 index 7dcdc9ac8..000000000 --- a/mission9-10/coverage/src/socket.ts.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - Code coverage report for src/socket.ts - - - - - - - - - -
-
-

All files / src socket.ts

-
- -
- 27.58% - Statements - 8/29 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/4 -
- - -
- 24% - Lines - 6/25 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -441x -  -1x -1x -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  - 
import { Server as SocketIOServer } from 'socket.io';
-import { Server as HttpServer } from 'http';
-import { verifyAccessToken } from './lib/token';
-import { UnauthorizedError } from './lib/errors/customErrors';
- 
-let io: SocketIOServer | null = null;
- 
-export const initSocket = (Server: HttpServer) => {
-  io = new SocketIOServer(Server, {
-    cors: {
-      origin: '*',
-      methods: ['GET', 'POST'],
-    },
-  });
- 
-  io.use((socket, next) => {
-    try {
-      const token = socket.handshake.auth.accessToken;
-      if (!token) return next(new UnauthorizedError());
-      const { userId } = verifyAccessToken(token);
-      if (!userId) return next(new UnauthorizedError());
-      socket.data.userId = userId;
-      next();
-    } catch (e) {
-      next(new UnauthorizedError());
-    }
-  });
- 
-  io.on('connection', (socket) => {
-    const userId = socket.data.userId;
-    console.log('User connected', socket.id);
-    socket.join(`user-${userId}`);
-    console.log(`User ${userId} joined room user-${userId}`);
-  });
-  return io;
-};
- 
-export const getIO = () => {
-  if (!io) {
-    throw new Error('Socket.IO 서버가 초기화되지 않았습니다.');
-  }
-  return io;
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/structs/articlesStructs.ts.html b/mission9-10/coverage/src/structs/articlesStructs.ts.html deleted file mode 100644 index 120a77143..000000000 --- a/mission9-10/coverage/src/structs/articlesStructs.ts.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Code coverage report for src/structs/articlesStructs.ts - - - - - - - - - -
-
-

All files / src/structs articlesStructs.ts

-
- -
- 83.33% - Statements - 5/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 83.33% - Lines - 5/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -131x -1x -  -1x -  -1x -  -  -  -  -  -1x - 
import { coerce, nonempty, nullable, object, partial, string } from 'superstruct';
-import { PageParamsStruct } from './commonStructs';
- 
-export const GetArticleListParamsStruct = PageParamsStruct;
- 
-export const CreateArticleBodyStruct = object({
-  title: coerce(nonempty(string()), string(), (value) => value.trim()),
-  content: nonempty(string()),
-  image: nullable(string()),
-});
- 
-export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct);
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/structs/commentsStruct.ts.html b/mission9-10/coverage/src/structs/commentsStruct.ts.html deleted file mode 100644 index 27619246e..000000000 --- a/mission9-10/coverage/src/structs/commentsStruct.ts.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Code coverage report for src/structs/commentsStruct.ts - - - - - - - - - -
-
-

All files / src/structs commentsStruct.ts

-
- -
- 100% - Statements - 5/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 5/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -111x -1x -  -1x -  -  -  -1x -  -1x - 
import { nonempty, object, partial, string } from 'superstruct';
-import { CursorParamsStruct } from './commonStructs';
- 
-export const CreateCommentBodyStruct = object({
-  content: nonempty(string()),
-});
- 
-export const GetCommentListParamsStruct = CursorParamsStruct;
- 
-export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct);
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/structs/commonStructs.ts.html b/mission9-10/coverage/src/structs/commonStructs.ts.html deleted file mode 100644 index d83d00745..000000000 --- a/mission9-10/coverage/src/structs/commonStructs.ts.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - Code coverage report for src/structs/commonStructs.ts - - - - - - - - - -
-
-

All files / src/structs commonStructs.ts

-
- -
- 83.33% - Statements - 5/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 100% - Lines - 5/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -221x -  -1x -  -1x -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  - 
import { coerce, integer, object, string, defaulted, optional, enums, nonempty } from 'superstruct';
- 
-const integerString = coerce(integer(), string(), (value) => parseInt(value));
- 
-export const IdParamsStruct = object({
-  id: integerString,
-});
- 
-export const PageParamsStruct = object({
-  page: defaulted(integerString, 1),
-  pageSize: defaulted(integerString, 10),
-  orderBy: optional(enums(['recent'])),
-  keyword: optional(nonempty(string())),
-});
- 
-export const CursorParamsStruct = object({
-  cursor: defaulted(integerString, 0),
-  limit: defaulted(integerString, 10),
-  orderBy: optional(enums(['recent'])),
-  keyword: optional(nonempty(string())),
-});
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/structs/index.html b/mission9-10/coverage/src/structs/index.html deleted file mode 100644 index de1e47be2..000000000 --- a/mission9-10/coverage/src/structs/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/structs - - - - - - - - - -
-
-

All files src/structs

-
- -
- 81.81% - Statements - 36/44 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/8 -
- - -
- 87.8% - Lines - 36/41 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
articlesStructs.ts -
-
83.33%5/6100%0/00%0/183.33%5/6
commentsStruct.ts -
-
100%5/5100%0/0100%0/0100%5/5
commonStructs.ts -
-
83.33%5/6100%0/00%0/1100%5/5
productsStruct.ts -
-
85.71%6/7100%0/00%0/185.71%6/7
usersStructs.ts -
-
75%15/200%0/40%0/583.33%15/18
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/structs/productsStruct.ts.html b/mission9-10/coverage/src/structs/productsStruct.ts.html deleted file mode 100644 index 01ca56f56..000000000 --- a/mission9-10/coverage/src/structs/productsStruct.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for src/structs/productsStruct.ts - - - - - - - - - -
-
-

All files / src/structs productsStruct.ts

-
- -
- 85.71% - Statements - 6/7 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 85.71% - Lines - 6/7 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -271x -  -  -  -  -  -  -  -  -  -  -1x -  -1x -  -  -  -  -  -  -  -1x -  -1x -  -1x - 
import {
-  coerce,
-  partial,
-  object,
-  string,
-  min,
-  nonempty,
-  array,
-  integer,
-  optional,
-} from 'superstruct';
-import { PageParamsStruct } from './commonStructs';
- 
-export const CreateProductBodyStruct = object({
-  name: coerce(nonempty(string()), string(), (value) => value.trim()),
-  description: nonempty(string()),
-  price: min(integer(), 0),
-  tags: optional(array(string())),
-  images: optional(array(string())),
-});
- 
-export const GetProductListParamsStruct = PageParamsStruct;
- 
-export const UpdateProductBodyStruct = partial(CreateProductBodyStruct);
- 
-export const LikeProductParamsStruct = PageParamsStruct;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/coverage/src/structs/usersStructs.ts.html b/mission9-10/coverage/src/structs/usersStructs.ts.html deleted file mode 100644 index 79a230ceb..000000000 --- a/mission9-10/coverage/src/structs/usersStructs.ts.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - Code coverage report for src/structs/usersStructs.ts - - - - - - - - - -
-
-

All files / src/structs usersStructs.ts

-
- -
- 75% - Statements - 15/20 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/5 -
- - -
- 83.33% - Lines - 15/18 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -491x -1x -  -1x -  -  -1x -  -1x -  -  -  -1x -1x -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -1x -  -  -  -  -1x -  -  -  -  -1x -  -  -  -1x -  -1x - 
import * as s from 'superstruct';
-import { PageParamsStruct } from './commonStructs';
- 
-const CoercedNumber = s.coerce(s.number(), s.union([s.string(), s.number()]), (value) =>
-  Number(value),
-);
-const Integer = s.refine(CoercedNumber, 'Integer', (value) => Number.isInteger(value) && value > 0);
- 
-export const userIdStruct = s.object({
-  userId: Integer,
-});
-//이메일: 기본적인 이메일 형식 체크, 닉네임: 영어 + 숫자 + 한글, 2~10글자, 비밀번호: 8~16글자
-const email = s.refine(s.string(), 'Email', (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value));
-const nickname = s.refine(s.string(), 'Nickname', (value) =>
-  /^[A-Za-z0-9가-힣]{2,10}$/.test(value),
-);
-const password = s.refine(
-  s.string(),
-  'Password',
-  (value) => value.length >= 8 && value.length <= 16,
-);
- 
-export const CreateUserBodyStruct = s.object({
-  nickname: nickname,
-  email: email,
-  password: password,
-  image: s.optional(s.string()),
-});
- 
-export const UpdateUserBodyStruct = s.partial(CreateUserBodyStruct);
- 
-export const LoginBodyStruct = s.object({
-  email: email,
-  password: password,
-});
- 
-export const ChangePasswordBodyStruct = s.object({
-  currentPassword: password,
-  newPassword: password,
-});
- 
-export const RefreshTokenBodyStruct = s.object({
-  refreshToken: s.string(),
-});
- 
-export const GetMyProductListParamsStruct = PageParamsStruct;
- 
-export const GetMyLikedProductListParamsStruct = PageParamsStruct;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/mission9-10/infra/ec2/ecosystem.config.js b/mission9-10/infra/ec2/ecosystem.config.js deleted file mode 100644 index 435b50ec8..000000000 --- a/mission9-10/infra/ec2/ecosystem.config.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - apps: [ - { - name: 'mission9-10', - script: 'dist/main.js', - cwd: '/home/ec2-user/6-sprint-mission/mission9-10', - instances: 1, - exec_mode: 'fork', - autorestart: true, - watch: false, - max_memory_restart: '300M', - env: { - NODE_ENV: 'production', - }, - }, - ], -}; diff --git a/mission9-10/infra/ec2/nginx.conf b/mission9-10/infra/ec2/nginx.conf deleted file mode 100644 index 6794d6a6a..000000000 --- a/mission9-10/infra/ec2/nginx.conf +++ /dev/null @@ -1,74 +0,0 @@ -# server블록만 수정했습니다. - -user nginx; -worker_processes auto; -error_log /var/log/nginx/error.log notice; -pid /run/nginx.pid; - -# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. -include /usr/share/nginx/modules/*.conf; - -events { - worker_connections 1024; -} - -http { - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - access_log /var/log/nginx/access.log main; - - sendfile on; - tcp_nopush on; - keepalive_timeout 65; - types_hash_max_size 4096; - - include /etc/nginx/mime.types; - default_type application/octet-stream; - - # Load modular configuration files from the /etc/nginx/conf.d directory. - # See http://nginx.org/en/docs/ngx_core_module.html#include - # for more information. - include /etc/nginx/conf.d/*.conf; - - server { - listen 80; - - location / { - proxy_pass http://localhost:3000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - } - } - -# Settings for a TLS enabled server. -# -# server { -# listen 443 ssl; -# listen [::]:443 ssl; -# http2 on; -# server_name _; -# root /usr/share/nginx/html; -# -# ssl_certificate "/etc/pki/nginx/server.crt"; -# ssl_certificate_key "/etc/pki/nginx/private/server.key"; -# ssl_session_cache shared:SSL:1m; -# ssl_session_timeout 10m; -# ssl_ciphers PROFILE=SYSTEM; -# ssl_prefer_server_ciphers on; -# -# # Load configuration files for the default server block. -# include /etc/nginx/default.d/*.conf; -# -# error_page 404 /404.html; -# location = /404.html { -# } -# -# error_page 500 502 503 504 /50x.html; -# location = /50x.html { -# } -# } -} \ No newline at end of file diff --git a/mission9-10/infra/ec2/secure-group-inbound.png b/mission9-10/infra/ec2/secure-group-inbound.png deleted file mode 100644 index 52dbdc15bfeb1ea9862c9dab2ed12dbde992e2fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90868 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%0Dw>2-Uj-MSXj7j7Z;Yy z(Kh<4`GW_ByfG-%eLhqS<#BjLEMy+lo%(b%dvywv-h7~@Y-+STyNfN*;@47>7Y!fZ zIAbrM&XMUOb?RL;HZFRA6H`76poT0R`QrK`9tcHC^kRh6_0|`)5Bh60N^NZ!@HFnz_#~ zQFOU?-NE{~Z_(&m=Gy>?8tOafjpbfg2}ys^{8Z5M_or$r!9f__m3VM6t2?@JB5~#w z#TTl)ldE=hl2*HVP%(Uo)xH$Z%{gK_^;rY5@L-;U^^el-6Hv~-8kIlT+p}jknxkZj z1&p2l4c-Pqar-maM(}}j2qu|rl}p7x9Orf0P0z|tl}AXl7%id!lr_G@Ncw^F*@aTP zf!P*dFV$AUbW*YMx>r)&H49WAeeHmjq0?CCBI!UlnK3LL`|SSy9x*#iv{*eeC2iBR zhaAtTcb9)`rCP`*K7UpgZ#sYlXrU2lTP~TuF;o+qnQpQj@WD&5^E?t?LLWuzcrawAn;tI1?+@LP>7n0@oQD&{`jxl?R zGq2VR@hF?i7KB#R5@@baUVm0|A~$o_x#@G*Ci}JHQl@|3@~lURd8}KmjERH|(X3Sz z?Z;p{{EkXvllS-!>nxlDFYBR?OAxDvPJ6%ev#v&m-Qk!*IP&>1j#Rl~&J68O;a^2@ zX~SEaa5T9pLtmTU6QU?9A06~Y1H_Js6^VTeEx5xf zo5|&qABA0SZ0^qXBs>J5fZa=D9KR`ow}CgH$@*|HleJbQ?q!mw+}X}1pz(sq-52#c zA1)AQ`GnKZ5JV9V7rxwk^`jWC#`YQx;Dv!*c^^llOl~Vj)C}Lj?Ue>B)ai~srX2(k zH7Y5PdV%esw1k&Ehb$Jy9s5RcS&ka7B`$PRT+@M`hdtGXJ(e8njgdsb1^Osub;v^A z!ymx}m7U{2yLpdx$b)(jUMgoyFY)S)W<^&LZPi% z5A@_#gqJEu2R=}BX$%vf$C|$9TC#UdOFd6~ql#k0!0(5~Xjx$$81GGKoZ5`A=sRTd z0n!=;8Uu`SQL98LC*dQ(UuA{gAvZ04e4pJDKm>6>_HS|=Wg+4+3E7;k=ZV-{ypg>M zQ)+?N3iV+EnCN2T^}LtwHRRKcWd4p{G9hZv>~nCtMZp*<&nQ5-eo|X|o<}9fF`>F@ zN}4(A9)!tZMcaL2mPRbFJB!>VDs}DCwaNd&Y@-O#X}p~A_+tIS=GKK_zcur-18p+V zbe~*$G!@HU{jk~+IeFv#WJ$lOv;AFYp$bH9qSA|AOZ0jtH*IM}&!9`51Jenx<9b#Ufhs_2({@L{+h zbXUu%ff$^zv;|)@hnr;SQ0XkA6eIM-Li~ zQ0xzc`*l(`s6hio=W%3+LZ9boiB|lU1N|MpP1F}(j~JywS#SvnO`l}vq$p-4kjDoG zzHm1b_IY1o8BX46Ca&r~8L};~8TFnevWu8I1`I+hP?$%rS>$zIkIBl)YG1FkG&-JY zUTRh;4C$BFW`_X;z&wO8(O!JL6nN^?fVEpn7<>YEb<(1FyK)Y?l%(EROF)h!h<8RL zKK*{9z?2jt%St2Fe(|C@8UnMeNCs>LI2u?3!PwYgJa%2Awyu@@gG9aO7NIwnzXShk zwiNFt0Eaze=o3gnv_p!x*1S#)5+_mS;-@`wFG0SXx7)VM57Etd;T--cWx=4>0 z)4vzqd3XDaft4i3hCNH}zLC#wa)@?AP&w_7q5ZPM7H-J}z-$_45pcHxv|zWxQ?M~n zV9)m*zsIQHL4YStx_MH;Rn*aTJ?M*M>0)mM;$Q~3)Ymy`MWjF0Y}a%LOFG#HGanB2 zg?)3u(#YW{!rISZk7m-!>rCJ{Tg&}AFx;;d2B^B!Q0G+y$50YOL+#28=_+G*} zKX6XxL#~@;+r^)|S~eF!heutM0k`3P&|s$w1KL}TItK&sZ!eh);_{TaX~@E#j%7dj zyI|3VKF0hZJdR<#eyJ2%e+!cz;>`I;N<3gdyz!~wpqsGEkS_2WSmHF$f#*5!2_6n{ zKjF@3p@54BFX^9kp=`MnxNBzR|HqIGXh6H)C;k-WTcGSNH*#1%Qi87s>d?e*PQp`7bZ|0=q`YefQhc z?!WcbZ*2G9e)v5Bjqud>WFM*glXw5Qjz12##slWR%I5#_HUCfR@aM(<#kT$%@A=O! zL8Joq`9yQ^U+9Ma3Z^4OJ>h+){HH(me_|AWEh?%QxQ71c_J3hYM4;atI2r>x+b7FCX>~ZU-9~j9Li%BAJE$j~ByN z_zAcMVy39>KiSdS+ot^gjpJDC@QpesNG3%7{4d$5wti0?m!D~`i7ZGU(b|{)h1I1; zd?c7ojsG_0?FZc96e}?VAxIh|AehpH_f597p zLF`f@84^VQd_{f1aqaZ>KRf2-|AlZT4~v-SqMiTqRrvcIq|~5v36Q-X6#P#D-R=Dc zihvj)Pp^pl&sTJg609hxQ#r5lKR0wre3)kyiTsNOy{TOPhd)rjIH39T=pPw>;D&#) zC>gLM1V8v+@gBSqV0Z~i%41A|e{Sgi*LD1dz5lpI-^(oI5%2P!;V z7leZv__SdpdKD%=H@7S?Pu&!~;a(I?RC4lTP-Lr}HC&WOa)ZWTjZbz4RmWezAQtRI z*gTSh1|`e?7iS<1oQ5>oAF}l3_SzTV0ep)~MrKI5^y{1W;^CT-`^8&60YnGgbp2N! zC7L`P7`I|b`JmJ*uI->w7EU*hrrihqpklqhGQ~Q8iV1$K(=`sXdUXAK77%g|$OEEm zo6luoV;=g1M*Ag5*v^rsCyjEkC(=?j1;~!66=2oJca{Vsz6*`)6Bk095Mo zUY^Q-i?68i>B=2ZQE_p!9UdphHLoqJ=6?iB{`&gbXd$P^VO`k_UWnFb|D6R-THlz$ zC^>6qPEV4ytA$o@Sa1|N0i%SJlvLbCgk0mjLhbyIqyld8$J>*pOpslTX;e*~!`UW7 zk2#V^j+gLI#DL)Sv#W8%lZ)Tq zEx=hn&uPc0S$jjW2wG*3RDN*|>!*A4r8*q0Dj3!a6Ps=9{FxJ;J5m5DQlm}M;)c9 zYS7(aP0=0Am(86@JL<0@@oHW_kPKEWKPsTg`LqY!kFwAjIC;gjYcwy_Z8dT4n_NXvl z$r$L=J$eQ!l}!8LXs&3<)CbC55=zR-9>@2r)PV+rRPT8-7^T>^brif~+8cu-)c;ULhZ#Gj^esMKqkFnSIPCoF+G%m37F^0dQ(4nwP6k)c=HT@ zqBC5K1Dnen%2MB*%AD>#O)16`^6tAN&xQHHTtH%K>A7Zguabb8j(fJi-tUDGwl(D6 zbq~E&X+1K%0G;Z0aXyvlUy{21+e#HP!1}8+ESTsbNOf;)7!Z(F@22?(SX_Ro2?s0* zl~~f~e7`he z!un=Pk9Pp^8%IWr5bl@zyM>oWMcR%O|fZ*`tZTGH+u%3!@NX(HfF?RHrtgNb@p3a{53c zTP}rLhE_J!ig_c^vb0H)+~<2`^+2Y0_&b)|x9p$f>VA0#nWo0Y#Nd0BH(U(71cMYb zRVV6>NQ_Q{m&DRLXbAPJLhc!qB%hxMa7{?Ib`=~mKFKo2yM}{6C-XR{+7gyN+nh*L zK@+&T>?c;fSx>aXMwgIPjc;s&i3>w-N%Ge{w3NY6pB#Ug7yF9Bl2OEsE6iM-p?vTW zCBm{OG53gm*D2@8_m&S_Hyt&9YxIa7cI6O55+;bv%KBPvDpxLWq%F=w!GT(HSNdX= zYJvDO=zbZ--V;3;X6f=njH$7T=zxc#NxV}Aux4%G5Nho{fg;uYg)oYYz~u{+_{@Gd z@}O|ixF{N_nv3FUg9TdmUo_Xv)tg8JYCh*7@>I>^*S$ZTV^g_$?Pl^ey^4O)r4*pz~`VB;3=ObQhyuWa-m0%PwKtQUq0&rd1I~!u|0W2KJ@G(jsFBf5&euq0gj3 ziM$FqGHEu&qa4RL%1)VA=aYy+4y}cax>fK_$2&rlTWQ{%#uSmC(gWCM6jmlThflzi zxBdApRuVs=1Xg%`8h@#)z(~0UZEtDlDy&g3T9ES*hIM zZtwDfzO=9?h|Mu|Vr>O&+|gT4tLn2Ve0>?@<&joGy;jH!6;P<1aON-G0EoYxw{Hj+jt+h7+GfPZb^XqCaRDBpKrLFaOp?>CAlK_HnAm2sZG(y>*Rg$Q7u=r#*=q~nD9~#8&;nv z{?1dt6g>tI;W+w8#Q$R4Kpy|dPkch~F^{%uvBC$;`|ip|2~d#X#Sb_O|Infm)6Dct z2z7U+oi_8?r=!q1P1_t(h>DIbHg+@_`oxoM)PdVN@5*7)-iAk;PzZl@NFYD3nUk~x zQ~E5e&Ztfb9w&$gxI@stO;U+#o}ZarASPa2-m^UYc$YPXskBC926UM9rD{62fca7( zWj#O%&}GTU+mcMI?Pf(VfDE6`)Xr9<)z@0H3c{S`t|z&gw1^8b#C|Gi{1|bsVY0QdVZa-+#WN<>Mij ze337ma$M|84^m)Dy4yK)fnX>-O=>PDDZG?`C4nGA20A^1yDNpH2Cqt3vDO>`-CAdr z;(STSY~4oPP~2dCTjTOkyqS=03hU215yJkG{tSJyY~_Hp|2K60s~UiYb|KY6_x}2A zyFJ|W+`>$~R=bK!lGK;){-9U`Q!z*dJzvDJ=rJlaU&?Y@&n()L!lGG;#eg!BI=&hl zdRbId6i~le$DXu$Q-bq0W0P!a`p1?h*Je8&5!C3*_T{}fkbM0fD0|P17qx5)TX9Z9 zk=J3Z`#@R|b$XYubFoj5qXOmdG!i}iXC~gN`Ce4^fKSAU*q2hQ2kBxSc}9yBC$gpD z%Lz|xk|Rs52P@m&>uy|V&U(Y>cBlKNOQU+mAr@1=1lJPzPvXE8h$)L`o7Sg;hzawu)o{BksDEIkt3$ z5xfB*YG1BOMv< zVBIto3)PR+!wD|Sjw43lJkSRnl_wSt1ii8JM-WM+xbvY^j^@j~AkV8M{FLF9!xqrX z3))4gX~0>$H8s2h`i>$gL6`fNSRBT!(z9@n>*7b-$jx(m4{8+~)Y;wz2ghZ$g#~Y8 z9DfTJ+BbV*EOci&={Ll+nzM;&*}HmY>>-mf)jpVN*5OmAN;K~LE!}>nv9L3YJ#Jb& zxGbKi{erA|n#FnOq}Xb_e0|pLWwTC@E6sGMzgtcI|p%F^lE zGgpNsZFgtESD^}z=ab&IBNq;n-WYp|TogQH5_yMFvg$6r*k1eb%WMpi2VD#dK}NO2Yn_5#XFpcz zUeka!AbijU^zWGS3i_WbOKMqSM;5I(t2p;3Q%*5nSOPLTqP}rjv}jfY(Hy;X_jGmCR495Tdua|lzZ;f z;K$cxtd~4m8!lM&PW+M4phJoB?oE+sK!YtIEa{|Z&M>rVBguPh(SMqWj?XRD^78~7 zQ8c-aK>f5++o|#A>*U0Z+06ue5y10NbNKC zfD+bLEJUwqJ(8|O#F_yrbLKb{jp8D)KQtO5kgbKGz}@e_coevK)e!G&6IEhHgH(_u zRJu>!&HQWZ&FgZ#THRdJ`L$eG(pZpyzuXToaIosp zu2%fc+k7UFOFl*8(WKfJbs+vukPxYWCo0eX$I{Pvip3UN3e8FL+4*Xh$nSScltzBM z7?71%pDA`QTMI9DZB0^iZkJ-($?+a-?|}HZ+8A3uXbHKxit{?uVOnX8XXRPfr$OY6 z21-J`FVyEv6c0shp(Dn9e#m(>R^R^v9r^-BaN;-?lxn#d+ru2Xn@zx)bsRC>`u3*X(ruhit+H=cBM>9ISSG>&@ z!=ENsDdI3m1?X!XmOpP?pC3Pc7I3Y{?rPo_$6Tm0TCB#pHkA=Tw!5=sHN4I>kl{#Y z%QoEhbNvw*!xOFNjo}l|P>n8OrvGZ7X0Is#^E-u+wn#1^o!oKXa4~4F=rV+7TM!F7 zWb$>}nlXGeZ*VNqw>J}_nvsaAKR}SFjh@(yMD!{-U5iz2R@H;{Hl9xJxKX2 zghA5BED6-|>{Iz}QG)`egS4`T)nrc%{4s2QW0>Sf{QAmnG4`ZclF4#&ykb;O)?AD! zbCpcBk@81wnh#5~^bdU3y1g@!rH)pN>6}joKFoS7DfO;$RV8j^^PrK84iA|j!YXAH zdyPxAqIGGYT%#g=rG2v1Bg83p3TTy8KYZ|0ByLCNSv&dh%^AT5yWx1+U zRjj3H(1wwb974+N`d{VivD(QnAW5-sXGDa_(o;LF@bh*Sy5SMi+wTZBfC9vPdb{># zkA@hf3_PrA{>(l*yPZ|qxZUXS;m(L2_mnz4_lORdQZo|MM&bUwDw|uKtu=6#Hk`ut zyhN+|*@R#ke&D`~=0G6af;7E6-Oe@kW$obcxN4Pk7TSfE&^gM}K0?rM;(_$r-T7GX zM4Jyjx8B#o(VxO3>7>Z;YqRNaLCo3JNYdx8=~qp$1B+KP6l;)o)t8^&MN^yhlDe=B zoO6_x3Z@qI-J9~NJIL)6Wh#R1SUzWJOkTHiC=GYNF+h%&l$Ai;Y{i%Lb?!&L?qUDs zQ)88r!T?5I{JQF-#X>UFKY}SY<>u?mA?v;$LNyM)O6aB^5_AQ76 z?8Y6m#O&`lw=S2+#`hie`_L;0SmZgL_IEPa?#y&Hr z2XFs9FJ+p0$1kelzvL|UXVhtn+_9KW5w2$G zS-yRcchH+?(}Mtcp9>YcbQAd_*1C^kzD8o6qa5%5R{ z<1=j9X2L~5avWZ6Yu8?&GhRt?EFeoEpX{(2OT||eUW4AqwSml_$>B8DZ>V+GZ6re{ zquJb!lg!l;2#!57oObQliRY8HGatQ3c`QETKaQB~-I%+oiKMd1zFQiNjKE2mJ_t_i z$`(x;nJG}FaMrILi}aI?y16t+ICa*mgN?9-s`@*pC;OhKYter?9p4m^sh1SrI zea=8TdqEkwovt)mQtoLy7w%A3WPn@x^$m+hw5oppIuEqhCjG@uL!s;3FvFBSLu1$w zJT1~){0KHGv56gp9k;W*zC^xciV1rJnypmp1vUJ=s{WNTQf$=D3{@*Q|bKYJeZ zV%=g=Zp0Kh64QZETPlwJp?v`IY0##nNC!AL{4iebi0c&PwsU(f1W$rX{*^yI0WveX z_DSRmr3`~4Qnp_>mkn%MzxJO!dk>jyBvm$FFhZ8{pF0w8v5qS`eg6Rqf{H>?{2jo=ZNH0t+Md*u2IqDkQ0f%k|7RCSm0KW{jEmu1PfBzf8;R9nz&F zeg-Sw9~!<}u*vz%k1Xdb@M$c?u9p1ntI4Nc{*3Nsv-@7&k=@J0&J%mh56cfK>|JIs z*lPTuaG7;ulL?});tZdP|DJ#28!X7C_=<(^im%E3=V(hmf`|0$NdGU-$nZXCjIZJH zLG99-)p+FRdH6YO(zBfE6La9DxO|F{C2(a3l8csk6J=Cley%AaOLZPyDU>gwU0BoE z52lryv{+{Z$qkmDYp)`M2%&g4di8j1Jnh)@R+;@Lv{z{P3U`cOUN|28MJNcrLDEe% zL3SrC&D-rTP3u}TR|+`J9wtBB{`k^c&tmdmsf!M;J4LMV*`;P|x?y~YH@z^EzL_%` znefJuBr}+Z)8&)$wC&!q&ci*E^s^6@md39+)P+_9zdjzS*;MSWPlOIWZ~KNiQ+}Se za_x`y&`pU%iOl%&?8pTi)+fN8E+=%2nLd#hFk|YyE99t)azXh9Q!G`#z$y^)t$W>C zw1d}{Wup$=-K;$0yGlKouU?~jQ}D>+x>Q*c*x8Qo-9MDl2Ii)+TI@JY~$eKEXj7F{>a1Nk=IP!;VKKz zZQq?1{l2soO?%#^S7R1=Nc4nKWA+iK6hlY#==8h}LRamlC7D`6hyO?s- z2ZxaTV(*p9Wv5Ev(kV;ImZ#ZUQ3RYplkNzx5ZxuCto&oSd8a%+U*IQ~-;{F-WFd5I z2%hD|JPCN?u-tCY?0R^rQE3wDDX*2cda3w{ngJs=vzpJ#lY_>TFi=xWf z;(xXGozZai>$?d-5acC^gb0b~LZXIIBchk6(TUzg8zlxQ1PL*SUZX@A6Ls_MovLmfA|Kpzq8~$@JgbfPNM{dWQRL>NQSJ)%u z(}A|&uE+(x`2=wb95VBm<*wH#wF6tBR?H2E!)h123A(jt?}xU}Jhe=C!W!gCdsXVm z?h+J~$EBTf^BzsqO70Aoxnd5=BA{a`PgX1IYk?(DLXD>0+=)yCV&Sw65_mFBVj52v z{!+aWi0n@leO0eX)5RD`b0M0rvShLTj^@kWP__9~o!Y`qZ&k4&%-oeXjeI&)aW%MH zM)*zTiSCbWm#8bAwy@?UQnx4Lpm5zFjp=88ztrmP@0`=2j!!yS=QyExH{Z-EtNf*o zL;g&%kbUgW9`kKdD!11cFn;Bv9N}UDaWHq^xR-p8s-^69)Y*eWcajLf35)m^*HZO%M)BNd4z1Xn5l{oquK$29Y_QyF_oF#u zM+)LiJSM^0D^K4{AdwyKJGSSx+)NXHz#N{;@b0X7Q??g@Jw(;2!TJ8nypZPQ_4 z`javE#-%F*3G(`O-P>W$_U4<*u^8VYj_*VKtPwMJ@DP6!`cZ*$ysF5EF0HG%Kp8lt z6YT>f%9LTIn#%FTJVeNF?&m@#XtAm*5~D|^x^2Gq<`U#{OmNzrA(PH&f7XMpmE>oc z)KdaFS-0<4(ND?1@Iy_1baDKP=@m+E{x?UiYxI6?lcFMBTlGGB;$S2Ja}a`41_hQs zV*rg=pw>dh!#E%QW^DBU1z1v>Z_h^z7^(1R3xTJlgg*s6DH^%D9)0WiKqRB_;RCM5 zA;L$k+cb~p5D}mn@WH3YIoapj2R)iSbgMoBz76KO{U0}w;1fvsF3wgSQ#WhAGickD z8_sa#0jh5YlX7fKVX969gq534X6188ZM+Am=*3Zm>?cGNhA7AE8e9Si(oMLvNpa6C zTExf2o;S+$(kK3$Ao8|0GW{FR5JMLSmVdAlKF8K;E{VSFuM4XG9GckQG`$TIpW&xT zU;0L~;}>Xprg8R1tD$^fA~6t~K+!GhzB&TWUjm z8qHe4_tGo7|_@kW_U#x&Nz>hOpj73sI!tV+P1@6bIUgnz+mGoNT4sIRa!?_2te&r)X(z4*tnzT9y?sviGmVIK>AIKu3ViW3VEo9^H|FL= z*EN~d>M4!wXIIsyuCjEttlRe0ojs(pj>B-h(IBmD`D$(>R45ro>baH9oYMXZMps z$UdEKhTwTN4`0g7oz?Y#rds23#0V0mCz&E{X~C;Ufe1!T9CLayV>edR+(Byh(HTwg z;8B{aSM}qsX9l{LX*fi*vxhVp?gtn7dx2P2x;hBmY`a$rI@^L+=gD%WtTQ{EJ!4v> zPHQ5~$y^tiOrK2GK_P4@i_|@j3qQoW5F;`0(5TCpVmvydTdw2BRI05HF1H9iEf2)& zcNQqlxlMd@MbBUb>zk5n44pSWx**&eO3QcV9_Lei_Xw64e9Ig%CIx%Fj>ojxm_>~; zbKXlNwpWLngUfq=WAe-h%!|JpdL5Mfxhrz1=tw@1fD(s})q}`f{rT_78&s+lO~;;m z`$mt?jINF$7aHA1wqdbhw1f2A9lCRFJllRcBRE&inhHEV@%T7TOn33n2ntK`$0Rx8 z>yK?vhH=LlrhU?~O+4u7<@Ind0oWij`GR`ACyV|> zk1U$sqQmsC9hNbCL!bQ|>zfbumqqBz(vcZI&ecV@S=HD5h>R!U5LD0L&kR1a9Sh2> z+G+~ihy@b-K3`Pmc8o;!YY)5!Da%KV%>^_Txl>=|KJ-YSUgYlGHunq3$--FiYofky zX>QdNPu4?yG2^WU9v-N`osF$2xrkEicvUKl_s8Cd5>451=5D3xqvhNL^&5qT;*}EP z+fygCYB&5h&mzs>R{i}qiRB;$!20JnaPPw{MG}3EFEl?OkA$d?zRU}!eiOuBV0!(LM%pP$s#(j1JqUWD;Y zMLv25eFm6YPMiUk<3N7Z>7$lz-ynj(e&zxVY@6YLJ&13o@Ewy^ZXaCy-%_q!;=RN? zT$&H`&54e9?5nA7T%GA$6T!4y+aBPmSpNwG{LpVSt7!iq$f}r2lGA;g&R3LB5ZJB0 zhpr+x{x|DK=)>WrnwcGRHTJz7%=joZ_X_tj1)ZbDL%(D4MeLB$F{bevxF6z>^;H;m zv}*m}!Hf0j#&!d#0hFEqL%XCGkZMab)E?XvSt{a9mqR%HJ5YEJ;HqGcL6fojhSMNC;-O zC(evS$VJ%BQj^#>o{@$39wnYRbDm&*?y0r4?fRSFh=;yHRulc5VW-Jo(+PeLRV(D@ zmsT%1PKa8pI17{eG!&k%I=6dGkaKNLw9;|BQ?IXKQXmYU-nF(QozdNQp&=+Brr^s$ z5nt(h15M>cM_rgrdvE&mP0U%H5-zd|7`<{{!+1v!5Q{AQHLE)7;pj?~d zd;2(wB)N`vV$<5z9X{?hX*$Xw?&OF^2wkvms4899$aJ3d_REQj< zCJ4k20PY{fUuHR=JSMZ?jCXMQePvlRh*7DG64i3aPS8eJ9L)WD`XdEoYGY->T2hg-@FA*x3~Xp_VVVgp3#pJY~E zj|mFZNJc&ZGfCeIOs27;1)3Cf{$N|pHL=}4y?!n#r-p#oCeaUy1)t-mz}qw6X%&Oe zr<0!sbUw>L(4u+rD_l(615_87N|hatw%6bb3n=r;;LopVOM?&m?y^l*yDiJ1>R(#c z`E2kn8N!^zhnky}g=fvNHAhK>5Fkb~CbDc)wGxlfjZfJexO^Tz*5X zK5HDzmFqAy9w7Zi<<0Hz7{L3_;>=&adr84CAMx#7gIRdcaEN;SDC~Hq4dFIrN5bIx zCBq{6`nX~%t>k^<0zcixkJgC-cG|vghXdE|6+WM?B|^L#!y+ZY*x!6D>ZVgqy)0Ii z&nY*6aDi*B(oTx+Q{5UK?^b2Wzi~xZcK}tH`3A4Pgw-XAjqXKqRRMs`bP9e>B{b3Q zO15g0m607U4HkFq=*8uGw)#}Lg7>DL5&UVUrfJ6g;1vLFqFR=t=!$An`=APkgsO67 zqwBg_$?0MNHQ{kiQOI1+NoRW|glXOnQsp#Q7({VWd&;vC5%2q`sg<%s0OWf%5$=|} zuw1c5ClVfW+gJUOT(Q+Y!7|IZhsD*dHc=9E?w%-jz)GOReGOI~6C+J{Ls*IiB3oUi zH~^Ud(0kwys5*0FY;2kc@?%uk}I+U__of@Ly2b1Q4o|b7ygl>+gTG&L>(dJ(R*YGH|K%rb(`{?+PJ-O_aDa9%kGWC#W$v5dI2QmexICv!5a1zLvN|)s zE!0NGboQ@L%BielTyLM;2~7>WK3;ET-~)5S=k9adIs3+RWKDVNTWIRF+E9Af z=f~xWo#JK_#~2Z0q-t51H3#lBVnTO9+&bn=}C-+jB)NV|7tqpCI(ssosL z@ZSq%dm|nDUXaq6@nK28(|Wtk+Z-m1JQAH|KizAeJr9aFIW`HFU>DvvT;0zOrFW%< zY5$b&s}t~6?IJ!vSY11<1F$umnKNvy@Bc;k_pqZ(+YhB@xiA9L^@!-Llp$+8+KU6m zY;G0k_^&eVAdg3Jt#BZzSGX^(ceRe1C0-VY&?A^7bZA*+TyT;>gEj;Gp_;4!ne^Hu z3$ZjCSQ`L6&xT#>6#53&U}9d^2Nk*@rI!>h@wlCO>FF%_uTC`CL2F_zx5H^U-Z1<1 zuWgJ~MU|LVP0ZL=yNu5la=u$gDK6bdkCvD@D{xHA8r1YtQO4wJbF{Iz&>LreMc2~O z)|UFZ@>snXH!8PFAl;&{Y0anE2A~cV01sH0t|z@L`GD_{A387waKeL5Pu1h)UyxGJ zPOLHmS@T}qIqABVNI(s9{7mav2ER?tM!XYV%r(z+T*y4Gn=nfnSP+D~+5Ogp(jGe< zGzb{Kec7cFvF(gEs!RFYdpJV!BjXKA50$t!Jrl38Bgoy1nxVfxeGlR`D<7=y^~)LNA%2cH@Kq8OFe7ecg(S!pWu)^2Djt^5*R-$-tsf}kb* zxVNsUZvB>WUfs91i+b?kDjf5gn(;%d!W;n=ZK%;Q#RLZ+?1f8dNTjf4nKPwe&X#V?t!}|TntG=Ckmpw z!%ezM$zqOB7;oMTqOr%G=@b&8)5^Nd-baFF^H>CO^40F(=-LP8dM|}07HHr|u{_6a zrKr@5rioyW6XIfHkYl=N!on@2(%|08O7XFREXDWl_T+V$%DMriqE$@+aS=S6*Req| za|T7;F~LRf4(Thun~m9jkTWLXI4pJNE(6P8!x?W;rn!YepK`v6#pj^cSDdP-VF9rp zRvwaYEM0Xi?HWlh*kwLr$gg@ZBHoEl<&3RxcWE(p9q(Q8OhN#jFYsium0$SVkA$cjFe^6@2fRh*hY-S=we*QfSm9BUtGoIdI6HaKxIy>M_Pmv+vJ zQXYzm<5JsS4{h#0ks)Z?HEgSnm45sg7GVfe;F}O}0lsBjy(zTUwu{{xc(6?;8NFfY zmAvi1ZC$L?qWwSXT$1;_NbXM8lk?f%n~T3MQs`m3Lhb zzB-+Hl(gjaBS&$tMUSL*7uuXYq*Fxr;hH!?DBHBvdFxJA<|Y4f%~y&UeJM(@G6f2V;+uPlNqIo7pC@R$zbd z6P+YnAIPjYs@o|#0H{On@}b%affrm^McqmWcLRO<`xFFo^-oKZ`vVUGx6zau}m&aJ*){ z!R8P5YtBIbz&NWv`5BhA_NLO~Rw(_NBQGRZ1e3m#;o^T-E63=i0F6}Wey5}^N}p~3 zMgn+~2}+OPHz5FDF;SvNltP8lWf7O-n7z0Btb%4a2F?UD`FjfkjRC9i1P`XD|d>PuR3?U|})&TuBHJe1dS5=O?{ zW*SmoY^a#$xt&~2Mhweh5u)dQ_EK~)k;Q0waWdEXb$2Za2>3epQkngv!*+33=&+NP zq{0Bu{bYIC4GQ09fDDytef#dquqbgY4v4#v%AxdT1(z*piFo;vK60kgzv7w{ zT5KIMCBJ_XglF;J!5|0_L5*~~2WO2i+ti%Rn}>-ic|FIPD`^8Q+ma6E1#sO@^aBfr zOA9YnM_grLqmO6wSO!+egqvjmXxEpRj+>4{O+O#%4Tp53ipQv52lcw|lYd(_dsv|P zyv5ypyL$*2@8-ed=@PMW5eC>KH}WpO>=@;xqJ)QG$)De$v?x{(*h!U9INc6K&Ky_b zIN|1|zP;RgTpB<(>?yF{Y+_dL-}!{TO9;6-g&^lPPm}6EGOul4F3yc9lwk;Fn+8=% zIq=d>g8Qa?$AQSSC1IDGYEmA=Eba=m&jb-EWKKTC+LP~NmJD46ip2WBE7xmxwnT9= zfp95H;!1py-`EBEBKIW)XyDW7THI z?K>}!L^8=7EVKIqI=O8y%N+T1E+%oR`n+FT<{-je>$FW|%I%cJ(9#gys)0(4l+j|P z6U)OL(jjCgdig`gUXaat5Bi7lSBe)-t-3000Tg-_DOP1p->^SruQzdJ12@qspy<3j!kH><3IUqdJOeC z_b*I-TJ)xlpGP*uew}7HSl@i|prK^>;`5Fpp5^3q(~s z34&v4-M;mc(n9n0rhJ&GzEdhMuWqAR6#0`%&-Sv9D#+9XKc|#=kr4y$PUWoIUi+px zkl6<(SBoXhZz<8PZzWD$!%a*A+CW^=JLa|*-BW=&AHT^7Gcn)HJabp7ZmAfZcZpl2 z53=%)&WH24iXn0;#_`L)+kTza#or5@1+%>rKO^pK`Gz(FCBK_JG{eHZ;=t=}`rK;P zE#J5&C${j+Z*BpOt9r;UuLHSsamKn-xeh)TrozSd)`tu~5ZpGn?Kr_Rna}rY)iXW} z_pQNWxahh4|3HN5hgw9nL|l?w-fM&s4s8$KXG7VQW(BMy<&f4uUDyu8gcE`GgoiO! z9(B1>U%9803yrOGg#b z&Xd(v@^%B3sxEjmwuukho5rK4z8ChmHS7?-JWzn(KbH32WBdgu%>&@wy_-3BLXgx* zL+$$HWden+*`fCkSI?Tzrc!sMp6eF)d$-Ze_XB4qj2qXY(I>X=rc)1P2iWp7jgxIE zcP5Aqqx{KY)?sE#klLlvdW}!>GI(JR03I)2@3TFpYRU%i?AVflT@4!B4~*-A*btM~ z8d_>I;wyM;zhj7hrfHL@CEM!1%Kh19&^rLlTZ{AU4Ga=|fo3g$xdt1tcZ_0q$DH~e zl7o=^IR{Lei_hBa+B!TR3s>#ryEO)Ml* z;$+-q$E~3KJ0rFv97WB4*vJ1`LxK|l3JFpzW$sUy*FH9cnd)#O9BUh2*qv?lx{O^( zWwARnB*Z}Jssuot0EioQvr2Zl$8*meCqBnsb20gzcm(2&Kb5S1#Z8WHKdso^cAGyR zY-Atci{aGg&9p~*ZwAg4WbRWSYZBDFn;~7JFu?*cD=>gAlByG*T ztXr8fK4rI+rb)Qg%gC~*FLUK}-rk_iS5IQA^`aoYsR(M8xDN6i#ypMAH2Ri| zk^_hyF8EQHNnY(1m3YZxwUt(dVhG<_vx3X&o11);#jTu)Uo@(zS z!x$x#d4*4bE%YQ6$Hd)$F^`if1Q;s=^5D7CauIe{*pYC*!?U5Y=O>3+o*^;;#gx~Oy%0}V_)nv#+_Ai=<9QfY4152NQEIwi~INH zwv?-2b;cNGQ|MSNCf}~`PfNkn$nQi=QQuC#2u$H zE@N?bG@g7to|39mMK3>_`vw2=h=`mVu*ZClWmmEVwmx#Q-YMRQqb9b>PP>H8guK8d z0b<}!i>2-apx#XgV&pM>m?GwM`_y$0*Ml{8b2xb@E8LH>*AjDk%9qibE{>YK#CAYV z&$XJv_yaOM+jO!cc-Lm}A)Lns{JWN58V8Bd4r5%obQ2EltB*?Yw88oY*FK%h6r0SV z0m(24fb8FGqgK?Xjd5x}l*lKl`>8mx6IcP@$acT+j$@$LQ1%N%wQ^DXGbkxXa{0ph z?c+t&e3y3jO2DR~geAbR-06l2*QF$UJ#ZMPGH<_3RL!5uR193ISQv>e#}(uj4PFi> z3P3qh5fd^_ig9KZ>QqicWa8dG$W?oJj3293oqU%aogR1p{s9HzL{GcEX)OLYkG!cp zJ|)wR>0{hcB0;JxP9ElYr{W0OT90_+mwQ#KAZq1_G|xFpS}w!F;%e?3Eb90R93n3H z-{Nub1R`+p&$;b0$C#*c3@k%3P=^cPm$5K#OB6P&|H;rlO+R&hW7CFGT`c~CQFitm zlzMsgq9~@yk;;=p#esI;l{0P}rKz*+a>W;{n?i+n} z$SyHK^u7|@?jl>f4s>s?`5y%URN?-K=y*iu1 zl`6hNdT%=N@w3)k<=8LNIh5|}aY6XFnR}yHOS>lg4~m`ZWE;Mt-IG9Px+vG8P zrHln2HznS9!6kQQ_o7sOF?h_oRI%|E^*q&tcoH%yWom|ot&Q1Y(r%Dc;-!oMwxR37 zY^z`|3S$_=Ljf}Z6}G1h&det5VXZqkJJ4c0oeMXjsVFf+jJ|sDG}k3rDF1=-O=0CV z4wGw-US88R_meNTrz6PgBZjcCvcw|=-;GHQfZ2Bna(CU_IdUFqN=KkCu@2F5pYq@r z&hGT3ibx6L5dP(@=c;%881<0NQUykhBX)Nue)BIOG7!sqMZ|x=o#C|S;=GM$f{8xS zjiXcxUFgU==1C7(Qe^QZK}}VH3?#fByyOmR5YexRI?9^(8UTGZdP~<4?Q)ey`uzdq*#{1` z@M#p4QP+r^}Ch%^5Fy*=J%Mr zN$z!v8lk@}yQho8s!gzbr??PWb12Az-k})ay)DTC&_P)$9(A_p@2FpXSCsFh7<7sa zo7tndIKM~w=GT4O;sJ2!Q+&Enk%4oZw;q{%GaLb`EcJ+&#;3{Sg>}9&6Y<3J#V(XCL zC{kWovOB^{+R31%#Bo8ouNUY#poll~rH~3%<1J0jkD<`C%g(A1SKtBlWigb_SIF;# zn>=9zgKHKqp(mFffatkZVxtm%J=lN!@PLw?k59AF_WfOn56BAAXh=4iN8?Mut=}{T zCkmMW@EKrVO+Le8ti*@pZ{G8NN?>c5xy;?+Smb$O6)niE{oBSlL%0!pdNg1@9$TcBd3Ax#SC8*(55ehqe@?{fKr_J0GaNs6hb>t z@gRGBk#L!(n^0{Tx(k?oV}BSJZ!xoXcPE1k$&(|wf8>X=KG)tj>fHIpejLAc>C&fJRO$^h4f3Epp2wUUaI=AkRTy2+@H)ub; z2gT2p(>*9sB00@%ufi>s=Z5YWpCe;Q5pi)KkrWT}RjZbACqBP+*UzJTzvUQDK{KX0 z+9J}hzZkrbjw1=?Zdi@vbGhG2ZSiUi9vX9+DkFG}OaP#^?s0gv>%yR#fJ${EYBp>D z05(M&hU){t45hqtuJl`vNkv#8glAv(O74TmG)K;0cAe@@usYed8v}NgX4fyyE{%+D zNqHrlCk&Bgh+>^fOZ55Ly87=%G*JxWG^ca3BMdFlHfCPQx6a0-@TP6#CP*+Rhxpf| z>iZqp{r{rcG?;a8Wd;ev6_6S7 zbbN~1*bVSf2rWnz+rz;x>krYJ%EUTv(|!BZ2ia`IrQNV~u0vn?z{>+J`6wd=ry8pi z7fidt?x=6KBT=N8eOa|K~-n7uf>s>ukf+FhWlMY++bGlZi zQR778HcqvSTxP@9D;wgrBHB5iH?;@8JjTKCNcgaw5Ys8^;|9<6!TVv~OqZZXU)VOh zVqL;l9KL@q8!8K|`+F(3`5LcW*8GK_r?vclfX1_WRP&w5YLY$I}h!>LsU`GEP2KwydC6O%UKLGau=@2@c*=OtJ#qBpKl3=>eFwD z^|x#QAm~GLe~f4#LJvL_^n9}kzfcOo?qc~@VM7-?m4%n{9v>e;s$%=)I&?KsIzvJ)ZAq?HA#uoLp`Dj> z4V?H-Zata)kDScRh1YR$2BeOt75{b@Aa>{$Ua1X26tdP>>m~iC}R^knrM!cLWb(;VpKo!FNu& z+^xyaYBjTDVXE?Qk1ec?udP1hB;nx7X|Fz?#zI19kOXDem(qs{%gga`5|?^G1ZEXK zR4x`R<~G4^7U(TLB7_Uh%aZC z`9AkL_Sm@Pai1Dj(9Gz4b=#4*5IgN&Jx`YYf|wxLk61vz-Id)WeU*DZYf=xmYF`=$n6*yzSq;iG(9*dVj2}fJ1rs@sed+lS+Mb<8X^#$=O1jQ_; zM*yaTO`ucz5l*7t)=I|Tu)~esb4Gf$0o;%8rGlIR#f0_-QLJ!+YF+A1HwNJ^T!+<& z%lz<4bjMX!g5gES)1t)XTol3`vYk3IUu3QnDGq7bm+)Nb2jE3UlhDGhPjs z-X{{OUHtRR`ZoYz%;4=-zAJV=Vah^d>&nX;eBX{&WG&=F=?j=N`pK=XGyqhkK~<5q z%(PqMR0%X2j=W7SCzhW+$!FsOCw#I)p_P7hpdPTRbVOrCqm3k20h&J?0gvq&GFDv= zn&MEZZSIK#mIM`dk2X;3+gFn3VnOqxkV$?6zyY~`DowC_})A<_HZ4Z3? zj^x$cqr;K)vOS6M>Y#AxlRZ1_jv0v+QHM_o6ut5Mj|an^?D~{_xk_MJ0=i6}&3QCk z`ko2csF~eT3qCQ6PLUPLw;x1Rghc^0e=er)1D0I?;k>))LtYJY5G@e4-_hqaj0Ger zl3SDm*VBDYOq--MfX!CESRZCbD$1(@&NiP(f`iEs10 zuI4DT@NU}b*2wbDD1qu9NtgKyzeDqo;jl5UTT7kQ_8&rs*RQ#M(dQCUWQtG92>SNz zn<_G+ah;Rtu4#i!#Bj;8+Dg&OaBn6FyOQU!Ajhl_*Li9n4ADQGl*Jit0#`zXA7nil z$Pv@aoH>VD>O0Z6a>qPvHE_{MzbHi}V)0n1(`pm&J5qkvB@h?6(3Psn9z4PP@GI*Z ztpOO&?Y1u+Yw%OuRTXPbZcLL42&4$%3o_ZK=UYH_0j9f>T+u9R!C^vx?cm{dF}%Sn zZ|zSHwxMI-WpdksF45oF@n<5W28X@IX&qANq4&O z6{Yh+NxY{hvNG-Aqc8l9ZKm+)Zx$o~_=$Msk|u>CtsUf0(tkvwjY(ynto<5+*88uQyRetLMRViP4?{U<|4X z1OE_?(|?FshJ(PV|MY!<&4*I~o_H8yi~}}y;P;Z;v8n9Lo4-QKf&11y$AFZIjV{jgxWI+3#;JthId<(o5k2zn4(Mr@(Si1jpvVVJJ|N68I z?5E@6tv{0X&>;m&y~(>gI=P<#f16G~e9H#4VYdG@@)9pUz$@6++8!&j9;`D99ItWw zIP-ga^!LUx-~=Jc9Z(JqpstabbBb&~T~G}^)k6PQh5D~**1uj20s+Zwn9kp5WcRJk z3Ti_Kqoc1&+&XO?l1UNe%X2IFi)Z%dNA((q0vzQDXIbC%PuHcAJVqrwe*D`l{`HoN z6Nr4i{!J}hj*W$+tgOuQL>jCH(2LbdO=~&47S(;7Vaho#Sq*?d{u#T{_l>Fgp)$jN z1X2HX!~fG;xd0%W$TfUR{M-38|dYz_#&G&J()Lc#Q$^&|NHNNc8Sa3g0fRuu{#R0l??Z5ej0W> z&VDqu6M1sXJbu4Pe#}SYpC=eNJpqkR^#AP%76Ia~<__1JA<&)EZ0ds+HP`FEU&n8! zTTe*#uLb3I#=`$L9{&BQD98Ny7*cIII6ZIQBS;$mF&*Yh>-mqL_2vaInYgpOl>hTs|Bt8t*8#Q^;Q8eg_LcqP{{EjX z>Aw%-Z{zB}597ZNSCcyM)tU|=uCVW5CJCP&*dzz-c` zetsEIettq38%qOYGkq{H@<{VYX>o8_wC)JcHnf~{BNS>47<83Bv_p-rkL~4AqV4lx z47om15!OUz)6juRM|a>8WJYV5nvH>yiN~D+&HA}!yIXT!WIuCO!!mwZ zYCCoA@n+>IV`K76G4{e&OfKOQcsPvp-giA8=^!$Awct9Mx{ucURwL^Mtz^`_LC1l; zQ<<44JSYLS5FVer-faF}p0i`JgL-!Hqrv zOuCZ3il~94Bp4-d4FmQfz!(e?xOxG6uz?R47(|pm7&P#W3Va08!TYy)tk`L39UUEM92saVZ47DY*x1-;-_z65(^CU)P}@3N z*nM)Mwy-7syOMv`BcN}qYh!F>XKZOf__N+mI+pf!Ttq}a8~W$(?|$k#8ULpx3)_DU z3m72n&nL8WH1BEusT(ND`SUKjjIooxnW})XIWRpy8{CY{Oq_qc|9_tRr^Wv&sq&wa zbj*zO|6TOI9{syo@LkW;9wsj!kaV})~1V1}_*mvKJU6A=nF;Utc!azG!sx5Wq$L!+X5Eu!J(cEa1PX>SqH^(%>*tO=M2E z7=Ne_sO~SR4O4(@H8zVXr||}Z1e`9k-oYz>W z_Odw8#7?ppItt+pQ^ipD@VgFjTfVryaHf#XTHA~)`0^RX%_;0C?IHSsh9J|+HJ+Tc z?Kt|Sjm_oTS%tYi2Gdt(Bie#+a$NNup(Dlkd{4Df-E+3W>7*m%<0!vdoz+QX5&3)! zbPE@_k3lYX{-iBIP}*#!HZ0Z*N6{m%5~7Fy=Nwp3K+PnaV~c zDJnX-l{@v)RA$w;$a?)u)^O^idy~bIJB7mG;NXCqlasUO*k1iQb80@4mfpszg2jd#b1`#c-i)!BZ|RWBzsL zujSfn7@TuawcZ0~>q*&RC>Jh?Y+-RWuR%9Fv6(`AYvk<5VS)_HOlSI>rd!{M?d4zo~`^TjBIcpTMKsieAl?A(?yL++$6G}4eoWln|4 zc&0+Fl&1MCL2qboJgv6Lep4HtpAZ6$+|s-~Iln*r=K9`;>*J+7I1uev)9v|>p}9(^ z!)dWZM&o?*B<2`mSBHTZy4NJ4QC}@qTKJ)n@Um4a4JRuNM-?W?36hwM#hm?!K^{kD zA4}ibI_AYutIPSFY0J%58TYlfd*gGRWr@erj@KM681L7ZU))`q+BOQQ$CJwvVbkB- z8!cG-5(tH5udaTKu1Ror%hzmlP{`-y6N?>CH}F{mjqY^yM_2ub;MqM{>mz0t@Pn1l@Oeq`Ajzs(XXT9;^aP?&)1!mf5?@oQ5U{RKi;yO5us+X)FQrm# zh#3ia)RoiF&@7P22s|Zp=3)6}p<%N#ASsE>lH25bCX*|H^<(C6Vcl^PzC^Qj#B9uO zC7^XANqSBISwwpxPh7e{K8NVD@dah%plYQ7of9=tty`UVLDznP=d%h<-@R2D$_V@~ zRT5$8OD8F8nq*O5!m#Z3w*i{Cnw;eB{iHgGX`iYrZTO>^=?ZT0!I@O)4Rf(3^W+n! zjH`CO(&sSbNF+p2Di*)>WpPt(^yteCB?6Pnb1*My&hhgL0d=dU_iz<(gyAvxH*q#s zbxM9^jnoQ$Rhc+_rj(c(kUOe9grmm$JeEU<YwdKy?qsi0Xk=kCMxXcG#gI6WU!tIp>#Z6%2BVihzzlkj%H^f5#P>WZa(kzN5GbO z_IRw?@b_zuo1;V`;C?&Ov>y6pH<$?nm-Svzk2OaG1uMJWY4wq2)D9t82(S^|&zf8g4vFy{=@IFcr z1U$K${n3LoY+g(@T}VV5du)%D`viyYozFIB;`sUb3mlf%(QelLlmcGN)ZW z#flX7_~3%!{KMyz#U^s`94UkAR={4!rg_0uVM-g$hNIaw2|$`0pt8&K*p&3W6UHK< zTj=jRciru2$+-~HINyr;W@jr#vi3TdwIyq6$gkdvgv$Z~CB0P7$c&X@cJSWK$Na$aGcGLgbcABnqgN=~2 zk*u)eMHKdQp{Zo<17mC)jXLRUuXHjmN0*fjZt>cupgLOgd|8fUcK1XKYAvcte5bw& z&U)KPY580u@6SYjAu#WhVPRlo8ZkK$(GnQ%fV~~o5bNQ7Z_Jk%5P>h}`E6x9OW2+| zu)<)NvO**kd#YQ{Z}eLxj1*S9gbr)v4|>@K(2O8{gFzJgr(>E+&oEP$JqW4-KBr zElR!KXxy#&z{+0kPfwb$VP1swnXsR&cvdWwYBmH?a0P)L}NP+t&xWZ&DWaey)?$Z<;uLmWAC$F zTN`A>351Z+U=PfIxb((GtSji~oO>gZ#dreqzYMl;+dE-Z8__l5N@L(eP;nbXW@nX~ zZA>f_Wpg!hUO0nUzK_FF-^I>4jnm@D#W!$gfUPAv zVtD72#z8NySg}!z<;vCWQ<-Eyn26vv9p%)#Y`GjUdfzrFNMxrGxF3-)APB-}qmb9?ijV`hHL2u%UDcstd{V+$wVxS4c>CDW1=g+Dzu8MRIvk zIn3jedD8igtu0l$y@(~@ASaq61RR!emi3M%O00=I7LHy?{Zs6-WL6CyAD=4TzOAi}dN+uzI&CFL zT#{b(w8}ql%cNl?Z`nyTSvWA&X`)a&Hv~P9wP~PcJnxprtcZN^3Jw(Hd(f(bHSSD)#2+2#nZX!$5EckfcK5K z(YA~W-m)a4y4`%-G@J@=o~5kc$L|;o#8GoRI$rRso6*x~jAAKqLMy`3(l$_3tlrp? zG<5K9#?oktLD{5n?cBDGj3rDO23CS})s}Z0g(ODN58wRKQwo&Zy!$}E$bB$ixMFZcO zpTn>qn?fVWfoU_>DVr!%S>rBDmK- zWP5xs@C`u3s`7k#U`yd}l#)orKh=pv1|=${_jHrk>@rvwny;~aWOqDx>tAY8giw-u zwG|R~D4^7VZr!egJ`%OI)^*dt65lVMCzqzxEV&)EW}f^qi=ZNO$GP5xny5RZmLnJ} zf|66VnQ~ERMQZw-7#db#4Q_mU-g@kZXGhB5{%i)L{vH}Or&0O*@ai|Sgo*jPVRaVc z>r}3J7X`TKBE_s@!8FQ1oyD43n0&W|5*$_Ry%1k0+nu4A3Q46hO@5wmEb~Q#SZX}1 zm>b=5jA+7uencVk8MPBZH$<5H4p8Z(-wr?f!*OdD9{~-gGIBgP5llL)p;t<)6<^7K zF#ettI^ug9WO;)8TeYUvmi?Kfw_}b^KDTYr+;ts~`1E&pYhbSpAqqZ$i^q`jRhv#{ z_Jm=Zs9 zT`Fi%UiO2qp|3knHu}{%Z`fJo)?#LAw!lT7cYMYQ(s%{V4WV1RGP=8$7p=$WYb+=e zDR_&lBbnz4H)m>*tgGrPx*Q7&=VC3+*1S z)SanDaCJs2^of0tlbtK%^uuB+TFQs#=JvUzMPJwX-uxnDPcql z*+%1;^G6_Bttl;Gk0Z_)jBCSEJv4q#;0U#Mscg=++H;=$^_Vf&L?KbKj|i*iSIC95w4BZ)u_kO=#Qnf#yQ!dw$+@?3?oA6WSrNl}E|FH> zb$DxEalwvlhd=rbcZ`um0MBr6=w2VuId~LZkyTxK7%qG7;uy(rM}Sf9khMmb$8xQ z|I0JFmpwQQ1(C%Eq&mm`2E0t8t&}o)bYmXh)Fn3YJP!gQ1_Lp>+gMar0g2JJ#ky6rCw}CNaim1voC|KwB+iG??1;E`IDmY;5>JYn^i0A{hwgIf#>d5+6rj zXWOn7hqv>$#Gm(B3Bg07HaOfWF@=q1)jEp#UTyp9z{10i%{zsJj1|6h=4e7Kv-Jm; zJ}HG=(Hu!&F`X@$1V?EqF$lwk>h!P{YVYU{>6@KZ)&kouhTv)KEyNi}V90Z_(A;E4 zvSd<#@6K&?DrTCZhR5L!jgn4#6Cl41m+xl5*&5c`+KM|8wB!EcO@*{mU*@h@l2S?a zo5;Gu#A;JX2V+wIO-fBlBJu5;pbbXPc5q(_lnuNKZwL>X6(oF#=^~{`pZ8^2FUM1x z?>E1wnbeUSZR|~(UhHT3*%;*x>Nw?^62S#RkeM%3jr-f`(jtmr8L~=(5>T7M;I!Xv ze|&A|e)2`3OshHS@&V~OuXSwXxVs>lOg>>kf3w@jqEl76NVyD!KYBO=@a;<{#3ZOo zgLb+){jB@rSqKzM4#wGh<@MmYy<|p|$bV!7yO9hi ztJbt!X`%Lvun7LNaf4eJ^l8Fmx;V#N8IF>-Yo8WeJKw~&x6O+;GmsV4`aaF@nJVC9 z?`D_qXX1CCZeZ$%{LS<&@@b!vRhsN59*O;>+(?!|=4#cM z0EW{4cthavd^p#rTxtsy!i~vbctm?~f7~iBM+g5F>0OWQ<1WLa0@*h%;c01w2wdc? z4t|p57TYA^bsG`B)H1Q*+3tnwgC+hAGO3tW2tfg6;?`?t75m(R8!aFaiHwWvtlO|P6IYu}JNNmF36Eqaldaw@ z9lnFL(N%tiaz*YgO7e#{%+T&&63d$1W_)-|r4)~tX1RaUjJ-0X(TF8(nWe$`*~Yto zt#X68LVK14XlR?duo6LFkEq`TG0W(FNq8f4w+0WW2KDr%9llynK*C1Gu@fRXjpxyg{L`-Es&i;uV918aGTw3z zzu2jjec_3ze6|%zHD$o=UE!RvO$tM}Q+^Zi^CQ{pDlhtau$~T>< zLP^uZ+j*UKKK7BW)sEx5pbfGD+oG`hhod>`aqp(Ep zcwg5l-zyf&@aefbTg6fld*YJpM6IEFtXO}U&`9r@WN_|6Twejv4nvzs!~iR^PXx{K23Z`x@6-o7oJZ+?fwlcqeRo;R!o3I8a<_sc`- zCfJ+juI%0W^>HAs2b_LKK<2+b{jMvm9(^0u5vioI+bWwwL%k7j@G#zIZ1CKZW*bT< za>Q_1a}4?5OB7A(^Kd+Vn)BGVJm=T(!H4|8ev@2yv3>aQ-R_!SAWpG4n>u38+flhi zy;AIv>~EwSJ#o4{dTB-wOpR9uGvF^c>u+axm?vGVdoKqRi#EH(?BC;yNqBnS-UPii zk&lURyJpcosZwxyf<>&`4LM&Z#&b`Ju8gi3u=TOx^?}n~+Wqr-9B3&a-WvLmIPM;6ODGvw?wcK0#W@OD8&b;3E_Bg<$ok&#a$b@Bjn*XOtAow`9DkM#xCMTJ8p+yYB8FIn zm4{RjG8%XukF(E5LA)s~C(c-))ab6~f>x)n4n6-buzlH5v5C17i4vDM%!Dl>N1JGD z0Z7;FbLxhpDLK(((sC{+yOf%RF&Gc)uU6TT^vBn`iM|>ny&S!7SH&GpWSo{#_2f&d z^qfL=z9tZWEWROPF;p7<%B-1W8Q>_DM$>%2--@KX*h+wMG4zF7hhz4X^TXYnv$_$v z@#k<>HlZh)-3412S#)<-MNqWx6W;CiJ|c$WTH7mW3ro{AHaCTIe;(zV=4=9~@cS*V z52V)k8qce1{Od!w==pTlPxOv70OS;RUsRu?fOEuQpEzX_dv&;wN8PK}o@iUO%^<_$ zi9(RJfXDA)8jo!@D0BBtOfw&2>DDoY&s{=^l~BH7 z0o7M?ok*lpOXK_KjE+n7Vt$@@JWbH8lG2v}i`7qltPDP$H|xuFuQq}zr7mpstUzvt zElecpHN^@5EF2=~yi2(;ga=XvS?e!Y0bjD$H8)&mlk{i+PL*4TfbZ;7KK)MF*q$>R zZN+*7GM7NOkvadZoxS@ZP?PJgRQ+~!C>-#AM_=PT2gu8krr{`mrOUAk{BQJ_el4^~5 zw?AF8%IFroB=D_deR{gLEPMm*mcU>bcT9_z4nW6#d($QF_5{UJ$?vWy4F#r6Wzy6_ zGJXKYh9m%IgBKB+E&`v6a+^o>?e+L^FMmNn2WUqzH>|MoBA=%;cMobL3!_kNb{7qg-H&4Ueh#>u6BB5%(b3=t?s?y7kEf6qYV=Zl3ZdP^eFuQ~>3P!dS%MZ8ksv>F zF1G5lCnCn#oRhQ6!FbxD;j?jZ3C_}BYgffG&n9wk8P02XZJDjiZTPiME*FCOMZ5b` z^wM{w{_-1e{jLs&N=chp9xI*>Pb6i;p3|9ZOvZ~UP{wuRklS<(TDUJ_>n_G;hEKwJPa=y7_cX&%b z*gitzZ9?jc)D%`3J`i+EiO=bl4%kB}O!qY}ctdRa{dq~H^YcwAlGM@90iX82ui=!i zrQsNIyaj=-F0t^`AmHF|(^Z=EUVWp3ep#nCh<)lmI~vq^xmep`HMSp!xn5X@85bt* z50BE>KWCD0x4kxW(_443H!fc!mq1tO6F`|nvh71h^PsjHGSKCGOD|I7Fs0vS6pMjz zwD13BlQ$Rer`nsiac|_p7yX_d^)d#p)k-|etdNg0oOo>3(igH{y{^7SHIzRc)36X- zs!G?_NUpQK3g>ph(R@DM!yQiP9ZZi`tIqNpqAc;Y@D7MJBlCyd z;rLv+N|N}unGZmaQ4g74lWHrd$$8yc(a8x2_`&8YHrRE)56m)uuO>oO;j17EdcLIt z;MO|i11c6kBj-f%f_7Ko)*f^V^4UaL%d$PmthzY?XF?8uemy980+ldCGdz}@Rp+-KK z+z2jP5CixHi2%#(?d3kpCaF60#UnOt-kFqOGD^lk%j5l&4siOQ(?&;RFKl}?YMKQ* zTA8)2CTAaqPx}KrKKYegoy;5GmB_{Q4vtnwg?hW&V700rk(H!39W6OF8`}utNyUZI z)Zm_lC%D46C+ib6k~jcpi=_k6UGDnRNn606)gbp!h8@`Y{?v&@1t=3^TjU(^_>nyt zU6=3~Hz+mN6F3l!34gS;6$z=Ir!-s97f)81&N)WyI9l39a?J)t5+J(!>NQ#5b#~I6 z#bvAQB4JAl!w^1h?5{24Hw-5y3l{ySGgE+1;74PYio5@0c1Xy$%hr4rQD?1wiGqP` zjUZFfyG=*L%fQ8~iFq*ix9PJ_7sB(RC71rnDys!gMNG47-A_wewZl97^mtz#wBrnJ zmFl=Pw#HBI)t#Ql+=xd3q(HRhxeum_y^-?Zs0_Wa(Po;)A5G>G zx9p%ss#Ophip}(4IXGdzsBT&v>WnFnX*qsBzFy zK~K(&l<1Uh1sL6nOk`V}bjj_Rqo2Ru^b(9CE_L(QohI{hwgy^L$koB}J z1On}0?@54Iknq?ET496fowF*m0@LZ$<^a5$h-7b+BsQZ=c5UPlj7|P*81>-Aw?3=yV$g@R}a2V&sK(vt@3q~T^D!S3DVzTMuCvGaH` zZB0DtIn^dDvU7XIx1tLU@;{(KV)gP^I&O-q|~CXO&zv^RokpqjqZurDlgdU7Lqe zqpn^F`3RNXz^|jC6a_-jFX~Z z+SuA=?X7>P9%yl)Ce>W2WLXDwDTNfq7Rij_a|x_&q_d9h>tL1!th>iY0Za03RF;G6 z6o0ENkg`aiZEW#4 zrHzv4&*a zGBb6BgFx)I;vxRx{tVrYx2ffY&Tg|>hwyMjS8Ea{E+NPRsR@;b<_gg!1ux>^I<3lV zD&4!?HU>fG775x%!7HJ%L5WIJ42R{BFI+18Vhgm@ZJIE=33Ggh8z%j6_K54kJf3EL z=g^E!VEwpADe76?^Hf6&$IW8@TJz2J+4^EI(u&2O+w zhZVJ>^VNElJcos3>tp$C4}_M>qwCU`gm)}o<5JXSTE?UaYxc$4L` z2S$LO{9&>4W^tYv`a4xKcF%S&uTTPx)mITZ#=YLqJF>2b2{-jEv~JC3*-jr%Kd;u@T2FCTE7^QoC=gP-0S z1o3vRc@ooS)_L4t@l>z4rta*dwK|v_7v!5=xT`fbeVP;+h^H<4Do?rYn6{$J2^~!t zw>)}$hC5xKFN}DFc)Rj!)KPa@5xi1+xKJaX)Xk~7y~2YFzj<3usg$2zJxyzNryKo{ zGC8ZN_9WB7K$SwU_iLzy3U2XxW6T6b3GGf{|EwKa%AI@QRu8kqDov2aK1?&j_EbO-0)X6en_h)R8X0+ z?6WsSe$u$W)MzS>&|v62bL|M|t1~P9#-|Ea4li2XT4dXu#Rhlvh0DzX`E|q_$%}`2 z<1wF|$y;Ukpzd?CgZXCl1z~Ed6NA374AS29!(M6JyoH91eD`Aa&GW5W4}+mZQRy^p zy2b@=I%!EDhP7etL{SONRJaKruuZKVY!=?D6tu}Bj`|4;gJYS7=;h@4=jii0Cz19N-k1ZmfC&|#4yT&Z?{=tErAkFa0cbt z^nvrD*MndXH&B(zA2fwT-CMTiqYWBcygi4PGG5OP>he}lWbNy`|H`A8~J$0K>f(LH>xX^PkoJnX?5?es*S@_lD(rFxA;h9$eB+%P=8 za;cjBnQIpU>-YY$VSq7(FfUwv_Qu^%z&`am)Gvt}AGKD8_SS6p0kD`{czAgm$9=o{ zpo3cjAcdlshCymA{}@`)F`r_R&P`!gq@?q1%!8*{th1gpL+&(UF=w(&<*d?xKg|&< zVXy8UQ>&da2_?8KJ=9>c?FUFCnVHxFL1Yy>Yx7NhWlb@^J#susqlGQ{G@&!0>{erMZJlv2R~d3^ zfxBCUDI~>{7k+9z$DurueCBLD=FMRKou;tkyjgGP3m+nNFDd6#e7&C*Qg`FTWM{V<@LLyvpd6P91YTWp4^um4`Zg+GNYS;W8iIzvdnp{~oep%c(rU zblS3!F0SC0hSRF;#43va;fv?<&EwsWkw|C$-I(S5SPR3&j{pCF0`gx@pcM-GEl9?P zS>S14(Izm-rnLtWyeA(VDTk605PVkLewFrV~1~-Vd{Jfjn76cg(wC04(WJKP$ zW)?T0Kd5H^Z8C8q69JO&#QN1&xG6V{Q7}Us5cthVAe`XEi(d)Nx-c(6@hgB|OkUn@8H>RX2p+!wi%+!5fZpcVV|drGVa)%3Db6RdFjl#JaIHx(dE-`WhLY_{(R%6Y zPyIao$7gR~>l}l8AmHY`acTB4WtBla@V5XoUm*Di?qEX&Gi@Wd81G{Ro-Vu>GVW| zbldlIqG9V6_h_-6nCw24(fJITN!i~aN(E?lIe|B29`Jj(U|%6*07110z*e_Z>Td87 zgoCv(a3{}#8-oAe-he@7qOKl9?z>_Pnnis9N$X914j+jbqmxx=be~%Ipv9SE*s}BE zD2Uq5dQgGA(LpcSV0_nl-7Xy4y_fT}q4sOnyr_i#NVH{AQmxPm{@`Cu-pMWOD#ymT z`{C)(ugpu^4h^!Ucj71>#wfurxv>9PK>@OlAWaCffIm_60|{P0nymMtH~*I4P6+00 z^b$EgC=LeU*TjT>?(#ms5X!vfDcwc?QwQI9@k&++82ys2^G|hPkn6%=-ibHXf@Qz< zg8#Wos0IuqljH-$uQ8W@?jrL52@YKm?_B);Fg4>qzQk*46zrdg48O_1@V-IeO(*rx z7=QOmcj-Tk1S$aoF$x;{eRVHjx+1{9nNBx?wSFZ5|EbQ4w+a}DfcR&q-}MfVTS5;= zVC4vuFJONq#Q!zZndrbk)QA{=GuXdsI3@l_pu99cHy0Ta@{U9-=5um#GC)O-L=9#~ z`)8Vey{sp6FrWPb1aMP5HmyajUwZRWHDujqj_n&b~)F>M?eZ3?+*cjUlH4 zY+__8_jw*bR3#EQ|JK@Q_4NCG2~f1XdWZXZ?K@1b2&)pRGKr8k5R?;5VNVIfSOUG? zh3uJTODFi#inPO7nSIuMi~DZvtEff{=FdQ8rLYGQ1^KSN1}={KpQJxR%|K{3^z^8BjZ!eET#76`be<8Tu)G{YsYvN^xrd&@;rYbRMx6}(dv!|S-3FZ` zJK3blaA$hYjLoD|r+^+?N8TPWic&J+uJczBphA8dGYHCEd$H0c-3G2^DswYtVH&g7^& zvRj>`&pG6O{-vn=TWPOOzIHnHPNdHf4+;GWRpmU0;ma#2Q2+;`d|RnJbhxv$nvl1m8oLW4DMJ<^g%h2f{7LuzJ8gibV_Ir$P}Gkdh%GSQ z5US`ep0mw&Utm_qaC1&%wV(>aVo9Y`EFrD6|1lK_Fn}=?m8CVx&>|zrHDHoEoO{o3CV4V#pbJg%Vc!wlbNr5<~2hKc>Mi&!+jc>$u*cpHFWI`{BSt=0o#31jZvIQmH2HI1%i3@r(@_8D5 z!BANIoCL!ohYNbGT=y3l0IS@zch&F97i3@i;@{i#6JxlhbKWptUx=`q6`4ZS<_36w ziL^_GX6JK%f5c~RjNvq4=kv{sTcWJ3Q9MsU3eShGS2og#Q`wRopI;SNWqhc3TF()` zIGAIIX4XIfvXbUpN)`Bklt;PA@;ChXMv+7|E!egkoK7cR+cYY?NwsE7bGW#;W-^AB z1pRopxF3L+8vXZh^xsJ{7$i5XcVAyShs&}>X{mw;q@2_DZ|(g4!NpPhXMLP8DoJG= zW3-h96PYC9-sr`{tu32y7(hFvRIVw8r$WGD3_K9@GU`5lSF(o__Fs$o%gdj0IJ`k7 zoxkA7wOMXRDUziHi#Wq*HW8!MUx=dLbZmP;+E-LD+sM+FQIfV^sOoj4KZqC*Aj~#_frv0O%(%OE1(yV;m zj`;bXI^QXm4G`F-;%46>i-9*no-uaio9U1yU`n|k^y$}Z{ zFiYQ#7*-GTR8XxpKwx8K9rF!9Qiz@F9UGHTdt`1TX{a&a7*kvZEKY;nzEo;|w0yhI z%RYI%StklM*N%VxFMz-IqmEHUuig2KB)k0`eDm7rxXdpFMrU)cV7Fgfl7dDDBC zSq@(Qb9ngm4C_z>FhlXH@fZJ@>t9w`E(zw1y|7pg`onww|0WO_&YOx`Rp%Rv!@p1m zVR*VKrfEYQW?=Oe*@8cjCxHa`h zf?2$l{U=lsF#%mqTtR>gn=2}x+cUQ|7(*kN+RsIObv^Y=akyMLyMC3=d~tM&mm{5) zdWVE9@#f8&3S&U=0N#E3y2YnYpU{wzKU#Az|Fzh>2at(O<{wBxKzVbmLpkRlny%8y zT33Jum^=_igQu?zWU^;MBM}JALE-#8G>?}zmaqhA5*M5OuYcms4(06CCUV`d=tkpF zBz6ZkuS%9Dd`x&e*FLb@?^Wd({J(wakAx@7;7kl2iDCdbcdE)+-1qf*tl#-gRCLyB z_vymw8fyJuv@X!NoU`lX55Tfc5+wZqa_wUJ<`Q5r$az)i?**{(3r_T%ZBW{g#YqSW zzdX$WQIW+mX-l!~R0(w!Ef{$CPTm9j`!dHC`xGE)oMMXX){@T4N)g4gdk`DSBZbmV)2eW+&Hdu0jod3gC?f2cyws zU+P<|^^IrE3$_sX!O9+|at$#}?&V6=W>xRcnC|~XE&*81kyfTw%KWZIo~*&{mfn7M zN|ocqQ_E^AQ#d{k4FnU!{blS5x|(k-T(oB*X$?XA3hg2{5IKOE!X*Cmv(I3VI&W8Z zck`DPakB8nG5@;5E#`fVk>8(40(Y8Xx(#cX^j6}l%z{FbiYzvd0V9bBGM$`yK@>@W zeF(->X(!9Y-t@Z?O$9i9C?ul$&v9uqhBdnoOn^zx!DXvRviq^SDsp?a%~UX}45S~% z=Sn9~jb0-(XGkQ__w&pEs^uC_h-6UPzd?5oltj_(OWvRPpxr;0avRSW=MZ{0muaGbAi`-f+3qY-2&Y-klb9?P2O( z!E$#ITr8h%Tmjp=)nu7?_I%i%{j}+NO%sOC5l*9BpLrNhW3GnHwFfN*B%RMKa0I>+ zvm}=ZEuF})1sxi^pLW`=N+Zv!v#{U0z}lP3qm4z*f(XTD`(U1Xa>BCtJd_rW&mr}i zR5EwAOxtv!{BNa7km|M7*UiB`i(smhgc}4w`JkUYkpA?jKeqAnpF!x&*_^(dO}QBi zIhNa|WilN|KMwd(+1Em+EQClv)6&*~z^quRBCGYlkUv$jJ1VVA4Z6SBeKUFu2)q$M z1e(07E~0QO)c{gNm>aB4qpWS~pA;u^W${N3r2gf+QnZ1lLR+PsL`2;SfF#B>!r}e$ zSw`bC1sg|cF}&6vy!NKEah)kY7SzJ1Q5INb*hwwX)Rf(}N8(6F%!&83q_nb0W| zRMc5&+dQ)q-nlVAJX`k&B7`LXCrs7e&QC3Fw?3$3QbZAK_7iU>paX|41K9u4w&heZ zO-^+6}DanY?eE}j`H`8(DYuY zJ?_IPKii^f%BVF6+dF$+xV406iOYH7dAi(}p<|Z-1AxVW;{HTgp(N@fhgNy21%|}-_ zy5H+Q%eB7nRj9slx>+HfukdJB)ho7og~Z~S5!x!_{GD#&Y;(kwN@D(U3raz%YsC{$X~%lE#&K7RfD_1)$EOzd=- zkFO;2dCKf_(3|lgbl3Z@+EW~kPn@TMA4Yl-=$(nshqS%st1JW;93M!Y`xqQ?r~W!B zcsY9?LnFlSBijOyNd(bqitV#lpe4jy3SJp>Juf7!aAaQ1U*g!njJ$Zf7s5%8 zC?qiZ%PM+Dh=1JLn`U&|m0_cln4`}zK5ltDdvy}lpy8w<;m&rpB8&b0#+9vOsAf26 z(*x)x3f37x$moaSU1f~k5x3GvPOb@(9^f7^?(XgqBv^vGySvMoBx~<|*1qSi?|J4AWcKXt*Q#pN zs8JV2#j@?Keruc%iq0ef_-yXm)OcLqRF%}O3Xi#<5fK?oUOwK&4et+T@MHjpmEm-% zwj?+UR{$lFC-VFExtgn-w&$_%lQ#Qi-}1f{$z!BgyuUa<#iaQQRegZP<$k0?z-FAx zJa2g=5m0S}_RZIcE;sdMOr;tE43geO9j-&Kk4U|;dQK-RA!ondd^DeUG2Pr@Ug7J< zN|YXzR{Xm7!>GKmrDej5AtIc{-}gq~nKkvZwJP09;U}eRwz97^)A8k%NUwHhOuBPu zD8%E=nVjrKl$NJt!D(0Y1?RkNSn=?3gq7K4k*(Rjf5sv+Klip(DuI^9*~LY?0esy$ zz-qo+(n2fHZ^M9HX0=GddeLGzw7MX>lrOaXJ~yD7?Qb zKWL~m8I)h=Oi@~s#G$=scT7zsmRG#$Su4DL+!_W;1<<>oe#PSX%_!F^R8Q!3y; zf*3s6*L>|N6Dp-@rD}iN>+?u-R^-dwG4 zGWn8yDOHGnRvQKc+d>pii#BB2`yQ%@*X+LhgEfcziq@ARKj_}m9}VMrR+4I=)$;(x zV*TsW$-#kZ0zmc>C~Bp7;c4rVR{cA2GW@HvXK0G0CUQShSR>rHul6V7BOagZ?uW5_ zcLrGBUbH49F&f2Qapj(w+2){+{V4qzSE4edm&&z_Vy}roE!(-y_1o4C`P*OM1E8e> zDM~=!DTLwk(GQ`#(AZzgT3XZ_a8i$CKlB{~0)(aQ>TS+YT{d?_5ca3ydQeZ7AnmtD za|8mBhFTEyax&X-r~FyQHq#ZW1z}2BxNLSK`7#51DY-1bSIWu)gg4-VG_01J4acnk zR&y`C6`Iukh|(z+tU`fI0pJ;>EQJ0!=`+&aK+WB8_Q*lB-8~47>~%Y6+@3W-8`!K7 z4Ptvv`9NNsP;A2w(NcJGQytUdu-Zm1;xBkA25bYQT|(6r zMpF0AV2a-4-gwj!v@A)R>ihzDiHtEBI~j^UK;=?O)(0eGS$+N$4SyBlIs-qw`o>`$ zX5~eNYo_%tO#<)?$Y)Sd^=C&u8PJodUtGictdc|leJX}!iwl=g+_|lGR%>Ahxm&A1 zJM@q8A=}z=Mz+T1euE0TIJW&7IROYJ3)e^Ij{!({#DQEXj}y!_{abfPp!40Rp1|Mt z2sm4dV2|$}TST>4XjLjSbMl4~Vthqoq;xQCvql;bDmq|11+vzCHUO?{(tk}!-W%ig z-5Tx5UrFf2icAMxm|Mpyp1fQTozaFvBlT5v(G(C{ylu%j`AQ4du>j{~|5rO69*?a& z;!@G*NeFCQuTA<^QTB)Nn81%4CkW~iKsJAK1hLgqW5wP0fL-@bVuT>1lY{|@)R<)Z zXVTCiRSEUoA#vxJy_Q{PfaiA%Dt>p@n^-<9mTw3zFWfh*{1EnRI8cAni`+=w3I)5&)%+YW`VIw8DUCuIC2Gszej+swq@woI(CS))GTRC&=pP8{pFf(DO!4cY8BN5pY zVrducbK*WF{e5130EsZr)8l)KXxjd;Iv7I{%kA!RZ@Y=4SpUt`IUzNVcjN=Zx9;qB z7lvk31qpU*I>Y)=Fa{dwUtEPdhErs4rpx1d&OTVH9HbU0R2ARBMF15^f5R>pFvQji z8`eH=Z2Ue(Ay~S*FFNIz=@NaKZWO8?f$u_05hXRaLiYHjdxZiJM#=@4dh)^RKep&O zBA)PvGPyhxHV5NEqJygn*>$V|2)83gIP3$hOz=tMg6C>x-h{xHKQXf^a-+jTeIsFg zAfN>&`E_$BMdev4bEQ*&LI#&d8FKLMBvL}9T(znDsPqDm{r4~AC*k31s zf8nd!Z||;8czA)$mwm47MwGD$sJ8_BGWPig5~dehYdU{vic<*;tC0E2qXMRHQO@?@m#sa6tcJYgNb zW^nsy9cWSXwGI|2l%CUBn1w+D#M6!-9q!{YGYJ`Dr3@UyJ#gsMIcrs8gu^z=`vgMJ zsZgV;f8xYAlg3zPKLiGvmdq3~D3zY(rFsUO6t*}%xqNFGJi=kM%+AbIfdq8jOf4$^ z1z!@f*W1SrCm~RR(lKaToQ~-WcgD7ar8*c3nY5A^4vg0cB(`?;CMcznnd3j3UzL5W zB}`{66HaUXnidiQ7e}QjuD%0PI)yj;)es)zd~;BWv%wloAc(`n^%dZH_AXG;0sG^n zmZGi_8GQ_b7opt_@Ly|IX@23MBMT7Q9hq?=EoJS(%LOrLlRW5jTbva?f5aWKy}3K0gy}&(&6!K3n>y zTJb))_p-i7qmuMx{)y6F&mUlXJ=U$(ne?EU%tL^gg_K&THxmmJst;)z&z4e;2~l(_ zI7emBDy;hfGO0q-YfOHHqL)H2KN(e8S^3`tf9y1{A}E)jBJcRjot{_!C;UHUhr{J` z%!PNtNAE(gXklTX4q-M35m zH0v$Ya)xs!S-0=d8e5$?lUTF~H+g13Rt-C2Z%vjfIXBW@k^Ftb9**S9?(CnE6LJ|fKyHv(x33#+Vp)hpI@xcW+)q5BG zuNKFT@9saA#0zM5#Cv+7Q%0`je(|g-4lb7ZJg?g2#A?&=<2yRbp7(*X2lijLJ?MQR zyQ|}-IDGsq5+!Gpv;JNSY1aa^%m%Gx)2Hwk)%CGc!C*A?M>nL;%~-s634sC|>=T!H zd>i@qO4NUdVZ6AovlO)j)rLP4j~HC9EqcLRX;bs&JXZ<#7fKRRbNT>_wy<*+)6Xoi zh%#cI^)I`$Lnhn6*DFf1onBY>LeSwnq`Xdme@tyYP5td)+VZ>sIrpwu$=p}qto3uB zC(j4w&cE)g+b?jK*47C%#GMd@v3M2=%_he!Uk_A*g~2?@C?8OeKMt!^Pzzc1=F4n4 z_ULQg-b)Ew&8>R1<;O=V=D#qg1i0;;rk*j8Xa!Gw-i!4PyE(`sMMRHQ>hF-;f*{t< zT{kzJr`Z(#0&y~6&sIR?PpecQXa|esbJ`X~{RDsk^Hdr86#xpFf8mH%=Ql#7Qy#f5 z+4%DIOy4{?3n1|Q8(bLzj#5Lbz8H$|XGZ_+U;p!vzX1aofKIv%W^4bizyI$SB8LI6 z?e90bO#kbh{`bp*=w8`e5*Sba$mW7L%$a+Z{%l+_opwt>z7>%^r#FuKw|smR4YSi} zkm4D9WA8Nt13`h`(mF#8utEIWo9hst@)=C_GK=b;Q~&XOfup4DO}hm5L&KXlujA4C z_00;|{|9RJLI5Wa6b|D!ks*@EmnuQTTLMU$} z00qBy@7~QFCa~G+x!j%S{m>^Bj}^VPuIgGqz+y7Uj2}svXhy)0Ting zE2QyWizaxS4uP`q2Asn{AoaBR1nVZbLKdI9JhcLMvdhkeeD8#aCsdFb~FXVIV zM^6^m^A4GQjGO$&5#ir$F`naXXzFE0+c{>XV=DFQg;A08>iEMXhLV zzOyR$E;%9$E$6EOo$1p)CaqFIenq|Aqm4T zwwaEb`lIO#0%c|q&tvIwtZR8cRisknuZpL7Z_0d20WrT^>*jCDDRm+ll1V1Fzg~W~ zJ=~adu6BKWYDnW$C_*J0SYA%=?(W{a8+!p1fLwpjeH!SL$QB$OUj<@7X1z&DSafe1 zdorL}<&~qqeQ7bdv+RM8^1X=GMGvfRqZgl{fa(9IVo z9Cz@ao=*tuzDZe~TL}23PiVh<60j<&32`?cU)oTofizp3*h25}wtauT4)bogL;PBr zHkM0*;p4Pvx>$#2#BH?CTLPTP1+s6M=e`Y5`q2ipmO4b1>f7RJl;&Hs?{8PX&u&Y@ z9N}#>+0YLF!WDxfAs^wFijFF@Pg@!@00o}x3Sx4*I8Rp zY8E2=*P7iyyA`gGQMI<3oO*#>@*CJ$%(to;DaO)h29Ss1NoY1Z#Lz_s1_rh^0vTl6 zqj#K6Yd-ZBBi*ZDZwECY-dtiaEz&{BYPEv+B;sjEtgWq!6|;yD9z3Akmx^)@>m5Sk zi7U^%$~ER>w5VDOZMu9W3ykSvc%hA>m`!IR*(kffFqGJ!r#fT^)>nUOr#PZQ$uU0M z%G%gmCb4G`yY8%zh$yOTl3ZU%Cyf&x)$ zvUfWHn<%8chNgxRi^Kgk&PNI#xf$!l$o`LCbD>`WQOH3L?Yi&c@9Cshf;!_nUYO?F zH)O<#z`x>7-s#TTU^8#JmSq%T0CA@b0EcIxQONwRJD4fVoy}mfO22=Yczz32XtLJ5 z9#IKVdloTr3B-GH4*r%vTEP|LR<=W8nF$UN>5tVo5zEvGfr-txv23#H_~RJd@^oZj06-}zD#%c zOQdhviY--5BEL@J!__4b`{3+tz7&|p>3K7mvQ^faOCqRQp5WfG`n9KhMTCRNR)_Lb zDLMZ=IHdsT)Js4FdDW`7*GP^qqDXr7Q`8wJg7A2T4Eh(8oudquN}5KSf!CqK zDI6>kg0fVthJ(A$IXAFNz`b**R`Z*u#Yq8RhY!r$&>}qOLI^qFs;H=( zak&I<+zp%*i$py3a`XJU@Y)e>6Dgf8R8BLSD&#vpK0eo58ufghrUmF6v|79LU4N>IU=uG4a}9= zJXjWhLRl7*@t8dASzAv=l8O*vm&V?&XLGE@5479`C%3|nYZo7P(ScA#P3spAXgBh< zy$aLYFNN81Thd;0pmV^h{fScG{_@=C^;j!f$@KoZV5U?86iv_V&DHFzFB1E{PwKt1 z^IAQP@-!W)x2*n>QQ;(RZK=I69IG~w9}_6Tc!&3MjzZ)1;oCqaU$v)`Q;!AmsIv1D zM`*LhP1+pMV6k#JHKPkQ8X(E!scp-1TRl3?^Ym~{WNb_k^G0qjI0dIVtC0emmw4%WM?omDv=lu+@lG;yw(nakbZBuC7P&tuEZog#7$a*y)- zyID@6yKSs|E+^2$c!J*vDTRuOeH8bEWZw%tRVtv%$$ozqNB)EVq)h;p#`|>XqMN!V zWl4%MiZpe|nu*DJxi#s|Ix)d{XUSC|PdO^T@$Q)#sSwC24f!DPL`xrWiUQfBFt&iV zzc6PM@OjF$Xfiza9#QvAB0rJxf=9&iDn9u>t+!5Xxx%bS9Cm!tpa4S+;(;)0Jx}w~ zLWo{5u6I~eJe$s8SyYlz<7|%S`n{vygyP2MrjQ@Q43@W9AC8$edtUc=wFNEmRGNn^ z9=XW9iGJUwxwr)FMksb}@?#Ug!kRXjt_ zEGO)E@lC3h-m>M?~I>CahV(*@eBGu!9b)NnARj|A{(UdK1Jm!GC>7=H+mv=JZg^jK{n6#y~%BK z(@f<-*ZEC%l%3rHta-zkWbx%Xc$3{)Vy^57Mhl)Q&YDmxwWebc_oX_C{1aDIkphTu z^2X8Qu>V95@#z?q{5oz(>wxhYLBS=-m_XtUfxpc58{k zv)%#R)$Ks^?P1zc)hX(z?e1r(_vX};8qvJeM3MCI8i5N#oo|0E^dIrncMm5qN(iSl zX*3&%rTumhE!S%K2vD?Qp6S{Q%yi=|x&>hj8v^v^&Ucj2z_<1=XmDu^et9PW?vdyq z>IWNk13x6s7Y+G}(KKlZs3>e!3(BCbmzfpMK`8`FpDvc6Y_pYOW9{|i8lw?npw93& z7@sx_A`Aw+vNPvc2#1$yB`+94(|Lo%e6`TS?}g}DN4)E6hLmQ7!0YH<*5Jp-13IHf z;(e%kC1YECWQ0~5DP~kcU~!c|v|f=MKifF8$@q13*PM<2kT@Tz=n&VD zjqLF?n2qe>0G$~79ktCT#8N5E`!NZKGRXuOb3q_U_8Z;%V0vk{sUvhm*J4UD&V7o%%BQGBc&U`MeOqSRBw? znes?7_*nY840m!}Z1FBDPX^N3-vB!%T>&PoSFz2Xjh2xR37p@y9C=H)JES_^smW_3oy3J92MUzl*E%g+#8h&k7 zXXm;UGb6W1F*Ip4o-dnpaMHKXfB6K34@5uInueJzSEWpHmCnC)dM|_ES!>;ZYS||` zKAB`Nv1oOz*YENj{#jl>5tj3(%hIfi9m(!7DUIT}qen?pDtd;px1}#i(>P>oJZf@E ze`3A!*{_WCgqprglBTI-c!pZ*S6(pdAlDnu%A=C&TC&oD3H^6YUOGGh3;E<)67akUFa!j2Ri9 za7J#1e9L3q_T(5V7I79GM9-24^Lz{_R?MTCx|r_beUj;>AaFl)FBDPqSrt)bWe1Q=Oy?mh!X_myKDEJgq2~#|BprVpBee%b^%vu|lpTi!O!D@OuCR zPCj_#cEay5maAj z2XdKI>jhNcUYRwRx+2HohIhJ4I{ zHDR0Zrj>B@OUy;Ea<$6EcY^_Ku{QE(6X@zOTvmrKyQPCjzCOL}gLz%ON5ZY_Ra-dd z@{lPmr?fEKZDY2fEpeOsQ($liO}n+6hh~}V1qxYKw_B9O{BqnRsf(?)Q>Hf=1XuQ( z{!~k*#b?mo6#e0JT5;pt?MALc5BpS}J8XVme9^5wPyR-1<@HFjGp??A#?ves1K$9v zeyY)xuRdD3f!nm3yA2O-2-B*F$wNzVVAk{J7GSHhgj1B2_jN+?E1^zac&EkUIHcYZ zc;+#8@dWfU(HadAe}{7wfvnm$`B{q|6Vc-HQNbA%kjL1vjjG%g=3j;$98@|zxd_VC#1oaBw=#J|ozQe%A-bOZ+g|xwpapm(zPHZ$7&L07S}Za+bP-V`S|RVn;qh77 z6?x}soHEWx`8oH-^Og9r15>%}`}|<+uME5cso>Lztvfhp{NOAX^1}vUd{1qap_xD} z%!Mi|e!?~UnMrR?9=#G{X92|8&ATaPi#MMSKumG*Qk`LK@xweQM z-u(;wGM&(*0`&FFijy(eS5Jye+&fR5)9-aST%g0N!-qy`aMIITbCxL`_?!I&+wW&$4*kG7lo;ZPxI%N{B>0@0yu}mBB&W$Cq-}jLHM`hP*S3qwz z1!Z5dkn?JkfoS{kx!#>o^l@t8qvrCteA9{XdB}ICwFawX^22^t1B0~T5k~j+@8rW+ ztyQ~X8<5B$qJ;6tAZkBsPV-?Ce?w6M6zg_CnWGQq2Yx?KR&%y+KdN~ly7gcbO85_j z2M-Q7&a%G82I`~$-7^DV6RfQZaWpzfrJGGJ`gu`lm$$;>e^#_VY2@h-dAc9e!Gq}4 zA?WTboAIukJ89ML?o_>V;L?N}0(=e8Ra=rbays3)V&ek-;C|#OY*wkmN)dvfh)#_k zupvmjA0F)Sw+3Shkm03?tl?W(OT8b4lbDivfI@ofc;gel?q<+l^eUEijj#hrG%s`& zIl9Iqu9>56p$~HW>9lE4HzGHC^$z_G7L!@*ppdefeLJD#e2^ST*lhKFKfzYmjL5$G zR)U-J1vVIjr81@Va*)6Pfxa_bmK$%!vx^%siAAQ=)f!*b;M>4wgFbcZq$40KE%drd zQ1ev(B512MG?A+kv7V;e=2v^%S-6<)Z|ctGF16I z&1pSETK1L?>TTw!IILV1gwK0;e96IR;4_~9YN26~yUDyRlCLM)ZuN z^9B{AJ%P)kCi_JwsQEp4B3h(JmJX7pG!1rfDCRj zc}>ewK73XqwXX`ST|eQAw96MLyY0=Q-$LEi0piOXV-i|riJy6Upbs9T@9d{=L2VKt8l_oYfC(b%9Aw&5>jc*z5y@SAAQ13}M!;*p2`n}o&KO^NQY4Jr0q=v_0 zE5;eVw~hI2=K;))Parxsvafh8mbpg(;?p@#LJmqg?Rtx&;rpWOvNt~K%W>985oNQv zDV5fL2Jkm3=+G~j%h?WRT_hYo3X?e(tF+)d3-pzLZadyWgHtk!2;t3 zVJ@l=u1}V0L;waU1`L5+K2e95zulI>#`cI2k01Q(HJ)cu-T_h&H?qU&xsJ0__rhjN z+$TIGISNVpye{y^x5KE}u<#4W;^#%PU_J0gLy`Ij{0QAH{INeve576y?vo=;d|3ps zy9?DI$Iwzq05oP>KQ4!$*Op#VhZi4vXw^SiRy)#anVo{1p);qTAFfR@ZYHoJA3yzF z*?v@fJTgZ44U*hD<$6gqD0>iISGjhF?x^p8eF4hQi7tm|r#4wc6?uSX~7vTd`0lD8+R#Mr`9j6voe9z`q( zzfDVm0Ott|_1EclH@Y=fm=}`BH!!_W;84tuSboXGG6)mDjHsBYr$z9s;kx;%Yv(3Q z$cZn{5D@eO9vMY(tuY0V-kvI_X4sai7BT&U$!}2}fO=Z3OX^1Ys_%r{8InR3}1iF7^T1>0)SW)dlqW3*l ztXV7``j7FQ66C72b0%*OsJ_c3QjQ%b_CU$cerIO~~>9h?U$= z4d4l%>@Cb^`Kkx$N92yKxOd1KFT_VHa=g6}HYqfPf+--#bwAL{=0NJ6fH0+YBjuE~ zL{OcBTq|{~?6t5Nh7^uAMN9wjImdMhiANL=@G+de#Iig6#m59PL^z*YSml5LW`au^ zA~F#_9n-T!HRhv|xFkFi%)ZmnvL)ojTH5V(X@ewI?{VSbP(?fHCWI?rPb}FCn48}! z|N1>)&>PnqQ3r$~WuQOTT+tDUAO(LZ5&VZAaBdIR1u_-$gu4ZhtO< zfssc@7VI>$r9Dq&_2h!8vi0IfaB*4{B3&VMyOGJu#B%zCRaI-O%Fa-+ujZlAxlm17 zaB@ACn!~S=uPrxsS#cLsy@Ss8`U!>tq;L$U59f?lwrNtrjFBJ`m3T^{1F-kej*g}u zy!mW=3jJ(S8m&O*fMZr*ABYGZb#NL*axUoqo&0hB?gG`FY&01UaHelV%hf_K$bXrM}WH_E#;YqMqtQA|m8gIAk9s2Df!^7}E)K_P+ zJZyt7^^AK&@q5u;n@-#6`lalNg3IYU<|kU{oq&@8{Gac;F(B|aTU?twJ<+sk(*itw z-JdK4ag2O0%DSWJbqjI&)QKYQi&7qtD4%$q(g?xjv)xAw?wwqC+0YPi-|QOH$`95+;>savezu8SQ2EZo^waO7z>-GXf?#bM z$vG+MK_cVWD1ACR=2Qx~VSHLr|05RCrIXN~Li+((8>)mCTU-PQx0$nP~sg;r))R_#&20MY*R&(66D3p@2D{ zol^$;P@p{pC^d%Tverp-ejMCEv6W_E!tsp~O-}uy?ifSZVi3IEZDRt7?)mzW?7$hO z5;m1=bBw~00dM}3z#HAVRe$J{=o#VgSdV@8Xclvfrs5~K^Atjeq$Ri?=s11>&IH4( z?8c=Kmntj}v%6I&bZ^DnqCbq`ZQ54B6a8LR?gE2El1}Y#8q*R61>T0Yvcf5Ws>oqg z`?!^ z&IR`^uboMTpPS8Xr*tYCm9;5|VfLm(S-gf^$}qIrcSlUtCi3=95cGre*AsFyJ;)gA z{wT?wSdcKbtw?uQxb3-lZ>W@`t2-XISiU$mwKX$z> zlB8RI#Oso*h7-( zZ2+YaU&?QG3rhnK%kzS&)x$zpt}SS`ko=3+V*$$<%ouEeQOZ!*70Tg-qFv!1U;KNIET zi*CZuh5J4>&_#)24c5HeITa{`gS+CD$Gm}w?0iBVNTARTy`ho2LYa0DX~1ulL(bkR zb&&;C1Bo0QnV&l@mqF)hp{LRB&M_l9JBPv-KV3UUwU9X-zu}{#38Flv&fy-?J>73q z5m@;q{Y8=}w%3oS|5ZPDQL95nk6>fU4k(x<@oP*6lrtk^AkmOY-M*ANMCwB>i@Hut zYX`^2Vd)k(;)3vouSj|Q8{$!2@-Ih(tuSXuVCWm+YM zo$^b#3fQ`C5)4cM_ZEKb$5nz#JV%SO7!fGD>rGR zLfGiPP~rTrowiGe=26MSj69$gkDU4kD4H@<*#i#y-p?%^qDv0d1SUw8fGT)lgiJD}y-tv=DWBQ`pWkkJNY09r68i@0@m| zOUz;=;F+5dKNDN?9(}DdczJ#zAC?BH?4>wAwLj4QyjJyoMN9NPc?V7<@IpJW_+j|| z0;}qf++!5Zg;_4VwhlwNBjAlGqedd`l} z#~}4zeK5ya6Z?W^K2>Emth#X1{O!hlexb7$(J6-W&_OzbU4JFCHvEL1LrXLY(Eto4 zlDCxPwDKNx@xzKlYKK;P0^7wZ2JqKK;?*)w8$9R=ru~FQ2m97}RhiZGE}Cds89yi< zTF0qRTcODQZp_1CXa^nKT7)oy#K@oglS80hCZVL}L@^J_-#C21f($0q`IRm5hTWXe zc$m~54ukOyf?uFV61vWk^SC)xxPok&_!WZ{ky+KfB3nM*%!ftX0vhJB8xpp5a_T?! z1}`J7albmjgx+j|ulE3kzkx38gzTm-qz;Ix@$tY^82YZnBZs-U4g;vdi^~tH7RkK} zp+V<`!TW5-uW7k72tC8yn%Us}v*wS0C~O5g20k5jt2*$=K&jOZXr|N3iaB*xHzSvv z9(Q1Qk|HxftgCCIGR3ZYlpN}BJUb0=0=}oX*OREllMzVs&n-?cT%x-*ezrID&RYy( zo$ADgiClCGfAHi+QLnM##@n*9H z`a6OQVqW}GlH-O8|6xG?^{-X`H~!dkHjN?wJXm_sZ~T)JbBF5xE{Oj$4V`envd~(! z!TjgJ>LmqkWe`iS{JVnw-=qI`db}{f-?c z?)kGLfMZ>NP&?g?VS-+r?9b~!7SNS+&KB)v%as52WqMtKcUXT?8O9;~hv%aPmA$U> zY3qQQf1Eqy6Bw>|{*g)|U&Fphs%UyXAJEIY3&_8~8#%rEPXnyaAlX{vTFZ&AM$#!C z0Y-+MI*)F*Uo?{lB9&HYVyVEp0nMs#&bASPAILg<+ILW3JqA z)r#KE@hxcP29;|g1cQbc@S?vfozQ|kKZkoz042NO>VlpSMnEyKU97V@AEyk9xzYT& za>SoU|M#vXY)2Et#j&bfu-DAhf4HtbF32#rY&-)*?tu(#GSB@)o&-g(JL*tb3hS1g zPA2ukJ!nxj0)yL2E6YPW%CW|7JX-+VleB?s152$H&WwXR{W!(>0NME%~KO?eY_{*A`g?$*fb) zq(xJ;YUv#A;^Z=E+a?75iGsgcRAdTV%5fy(-7QB?zJ?z)*&9iCKQ7z%*MaiGAog7o z3@=tZWl$-;gW_5p4&oXKIyLw_55~yaKi*y9@WFuNYU0c!Pehago0jQ~B zcq-Dgusgi0mTys}AsNqvHR4x)8>fZ%_w)+7fB;x{{h)06aC=3Q?w1>RkLJb>u0WG{gj775chsAIpU?*>UGSl{Mha~>umkbo+7aJSd ziluY;qnItG<=Pj7kLO=8ab!?yJkM5kN#cvfkcY)mY0jq_@8<@Oml}QwwDD2jDTk_9<)V(J6thuK=N)H3~1B-+M~s+(PeU8rRPk=iYqeDkbU#^;F3~ z?zr^!*tP$-SSdZ$Hb+Dvi7`)#?ai=RI){FM!C3rAs|kzs{N!+c`ops8c4AK;NyCvz z=qpnRxNHO7@Q*m@KsITx{7Z{rnM>CA>j6o~jrL)-qXWg1TdR^6!|guF zt>#QbbgHsfb{o(dvm#$B)3MRx1K&a9rz6;CIQIuA|_fmky6ndd|H z)Sor#M57kE#-FX`E%s~OiksAkE8Z+Vnf{%Uv%oj4#yUU?yGSyLgrut<5((IJL(ya; z*Gc>d1nlz6;i{$g8>A2MhTW*e{E_Oy!g5M}7ewguQv_ASW zz>QX|fWrn<&E_OUJU4X0XJ&Qy>b&)aqz06~)(baG$!ynq<<;9fu~{s1TIJ=C(%FIJ za2!w?|FaN<1mdk-NCFL$kCbB81Xo(%D_w&WIRyp+;x=W-R}>8!`(ug{ZWpN+c^J-M zAi>MnQJ!a$O%_)P8u;nnVwJDoE)(XM2`IfY-V;a7rXoix1ll#8N?*9aavqN84LZ;> z;2TXUFlPzpZWnMtQ} z7`FRG@Z1SD^W3D?TF)rY*ICj4WeMcl+}-ax342xPkn?#x-*+$tB?$J66AI41TUf=| z*ZGBTbVKl=O>jcFMdPnu&*cKX;B-ij872M21R3Kn6_yg{rOaZedSigB8Hv^z(>B@C zz_rqrQfoFb3aa?FH!WZ+iWL7!FKc2%A^J*hf{uzyEx{r(|8T)`IXNjnBf4~Q745--40o$yqSSdW4|lQ*#9jnE zX3^{8rG79b6|Yy03vgzhhI=`|K>tQI)q$3S%pzBxE)9Q>NctE@{rJdqXMdm^a{=FE zsQi4I^KEZ&a5L~s0cC5lXu|G%Qw(h$HJzp$(i@yWrrvE16jm-=h+($eY5r4!EM9b6)*4cqbAz%?Ih!2>S|~EmH569 z^$$TW>Ziej2wq(^fNF_^I6{)6GSvDh|7F#&0Jv#OS6aLHmUwtJrfUbGbtu-sY@axX z)CX(~AuI5Lw~c&%!Ukk>=+1?AzPiwI7h44x$$SJc`n*t{%PtRi5i_Pp2p1RgQ&Ic6 zr@Kb8QcP^h0L8Gz6R5EDkpaK@B^l3Lq|t^34#^n>jRhIilT7cmIcDyuVfa(i6L$ia zdCc+P_$&3%eC_W=$UBla^>;~(Lc`t1IWRd9cs%7|$(Tc@x&nFfc@)DIJ9|t$=1ch73$LV&^IutVHn>qFn=Tp*PVb6ZgyU;?^aipKNOSefkOWx69Z) zrs1<|0s$xl=B9;1!)cCe)J*Mn8FD0AOj*<2brHC;9T~aeabFSfIVdTl)1!-JxT#iX zUgrJ6IWdINlY#GtJvQPWlE4-$wHpJ8h*f-)&&WS|zv59t>-#4g_TPaah#Hy;HOnY> zG}T33Tb}!6T>=IPDFN|l!IaxOyc#sfn8azFE>=2MDyGj~4#UA9(flGo$KDR#%G|V_ zWO^a_3Ek;y62}G4y(%Iumq|B-PA2?;vmI38DJ`Tv7yw99}c=;pW;bm;Kq>dOGlM%frY4s=;?J5*?NNf1O7q%I>$ zH9YuGi9n#}lZyialQof06q4o7Ue*!Ay7r4>qYmK*m%wXFDbMEv7ue5^wEqe%{?1uY z2Lyhwto`i(N>_jNFm?%6ws`Y5(=y__ZE1_0^&fy<14X(`tVmt8=@16f2He^dax!GL ztRddO{!&fBsLL@S)g)S=@Za6&2~DUtY~+5epKtf=yby4Kq#zM?t>1ufWLzH=uGj{!2<5+xYzj-DNOo>Tnv<0%)>z($h=9{Zr{h zdYkJzG|c0Ev*|KpMDvCGI%jR4TPB@fItq{{M3?2`gb z3}1JLR(v8-G59s~^riWFWr(GU_K!2gdq{M;Sd&Ipwq4|n8CoK1zkf-^?)mI9@#FsP zPOK(hD(&Z@rH&DcAL6i8fQirCWLI(mq~rcDR?XOw?TaB6D(hJ4=c%Y)a}!NbJZs;{ zTk02rXU<&<#D58Z3fNE3NSnZGM4=gp*RW8!cwHJHxnDx;&{2Of6(0c z?mK$5;XwvDMn{|lM{#{)#vj8+XoY4n(Vnvb>2bejY+C3mQNF#ewBAf`c87uib$xYi z&B8iQb$8UTqFFMCj1V`yiO-*>8&JLFk5*LWO6j#@(ie)7PG254GRe)HH>#ZfH~eU% zcvBIJQTEl`qyih;gR!M_q8&UdCP$yG57rVmCb(a{yvLImnKVSaFIKIRsa!vb;Bm6{ z`PK&`;SlgMlvm!a?N*001UnoS5O|UT&Oz*+y4z%A|rsmG|BoVWEJXBE>t}D{U7$;Iw-Ea+ZM$o2@;6mB)Ge~ zy99SgfW{>>t|1U4g1Zykg9nEMr*UcA9UAvW?qctA&feMQyZ1Y<>b*Z+)vZcV9awZP z*3ae~bBr<9W9zi_>$cHrgUJmLfr8cjeDuXjIG#|fBXAvs^}Fn!en3G(OVYWrXOMiI z&<@pp=6jo%rS)}toOmbU<@I(5bnRT^7B|o_G|cMcc{xoXuxX}k8#H_C9=x-7!y|-) zQeQO4em_j^#F(O-=O?#|y;-VlNF(){40ML|G1)5d^SifdzkI7b>vNpf^@cbWp5TJR^{wSRe$k&JA}EbARCaN35#oSneEiOB zN6z`~hVW-2;LU#g_~CwO^sxh?>I4M-w-QpbmlupS`nrMqT)Fl^UY%t5oFOmgh$ESa4{LjSPakw9@w5 zh#X{~0EC_>e0(n0<16M0Ot;Tjw>Kfq9ztyS4^bTF*XzIr*?Jo z0rUam@ib)7EuC||aew|T?Tr539!DKX%^mflCrPUWbq0XBr+pN+{#y9kL_oEQ{|pO? z)K|LXe$Vem$0m+BI5@C0R*PfQrPM5p85U*+AeY>mUov5maN=Uw`$-f2NmTKi3KO3) z;{AJs<5K?=uDB&#kBfshm~IsIqLVBDaCZ+p74EqZ=+7(Qg8G4++@RT6_nt&o%GbKE zz__2I(%K&S9>LFt=OO35t&xL~TkeD}4|rV>;Be};wPO(ep8T03xywv7I6!^o#8dFB z_ja&7aR1!UiYahM18mCof;`0je0Dgg2=J)juo$erM^<#ts_y57gf*AKz1o7~$e|+S>c<29TZ|mQV<8<(gzeY459wptY+yVal zNBnlN!td+$?`!x!Uzdl879Zr-X-85|yk159k7@7_X;5%Z9>8r#OT2ob_$p7f4}l52 zS;ufHw@U#av98{ZU(C%F;v@6)tG;vB{fP^QprahE4loV6Za;wuSdHYDYj`eWmYr6D zdX_h3hVlT_clYZSFK8*=;{N{R`h(v_4Jcnx;sOOaMrXDys%U`UR_A$I=u*gAccK&} zDgNu{D$wlOzH9*iVJx+jrsVA8L(i=`XQ z6G$x-zdRZ#H}sN=XD(s9xgyeSs*yI+b}QycP@$%@Of6%4f?V)(@H&%fh;!ot_0amet*3_;5B%P zTlrP22k4U9y=paT2Kal`mHZO_;zo4$B-V++uzn*Q$^pVVrO>RA9(xc;~d@r9pb_aEe6v#d_tQb<)bx7`#^7m z!XjF*5j^TROsFK?Lz>yJ-t0Ec?a8#(5P;M)N&(QTg}zn0bxXWa6sND%tJuoFBPqb^ z#bLaVSaGGb=5&R6LGvuB_2o8^wR2tA>_mxnZK>d~vjU&*av(tU((MSiz7Kx47HZ2N zfX62Baoi_v0(P?qBK`|BHX3vJjl_w>N;B>y)ZNNi0BpAn!x}XO>{NDn-AG9&C3T40 zkliu-IJ_qr_$N2Ako{hSd}ejeH_1H%(B;*P2NZE6yzbq_xeD>hMnLjwQ0F8CAc+NL z!$asU*5h%Jzl@{ph0^1l`7wBnI-Z26+W1}djM?b4_$$8P(5e?+kg%Vtr^40kjiX~~ zxjPKroo$+Vbn-@P!MrKl*bm;nMe3;5_+EUhO@X1EG;gl@P%OEn8q6bQJON^{6bzr{;w*>ttj! z9$sPafzOK7`MCMrHZ9XWM!H%eUd1|Sd+*rCXFU=RcM*E=ITNX_K zG+Q8&Xb|-0S=9QADnc%OT%AT~f;A5F3zUBz{Y!j(@aT2nJnhA#-PI}`-isH9z9uYP z3x^a&B=#&$dg+H+?eGxwOgrRnuRZOM<8&6N)UstuH!wM8CKk3pzxu;REtDHz3O~h# zyyhFMf~0;s{zZ}Q9{cOijY(=}BT_iHEPcc)WT6NM!gg6q;kSy?(7+)Kd>p{bp)T}x zkx#AAOpbuxG9oLjI!aAqHRG!;cwI*-j4G_Qw@9ntE!x9y>rF(+PjL0i0JLpJdtm_TM?b}6VI+uM7l8 z({ZrbYIQX17bXc)ACriuDis>I?KBY{IJ=+gbUDi1FEchVlTcxv1^6N|{>UL%KOu25 z?cpF3#@wEGyizLL+{sg=WX@sVtPhm0!zCe~i~xWd1r8Sha)m@}ec(JA?2&>Xt{h%!5Fa%R_hL zCf5@6d=AAB&vG}1OQ{9)-AtZZ*ra`<73he&Z$8mmC`A)^l@!{?(~aqOaAhN) z{lZ5C8egY(|xa7@{7yri~7ejosxVm1cd z&JkRG#6Pu}$bW-f>4pCW0gnT%%&4JoX(g@)JSc3leSm%+7yz|$_ZmqkD*`%;WC-X!o{eNKt*fx2G5-`o0LDlR@|OxU zPtNf$HA(k5%)y*9<+c@>uC=p4V~Y2=sV+I$qyL!%Sg1`y9vGLs8D*5fCWf4N*{#ZQ z;@51T7e!dEhYO5rOdnw^57fTI5uW4Sb0E0Ujf_RojMFsM%i(%)JSzw*-jgDCj7WI|9J=};@b?emjI zFU@vAYf5$NuNEhFCZUhT7XcIkuMnnLqBp+EnE$#YNwoVrsN_v9r+Bv5Bmc<}V+%dE ziS`MM91b-LQwdvwyfnr=+nE|W5Qtk)CnBWEZf9b9SncO(4gud47DXvJrM{zM2qVw{ z9=s=LXM`&g=H4Ij$`X7yLbc8tXx)kqeb@k~Ky+WlAW0_eYnQ4m(FW8Fa1U0EP!@EV z0Z4f+w(lYpZe<7CubBr~>yrfx2h4=mM}6zQ^JBP9aYC=lziAY!&O-=;gVpxl&rUG^ zQSBk0z!jxs@ADM8YZS~3u-I>emwJGB>?gZ-e?lx9+D!8RE8PzS{Vy0Lez3dqNO$3q zVr5Pd<`0ReNF=_rn0)he^l@Q-s^-vv^}#_oQQFN5gQD!E(Op+%bQHR=$00d%oP%3M>>)2s2WIn;2O(!&ZzN6V@5!P1?M$l zdwj2o2KyzB@U59Yppy{6?+l9#gUtwFashl8HkL4vVk5h`3e!;6&Yg$Upezb9?4OOg zXFrdH`su|>mYPR$+ry~0J``F_^7PGYy^^L{uS%2+9VQ?=n&3rBf{2j56t&r)e(P2e!j4lxC7V1I zAQjiS+u3jVqN=Wjj$J}55K?AW!ju2}aV{3eH7+&cMim)OB? z|9VgfNW${CBOle9_Ume0jUAdF~UT8UG(=VFJa0)7@=_-yPzq?WK6l z{-pgp(|zKaf@{QN&ZYQ$PHht|0lE>WZ|E~a7~}IeGRsa$Ix{W5)u;q@dXYvCExrcB zuDIwl@-xN?btQm$ccER16LFLlxcn4${LOU61*m;X(jV+bv8{C0?JfUTbffyjo4bAYl0sj0TRt#K`w0zZJ42q3G;|L%4S>oW&j)C&@1t_aPCZS%j+d_!s zm|=r6U|Th^Y5T*EDiZrASMfrt!N4ml3p4?s^V{K&zv>6wDXVJxXz9lvdXrpilu{$h zzOtsVb%l{|^hklxFOqkfikHTaTvS;FuWOz#>&Su^s@OIP3@dZxyzAEn8(u!gZGJQ_ z<9BmYdw9f#wQxBMtJ_c{wh2@cB@NPI(&u+&0k{wK=U)!;%OC7alv2#4?Yyd7hr}tl zfeQ5Df0i#MMG^RVXV>U5@JY{ZUmsey{SJ{ z#2_mA%I0?rZhWi}4U4YP&6!iN zSFe(38MM)gBU;~SXejgSZBHCivf`*?JJvQ79LOf%byn=WdsM701n=BUl#16mg-MW4lS2r118_t*mwo|0-i3`M!Pa( zzNBIcm`;89Bry+{TP938Fm!jMAX<*F$++X3vp}85L2i`_FfVa}Quh5>r6EN`?90N7 zPWe`m!UqniZC-_wX<N#J-MuA-kTdWJ)Mbdk>Sf_UPhJ~!I zu-=%hQ4&owKp^^tb5x+lP}|q=F1a;eGuCUguZG|8#(rflu;7q4omBGJnE23%KqY0XBF2a~%-fh?Yl7ERi}% zf0i*b>WIlAH_76sOqZVt1`8@Z`rLQkY4ax?^FL}x{xV97Vu4A4;aAIZsdvk54Rz|X zu-f=J1w;6||6CdVKO_;5ZJt;ykMMNb+>>wpCuJ4^QREY=w+qmp48OCfL!a_l8?*#3 zSX6_V{<$UoEpq%TK@dPHAIYMgf4z?NkJRD6F8S-ldm@0_J1hF;@t+Vm1aH#M(GQaL zzT`g$hF(a!3jdw@>)#aw5Tv`-i`KvXTO7Nc8|n1}uG*i!s9yh+EQi&5+$&1{&A)?g zOi>B{IH#6pIjZ>2p3w^n3!l#jhyNo1{;O#BSM|W4w=iP3*Q8! zeEuKQCqx^`5&BW4F*#$<%Pldvc-!j07VSK8c!vtGbMlRq@_#eNz$C!U!xUxk2O+^$ z#h9kWv6P*!AaVdK-IT4ExGgr=xAI%G{jW!D;PHEDq!N^*o?qX+@T?b`!AGlXJqa%< zgltIBd}{t=0{tJR8?FULYcv`mW>pkAmIr9g`NJ1or}-N0Zw)7>r?HHQl|5gFRO=j< zKFmI7c{(Sd8~z)k>95K2w|iTD;xCDbkLff*K1(2IMH(lIjB!pirgOp$f-n}S=SBAU z$5Ya>hJ5&n8uU9m=3mWbUKIo+CF_>4s7{s=6jVcBT0Sd-Ou-1%fX+q3Xlf--{0B^{ z@*xHduKl!fZ-9Pa_6Anqf2#!{pTK+1y0WrjS`}{A6D8OCgpP`pR+ZVf`9QVFauFfA%QiM++VrEj1GbYP>>=e^`!p?i|>c%qL%xQz>gmZU*9hwJUl$cCB0|SXG4KW z35~M<6Ya}kB!Z#Q@=9&5*YA7a??sM3mU{^Pz0@GIEcE#wxWWHvw&9Z9>twV9Hsrs`Stg2E~5a&#COX!%ToV-7nZr#aQxo~`+pzo|KDcp74Ck4=QV>!6Rfg7L#y(_@L0B8E;~ z-ozv$Mc7Br_x4nq&#^TzYqX7&8#I_i1++bk0D86d0Eg16@!m+Gh8QM&t-<)$-rnA; zKR-TP7o4eah(9<;xSVT~0=V8P-abAQhT%=**JpN9b>O@vS$0r2txB!!7A;Vat@l1T z>iBv3))m)99ZgSjA!4YZI7T525cwm#rv20i?d z#tTpaqNutkB%(qtBkTf>bX6puO|3cD2pQuZin?RUB&S=E6-2AnyXXpCyZRMEwxn*FxP zrmK5w6Xl^%l=#Hy)n-2G&J4TtfKi?lU`NX{qs>AZ&$NFY*VlDhgU#0WV6Y_*X5mT? zp8Mf_!g9IO_qenp%r5UKf%Rj@>aS7=A`aRz(d;=gSI5iS5HsyGzOB!A#)E7afXATKmuq) z#?||1eP?PmjRkOWXMcO)SYT9A&$k!!fE4Ig6kTOCk^}?#%k&&Tje)ivX9;#YUBJgt zNd$!~uoOXD>h!}C`R$Ty%16(LJbi$^I8MNy`+jIB;~hob+ZImWkz!qS83MH9U2!a5 zhuK3HV%*Q#041GDsNU_^`{NIu8@JQxaanPtIEe0Qhp)iG@{So!M*#$tm1v$0>aQcet83&h&R=X}?2L?pM+mQ+>1s^S=28+zxw;i9N zRPX$B2E`mULamL{1U(=wD5$7v`JoTA9_`AcPXKUMmC+^9Ymqdtz7lD}g(w?A22PDP% z1CTp2(7Yr+9{e2pn2~^qxBy6Od%>^S0xv#jg zHQ=FYhaYjw#t%My6Ce)G9Wc^~+VL0!Tp?bs1A76}WOcWdz;3VkrKzh-9y=VZv_&IW z4(YJle(N|cK2W&1V(r&+SVvU3>eD(>cdZX9Fc)TCl z$t(ewzszhPN{ZW);G_l5sbh{VwYO6xf&4|vnVG3f_~Sztg7 zg#58d_{~_tz&i(}`FdGFT|4&BnvxTbOgG9l#8(TpPmvFs%5)pFYU~!Mf&PzB7^B(` z$2V3J*#(Lz2f2@4TvV*Mb*;#~9S&=`yOd!rj8~|4-pcW=J5mtsRF~&2AK@E_>0W z6=q}wKsM@B$DFqV=tL8DmF8v_A<$L1rw)W%&d;8f1OzuttO5Eny|PQQV)8oQ zi(Tt$uKBcbeKeBux$_~FY0#r69tR@=cFXT|c@A+b;lp0P_V32zqQABpX1R`$TCsVu z*SEaJJ%z!g{L!A9RgS{%_S*hT^2ySje7-Ol-I%*%JIQ~K*>MtE z4Lep|^6Zw>+2#-tMy`)U!j9m@XCEAmwlre$NA4KtMj(}{D<%E;XE~6RE)BjT_y(TS z*&g}n*TsiUwxf7-V`dqYqpYTKQI~R?<9*8ga}#2hSo?w-8m=rvOSL~&XVVr0N$(wd zr`#AI9^adG!IfWYBN~vy?F=YqghOAQj5<<$r;n z&R90E+XdNb0wDAmaar=owLX84)eWtBeU(Hu!DT0Hkxr{SPz0+`3HO7IFI{=*uqb14 z;bQyUu01~`w0XJ4DM;o^Q|#ysbVyRiiO0y?&r455-59sg>I)3TSK4g#CzLO?Ppuzm z)a3xI-`#-zp+#z<=+#y;vt*|^IL_a><1A= z1_e=yp5SlJ`x8pJg9$IaoK5PKVbf}jI`6vN-aie=h0)n?QDjurBCW9kIBJ< z_dJFMH2@mhTc17=n(q1RE1AH6J93TPsPtRC{GQy*Tg$@$QGlU;+0-@{h!V^@r(xwY z(1sf~Y9EY4_RM=WG5tZ6uIBgodbwB@F!H1| z8!^12`4JKS)>N6(x>8bpn$^6m1eUf(Nv|#J=rK3%XF`^crRa+Y zMgx5Ks66nk$-_(#YF$gFsrRmjv$_<$eOH-!(u9(+)o9pBQ3Ym0gaDr7nAi>mP7)y5 z($71qZ|8cO;ZgO8tO!~hi;RwwAZGhWBOZ!q73g&3a#I#5Nm%w(I6DUac z^R*YRVu%IZuDQ%eZXGCUAGLF7XLedY{P1&73>jkGsEtl|$Y)d7h0m((3NH+ek76 zyV))nrAI$q9UToVFg+knK(`XrT>uECJCx!&hv5@{n-Z}=-^(Vjef&U>71b< z(I=h9Ps^HNwKprinxeYW)^SfJqg{FfM^YRMiP6b#GL!Tc>cMoS<(zO_0!^lp!>xRc5`U;??R!Wc}PDgI>dlSrApDDOX1Eu zeka3wZor}!Qfq&*sZE-mojXyJ2lGX3;(&g{9;mNX_d2aWHs}A&<#6lmRlN^$n+KFZ zT<^aj$LNjN9!7Pz4uQY*5bC_?)xEUdNCTJlyx@gG>7ndR+kPtcrC*4FsC*X2iL8we z3vAa@-udum!)vU5p~C!g zv{nV^()V(IFsuvI)sN3)Q_};ft618koE~_nU*%rjZ>IYBUHVt9wjiq9lPUUWbM+bQ zpW6skw~8V}0uxi&v$Hk`l6|+E@2k-)8j-o?r#R3xYbZsVzbUY0vrz)T(@0huv^$QCu}AW zFP?z(cyu+r?oNd3v+Ce$j)#5vqtJa6DA%z{UmAajUyCod7ngO->ey2XoW$QgZH*k|SeBd6s?OW!z5QhbzSTLG^x)uTe4D?E*g%=RerzX zkUuE3R<=wSia1uXrN0Jj_El?nDG;LY)YwCst7&RLHz*&FYKmU9aJPsIPaC?Vuez~j zf83Z{U(KeA#9wgsG~U==+hTvf73;t{F1V(j+Wo0@GM85klf>9C05B%MXZn8`pA^Atu*SPPvIQUB(%po~RtBK3MG( zU%YGb{!^@pri0nzk?viU%3|lA9!xTBJN>njk8(bnm|a7c^u<$^jbaZREzX@w4k zB+eR3ITC4}KRUiiwRPJ&lL@%OGP~LzHP1<`ltmwv-~&NRFWa(Z$ozhy>757&)6t2n zXo<8CW)IsIb@iW5U!xwc%{S~vMym+x+F$P&f7w9MUhIQ$A_j9$DEtF`s0%Lj&b01V|DXRkd6myIaWa>>PNQQV+(>vTz)+Jp^nM; zjVH|JgnPc5;lCeu??rk4IPZ?$w%nYn4MP%EtJ0!Ijx_XpZML9;J-z84EUH)6KuP3^ zx8A5SVZ=n6ZbldL5T>IQiKgAr?De^vnd&m$BJuhKUT_K{Av_S~Mb4u@uNhi{i04PN z&z8t~i^OFmVITP{;C65!m$a|p(I5^j#P?iTJ;|;h#rOO<=%B8`HtD9in3ef8b!#@V z+-ZF(Q!qAZgf7JmI)b390b2TI#t&{LqTDr)Dn9Kvhq%X?YAwqy=Wgt zPYT!Xny)M7B>M=r-X{*gm&&ZDzqE*c9mxBJT$0JjzB-PBwl z^S;O=G2vSAW;ba?IIcfd{JtEi>Z(r-*I+{q*K9)Lf6ihAxT<>99V4Z9d_Ji|^a=#*CE!+S+BJOY~LWRUa&>6I$>rET>Su$HRRh`>jxGiQ)* z2m}_2_=om{MMAO195|=UliuYhZJdql^X7eYf?!iWluw>66HF@qF>g1(Y+-!6SN&wI z>3m^duY^FN%_whxK(kiaux{yUN700#*EgL{Hz8G#Ty-X?+6It0r~9!DpjmS=s4oa8 z8$-n;+%t|@`TS_C&HQsvD^jNG%-Gwcdh++FZ1ZWGgD;lag$<_;1pWO z>3*J!qT>$JF$c444@W9^x2KCNevaDxq%7|aMt^sfO$R$u!SC*!i?;F0ZBh}LOA9_e zhLRV6m_LqicAu_otk}kF0#?UZ=F#lK8`AjQV}qZ|xUZ9n?5yge>r+>4st3(`WCHvN z+q3^SG2rv~=w`j#mO`rTZ`o?qgi&tJ1BtRNj{S|pd{&M6C0cp%im>&HsTj#oKI2*a zI6A)dDmj&Om>}cWO`M0wt|)+cUTFh;sE(6U^c#MmOrh0OWx7v{|1ct1 zlf0qLr5DcXCh-I1QFbXQD;sEOCGvDVfO;iQ+P-SCo=t?xa8Ol!nE{$PuRaGePfsLA z@$-jVeN4pgSSRCv3BIg1K%Xb$3h*ZLxh}U|NV_u{W;fx-Ez|ah&pS)Oob})#37Pov zs-Mykt-1+*4Mid6eE(Rvp|!EB#v&$tFm6CDlYs4A`MVm<3=Wa6amXj*Rf16iIhl!e zNpy!dI4gz$V}z>1ViqK{(D&B7N_{WpUAsuQbz*SSP1Yl(pQ*Y2VrjX3)t}50uOjV7 zeBxM}v>WNTzKBu(3vc(}*995GK)YzI-lnuVUF>FlXfd=#gQK;q#9U7SD#-5Ye<=}A ze47Mnn0+^6H&W|h3_phY!&UXan{HooDN`$CBbl{@6>JFqgqV*0cx?*zfrq1$#w=+Y zS+#Uk6{pA1jjf}6Z6wQ^C^gI%{W`ZbEOO!^@EjMC$^-R@^(pQe$`zw&s;fm_7vK@0 zz5GI_=~~u5>vfqkz|C=7;3uSMQpzec5x#JzYJyGOFYeVDqc*yqiLUfr2AOqWA=p#! z#!H@~fb&Jk!twm^X#Su`|6!GtbYa}ES6__NsE1*d;k&6d?wt*Db!p`mfhsGsnZprI zastNVad((A689ek0~4 zpqfVNH_zJPBCk3al~MAj(kL(xnnzKZNLI7($~j&eoD}WfHlB}5ExH>j?HH+;7<}Gj z^;y~85}AvDA-AtHF@47T@N{Ncw7;eU-+X4-7{;I4q{wnTW)H)WegngKte4&3Uhwi=CvM(&)cyUOR-u(gf;kBL7>KZ?5-Z9v6$G+5g zLagR=hv!G!TEgy2tg&L9>XB*)-{wP>CR)#qI-?GfVk^wtqsc1gDD2s^=^YKIAkh{7 z+5Q5JdcWq~e)C;(7kMd2fDiE}2Skvrpupumudde4-*MeYcS|E#^gVBKGcpCkW7nd#b+DzPW@GfK?sRCFtS`VAhpKG}AA>K_ObR4oJ7BcRC5-R!7 zRZ%Di?Qt2~6z3I3%OphNTMn_yZG7bbU)NI&SvkIElFoj+EG9$)bvrxrrt7K0eD+oC z32xx9%;Tjm=ex`ygHB^3vA8Qu$g^9>Z2=Z(m<=C43gEYha~q9HR!(Mj zDZKH@5WBfzUoNRNNE9N>7+$yWC1h&J<*~aW9sa_@^m)^)f6I%KgF#(79Fvr|T7WLV z&%kxc+|{UVbJLP&a||-_ttuhm1<{W)9;o5#v;LaD=im3q#05U>xTw;n9_!FDsPwwu zbq1fvV3FVP8K|$=&A##&!b{_@VaAr@QFX1|A+HHrhH!y*QCgMB{LV`TuaY@8g%xuf z9mQn*6Xi8+WTiNuO1w-C3-){|wIV4>AI?hDC|)lUT?`@()w$AZevZZB;5?}0-MsBp z3-*F&c7|WCyyQ6liF#&jqJOm+DI;EgG=JmrsAX9`Sx9wsY|1S?yt66XNK?SV-uGFw z`hXld=V@+^8B+C5zv$A?ON;KWJPS|MOr&>aw0X?)ep>O9iSh<4X71|K;6pK6Z@5xz zWN6&)=3}Dh9gx+MmJXBX0`k_HeA5mp>Ef#gKo6{Xl7g^^df(q7XUm+EI`z9iljNp( zbdhK_b5uA(a{QCRyS_v+$)LBOpX@jwb2+pehmo+JZ)i=#+o(z-bMezeVi!B`Ofe=2 zX(pVlX&WcjDJ$bKHJmKoocDnTMI6wBPq%$Ybmkq9;*|+#_iv!=JA=YIw#SBsa^9%c zCmU>D0|v>u%grTw4d+{Vbu35j#QE3pGF?swt2a3F@!$bI{q1D`bMSz$ey8tkUFw32 zis6RJ2;{LbfkPMCI>StzJ*VhK%;r@)3fX<)A6I&eJ;s~(;wgh>)p499S`s%+H_2u~ zk#-pyVuj?^+ukiJT#dm@TCsUmU=PmqM@?l>L| zuWF&39DsgokPiP9jJ;!TfJohM5c=tX5N`=0e4<28p)4)0I~eGG#Y{hGbDrnNo3p^V zDPlLxsjU@L^lKQM(An>_8oC-Ta{GOaQJ~6Uf35@cW0simd+vrWY+QRrw4$tK$5}YZ zPw1vaNK~4{(N(PVhe???_a6E>--^U7R%-2UTD5 z$>z62wn*#GokHdtv4_lF>$}Dqv6wFQ1QtZ8`kg&7@8X`G8Y$#$^&9WFAByC>E>pNJ zVIJ)}wO$q2Z|(z0XmBE{eoSoCDU;qGDi0vhffkik+a?Y4EzddIBU<<(?z=1r`vC%_ z;^SWTcp>mvR&<52$K}(3(TF`Vzaz|W%m|5TT3MQ=D1C?9q;ukzw^y+pYli$T&ziQU z=pL^6gbBETde_$JcS=DBgP3FP=X^%#HdEh-@x8~$zj8C7Z^n#2IOnn%lG%8+Wr?JJ zb9Gk9!xaC_X16Fw4oc>+`ZC%;J2v9=GNY z>9^Ki4~5qso#_M^kbNb!Q^+v%8Q0{tEF}0)q@>G9a!q#A7VK&w#9$NeG2gCycDt@m zVSs4bpW%KpuDurOcdPy^*~H-UI+IyU+}<<&G{e4Gudx3?}OV#D$8jmFoVcf%W9T53S|7wl}o<+{TL&%{ZhvO_c+R z2)~ScVZ!3}yB@aGwOVI%VlNTqKxCoGV0X9`Om=Z=`~J{2wCs#p_M3l~YVxf&sn_aj zqLW+eS>8m`51$EXeYaZf%KfV!LcApa(P}IJl~u1%bLo7WG9yfwN=&3vN!n$_3bZlV znr!5^kq~N>X{mZf{r#=c{wiIxk8kcN7aT6=$_*~H0<%1y1n8Fyki@}GVLBPVP58X= zs7ZBM?lJmD{`2I@CNxYJBXYvuU`=3K?VwYoM&h!&^KK!25D{9jdF+?uWFAQ;Hs;-m z1rm-Ix#Tju8n1LRQHjF}+np+Ja}Y6RNb#`nE-_8?L$na>_X{_*aW+vypVmtRoY1jJ ztT*g+YrGQ$Z`<*YAT8-}GW}+&&lB1j_7w|qE=z~EHOU|t8Z5^j+L;yb?DzpfwT$~)T#uk7)+<0*B#L&u}gQs;Pq_#a?W*w#AzxgzL!;Mto8q7Jzg{=y5->~JUHc}bDl{Io;q3s z4a6#sl-Tej^EJ5lyd9R?J9XKFF`H%|w^(`zV~uRWoo1gKcPCS0tW^yvIp$~{2CMh zgUyvIh!v~4LW6m-{#A`#?xUq1Zn#WKCFk*a%bge1(94_BomoDS$#4GOMAPY*j`NQb z>uQ;mRXb6VQr00B99<{}$}u%#W(9NJ`j%9PB>2X*5=Ig411mJF4Y#r zF&~WsRY(U80`HPhbN)r2^QN?b;oGaY*fk&YN3@RggpR!MS+G#t4qU&_q@%M_zN!9{ z(oLmwb5=;XhXYoeQ)UE2Wc7+I&#MisDx3%t@wD}j zF&G0P^yKOHRU@(>C1%Q+$dvHXpHNT$I$PNVUDnx56#4qq@!Z&M!h?eTdB*AD=SM_M zFUsl)6nsljk?%9&7O>dZ7Wq_>{C28FTHdrEa#pp1hbh))YG#)W0CE*h+v}sM+srUl zQCj%t;O%dBvgJ+#$HX1>n?&|EteEurj-H~@@Sg2y6A!u^fl`0yDRllY9@bl6gz^!j z)Jb`h=x>0ALu+sP)0b?LvP*i)l8|dnXf+J68lcE2lkU z((49sbZ{?;EX-m#)+`1&3t1W z7Qba3?S{qN^o14|c;2#r#Ug@hNccfRX|}-wFW;P|)B&%N)G#8&3<}6E?nst6fQ4gV$)GJ-Zf$zB=Q^i zMm1vpJt-7L@LztytHqMf8~(HTpUe2K-0}X^1B{5*>hA+l{~4P99rhRPxxa{gfEe|+ z)bsZ@!lfk_%>Y`2Jp5a7`j0Ds+lqQjuKNGhJLNywenWWnLzLg(I$Kh+n0TA|grN&5 z7-y~LdKjnsYAZcvMZ2wl;y%&%`(N{4|5dF)6(7idDXU)N7ZE8efYrSc{ATZc&)Vx=_lj#>OHMldm7JCTQ^@U<$xP?;iDHR=4e|d~ii&QK4d%G} zy|fnTxyqiVPyh3MffoTu$9NnsLeRh{@LLJ|Q#1keV(APlYy$uFheeXmDwFWbp9K6> zD1R62|J@1W|Kx=Ge_HT=T7Us)f%3EB#hU`suV2e5C={zf4I~ORN}k6uYes%HBPaT+ z4gC9|!9 z-cs=*qWdn|*CACDE%o2*=VumWag@>3r_Y5<>V;~N)6;yiCHk5!riiHGVk#at)ph^V zY4O0AacqWUmAben72VaXV$%aZD6R%U_;{(u3or!fNhj;~fOa@cx&hfGG_lu`KiD-Ox~rFOtUe zkydZ9thl0c?G~`3Qd`s=!H!P&6#o`T{&ijN=LswnB#oa^JRQ*r?o@a(@(q97qP}vU ze9i>1D2!?OBx6YA?=SH$2Uq$$u0@%YF&zc-$X8i9oo+~COw6o{A_a%#llH;?dZ7?L zUjjFp_|cuvl>60z_wz@NQtIk3d%C-6qjU3DZT?>7{Oj4Yp(EzcO~E-bE&E139k}$D z(ohL=_$AbSiMUWWJ2atV)L@=I1j7hlj*3G`f;)@Y#g?^$CBK z(63uO(!`(;9C`S;Qw4v{&yJjggn5R)aijY#X#KxG5jX!sry|$K%<`CTHNX>hCak~O zB<_8Kr|th2ncje`X^0s!QOG~DDY|bXk%DP%zBy>Lp!J_b5}(!f zt+8V5%D4)b1*_;5l9QI1|Fn6S-aw?9*q;`tuYqhDAB6iVzm~)}`!B z6|oahaz$8>BxjtF4yO;C6Hx*<`_LA_`wo_Mh~OvGVFP_1#2kD}n+@Lu;y($cNQ%DVN0uc^U{>3AtIiyDtK5vbMU zHFvp@X!O0tcJ5b_+|kid651yEMmP4kdcPO-%P624P;E6)K`v!gZau{Yq*&@rq%EF@ zDKC*Q?hLKCc`VQ$*Poc1t#XYPTY|M)-UYX^-HZ>qpRa9+!Ois__If%C{`kI-S_7f) zNNOUsg~r9t&o+t2>N0sc(A}BQcRxX;9|rc`xOQ*yF9lSUv?^9xPsN?s&dp3vq-$52 zh1!6YcA#jyR-tN_LIC*w{Xv;_nMFo+ULILb4ig|@s;{Aa0b&kbrT)!jo3C-l)r#+u zT+5{2qNC4=Ie*0MtfER^@|xgRzT(T5i*DC+@QFd*n_V8;S(y|8XSxN+l5pj&fuwE` z*JKhB5>wB|$=>joz`t*z|1p2}vp%3dT%21PucM|)%gMPis8uR$Cl!4R3x7<-onqVO zDCRwm0?M{7_WE~s*o4mOaV!A>Ll*GnU}WMBxM-8;^!n5(_2K z`;E;_4;R7%?Kev#kEuV}nQGCFrtK;lSPgtntS~k|Js?(F9ZU;67q;Wr-(_^R(uG+PBAGA5O6iR=w;ic%_C# zc_{+m$cvO(MZD?wpJ|gOu`h*-Q19yu-umsvdG%nJ-?GY*ArwjrQbEF_#xG33yLRa9 zH7aKFuXBis3$*c?oq2QJeChT130J{ARaJ_UCgs`G>vRS0gC~tbS3mdetZSE{BqIj2y&vIkxk|hdnW7h0v4SL;4J7vJLR;B% z%=#>K5{q@G>@pLmru2Lz+GyoNwHLnJ1dBO`{4ZFpr@zjB?Md zK}0}6z=9WqpcFP!81@NfAnC^YzPF_LB1y`1nOTBCE1hW?5=8jOrtz1B_Xzwj_FM*Q zd%Pf;aBs@+9jGv~W=MpF84Mc&H#}TR+gK%FkD6rFl~o9RI4Y{oA@r9M|DQ%4_jNi@ z!k{mAFbCiiM}_W)IG%OVktEkX;`wBoDa*1>VIu%VXULu8T#2@G+R3S~>kV3L{CU>o z(|n$(`eN&As@X@$itST#8-?P%nZ_<^i7uAvb7cpmgY+)jk*0bRGqc%ViHs(O<~qTN z{*g+bOOKh|yoxtvm-%TLqNCmgMH)!F94t?zfQoPwxB9z>{Og>4UA668U#uVbHT zww%+uNSH9bOLCMRG%b89aTCS?*2}m}2|rmmK{=}gUh1J|H62)(W5qy$_z%_#7*or{ z6R8AUyFC%Uw5qvR40$OYg?bJ%IXq*lJzdn%eL;rmkDxQgX&!76Ll57@hq`%YHy!R+ zQ}4R&%|8Rcj4?A{SnpS2(JF0DeL>ea%hqf7$dG#`bYo3P#3A*(nK(y5%f+Qe2!O_1 z!aKAx#Gf!KR}PizX*)Vrd~sVq9`nuBEm^w^Jwl#;v!r0Mw%)uP;aQ0{)Jsa8-=`y= z_DxqSBIT2*vFLd>)99K8INrcqhDS`sUEc6n9OB=eeYgz6RYULROn(qV?{Do;XO9q4 zFh0ym;8KhW9qa0;aaan5S0Wz_$&M{{NZcOhvKelJzXN;(c;n~pweJCv^%m1F&Md!S z%E}c!17=QFjBz~@aO#GOPQPC95N}xY;-*?F(kRh^sCzv2>@y^kCRahXW_U6PiN51p0pyE6}GAgNj(D`%2P>e=iLn_)M zqJCB(_-z=X=od&lk*IDFKv`Gh7z$f&n(AzO7!*0%Z+i^%mBK2Q>eWZdHo|Z5@`#TL zqy(K4j&IfP2r0G9hCOKQ1K{7Q&EB)*wQ_)8gT*sbX&eoZG|ymM5;ze$h`$w?dJJ#q zUXY_#9xHo$E2$>eTy(W0@^EGAVpNmjPLJSMM%M+0AYdqxqSaLCM&%dHNW<#6+gv-z zu?h4C4hN%k4#p!)2P+*x3m)sDz?h{3>lsB7@sp_v7t9wHZuv8i9gp;H;Z z2%QyOBCRvRaR3-Hs+{X*=FLlV2zLFE8(ci~<|XztZ7B9zvw;NqywuS?L>L1ofzBW2 zb`-#0+RMA-y$iOZYNf2i_)YM(9PmKKaz-B5VdXPiNoL*~E6bQhPAgUM&@$7(c|pMc zx1X(onoYa$E|`b3^Cq;fV}Pi&BlH?Amwbyi~=Pc={Ii)^8jv7 zeb2D=W_kamEIlW-+r)-u9sBd2T75wS$=pS4j{3u8KDRX0A9)*;zl*Ujl0jRicQ$g{ zjca+NjE+@n742G}eJ5dcQa7=!l=K~J>f)R=1|Hp-9Fe0^DM zZPJKGdS(@L8y=tLRk~nmtF`6vXiGfD>g6ba zt3~fsEJsUcTj^D(l}0X?8+0XrvgHaHCnLX0rO+{Y=a|@Qzs(!}xux};amA-J#I3H3 zhdo6s^z5hLey!zLa?pv-Y}NJ?Y2Pa%h1R1ZTk2hJ;j_Nusd|k2i3ShtJdyjg8|6VX zJcfR^=t^FL6S&+z1GD+mofIFi4ov2N8Ml2LugFdU41Hrw`;gWeA3c*-cMy{O+=4yA z-Bmv%n*|e99A}RPt~z)Pla@7YDTQgcj{4IL?I44->N@g`I;>$|uakK^;Wp7O^?DjK z&5r4sL#lh_DaUXW=hausTihOYmIJ!oey=mUrx#G|#=kkGAtXw)8(XyJlkRH-O>RUj z7Go?FjI?VDJqgjBp7m((f-4f@`#@NuObq0x61CtoR|5`*f0VClt4D9HA$e30$etAd_~?t>HdyB7zJ-xY>N9JlsW#!QZEQjsOr zDI!`Y`ymzYF0O^*0uN2%@hbXhESG28>%HJ?;&{1XQ{RO+|rb7;W<%5`mJbXL;ST&b!HZj&eiBBU&h*(%T}` zdhTZ%B5~&iPHTpCWjDW`5s-F&myNc~gSK2rx$O7yAcyr#VHqR&Wv*kmaC76X9^I$X z9?<8w6X=bTF=Z)qtaKkR?SlXFlgL)auoOI)6u8 z^>m*ZOTX{5{^*qsOyVbg`ab;!(bh!TBj1kG%y$R0)IvrUj`9 z<(%-SGBq>B-XT2{Xm;}kN_(YOvfRj9;-y#y#1~jEGr3gTx$-0vr_4(84jddDqY_4q zwkvW<306_{1MFktCN*1F`y>okR((nJJY2-dUno$fksigVpzLzK7Rbr&MRL;;38dzr znk_?Iu+i;!=qa7OeGSoxDN7nd_1sbUMvs?mR^N_`i0VBGmx$g8<4b1;)}h5FH5Yqr zw&TV$#@z4Gdy7r|m@g0MY7`THbu8@7RjXGiXvtQ|sUy4GiT8ROsqC(#QSv_uM@HWb zUnh*(Tq@)anrNRa$U9nG8)&A95kJ=qk0!lkALE^%yPp2iW)k6{t6{tLWoRP^-5?jw zoK~wX0Y~SP8p`ju2uR#sH=FIxY{;!jbWQJV_I*negsf-Vdx>AEUw~;<#WlT3FP{zC zopd}_@1XC^9s?zCs4I%@bCLU)`V5=Go9ZhT#<>Y|7Oum6r_U6tpmFlR6vW0$JC})A z%~|KHt}hN)R!;5NJ<9P#aQ|CR%xMttw(Oy$?x#_np27=|wa-tV2 zoJ00rYz&Tq7(xaY_Nye!3ULKD{1QAe)cfK_p{_LM>g9`qsbTi%{`{hhFc@jReY*4D z{EO<@qc|eY&crtPWICR07Ecb|85=U+x!f8W+MvUeq&oQ@82VL@w8E35WG83cD~^(2 z8=rbu&h|y)XNyUQ0_gG*3MCngvcTiT34C&s3O+*!FHS5MgYQ@q_pJI>{Baa4s|cr3 zok|mTf}KG#t*RT#S9+dMNaBL7X5BfaM>-f~F=nLnBMU-1P!(LTpeA5&&aPThR<4h@ z$Z*+b_v*(iy4}4F8;n+rzta7cGl-+tJ313hvAbLEx=1sKrhg(B+NKEjC0XEtc~qPK z;iffIu0*GLFPTe#J#>s~`DdFbwM!~?^Hl#sm_$**d&q1hfIO4;1zNUXsopgy{UXZO z0t{mk_9+4`OvC#Ck$jW_^vr7T8kzRmzI|30wZJI)<$A=vwh`Xck;Rj}6lV5%icNpd z>N3;kXeDTGZEDd?)#)8n(5_Y8!v*m+9+V^kunwN^tByGq;LQs$!7jIz94Ch}4%b_+ z=+|0KM^ErJ!pFyr#bfsk$hk9Y5Q~gsm_=O5(aDca3vZxo-M;)LefRzyff~O+S0H-1 z;&Yw(_ywyjN64tTK%YF<8`xTj*;_B2}P zw!?b&+nHADMvFR?rK?k`&BU2ZUIeLXQE&oHLGYvQo+I3_tqX4F#^jBK1(B%= z3mt)hMtUANOL@VWxG2K;9B`mD`JIfQTzew@*jX+tX>7+zSCv&l$lHR@f$?~@sOZwm zv}DI!X#mL1Sg}>v<+a~woG>u>^5qR8M|Do*u0_$kXu1c?n(_Pc4Dvb8M_f{XroN+> z2{$=l&5fprK@f-a`oO5&^wWDO0o+CHiZRP4c7%+2Kcu$fx&j_WrcB9d3S?rt8yv=C?0TprTChzqQ|tb?f)D7`0&9H z0we;ai+)BYx}pR{L!qH5{MN5}st&5Xv*TF}nj|$!4K`*=RL^ZX`xByK)Kmpr``Iry zca~w|KxEu#hJr7Mcsgy5Yd18gt|J-PT%t+`}#_KOuimUbK)h3tpe z1iR!qQppl;NE6J|xMi}o$2MEaW*ClTTzZ-eqFrb9=ZHMDoD9Ay>zsc}Gu`||`Fco} zQwO73SdiybPrp&$*K!*CRbMkl3Z(mPf4SuXC6QD3@}7FZ=V!b%syZo`yht6!835`o zVb2N4vE@K@pcUeVG!m|MCZzq-H&fpFDMEBQsL5o4Lei@AtDF+Y1d`6oIW!cax1of! z;`v{*+MjycaxT^_Vp{Obsem6SNR2|~SrUYITvUUZMW5R2#}LzbA3z67!}`zwFg-sv zuGs@wQY%k%GBIUwg*`L)v1P6DiNd5&w1-`MU~I?ZrcDz~i5~U$`y`k^2ldn=LtmMol{|Tc@yf^bo=ITz-Rze3#H-{d z$EkddrxAOzb=_w9doRhUGq?uyM$QZh$7Kkoy?f%7Ld;t0cv;cvd22@G*J7@yAGwk` zSG$u&ou6q84z$R2qH_#InLWl_IynjGjA!msUW~v}6n;v=z60O(dCj1oYr7Ld7UF(u z`p}#k)EQdC3T~-HoqHkY5emyDncncrAZ#_R#;y0M327J0KH%0R%)|;4Uzd+dj&|C+ zn@RntY@@q1BNf9Yd&MaiEej=sb6KEUx{0z?+u_4SuV#q6FYXS)X1g|j)a0w(;!Z4d zMP4sh7|zcjnx3{-C|o=fy6WzzNlqwrWvE9@O?jW0r}@IK#@7yBaE6CqTWt=eFd}?U zBfA=++%h+Mk~gog^62NBd}#8hM7$(nNm0j?Jl$*aZnyv70=U2;Nd8gkIgmMG)bH)v z+EvXm?Qdl0r8^cr5U5(D@mbiV%==sy+By4#dnB=St?be7BHGit-3u+9grAb46wMBu z^I{@f8mO3kYstAOyb?|-5Ft z*lFaFAQaM_MZF8a8}NRtswZk=D^oOrTK zG5TW@{?u~W8h*@~Hu$7x{((^0M)}(hj5`G&Z+~uIM6l7^nGSTL&tvhT1uv}0hC};m zZNyZm(Z% zUDuK-5g6j8lKB{o;e9PAc*G|4GBn%ep$RN80eQ7V=ZWM9_erpZxe2-Yjsob>(R67a z?1)Mspw9&MHWJZsrbl*W^mZ>Dc%LsBdIf;A?%uW)KbtQkal(4CJHXH<5|qo82%Uu5 z8ybd47@TZ(W!d(WX&QKgxQv{ds@JpW>QBEBNcd<|^4Q%^S?e?eLwU8Cb2K6`xD|VT z)fO+Q!Zv$}F3^HN49;jB7PqUP_@~NoDV)xCxN##op!YS=@{rppDAa>+KW&aW5bU{IaAt2qGvK^SQWQ95y)Z7JJ?6Nu;ytPxWs~U=Mv>r zI>v95>}~}lEnJ2hY1Yko`TC}yhU{rc_#!$O^02az8=BFqJL zX)8*yZ2y~nTDe!E`w$3hTl2P4YX<0-+^ye*;5nXI>)5fh7*HnN&GnvCyc~|9LQj~Z zNd4`jJoJZ7>IXgFeoQblTgeM|V`m#jRx^C68d1WQM-x!Tj-RAL1Q7me#VP|$Ep)0a z#h+2nwK=ziJ(AYt0 z0NYcfG%v5p&yziHD~{F+9DSaES9wJGK)rp!`*T5So!6P8cC%TDbpjN}b-_L8duQjl z&Vx}7qE9x@Hg&=%xLY?)1pQKnh9CQHe0eP4cQVFq#F)ZKPw&f-pH6wUtz2z&h2y+C za%k<-Q2y{Yo9V{Q__h=J=xochB6^^3rhPtuEZsI4FOV;IV|1#mdY;$ToBG+pnhm<4)&iGtu5sB7%YBmtcKz-qJ81>UA5#U31WB z2scvNzGZf$$-9LVtv8vDc8?k_P8xFF^+9Vj!6ru(a)ilKk^7GX?g(Y|!ftx85W>Lw z#>jWNYHS$XEe6el_P=QP4U3*s?9GrF;981GU=zp1tY3Jk$83`E9~}A{1FQ!uZm(Fx|Cwq3OZL4jsO`j5 z)mFCRs}9Jvraf2Nu-=0oLXNT_*DvVf=F0+2Sx$!X=)-M{$-atm`HQ1UHmZ)a+7sgh z#}0ZaMnZ;Y%okI=FKCL1UhXpXFOYhof}-DEPilRi!OBm%Q;)UF3!bFOtd-$vuJcKG z7G8t0cvkfdu1ZxM$Z7X*OZe`f``*Cp6IH_|rex5?NeU94qSB6OGC$X%zkPSE7473M ze0AI-?zpvFe)f^n_bQtO%}^D9h4N;<*n6pcI8g}?!53O=ar(Rk0HJesTN?9J^A`vv zpfA#PUs2`Xp^Qxs1Lao}q~K-aAL#hoWzIa#F!|&q;8JXDNYEd@8a%zp{*~SQHu>|B zk%`y0*o<3G=NUUB!i87C?#DY5Ii@;^`Y7Yaj1tItW6~%80;Bkc;ZDATA#m68(hfFT zZzZ626wnXUCc~%pG2bTN2wfBePg?|Yc^9J=L8zP=uEaMPfXpm^d=)4txJN_74zR<= z(aXmNG+1g~IxRkIj-ALIW7sNT0$l?6<@lZ>yu5o#Kw<68U_sd&fIok}mwR_f@s=`t zAXWGAAhc|*o~ALIhU^5auL9Ess+gc8Uis_xc9^6?S2qWJ?Kj&b9^0r9vwLi|0`;-3 zjpq%!IqzOCRbw}!caRG+GcBZKa~uPF4t^2|2?^9)D#46Z=0FQW=~X4vOD;es~PKWfv6&w zq&_Eg$tShtqh+wb%$&G+Sdl}6;0*U*bLIS$cM&I|3O(u!zze=<#((IGOW=npiEPsq z02BX+a_^hAB!0jV2-D=Tp6x&1mRB2kuM5=a-=k!&4_TGRhn!`b&heiW5QSk1DF4Dg zI3D+k>1((g(e zp++%)yGAa4Dop)d00~5RlFUrNe!uCQ9{nfjLp;Q@epX zKVr4lP?)_3_ygG^wDC1qA*6C19v&G6pzKAGKmk6=*k=$K?@|f(Hv>sL@f*ze@v_nY z{m9$j`{f_R5+3Bwx##0eHdzd@o6lKkA9OHdZI&Fk9tyPA4eDoX3|2j$msxw%A*>Z` zy&118Rlc#{0$p|J}>HIkhe+UlC>L=P!YWCh-Cqkg;`zWs^5xB zCa=C*qZ{ZSNjBOn9?89#WII#DJqj za4j@)f#`w03_56g>nm z@2XMJQFLrpZpFkMpO|0!B0&%`#%11Eh%3Q!B}wmkP#is^3Wmnp}OnS{+= zzP_99Ftz;hw_E3bf4;IG#%sKB$=GFgN2cE-0{`NR@ZQAWwtFZf`MV?YkI&>(K8S&2 zt-vh*?N)7|^r*Qt70-txBu|fbC&*HinHxNgRRoD||CwM?_QLQyfmcTd*v(hH0WyxC z5n_Afe_0H0|8xbstqWFWO(=^hOf60^cl;JND=@ZdbgcZ_Sqe6u0nK+#s-VV~imxMB_kwq4r$8kVVxuNhb`C z-}#@v3Zjg8vcai0{=wNosteO-6W}VYGiya0Hyq=+-MEOV9$yTp(2m|uKdYmzZgymv@3IMhPwIQ zj<~P<`HeG-bHR)&JDI=hG3_HrQ4n#wEQwDIueV;RZq6v*+1Ad)zGOw9aLptKjeyCg zqTI93vCOaSmw@ciTh|_!KW~~t8IW<+u}e9{xgQt+yHMQ2G^hu*ZVaENnOC(5h!p5 zs&NDfeC|Tfp5*G{1i-9IjV-(fgIJoRXGuL6v=HxBmHJ|JZ;3 zt9|Jg1Tkt6xzecUbpT}&QCFwsjx2FCnLSzx!BVR9yGKG|vn*?42nY+pKm9#!spbFMx5z zvWkj|SGf-)1zh*&T0x?uCYGah<-kPLapNfp(_)~6!4WpttopR!qolNEJm8DSG}i0` zh*$5ZM#d>)%GAGYxj+AnQM!qu1vy}GsQ?JO$fpL;00v6Vz#vtvK;?A{FtX?!*4Wf) zQ%%L4Vh5mt)lQE1LXLRG};1Q=f1a|UQ?CjgwAA% zA#9fM_qdN=F+(r(14;L=qxp{q*>6%hq;L0G+kc68)(VO@zrM^q+MR2Z9PZUAlQOKr zww%Akq4(6Q>x)^X+4f;Xxb z*Bgs8)`gQuaOWEujw;-d)_wKLFC{uR2XFk5h?mx&z?wpVL9-5oFgY`oa_&F2pu{wZ z$zoX^#R3QCfd2YshDdB zu*+3?E(bXb-5hEn7j9MkNuo+u$9rRk-&<2-e#pmt4UVZ;|3wORzj}R!y8{|mFy>PU zNoc=?J+l!?!4KQ8e8n{>(HRDKzfp_dDP1*RkLW`TjlN@cIe<89oPRC4Rl>2rn3eGb83D_?+}I zpT0K8G5Spwa>xSg_p;?vvU4EOH~>8{crK|Pp=sc$euX+O!t&z+Ec(3%>TgKd3`~e= zfI~2=%ZtSrWXWZ#>XY=G#+O5?24G^Sv<9@EeISY3*oUI1gXT}m`7eKooslvTkTcLf z+cE&^ZvqifLO25vzvzsT0q*GLIEk?&9>z~=Eu~GEw!P|7q0#Ed!w~k**mlXwp=L96 zIF`v9CwU~DG=@Hxv2@=VyC1~s!(EF2oVUqFp}NcES0&NN>91PkTt-HaD;<2>i{vTMl?MO`U#_>iFcv(W z5NtsI!-qbtQ97O>b4pzx>*Nwalm?hS#^NWAbMW7e(=e^ zwE_QAWMQ`;Yus9@aeiFqJPtz<4j3;6=U`e1l`Ez9EV?F}cb~^@vM?8+HrSN2A{5Iy z$qLOD?$c|jwi*Zn$?&Y~Y8m9T_g~FdXIAu7bS@|%turJb?_V_JPfc!fc)CnoY&n}< za33bbrfG7C&ZAF=s3I63<+2}Y;NJO&aYy4vLrv8qO9Ny-et6`sqz{*}XqBf^P(i%UIi&_itoY8`{fmxTAbmKN23SKgt5erALgMSqV7r zS-5fonw#XH3UF0To&f&QuQ3nVbd2&2*jD$sl4(JfmpAy>{_r2(KOxvc1pJ#v12hsU zV;xpn!wIWB6A)zT6y|jfV^Rg0P#?=jiN=3M{V|VkUZyDj+uCqx-)G{-$fYwdGD_Fj z%Eto)9%=dTCc8ge(d7WL;U%nN*H@Pd5r1#MYzux4h>GIJWQ7TUn}4DO&TK)tE&Q)` zynjVt5h3MEmaVprcgeH-<8P+<;V){W{42je0>HovZ9B`c1HA5$TP78MqURxNs$#xV zV@qd8uA-Mz%D}Du^lSfdn7_{?PUPl5#smv|HE^O0iG0dPbld1?=Ju2v;TjKc^*6J&>>=zq*0Os?g|6) zN;IQ2jV}99{K(Co)g1X(JJ6IwURyhKsa`Y3y6x5{G3^ImxmL_Qt@2R2h8jwd$XDs( zn5SMb6v8-cI2c|cz3s%osw~_$MQC!Qh9G^A8)@N=KP6W0%Y!})Nf(TOjWF-V8Ub*89#9K8vfX~%+-x;f$l9zVIB`P6s6{e5xcy(dX(h$d^)P`(Erw*; z&;|=J^VRid9O?E;WffLWjC$Gbh|zv%lhtpOi|cXIE$47dupSv1QK@${ZIvGA>x%{k zZk+1V^gMX>?Ad6QgRyp#N$}oaPw;x_%oN`9;bKe9f`qTMoaO`gvL8@JG73)5gD{$E z`&NiURoOH#&e3YGB6hHJ$Hq2(u5@hdI6G9}-dArsLz_pQU5YRUEFnlp?)?f*0EA|s ziJ9qxy_J^ywzXfuQzfk5ffWkGv=_U7Df7{lzdA6n;9w22(0L1}NrAoQpIv(;%W@*k+1?)$vXoWGsL;Kr~Os$oOD-<1w=S z)cC|k@I{+v*$rX>xi{$m%73)uLRbZAr;m08;*HWX&$l58X)h%J7YXiQW~);hC(qt8 zUA+g8IK`GoU*BFqPyG1izb2L*b+%Ao9!@Q8*wdfDX}WZES+i7-m;9ulpunfLXS!U% zCxvgMy5+4ucJ6a=-6^mkvCrv&G{4hUg#N_D1)Fo^S;}+eM%Wcv*awGTJl+}izJ{16 z&AAWpWbXA<<1TU}(;bXNzo}RPIl90A>?MJBDZ=2h`z zM6-@QSkosQTtW}l8SLv+XB!9IEEaO$W*-Is5XrjTf@D^g zV!9O0SNo0)9`<$GN$*Ln2XDA? zp00Ws^383deoP+Oa#)|RjNByCnIW~9%?>7{cp)}AFtmqcZ!Kf=Jfn}7QBe4@``vZF zx8~Yn^hOTUCD1+G>cbDb@uS_bDNKRgdJOKxx#V})Ck-y!EblNfV->`ZKUbb^x^xpJ z?^mM_;6q?cIaRS+;ks_p0)UE^lOVU7+@F(v0meIlR zV+oTayiagZioFAo#qiB1j~JDajd-a$vHt4)_38yGKg^hSn?(?&KE5MEoB;o~pAh@) zo0nck`(un-rLaU_W4<)v%gZe~BqBNPfWvU$`-;flL>8hYdd?oocq1&-UXCf4t@L%5y~5vep85HF47d5ogje><9+yhYax}Stzs5O!l-A?5_^SVMmLj zt%io2=Hr$eD^rI0ml(psw4ZL{pIX%}Iz?NHwQEB)t*mdDzy=jOA0$`mAzV%OqijSW z5A~tfb?Em;7T#Lv+eV+TtqyOm*H3Q8BipW8a5Sz?P@a017sC0`I$b`*eA^L&s6gxx zjf5}w-lAKg96^K>OaSj!aP#W?QcDNf{1_xZwYRw7BeKb^rF=tgDU0}Pt33YP z75WU-;2>t4EfBQj@_f#Izpzh%C;zsOHR-dG3;dX%p`gZ6Y|=(2 zxCxoF%~E>{jlZ{2t@YI43Bm~8dU@4|aqZ)>BpMEQdXV>6y<;c~W|H;E$y{ejPlx3X zK9?8ZNTQHJS!Cdfe8LkH+MOe8m&uCr8y z7?f}Jj)41bNa`R-YwmXgHnCrH)GXmdRtGviCPv`h7uN>0nv!JG z8k%+0ouQO7{1(Z~nXQ*Ap4(Hk;arY=W!uB0%|h2loQFR&4HN6L85(UUW(A}GtR^?&5kC!}t>1UjCHO!9$$4BOOpDg)FyP7ri5>t)MT z4*8^C?)u|UTe%qbGcFUYz6Syr=uG;GX~`YF$re3e=c4+-#!b;DDJ7*I3>)+{H#3KW zhxku3f*6U4O?vKaQhg(M<=bZ6nKUu_!t+Jl#=GyF0_7t;QcofClFRun#VcA;O+Myd zIX@)_9#J$ZbzEsvmOQ3+FjURbaek&*T5O|s;NkD0MxzQa*WSEEFSJ@kYc;hZh=(b7 z^V8)Wx)q03=3}4Bb8G0>UC&0-Z%OvKGr|ELwzJa{kK@fCK1?cf^LdQzDYXlwsQ255 zlsl6X{2!M0QHz`ttFAk*ys-;1ZV`#3@{PES%nQCxmyCZ73a3!|dEq66*9Ja|D%B6| zdaq*ju%CLNG0D@|{?}Av5%>37%23-xe$N_OH65vw{?h}$yueLR(so<1;yGHqTgY{d zx6d+21*hQg`u%SbYd$5(B556h`=5+&B!Q_Eqs0_S+K~Izn);^Lfp6dcoDlFX5|LP) zxqp|oiTwO4MN#d;L98Q2ec%1+LtjJR{SqeFugS||sSG!UwDm~H*mPI`zb<<29Hl88 zVh?h{Ax!<4XG8mu3wMNqf+#hV|LuJ%N59N)fz5m|e;QFCwa29?dF|ZzZ?lFYYk@Q; z)l0P>PF1XD_5}yZOa)IX9KfG7y}X*TA1S?baJ@^4FWS`TiijLNZyRsc^R*_m`Hoc??sDB^Ybxp;ywbv(9^-78%N} zeBy%a;?YiaODz)3hKaM<+lzTar<@ByzMM9%^w){YKk|*;G51*TiazKRXY`8gjom

_thi(D!_Pft9-+l?M%ss2i4nD_BstwnK5N?qq3R=h^uI zXXeijO|NYMhLWkgogtc}1mgotz(u~W!f?KsBumOye-MV3S}#oW&ON^w53GqpQM zRWF~*t?92>z5z{E7lUGyOI4H3Tz;*evFp69J*>O>zS-R@ak-Qjn&afJ%MHddkO2iX zCfx1sv)#hu^ba`Zkp6v5x`LGp*9k=#cZK&@lw)vbnl0VI?rdktwZ2ST`;SZ<-0u$4 zS8`RZ#s$bE;pDw0y(aWCc(+&Kb5%%5B9=SJLhqdYV3WHgA*o(o^L&-g4hqXqac!Zu z4#z#7>yhM^5yVB4umaBouM_&`Xf%gu!-MkGhcUgp-c3sqB96`!g!av86&T!fToCDh zs&I0wbH$c!Ah26Rhy^rsI*wLrJQ~-c1^GTjQ^?Q?-3s^UP@&Ov61%FR!$e5C9?KO< z*B{Q>4(m?ln{&?UnNAkO?0h~$R;)fh*a&hNS5N9mzOF7gv0HV7k)rSea% zbP8qZ&50pz81vrs#2{a>$TDN;AzuhC&kO=b!%pYD=`e0PG#9+x^i#c7IKyuKREm1-*R<8TrmU7+MUUo0B>{2QLWXRvjsfUo0sPmSialRPNG&aMY; zo?~Ap(Q~EQdly@wkoTg@*~k$w!BO=bz$?jsTQgo?mi%(GSSDMaK`=y2j6^t?F^@6#q5>cu^tr z{B2k@jFtI{nHaP^udDq60wf!2EZK;J+|;T-`9rC!z2pZL6M27<$NbXb#g=QGt$V|L z!T%3k@D=44}uK778ZQ|8TWtdei-5 zY1sz7ixO|0YEDw5*4FCmyW7(lvrWh=e_*g4{#l;@lwcUF#m#{9RYSyM3$#PmW>PhQ z`h&vK!w<8!&_;sjvN?jwX-3SY(c#ljs3Ovtq}hn612smxpi_4GJYUIPG~`@i{pyLs zdSH1z!E6%8sO{ujmuV3qn?YT`g_fareK-|KSh{o?oN0$}_~twbT2Q_F2=S+3&Bgbt z!5Ke&rVFbsK*e;{;7_fOmkzj%;xBF50Bkk@<|DV?8L|TkZ(obfA66j~Mr{woIMQBL zjbGJc?lf=3u?ygocPa3>aq)UHyCCYd@Gud%Y07yZ+f9m28UI1_+Yns^|J<*n_`}4v zED^>Qs(m}O-8aiBWg$RKl;lgKoaIKH^RQuc)9r~->*q(;#+qUoua`wvxKB=u|8gw; z@y-HU-v;c>zH9HT7{WcoA(d)yFfAs%Khd(-0}4$_cIT$r{T8pOFdf8XB|})BLm7Y~ z{YF7BcW^%;#ZA|clJ!-N0Kl@}UjB*1dyFONdOkd1=v#kh6d)voGgeyq9%cO9WD)Xi z-z}Z;Cm+{*bxy(i>ZD$^tw~9tReskIVrEV=%A_=@JSGH4f`w zn-mLx`W)3av#!O=A#Zg;Lo5&XVt z%{Jp)Q%lEgl}*L28c}cUawjSCctm=$^+H_T>iSWYzx(4giMZcibFN#Vu8##EcueLu znMU_q2=|6n=!}!zKMj^9-^_EakwgoLXc-Nr4r}3CJ$J{s`J>AljV9~zS^)*^cNJIR zz?%V`(st2+pXCSDhw+`?Yt2ko;)tQH@tDVcw>QFgs296l6UbzS)2ioG!LA1MJ2P)- zJsu=MZtNbK`=wa&)C}ghafuT^>us0#9Xh+q=dhjnpp2J5X*iZx4eB0L`QrUE%m4Kq z1sS#rZhc3nPH)F92A6%9B$_IOlS!GC4PpfFOC*;UstxxJMTQVq4-K=wM0V`>!!T*+ zuei((L3M_d9s0}~wwZhI1%QDf%=I+?y52r>B5VG#1Qf+P^*(VSg*NsNL#FjWY;m$X zM>geqBAeBb;*J$KYblAl&JC;RhoPF592ZNS+|g9_$0dSW?N}1jE4OGWE;La$Zq5rP zjoGbvCp?Y~%f}ow?c2%lDCTd%rZ4V=Hjk=*VYKtews_~>{#X8I)d*vBqB$(uwqyY> zEtZ3=iarG04iwM&9M`Nm46Bo0$S?O#kVJz;%$74X)qXISJ9wp1fW>V%15Grbato0) zHpUa_I<0ESJ3#T!6AGw%h}P?(rc%08Y^{Ti1Z;>kUM~`N6x?b|72c!}L#CJbfS~n% zftx_`u)I#|P=sugIZNTUAw*!lqGb(^hkH_z43$!{w9#uzbtH=`~y!!2QHEShWq`xBd~_o)ZYKbA?Ge}Aqe<>|C?GzE!(%cv+MiFrI9 z0k8c)ccVW-3X$-S@+vsVeo!!HkmJ$r<&GpE4^})369;hMB|0fbKdVyF@}LqP`&%s& zoZ8&zzkve|2V?D8U4J7R|JhAG)F_~%4n(am(%^QB*6`@WxE&$O?E<1@!XIZ)|MaKN zorKQL)$Nv3pJgrQY;o@(5b01t4_>wO{{j~cavS`?)M_*JmN27Fz#6!UeG~h1zMJ+V zg6V&;_m)v{ZQIspf(3#Gk`NpML4s3AaDoO6PH+fNxVwj-37X&(65QQggG1r&4uu6M zT;5{ubI#pzzP9g=_v5|RJ{pa-peR{u%{k^Aee~Xk0&D1V%F~WX1@2CzBzm{@x6W{Npo$D2t}h=3Z6z;|X}LaSh|txjGNH(nijF$j9)Zm3n#YwqhjPSPY1h5m z3?o@1OM1tt*>1U#^ay$x=($imerObGiHDHve%iE!Fig5veEmzJ=fHb0vJ39EH%s$g z;M_g>#^tJx#+E)@*UFuv=$;eyhi}nuEe7~j5iFPbt9KH=NYz7s+rKWMz5L|$v#(FO zA<_jBUa$E+?TTyy=Q*{0n;)rt2E_@XMWfsD5}x+)QvsT~y(5?3r`Hx9>M$AtU?<96 ztAR6NF%uI1d1x@WS^IVSf{O@F6+!I~t~>v=IX-m}g(ywGl9yb*$L;1B%`;Khe%yO% zjdK^4KYz4Xq0b@eb|2HMqZpgLDY$L6grZ=AyMHFA zKrgiP0COLs$wPjCj}+l+mO&YpipRoIr(O&k&7xRx1Ff)d=LrFCHfka8SwHg&6B7JVLW(++P49N08m@g zOQ2&7%j7N)3}diIX!KtCr=%1&L9{szES@Yh?8{`{SZ(yjuK`=z&tGu=Jb{DykPgFu zrFlQF&i@VL9N!qpG5PP8{DZ`j0(RBUI-(8a-{(@t8vwj#4U59OUkd*4E$S=e;0N&= ze#4CY&k#G1uK#}lw#Jp%T#|6KxOHnpPI**%aJAtbu~Q)ZTOj%^!v1Ns_`_dH!-NV> zYFy=qsV5ZH|9xH15db-f@K=2L=b7$3-?__Awr&ArcB|GLF17m#kZap{*n}7vNkzwO zCUBH<{wtjddW3YeHprO7;}CR|#BMeu|5^a9><2Fg_pEG53}sVEMRh9xyFw;lg@a9P zJpR)a2NWGtIQ0Bh3{l}D!PJ1Q3@%_uob+0bsWFo3+foEht@~NgEbQ#)2zOYUqFQ8b zUqT;1d)7AwAf#s!Rg?lYA-kltK#7L@7T2ZJoC|=1#cGHW?=Fn(fHd25?1vA42TM8K z-c+X#0@AUsv1%XATw$su4m&eHcaI06rSnt@Uy?y@lmQ_#34D)!do(*z-@0L$b_P(y zgm@VjOnYr?XNSJ4FzLbVx_v$X=_{8_cvGdVc6fepC~Q3W(dzd|aV>!)^^}>3BTog} zxk@AuyQjJ@Ml$z%W`@-s51aL^heQ%*p@!sWXDG=m0Bbz=(8JuBj8w{&>q#Nvd~;e~ zvtnFa4!ntmP|S5M*Ea_)KPY(Kk{V^+vI|cVc9FPSpUobOX>us>ZIrg@|>Rk=t{l z0;39ZO<$hnEyCuGt_M6C5D{e36)2acRaguQ0}3uf6u|IW;HAC5#fLBwUhwJWNNYP6 z3T6zusUl<#i0QrEr3U@dPWEo{?&0T##>hC>)%v9FI-r+|2?3OnQD}Jmwne(Y z3w>Xvlt{SRJ?^DftdXC>Xa?Nrdjc?tj7}4=wXs=eUt};u2sQ&SlDgCG+;$Zf`hD0T z&q7`6|0cq+`o=n$4+sVi3An)(U0EQb-YxdHXa;q*do7X&d|+}pto3+UBIWqNn?>_` zjtv$%7S?mVzI3)H4-g$qN3){g-q-tMPEb<*wQLUa#NGnTlqi9^1fi6a$by$$Wq_Bq z_y@bEHvYfe1#)pzsv*IS6w4W9!ii#LNub*$z$}Xb9FuD-c~$b15fm1z0Ik)l$lD~W z+za%9>t`KR>F9}|@SPiJeG|k> zr^Ey87)*RsjwYd(g6w?J`^?@Vh_u}F7~EBRy!C^kZK;N6NTen)RYYg9RgjqkwWCEV zuGJSAR0~byrw>%7E!|y8Z3lB`*Et;Z_VKS@!eMN8$Iw^70a7_C=~)Z0??d;d= zK{M|>qTE+}MSx%W#h=4!O5Sdxn~n&sQ=CVuT)LtJj=5+;yfWIWbIb~Z``3v*#^;1A zT&_s}R%eiqTmmTNGC}b`jU?XK#mv)7%rJe?wae7m=Nfr!uR5RykozX~mJXL{yB{-P zREwYw6?-&ayF1qt8{v2rz*@=Gm*7IRo>x`VDKd>@`~(fJ=f5ntaE|_tXnl+kqV`mM zPbm1dU5A=QXU~O|pNmiV59!cEpotC<|xVzJ!MOhHTUuvZ1;iw&G%hY*k zm~mpt_&Tp!FYVa$4)q=_NCIqjWO&KjDb^s4gWN6*K53~KS_~1v-$>hu`53WZ`aNM`d!DE>T2@-u=#@6QeCer*%$_Gvqhr``>V@% z{2oAj&&_AEbODsto|iWRMFVij(WvXO;rM%?K7%Sz=s>OG>juB499;L~0?vm5=m56h?UdiA>yhU%)Onk2_ULWZ_43A%S#qqNVyohz6^pdY zl4Ax>%Cqnpw5T3VBFN}|K0fit4b(z!pau{Vn8S?eOmjaaGXViQWN)&1!eltJ!vXkcbm`#8zqZ2Y{u!t3vmAAC|Eqol4L)?*~H_xMN2YM8CkvHrHMs?1-bU0Q{tvSo%^C|@Qj>7zE>T;JCGDa{LRHr}uAWKD_j?xVQ=P$)Sj zSGBUv)>zNj^6#o7DTG6hFM0YxSUO*E6b@Spc0zV+zo<{xt6Zx$P&K&R#ytL2dt=uJ zs1y6`Yc-ZjFH8{@^He(mPI9^7KzXM^;+wY#E9q&rS2R=1cb^L9t0rdNb2X-PF%Yl@< zPcJN&w3Au%KL~zyM)IQ&->=Ba@}|XOdP?19-o$Z&xjKDuMdqCo1W3BtSFMd*+S?D$ zoEPR?*ABdI(VWqkonYXX2q*H`m!Cd8AUN0X&ehJ3xzE%{Tp91qkFlqVmcJ~wVz>Lz zuT}cB29r{R>|KmG z?=St10S=qsQ2AAMTD}n&f3qAICc^8yYcg@;;c2wcmC}83W=!bw$R9O&w9?*~+hZ-K z0FZ|z+W6vgywJ%z^l3HEyjyw;7UvY+2!Xs&XfMG0wwb_hF2H3q7d33q{#|nw8JqO& zdSCQ23@K86H<{!j<(`U2HnFJ?9={LmLX>SavZD>466U7M8NW+bqN?JmLQTlq{>()$ zbNa^SuPi3_CA#v?NpnDa6Cv^l^l*__U=G7hWBqqP#)9HODIm|=n|1CFSqCb=rh}gZ z*H(T8+sPS=-K9fEfgPuP-5lVa7(ZtcihaE*$$Np zutLL|luuSA>Mjg$CUgl(9%@t0^$2<7xiv4J|22NdzX{2eIY0lCAs78Fq>+qHvn~Y9 z@_L}n|1|GUcpH#kyMzF=gk=jB99@@P9I6A?o znb#$48#xI+@2(D=`iuj3Mk4pN{S0O|hT3oV+n$$jg}(dDiO;BR5hh~t$it?wL^_r^ z{*^GZP=$J_UG!r~f_}#;wt{^L~!z@;X}G( zO&8BS+Yo;y^EK`)l5t0j>=`8Y=8#K(76Yj{1${19$NuwFaNcq(Xl!vjZo!OOfRfbTH&zLXM5pr1= z>QH%WHO|x-b>Z%XjN{Aot4auv`1zObuH);n<)aP+TuDKw3#YAslp%incK)odAn&({ z+G6nP0Tkaaw{+Hd(Yu(G0V1owJRoUMT`ds~aQ|Z%blUiWpKPGKbW_Ik{di8EL2XBr zAs4Mt=e(UqDzLd0_jR-Sb2~M`4}QMQUmoJOr9l|JpSD(ivrz!3eSty%by_C*9c=g9 z-Rm@w#o7av>d>SVBQk;7q-F&L4wG!;aa>!=9c8mWwJ2R6D{xDW0U&tJLitv zSj9aIDtY`S`^F`R33WM=qVc$YAMm_PpqdW~-ZQf{b9v;lCq!ij?`*AovPy&)R#M{r z^zAJvhVt(PdZ2rrv0?cBJjWBbO&197OJbqnAoI3BJuL#ZIL44ZCw%0f$-XZ1K@yz! z(;Vj$6IvI*Rg7IyF;~y8sz|Fb?*gYGQ)`+{995&rqgDy>j!B!``(ZYlIU-b@Pq#jY zh3x5C6L#5-o#byg!r>Nb!$fs4z>1aU*KPW~$6Ez)4!);e(D+SC6JXL?R6o7EjR0iY z`x|WB4;e@G|v0u-q zkWgV@Hq!e)emXYCUD)qxrdn);n`?Ce^9n-o3{eHqhEasS!7i3kKU6!B;2m|E8H_bv8%H;0-VBVUmwi(z z^^AU}zg%a7_#HWqQ33=%#vPRPEw+=b-%7lj%^Na_%BKb%Ot8#raYoS}e!SM~eG>;i zO@91bfg|WuT(nw~g?bkSjxA0M=IO8Olmr`ti<{#fbI;2-w*EtL9U@dvNr8H~$ySOg zm_#=)ocLQc$5TQKP}ky}UKP0o!HW5+@3b56cMg3*zy`t$etisnraz=rnDbSI#SdH( z%t`BOBl26CI3?V2ixIw+z*Bj!WP7$f#=a{F$F^B7Y+9Ve5>_EW(~sM(9q3DjsX>$qMG zZ${_i<5#cDQ(3PyPI=~6{PvA(Mm8E28mF)ID0nc$t{JHq+KPz6qMSf8!~pObT~<)} zikb|&TizxZP@DTT0FHsL+|T?QN0%<<%f!&b;jG(wTbkCcb148Tb9;Q%$dinYR+1g5 zTwG=1%ZF4jE`HmKy9#O#FRAyT196whiQ|0c7||PFaQc29=>MXe0Fs9#5~Ic2dF*ka zL|m&hx4>^`dUGcSf3u?Wj+Q z;u8JSIlgBAxWVst-$RN1bxMDzqWw>)=(j%xSt5~ssHw#x1iZtkzgnKP!hR>Z{pH{O z^s7&o+ylbL6;XkekDglz3x5VGEHHg&*XqCS-+%I1~U|iSV^YMphR$G0k zu0Cr|4)6N?{Qh&=|K&ia;nf37WR2eT8ANn0F2J|Ju;)Af?u85SKVQTSO@tx&ADMgw z{3SMcFI;2+`}`h0E^O(jcquK)Pig&JNyuqHC08In&kziW7-ML00bC4okI>%g$9wOjuf;x;|?u%pJtfCGR#gx?A$8}=y1 z5gi>#z5G%U@)s29kGJ99$F@E#Nkj5zXlR@-2SSM^U$Gn}_?bDW3fv2qOWtLq|_aDE^;Q$^Y`namem9HsQ^$55D~4 zos0|D>`uoIli2^1bpH!X2KZZph75W53iASG)=KYsh`R@?- zuZIq4(WtzlLc0uSfs%1-Cg4nZFN}#+(+yP|MZ=|v(48!dEZ-cI431%(Cyk_ZcLFpp zA%^{N3JnbnzoD9d=3yG3odQhAI)3Upf1sD|J)$l;(_d*mxwchmAO~jychf>StoLc_ zU13@MNnFrU{t|C*(~+9e22Qj0pdey3*FaYe zhI&~{{>n&x1N6oO%2nXjMJ&L5-nos%wM~>xt*D^FbWukx@s0lJa(pbkv0S#>KIdRE zKg}ldo9fLX9SbJ+Qg>%M#hMZfLN?I_w`18{#o97<>t7y;&BaswiIaa{6LI(vO2um= zV;JHA0+m8t?L@FIV7reCDMF{wy)T+xP3BiY zJZPZBylAbYx1w?;&Bm z4PxozGh%#3{j?6nnrZnSjkF@Yn_WTJ+JQeM5&|N_?n2vL%$LZlh@*MID2xmGp826! zT$lZzxdu1!kYHcc2#-PjuHQCdLnFA}QymyZv+9qno33xmZ5aHl$qnrq9H@UNSQ~LQE)* zz$iS(vELjd;db1KDgeyNH@r{dksdwbJ=MBIACo>v7?4F;^kUX4FgNLJiO>#qVyo1?zQoCuFa$ zuiGlCKdwtnH`2(2{4Ae?*VsJj82Rj&uLkq;p$f~dcZ9_dDC<@jmNH!3xFQ5*~vwMJ^0`lWohiEg=ZN;D~R zQwFqv`<|oHrA}V*oLNT(c|scS8{}o}L4;G5PX;zoY)*E00lKx)l}o;!EeBo~r<==J z>y;F!Zf_KmL9!Ye-p=B8CTPNQD8DiF;Tw|OGM~+rK>LlFzmZga+kcZ{-m5+IN*pfT z4{}kJ$LaKGk?03j}9H40p?qs-45*GXcUx5{l+BccgkBWqA>^18dpY`tc!DIvim; z6$`o^&{~vW);vDZ+`Lkl-9V^`y&a5g`n35L*KPB*-@DjQ;7A$j`W=?Lx!$qy%1&Q* zior98fey48-682oEK4mJulhZ^FLi-oA&kwL9+~I_ls52XKw9NIj(QSG#zD%tAh3OJ zJ*il>_a^u7sH@D(1bLVwj9Sr%Ib+W_*1q1$HmbJBZ?0xTc+bDFW8q_PUw^o2bXLjz5bD+cr-}qeZ z;#v3j0Yz;7y{RbwUR93|;v)y%;HR&Z-zBh{F|01Qs$Igp8RcB*Z4e+fNz{qUk05LF+8B@HsFa>!RLqw zJ;?$~Ff>N{d)|YCL2?(7s6ZM#K0@hOrcB?QOrxz5u65IA_Jm{BOZzMY*PXCVypfsd z8U;#IxQFy~wRH-E=4GJ@@n&o+bH4Krw_HQOApB@!fZi7cgZ=DezRW26Wa03@d*mF= zPLtm;Z@l2wJLu0&GJYSRD91)Koem6mOgt?B!KH34)U{@g0hDJ=V5xAP;cv$@je4DOiSlj*mPr?~aYt-C0(s`GOU!Rom9)%P{H#7%+$P zCJ3V@N9U_bo)yhgr4P=X{QC6`01CUj3j7w(q96LAa7XiZqX<71W5@X}=_qGcn-Sw~GA(^-F}CPuF8!UM z66uk@>u2?7z}~J#e*%4CLxho;Y=Lmu77dsB`w))taB)96Xl#}ya&|S$T8kFPcO`Ot zJpK;H?`&_;+6tY*Pw&3Doir@pAy*M=7<@iUS@034zIYqK6FACr!@Z9~Qwam|MtBK#Zf>w-$FaVgSDn@Cv^#F3Rp4+V8~j}K6s@mv^( zwzH(R?Xd!IN}PD@)`FH+2Nm=6AS%ea0PU_16D}Sm&1rK;-nHoHoc7{~vka%9uUV7& z3m&h#VdpFA2Gzf%xIQ%!`U+ zxx}do(X!|Q=4olJn1Y|Myg0jeR$APYbZqBRUqhOxsd`HVn{8*sQSKgp-%1XY{fglg zW-n1;CsWL-^o>xlst<$vVv-H*O(h^H$9S5;aJ%D17ti`{FMw7>bumbR9e6W*Srig9 z6H@B=T9G13vt;9}basQAIf0L_`{A1ImC>qLmE(T?j-|b-m3F;eF(LB=O&FPVgKXXe z>Xozq97hQr&3mDQ+xO111zc!K4p2Rd zBKGI&dK$qlsyCkbDf}dz@5_%)#KYpt!7~)d@UxPIUE9^>J4;ZngGQj7C*V+_O;C#2 zf8~6cn?0RMke+V-72M?sGK=azeVq4n6IA%tYyj6uW46lDu(b_&P}+Xi-v_cX_Gttf zh(&WcS<|dFo6CTgo0}^TXu&Y>3ue=FnItCi;2{!@(Et4Sk%rXv(k9Z(jM8M3w{^Xb zdAH&@>SR4XeBZ3GhLG09{y3Ct+A-1l)YV9P>}$T!0qG=fCw$P>(k;98dG0tx)F6RV zRhP@A+vGX#0Tvg>3jt?N^;D?aLrI8^hmEy{vNrS3_2R7sS!0gfE^Als4K`BImzAba zo1_Vf-imdj0$Y-gI+td=+Mw3sqQkX8-%N3jG7EK1^{Rq6Fs$$TW=Bl1+K3Eqjli&6 z`=$BB_g#*1qt$*gqtQfNBiN;X(O%tqb`Xc|$&;K)-U}z9IQ5SKVzcp)Oc3zhOQpp+ zMGaEt%8ECacE{7XD;l0xF^*;D*_%ce*4A|!Dr=&lHB?vX3(1wk2Gttn*;1kz4vkB6 zyt?7)ftirgeK_e2);K;7#te#5xzYS>+T5Tk(}$WNFwYirIOp49+*12Xkn+sqNPne8 zov3m2kxNgOBZzgP%Ikr06j6sb^2Sevt%L_Hq0UvIXJ5n)po$|Ga-oo@s5bI`!N@yX zWXp!hW3Qx`7_hOU#bRsaJM^@!j*hQPM0P7*($u+=c-_IXTmFgzonvl1^ZjD>Bu?_o zZRUIUBw$(QMDyT~f{mH|R2GFrB=w5I#gc{SSD7N&Np?p)8;<&nsj7^cJ*(mT)M^Qz zVLTRz#S^6l5(G}CEcNfq2gmYMW>IWOIUbgvGuKXGC~&njO<)m*C@ER)6fsT-aDYzK zLH!96?|~glF~R;mRk*(Np18;LXoIVLeeu-P3)A?I0r~7O^B?k>C7ug*qXTK}>)W># zI>BJOah7QV!kXd5P>oflOtIxq@=NDWx3a16+HStS;7HR^sG^KR2&{4tW>`STVa5PD z#YW3&6@m|0vYU;)E-mu znV0=*U`o{t( zRaEQjxyp)gNvj>5Y8=l|Z`V=oWy5DpY6)eU{MdgvbVplkzF#ta$15`Iu1rJh-N1KozUt(CyPxd5#}`8L@@4*P`m9<>mt&Os*?YD5=6>~vxpk!BuJ5`! zQBelP4q$gan7qD9zCLK(eZMbhl-7bMW^3w%c1r`yKGb{?);rjfxyNOuP2`b^0c!SDOncYRdE!;fyB5 z%dGi*#e#oTvrN`!XQgT^>R=&re{GLpF(=!>D&k3G-2sH*s^P8(6DOZ=Z*YI2X&~ds za`VZ}5Ctp8i}bzvgXVH|&P&hYX}^8h@}zy%R!7X&4C-|qSh-muQ>LSqq{d7P=2y@p z=NbD7=GWVT+Oo?oH~bkKV<$HwoTpI1y>cuc$D^UhU9l5%rlu(rTx<(0|H~E{#3~J9Kng^#!vedF$&x&;&^VOB{I6 zL|)Gqjb;9<1@W||h%KIO6N9&l)VahPkT$-I%$A8+&)WE=qlImh!teeZC6?6dgq6r; z7=yU6M+9@(8lp+dA{m&8Z*W(k^7>UZ?CV>^t=bqA;BG z_yd1fas2{{p3v$!3q%g5GA-LV&zd zW+L3(ljw$fROW|}taa3|MINAFm`&;XfY&iFpE6Et(rBZeCGwg_Bttggq*`KWGiUZFR+_B+i+$1;ASj>~w6=Pe5|x<kW2 z?0ivriX0ngPWUGRIU5i6brwaL=Zd+ejRy|~JgFf)jRFd^SGym}GAeQbV61QNM5Efx z)=B)6_eNYuN&P|N*u8GiA1xhAE{dQa24vIXZqd%J`hnC-}0kMC10(!%(Uso zDhhLM3&;I(+V--}iLlLY!ghpWBXJ^MO`ks#jau(`6e>77ed+AO*(GY7X0lk6l$7m_ zy%k}W@RrZ34T*?lqGeiydJ10T8ZMn+nhxJ5^*&LU27i`(&wnF0X=57>NnJ{2@hNQB zb3NtfcUuy2Cmy^ieycQK@i^0T2zF&HF^#c?EqF;ArP7uLg;SU03Nkm%WU6Ud1(w0) z^Q()03T(dG$Hp>~j|_N#fJ*-9e|`vwq4|j|iNAN+o2j(RCP0v3#xe_yJ*uk*jbaoZ z1%{^zo(QhMMkX+e7S`rmJ1=ZM4Zp(O=(Oo|fZlCH~st@D)EezjIrg z_1pCp%jwfi}F?z^aql2>0m6iri=_ zU?1hJ&YVr)T$s(7+<*6_aIx2L|N5hOXALuyQzVMp@_ICzC-RlsLX~T6|HU>hhW7Jw^werm8E%R`+bIW>~o#{nso$P?=MEGHnObbZ@x&w|;3vt~cro z+_1VXJ?IYGm34xs=Ns=qiCj>;fzzN~i6R+AADMkM@c zx*12vyiE|@C1I{%(iwtPm#$YFA7=2-fkN zK;QgHV)m}Nnf*<1Yx?=jukSI*&lOMGQ@n5J3NALzFT^FGl_nY zTBUb2wm2%6C9RI!|9MX-+_NUvceFv>{;K}6`D~uqjneNHYfS%v;|CE-Ih-DMo?5RP zTx6?V@w2=1%{>ewF84u;GchNPvs77M`AZw?`u+o08~Hj2Y*JpocW|MmyJJ=EmEy4@ zsWwqk9<~pw)|J5T85(D(H0~cVzvOplM!Pi;>dgI>4cl3KlVFEL02J^;C4zWzn*7rwibLow4C$VQQdB)8qIMv^n53m?sjNGId zTP%UsQx2wuzFzSdaW_)Bmls^P`^_6Ro+4T7gOTcjSnagSD9O_Kc}Z z%30|lX1P78uPTS~^ywVlZmouE#e2*iBVzj-t6`*jJ51%EZ7|(M1}0m8v=i(5IqCPS{Xa8J-l5qAvH@Lfq)os8B{Mo0+ghmNp-6l-% z+3u8|!|?WxX%dzb+22Lur0BtlwB6wxX#^zhr@N&Dgl^aLYK80~hE036ujM@7gvVd$ zZgI*9?m0lzj{#GGsoLr}kMiOou?=n!#LL-i6moV=iEuTLWN#YsZ1%p0?^m@r3nEV_ zl*>`ZVM@M`%)Zw&yY@4Nq$FG`a8+QB`4eo1xXmy5%n9U>JJCH%(bE7a$1cnUb<+Dn z2}a}sna5h@SRy|cWkqKtqVg5J^_7?PI^UoI!RPPLO(5t4}=N}E|GdM z35nU3>fa<|H;XJJ0e&1DS14%HNRA-Ss7zI;Q!(vi-YE5 zMZ2o@#}YdUrx-DUHH4zTyT+|n1lvW;;i3~kk&a5u9QE2CV(OXB zEKO0mA;r!5AfDS7SAhgN=Ai?^qZC#NoR(&0V9ctwBlJaeBjDogho;}$vrUDR5xIcE zQl>#zpk8X#`e|&+3Msbj@!J7esoA(x7zch zB|R}#EEy3KUp2!%4tl;e`hKlqR4%%6L-^V>JNfmZ$5mk=c1B_708>bR{GR3P(FrBbMyV9+a*l|r^q{xzpmp$?J*3oQbce;EQ zZr@z3S8Ub!%w|N-e_|B9a(jRb06$|N-h@X$`{j!?dRL>#sm8`tnYrvhTrt|F<1MnZ|ZssR~CU%;TFkmm!{Jn%WN7T zUd(0_VkZhF3hRmmAz9yXChzz+^NE|W=yTWNcqn=d%NyoRH9UDQ_@_pMDbKf`oT zX2s8FfQ|au^%sWKcOqH3K`y!6Gt}>nsYWqcvmCV>W@mbIzXqT%VCPSblk_|tQF)AC@aTHhC*S$?OkKnli|Gp%2lgnA)~6-u`!!&{ z0fD5M*qrsx*zr#sri$8gw^<|z&nJF_R@tt0T{Zq7?iceF(twBtY7;r^l3xuikFSJy zM$xU@4pCx54z>k9TXt^R71pli@5?DGM-jXCm!7^Xh@@C=@_9zDnsCWUuN_af-}id9 z0;N%aj8)j7yP}V|z8_^NTMj}^FB=NNLZXb+)ga^}y57)%)CrsKVnST8%2o^Y(l+ zoD(qqiY+?&X`Iqm2Zzasn^eENLUk0Uy}F*kK+h9w=9yDV;&HST{{kK}Em84RN*K=M zV)FQPfvRq0M#>%kfl~HCKUztDJZ~3xJqgrrn8$AVGD&tw6!BXsr>8fm>z2Md;!o^! z@g4>|i?Nnp(!~uHh?bjiZenzdiiTs|*1JPlgnYvmAj~mCuu;$I2FlaMTwz4nM>|Ia zSdM3;H!~HSKF{r&@TlbuFF=Kxy9b-4^|@!+1D-CeKxg<_S2=#-t2Er3^b~h*S>MT~ zgb6aY<=Rb8#v|VMAeV|F9Lzr>HxGP{o}%`(3}9xJ>=q@}UnigC7dNZ!vi9Cs?tVVL zd!-pB*t+=9)%~2eN<6^blCU|c@wtg5p~f#{hqwxPP0{gpxsfB%W{^uJ*{dW<+n&N# z?(-h;@L|i5v%0g4&Gq6qil0oel}b&V)2txF*{sY|D;|?(Ro`M(4$HyAS?gce(61=z z>>tty1b&)oSO+|>Yq>@~wse~P zgR=*Rv$BC<*9N;&FZ=B6s(P)P?^F$&KqAa~WRGRbn;hZADc)71gf-^?x@5Q|Nh2A&!I+VNwq#NjhVts9twNylmU{vVk~PgI zH)@IDea6py95QOzsXmY}?DP#>hBCWp4W?z8pWrr5u|&k@FqmdJso z?%MZ^WP)jjtw!>VnWv3!t8IpbFAmeg3;dJ&k~-f3J>PA-2rGu6>p2HakKpsvWj}^gZ4>1Wz;>A@=8EJr>O2o3bHra?Cs5Kk%%I}A-%Ehe(mu#{t@WcFZL!sd2XN--?e(jC>gn*dT5W zLSUuAq;e6RNXdyCW9{)q2yTJWnigeKRt>KzD3D0-bk(f~*^>W)E#T17|F&j(W0=3S z-DFbtrn#8lwT|VnQF3|sYJ84kc4k+ctO=s?bYw#Z(&_wugA~KZa|6Mkt9(CpCX`od zP~5)j78~0AwY1&nAX)opQi(<~zjabNJvsX;II}b(uDm`<~X-;bizlCjL^$^YVBoSzKr~`F8I6yby6ITP>f3qkh=B88#T9Ua|kxi+M++JP{WUPYm75T-ESL)u>j6oUC-^&xxzEgU#xEEXTEc z4zsZ-FweP0*6|6#xwf;rPU7h#m(~UuuZzt$5kOI%o1L=Hsw=q2W1*_0m1tsF0pzJ^ zmEMUIBNgRX(eQ+xs$o|`q+zEoJu{}@fQ}K0boSYHwX2h3s3_TG{bcTN+RZ(JmAkX~ zBRQ8o5*)BJdUHuw*5}#mBM{tr>Y9>koGlx8F(UNE`G?Kv?zG+h#U^A`^1DW*`7Fg^ zgJ7&umRxkX3|KCBW5CFlV8546`3@LOby!M*Pzh50A^42Dutuhb z{h%OpVpv+Hz}%MyA}iEI&;}2HSe3!pxvq4Zy&BE$7Oqg&9hD+kGX#|g-#tD7WyS|B z$d;#%b>^n0w--5Xk4$4BW{Jp>npx(#E^?%6G&j#dZY{Pp1OAp^*Ptm&N?DaL&tc^; zglESR5K1z?2v|)zb*r{Z55U}uU>YPzNca63$)ev+mlIf)Hk%yM*B zuPZQVUDJa_|2&H80OM*`m-Zy6Q}f!5XhA|G&8z~&XPb-~&6CgkCY*YpbL90$9=Z)D z`^Ckp5QiAE;Y!24-fbft>(0sBub}s^@eT+>`t|NW5kp!|jVPYXj$XODoor$9N>vSt zWd_)zY~aI8G!dVDTFq>64m1n}uVO)p(f*qzb8jXj*zuA$r_yY^7lp#Xg)W;(#ob=b zD=ODKQ^c1WUmMXfJ)`e+Z)Qf9bIIgr9UV`GN=ep3>;V^ASm%|}M4H8c9{LtE>ejMi z{<{B-H<4+Q&;WR3DXEwOz3(Uv`xL4S7;egnYc>GO$t2~uddy~b)!#M^g)J0hHFS(P zF!#sAyXZ{G67BiDR4v9`XZ8NU*0DD6eOGu)2S{DEIjDyq$DD@9#7BPtJ6s7Yfu=A4rK|)VSh<7v3W1Z%>Jk9;U97qpCtq&tItHkh<`fu zKb|7+Kn~7B1g>Xo9$R~&flVV6B_^mycs2o2=o8`V|HsSxQsw)1$SysWC}d(Ucr>Z$ z|M-u<11-z`1zs-hg?`!Y1K5MN{-1q&Ne!%#5 zpZCv)pb_ZjmZwTM{N*kGe90i?(+q0ogA@JTm;d_UXSuh0q5t=!{~M?Ovx5IyE&qRe z!Lzb@C%ngxsY*+2mEk5|B_t(ffRi=rTf&>aVl@6^m%WX~;3w8H*HGqu!ZKB3pR=^O zDr2?HGi9+7W6F5Y9D)x1xrmb8(yVydnbcef;g3v+0V`yR8Nsf+T~lz8Qh$2XU(O?0 zW+llg{p&A*xeR0Z>T%W8nvvQ~X_km7hN&qnOSYU*!M##n2AOVhlit2th#T^jh|Ex zF_DIFY|T{2ad2=L?KJL#@bl>gG9Ad8g6uO4!M zX;%Dv`TV(`JaoA6Zb8_89_oL2g&0jSKVA~fp-CBVfIQ>d1sajYBFpZ+N6d}l|J4L> zoNtFDm~BcJ(q)0$ab_eWB%}e0GX{W2SyQYi>c9O=;2#0eJ{<~NpVLdDBP%}?6O)qC z^4B1Z=0!l4Y5)DG&i#-3?pv9Ue`TNI;eR*6o+QWc7?ODokNs5AKjVkCZX4 z91tV@rjir-V!Y4-D{3M(e$6aTtxz*{J7BYHw$8ctcnfK4(XZA$StiNB$+)6f)-=#Y z^#JkZ9zNgu`MdqEfI^#G`i2BQYw(r!OZpm_(hebusj|WXUHEY31-`pp!QYKxv~22> z&x6eNp*UH~20|*x8$UkAPER@u8ZScSo1aeRGr6U|Fs13BlFw@I#QgXy0Itpv={S+j zdvyDt3s*Wnow6^obV_sccjsQHehcKXj-_T)W7-2kQq+h0R@3EHtc+?bL_c|`&W166 z@5uFtr8-3^46kqABtC?0J6Y6#8I2E;*dt3V%Pf)Q@0_f9OAa!AK6zR6id4pORxz?J zMgNWvy_47YhDMqGl3`?nl`b(^h;(7K=5RKM^h>c0(u#Eejc#~&_ywb&oSnVBV1u5Md ztybnRMeVI~r=Ruhf=LbL%;2B)o_~LhZ_p#NNzdHF>O;voM(jx@(yK(v_&ssyI;+ux zcVN$-*hRPc`*5wJLf~FlU>)z|jfrB`WI?C0U~YZ5`4|JR&rIo^w7GfNT^WIg(myf! za9X!`$bdl1F*0Bg+^lJKMs-c!{Zk5z&qLqveWBmjODia`D({{wJECaFM@e}1_V$L; zJl(;AfP!Zt#&M$`mkCsASkPh3W-zSnssXce9lg7IINQ-eMp`=j@M~)wMe80PKh1A8 zFyCE#n!{+u6qZFsbHv|`?rvQ9eL|gFJuhF;P9L6o8 zV@CqrI;3Z7zhpmspJ_Q2Nl#4UvU{@By??ReEnO)yzz9YSWdzjkZgSoZ6DKlHT|aH< zl!4QLUeeRQtDZdy8?%x<5(Ia34g5>OO9 zlZbE~XxvQ)VLB2f*`9;#X1OQ2zK!KCe}xC|!|#ezfoD6szM!h(puvwlcV_b7YiHn| z<;oez?UR<*za3Jd!5<|_^3dg`2Kr!cx5n@Hg-?PnjMc5O%LT3l;0Pik_m1fgxX|pj z4E_Wjw+4&$o}h+G^`B9=egs6!x<&zE7J$wPci()9-loAw&;G$9^cQ5UuO86_@AwAs zZ2~nNhwV|BqS~K!>vIiIOJpSokmR9at-lO1GBpjb9Ljww?s^py2l@e9aZ3L9QJ6;z zZhArio~R6wa9sazSKy{*(W&NQ?!tIe&%35_w$$)`%}t8?CW^7RMy=c?wz4CHq&uIr z$tcIV=E_L}Zc>FK9HWVVaQomK&yHU9&EgAZ!|XIWK&2{!mG1f6y9wwS4C_kRn_p;up#<^#l}dm3H=W_YAIf z@SQjr))dp#fb+2N@}cYm9yG{nRlz|;#9_xVV0W@whWwC@!@Cc}$w8m$}*)wNFre{R&0clnQ4+&t;5bZsHk?^EsQBtj7?Gax*B`h ztg<8O#$7X80lNJbLq1@uc5i;7cj)f@9{T|yWQIoAlb1uYsX|ZpdsDBT$Y+P+#ZT2_m{o>YHLIh8 zN}Au6kmK@SOZ?-ofo3fp7E`NcLeH4UMA!JfaMH(2OL<*{^Z~7Q)<1l`2|pMRR-CSa z(3Y~7X6Du!#s6kL7+_-X+eFf@54O{}A%`rkJL4u@pmf|FwWnR{hH>EC4q=}RPe(0B z&EqnpmDAF_GLxUCbI{$hTHB0{^kuxm^F))dXyXx!2-{NIGGXt!*#KQp?OIEXnz%24 zK(+H#H1>+g?#!bA7K`wiW-^NcCLP_fw3ShXH}u1#)no697e5bw^rUz_B}L~+av~zW z59gV_m0EoLcq~2B&7pp?e<0$c&RJtET2kEPF$Uc0bsmc8-i*vW)=^l_n!rj!63;gY zcb4t*_N^UMs_eP&f`!&HJ1f&2-t%^c`G%9pR0M0&H3P2DWgs~ND!FPd8egS)V>-Vm z`VGv5W9TdhAmjZ$0=E^f5b zJ@>>heqWlDL`FKeUl(!pfXi$N&C017J1RClo~{jX@uUEJJiuh{)ea`%Lz!)$gGnz| zVMVGJha1eDl+N{M9%wj;%59RX>`25_;&xejFEe`951(Z zo0arRGvcl@?zGwG5WJ)zc~aU3o$HH6i`CW=RZ~|#S6?iz$%*640G`8ls}Ez}RJWlF zQS1JvX#CcbY-gUE?^TY|LLGLd5wY*-=;*?~spco1v-uVWgZaMzO{@s{W6f9Gz(kyP zB8n^fv}wnNEJ6iW-k-T178f;x8ZuwNcms=ds`|GxqH4V2B8Stz`;rP1a&L~7X5@l% zeW7Bo`+BQHX1Ze=+*w|ohA+RV3FD0?+ zbt}+R?@>pVSq5Q8x)#r`WI|t7>IPHiTh5ogBD^^*a5-TeX8%t7@{9t*b|he=r&XoF@|wgT1Mo+JQe0Vwp96#qNA3V)%BtZY1SU)u9s-ouk=Sz&|ui@ zNfPyBgP@keq&YaD*rV~RXo%{e?6zF+O_|lj@mADkfh8ctS;=KRH)FDMdj8WgW_Y*) z)mOkYQGOzEJZ`CBishneG_nxDBOC`b^{a6z)H_x4>?N0BxPH;%-hXQ!E@`?H8Kvh%I+JRw(an!ZNhcBb* z>s;!`A3i1Dl7d5ca;%Qut0fU>M*i?`>2xmuJU!*87Wj9=l#2&Ct4mb0H3JMB!W#iQ z#u+t)8?)5%gE_{*_+eAr@{goBAr21D^gzXhwR$%r5jN!w7eDSBI~9Vkwc<&S4Zr41 zn`~1)?w;6Ns|PI68+8iRD>PwVcWw(%&NtA)o9v3lF`Z$ye=|di%Kmy-739FTB|7|b zt=9-K59`h5&v-eH_K2%Gy)%nD%E7JUf){y&s@!DOxjD+byz05fW24MmTj{`mW2Jth`a5KXITkklN5*UEX~OsR9R~ zMO~QAisw-{W=g{OA^RRh?-5Dq7wv>+8h2&P#zA%}adQ3H#+4qQ-*hTB(rurJ(L1Xb zjI~kQj7%9hn?XekKQFDU)GFu$yt0*Ewt>rAoq?g0{1CTYcHEuD9TC@~tT>4P3HKj0 zrjP|HQ>{=lr8g?X`H5?}JhR)$H#JD>t0ar!#vX!_!J{DLoa>IT>r%^o1ks+pJyRjz z(0u_ueTw1@pninO;uzKFiRBG8OHO_%_n>o%Y1^wOzln2mI<}9QV(1*S@}R+DK-a12 z{4Upd4rP|t)wvT!HQwhGvO_tZ!M#e0k#QEaV9ynA1t`CJwhXoo1LMg&f-UvtF;DX% zle2eOxri}`0mzi%M{M+E?+Y?z#*C9yG^pA zpa3G>IomFFM7j;>oDeYCM7;+Hciha(2v5BBlyTBtZW|8MIc;?WDk%wayDH;$!ehM) zijX&c91ZTrht*!Ijit#ZFOpf`cx{RF#s=}NSd1J&96E2xx$A%7TTW}#>Qp0zpSbh4=IFRR&>+3_E+Q~>^r+e zRDv?L2DP#jf+=X^R!t{3lHczi1eaO%p(qYsyQZzCwlL@wo<$H%H-lQX$&1?WT3rmI zD`|5cD;gCi)8fHIk?xh9sAT?ij&1LpKpeSv0q=sPtm0Upyj?oy4*DQ@Ln;~p2s^y+ zc_~UX4&8AY;&f_q2dzx?;acrYT4^-U^`D4oY;i_!0dUi713x48g1NT_2xS>LIbP9b z_R5uz6U=1Sb1;v7i9wsx1e;-A9@s90-fAA`nMLd|^9*c6J?x0U^#)=?d8|2e8AZi7 zZyLqYBPFia+r>I|Lz35o1PR_(6%&&_eKW2H+HFNwyNiltjuxSLhV}`Ch5*L#fEooh za$VxhSeiYVXD!>*AIP zhj^|kP<-M7B2%?jZKZZil;*w4)54**L0pTHTGsX%PQB6iXKjTZz8B}q?1iz+nKivU zgCa>MT^9$B%*efaNgRaVIxS_&jBm7Z;3mFOX&SMOoLs?}658Q~IfA(fp zM7h!w5`HNkWve2nk&XxLN+GW)vl&&99JiRfGWudYE%|NiD`Q!oyHtNidl_Uz89Z~s z#N5b&r)}TCq zd{-oK5|nXTHlFIs_-sPQv(p^oeiNxcwCbLkc|q6h29R;`$n{R!<5n|nsp;w(peqzk zR|F-^&)%GcCFdL|Ik<+9a0{LHC0kPmth~)s1;oQo`NF0aJ3>xeJa@crEKpf%eSnUC z_bh<-E1kJ&H;&W(pa*!}a_S3Gre9%fEg~d5mS!CmmP|*H8&kKG-K0LR#lgpsd))qs z7nP2h6BGFD`XEl_GC1y~*gX`bnX4Z<_T~pf$=+D#+PoeGht#yl&Cdt?tDErUBm+~q zv952wNIS@bgNl?US4|H@c5?y_n5J4Sv2qq|>F3X%nO+U&SyK;xn@l5nahse51l8?h zk-69#=Xs@WU%9o(IEba-)8<*8Dt6_^i~{5#%6T#l&7e*CX=_JJ5CB8SU>7pNvU?CV zCtnDeC`$Hn!|xw|>@yt?8Hnc>cS;ab`dlNDmx0gEYmG9KBzZQR&22rMI26`X#~&LC zNxkCVi8x5Pw?S&Dfe;9JVZZDfk(~4}G0~BvRxQMOT+&VZ{G(;cMO~pJ-0|x5*Gk>*Is9LpfTybkFlv$*>95-+QQ9e0?N!=JH1e2F4lGB#TMTu;u_qY64FLFw4uYA zyqZYbysZcxMj05l4IFa7p$-$ntLqDQnC3cFarD-g=Cu8Q$_X6D4+1LXae_CwI;-}S z>@E2^96xH{naF!LoI9PtPLpl-=0$!uFh-fKaxQyx^cZCrmqY+W5wl0)P%mE>Ugo|m zggVL3PJl85XN)a=Pvtyo8}Q;KjaxCrKFV9iq4dqX?ILaUXUIr&gV@#-fHc&z?2ToO z8&MQiO*&`09tZ1lygD2zv>0mD&+xv`DXZU@P4ZkxNDtHB5k{*(73|E>_M#PY*+j*!-6-5Ux&G}L=pQF` zbj8g&!%BgATx&WLeH;ihY`efJZ@7CqQpdOUQ@v#lF}F!T-f95|Wg`eG4wFi(35__w&q#`iJV$$#Ttv#{;}-46dVZ5 z&1!)dyVj{HLsB#Qe)pw%Q{QuRtxD$st31uC=0R=Md;$fOM~>vXLKaOZ4MS0A(&=|D zQ>VezCOv+(pb>c$TpIg!2dx{EUGWr|y8@fj{e|o48q5NHiRg0W#)XMs$~nQH!im;V zLvyM+JGjutmzp=(24O1ob;t>UuZcJnE3;1$o#U#PT2s?bI6RXF({u1Qd*ZS^1Ex09 zndNBZ7DY^Dkx|xgM_ZZ(hZJ(%?Leq#m3Sxf)3d;0gi9ZMN-#UN)?{v!?Z~xUHLQ@) z9M)*|Q9>=Ove%(e1+QynnH4V5*lWUzaJi9M=h~$DQiL2uk15yF;Qps^nb&2_D!fOt z;@M(N%362X1_c{|ukay_pEuo(j(8mk-0MwYt1#>;h}%{tKc zqn|p=6tO>e6_e@7y-zw}dpYosKrQjsFmT}M_(DZHLb+Q42L0X&7-^^SEPcld_Ov7^ zx4WYbz-D8B^acVQ!lklSx8oh2lj7Q8g1vqSxckeMT2>s~p3_~?^eT7BWh0EYr`WYB z@ul>G9k6VrOw_WwZOlJ>l$V5;zn(#x{aseIRY|{hKkvBc0-zq97g{f(N|Fm2ZEk2BGjOp6rgv24M3OL(R9PN_jx3WKt2+V^MBRH=bNMELF zMq}cWVXUp~11nGxK(z}eZdTYQt8O0jC%rrH&__}{nAOGKoMC~B)Qt24Q}U`#xT@WY zR%P{uYUHyXYh9If1u?6aVB)>))x|l*fKL|F-toz*!r7tZk&uDVRsp$)x1~=WYs@}W zjHTaFXb>MJ46V|51qqn@a0dkDxPZG`>cG0KwHrkP&0l-aU=ZYTi=YQ8|4R#C%Q^H{ z1b~zb(6rZdR%xO!oD$_YtB`{zF*td%$qYa?km^t$gjCd6v>`{>x5UNn*aXTsAeZ)l zvrkR&@|`l#^|IwgxCc&fGXl2Q(S4LHBHM{W-uFJ3S(4MNJlSJd<_R$|`17o6%)JLh z=pJ_gZaN;Um;31=nw8h(8PVAV%-iF5B!Qk;^Hhg$<0J2!N3V4UA|_6c#Zi7M9y5xj z$4JGrQypp9KL#$YKd$A}pc&wuwaYJ*%pkRxEb+bE`O;cmcAvuS{Y+D!sE2hm=*I}v z0L_(Wv)l!fZkYr?FJ#JSyqQy|qnzC2w_gHK+hyW){Ne?Ocz(IhO(!YD0i3(1u=C(n z@EC#*D(H0HDA&A>w^k$d?nk(5os+9q9=c|L@$aI?AJ0>X%#UzR0jN?K6;#&F|GLb< z0XglU*OF)gH8Tm+t=cDgfmw-tvOL5-bS#i&Ra{wf#y4VtMsd>Uo4p7^2Pr6o&a*7a z(+6yfWmu{y{;)A~H_9PaL+}SguUr=gYy|Qo7OF6pC4P@z9D6ndcmY@2`PB~&XDU8L zcB{m~0**!+WBONxm_poP2IkY3RG{-DWAm=e>1Q8L_}3npSzJ^6V6RilI6j8gIPI%v zEA%sk8E><4!6i}c@51N>dZOK%BPdiN|DW?_OOj3-P63qNwo!3G!v&}%s>?cPfaYa1q?Fa1=W}7x(M|r8xN)X(u zbl}`=aZ^wJnQ@Zm)>Rn#d#($!9V->6$AE%h!HiWDxSW%=ZD-dSC=Dm}!6-NuVjpwN z8yyy;D7kFup{~tFniEV&An_FEfr@jT%k?b%Cq8fmNudDA1(WW`EDqNm{Pl^dVxgP9 zk^PxqR@o1;5;cpJS_LgRu&@&G^cXY=PP=m55FYX#rqSayaopNQu0uKcQJ#Gu{Bt5V z*=ROfFgf1j-|sesU2LiAK5*dU%z+@)o=T2QY?RpyQJY3|r%vT?msmRe+PSn3k}(lw zL$!h@mwE;vRHk03tNMD)P!-(K;XHNLZflcwsh)hjqwlpe2!ib^dpUnoz!Pi70Adji zqIyKQLN;F=XLQ82Ywtci&!Utc`%V4EMaP;_m{L_C=!BqPIe~bibY?UXlx=(yagLjk+K7v)7xO{gi$(ivFmm=blin)F-?HiqN8M`<<%fdtr*bEgvX`IX9 z1N>VS+@~bq;bJ!NE)Dux1w+%a(Si0e3c92IpwfR3VE5)u=I<{Zsq4m8LXZIZzkWgB zll2=lSy^)t;9$l*D1PlGNdYX6zzV0UWJl&%;kbOY8|nMEwp8UeLD3zLael)+l=pfyQj?W@@f{Paru&x zXRREtB0jlZ!HA3G1Nf0(ihd>VTqk>~xA*#BW5bChtaze8htbgMg#1=e&^M~LW6t;* zioLQPhhPI9Ke$atK|MZ>3Q`;5$L$RZ&_|tV zHaZWmBp7^tl|NSP2ZSQ?66S@<_Ii%W z3E7V~)rAx;a`$!QBXiBf=gQ-=y!GWPjZ>V@i;qyQr3#-}SnRSl~NUgqr$W^$H*%C=<&9 zBwasTKu+>S)doK~ zp3z%P=t}@t<4)TXo%U%zbi)3)s!4T4fYHLumHr*3MWcfm_VgpuqQSw3WiG<72kx6~brDM-vEpZ+IsZawkMVDs*IE-rnlm+&ef(SdY{1 z@JIgEtPU65T0X4bV)%q94_OvB&~9;koh}Wb!2Sjq;8XIJRv%@`D>MJKZ1X)omn8#J zyVhc^IpZvPsZW_k=8-CrSPL+EczZNVlMK?w1z#`=izo70uxK_d>qgCHw834gwoGo$ zjo<5TX;jIli(NbgbVVYg-}7~tq0T6=wf%G}ZoR+K$tZ}YhsbcaDi8pdU8QqrhSah;BjcH&$ zf)xdxNSQ`fh-^k&!)(`jS5lO4i>2P(`rm` zeoAtAY$y&<_JtjXn2>v*S+i6d*!*#i>A3rq-<2Cs?iGH6P#X>?uC(=@C9CU0o8S@~ zDM3EE*xlA6Y=Qpt!gZk(cWuPUZw7%C%ae&s3hh@Fh70A0_`P;*)9HQAvkscu!n%O7 zZF!4VH}01jOB~FTX2i5FT=eF=xBo=7GpoGwXMy($agN-)$fu?kNv@44^KPcq!ZbQg zNOI@t52lUhpE#@?12tZyS>{t;{E}bl=SNxEpS;HV5*&husKpw^k{8Hx7QC)*af(Hc zV*Juel0{#}TIE+^G!S@=o`S|MaY> zDEFvZ63W?E1Xsjaxi!ICh)W4e{#iS??!bPjnD%qviH*6t(^Bonj{^RQ=rpgvaFJS_ zZ}GQ6+>xc+sx%EQDHjD;3D>ASyiEN8UwfU?t;MpXoV&*IuZ088o>N9hiVBgIxSs=p zIAKaqoUoH#@7hn(4H8$f`@%};W5XE?;Le zb`G`Hu1hg(jK}Tdah}uWckNR8 z5?Vx0;&ZlAXYI)$wA&>vvN}Pl$*hw~d1|ck;ODPBwDbk`!Sx=;=T0;1CDkJd}}N4@Vkx+%?Kw z-sa{L=EKG#Z8y5{E!wd*3b%jCJW5z_C! zdWeRQ@RYa243E}fR%eJi81zQRjw>h*)J!$<<&gBOrtu*&c7D(+O#`3|rToa~86!Pg zr_ommBVNdvfyD4iX_OchYMzO=ZP55AD6eq|9$8m zpt(PlQ(`p#1rD1|;HqRv6U&?Cx@kCD6!d^HFw-A&J zCGrReX&%?Q8vj&cEQ&2>KZ;!hAxI%4%|KZos$i1|a8j^Q0^G)T7EGW2!lh15{(%Z} zl0@5|!!k9T#HlX-TOacrNS=qlZg*10_{)H(#)^=Vt4%W>?0FLi4QAiw6 z?PU0#3Lp$30Z;muIG0JnyL`36*TRCdRc0k7f1n9D8J8Yic~USKt!}>9M8g?B z@exGxC3VKm{%>p+Uq3pf#AeXThQcfI;&_#*+d8k^@N?;qnY z#*g{^`*&&O59tnD!>Yr>%EnW6*JiA=<~+fF{#KF%jdtC)&0o=z4d1YvSsw+e+4Bkgg?fBlJF*i@dyZB0!di`BOCt5 z|NhEBv_tD=VfW*}YmoF`fwc=Zgc!liAON66P7#ud_;LAmY36@sa>0gZu<4#-mv*7^ zZ*C*_bsKaXVhMt_9f20=|2_R!_saVXfOfGz{<@bgl>Fl+0NM3I`1xXqCmx^ezhCn8 z?JKC#4bT7b&y~o0ds!Rab%b5Di8$19RCU?#odOdHF_?~|2oC)u;?VVIB7P0XbrX4B zUZRR$&c65$NG=(gZ+*ScP!l%zPq`g2V?t?g1T_#*6!hgR2ps$SqjmT6*frpEeu>j_ z(XDmd+7JMU&kf%dnr?ms6uHKLsR0mA*6q6G4pN=lq^5!-UA9w27R!K~xv~^Ojigl0GwA)E>x}FvI64W^`yKkdK8(SX=p z*K?a+=zqXNY4Et1buOFxI##sxt+zOO%H9-enQEMl`lVIuBy#ineI2mmcV50hSks3n zq*lM^2^j#!SD14>xqD{1A8pq%Qjq5F??M_lZ2ur`Aq3qrsrhRZ_~1H#vgV z1Pgl$l;7?EQdM{Ee;|>CJ;Ucq+6x!IgHA*;q_DLCZyxZF2d;tPwD?-HHT4h|r|i-~a9n3UN+aF(7s77BB8 z@%{6X`}b)9xTQ0GJj()~LBK)?P(sBV zcQGAx!HvkiO@_T|78`1^=I@?g?h94={M!B_FUis#&NlvP$k}=vOlLMs#5@&0UM$oE zQEoM+N&Wo!OBxy}LYCu)Glx49^VbWTlQnHc$Rdc=g?7FgWPPxx0g#REr~uLYF0=iQ zzcCd1;7tzx80rDMWdZk-tr*^U3KqPZ6sCde9b00D%^`x1gjOx2!eH#_>icF%X(J8^ z=%)2?;Dv0cOwTi$jMvMfuYqc@29Lu0Foi5^&eIZ-7?IH!V_=#B`N%VtsaerF8Rwps zM-xISM~XK(L`X?#Z82TW?F$9)RXy~y$xPf9<8+Z}D$|CBo_{RaKQ^j=+O}^HQEqN( zNQ#E0W-a}XJ(YG?=9FReJ!`Juj_z{Xf!4QV*u#9iNfYOr6n#SzKc=Z$kD6Q8tJ5u{ zdOxk|>3?JqUxu?vbtTojj%Y4dsBqnH>m)0oVvDKjr{qlHEAxt z?JlO17n}xRv_DF}zud*Tg=&|J^&g?PWBSud|IgWP#|IYu2UJtEb2f+_H-DzqVpnQ_ zn@Xew2c~8vh*e^M-N+}N32p|^7f3V4zE=7I$3-Ullw?QCPPUtzVVs!kDXv7B3|v}x z2U0UYdSu1A#@TykLbJ|9?B=!;B|z)mAK$GqZtDo4n4Li(AClWe9_}C&O%MspfV&1k z{Y-MX#EgVPFpeNXqkn6dz^d~1Kke~;@>0mJpkVV!k;eI0k{F1tErs7xu4y6&`8o@L zTAg!GCoOzsz673A-susw+!h)8fxm-K=P#L^3#LOZ9_vtzQCtu=AD zd0mEs4@t%oON+1-l(mfn#M=I7y+O%q z1dFg8@5@&|EjoMKiFB8o3z-v$0bDg!9YCXRimaaG<2TsdlRQTaf;(|3m;jyX2uwU$ zpa=KEzcscV+DBFudOdQ3!e$w(9wkU1?XMk>`U-e41ZJOENe5u=y-7Zy7Fld5x#hm3 z+@9-W>JT3(Kd$~Zq^2KV)r?EV7OH_MdV+kqD(-u&qjBF(6T$jiv9%sRq)6<%6mWc! z=?XWYI7lKQK?@2Fj+*znnN4W_UFP>6HYWCxh;P)7_XmD?0z@_@Q2PViD(Rg2d~Zk} zaY0FO`V9OiM{B~$=`&vW(1e26s@T9T^xLQ}>9Ru^ILVDyK#|kdp;5$QFq^9dS_zpB z8m}7qO1$GV>hs)qFS4Bi{wtSg-6S|;m~!y*P(>jolw3dt*x*bF2maRF1ALm(Na`_j zQbWAtXE@E0e7+v+@v|{aXBAP6;4ocuahE4@vTDN^Jr|@5k{3c)jSxNbpxtcS45>1! zD>vX&3+Y^W{vVr{i^INKMC5BvQr0KBzl%A3of83HeE@epOEM_hlsvw-xVC6!_Q{hc zFQ`Obm6gF?kbQn*ukijZ7jS%~yv=x(bk`T!D!|*n3l?bNFq-CDb(Ti6N{ZS$*`%l+ zq8ht%&uymaZH5#!J>4WDHYry$uv=|4b}6hbLvYXTvjW7cGoQ}hQ_RI+%K+lPABE38 z=zLrY5iv2U>x$9?2Fu@6sr2p_cj1kTeZ~7qPexdn|CRD00QHE=EaNum$&V532W=j| zPI~|w0Xde{)jh+e%5EVg=KuvLKB(B5EEP|2Iqz1gyT4iGJg@7z5D{?a*nsL^zMoC? z12ZZ3HRLb;5(B(B?NPbyWiO{i*VG#@j9V<@$O`Z>%z3%p`^lgYD$`pO1xEk^E-E2` zUgpaemeS|MF%5 zaa%H+fL8W@pWb8=f8$}mZ~b--86@~k@!KwUJu{*h}7Xz;ma&h-X5QGEVi zBs3iLU&(yBMjS&zVq%%y6`QLUc60wT7dG!7m<>wZ5E_{w+s+M}yZ?CLKmY&K_g6l# zj@|lN2q0BdJ>>h~!(}}#U(Uz;Z^@K}LHxm{qeE+vE2QEL`e@U=Kf7_j!Xw+h6Y&E* z)mg)8x?Y0>x`(K9T4xyIw)l*svJ?8ZQ5Zif5f;_s;N&z09QKD{YUnAJcmB1%{ZC9W z_z0t}Iizf(dL=lHNrcOv|H0qwJ;04Nm`r*#Gu#M?x4tDL425ey*#B<#{KwPzJkT&^ z$V7IyO@sdPK>GLl{o|Jb3qaHFn}3Fb`{!5tlk12>2{70L2HX(|f42sKXNko>cvOvf zz#G{1S9kwEp5@#2#-|za<3QIw`!6r@pO=qT09t+PCHBwVzx7T4{^2el9$)2_eJ7yp#4PLKjM-qeN+-@fP_ULY z*EE-=tU5p1=pA}P4!$6yb-^3%Soi-g6NnM*E0#sZ0OEvnfa0Ip4N4_*HD{pKYJp{g zLFqdu>@JH^`!oeHc6>K9G{i%y$hq$!?BFU{k(v2o9a&fPy}d(ilx1pwie-=^D{E~4 zlp8XjpR0VBZ+XX~k`XD`v8Tp!`^r7fzz_X4<>SXO`=YdrNUfH=&j~&U7qmRzn|APi zE^Yyuo}AdeK~HjZ@?%HyRNfrAYu>n*1A1{(TeU*h7ebljBfmmi43*ofCtkS|N9Los z22IXKJ8Q$0vI({sL?6Tv<+k^S9bc1cB0PnGsJ>Yx)fy)9gouc?>EI>M6)W^JK4Rces{mOjG1?0EC3Vj67!JbRYG5%yhe?A z%+_$Dj^Gf?7id~FIq`;^U#vC(`Y3zLyU;i3`}bN&9(8>$mh6EfdJpvALAJ$b57s38 zy;e@7e@UV2M9$0z9k?4r$)^aY4v&lohZc!n9NV>=t=6qHoOh6xx!&wN5<#*M(%{_o zl|HCa0c83_(>qKQTtsheXc zK0f}Wq%dM$c{QOa?@qf;XRn&MvWIcZ)NKsEA2Y+a=M*Gub%;l1t$dVa?^lL@;|s#I8?WFljQSfSsffx=O zm2^(wK*kElh*T)I_xCMs?`F@-DN}$DWgSLSYNbQ$G_LW>Nel~~xxc40#eIhg(@aU? z2IG*RdVM56&dgy7I6&^LqKa#zfU?ud^f3@REH~haI_NyLVczB3+p#E)F#$o(H5ho- z4uPbL2R?gWuCCgib;SM5{?-_FJynSS+4{9C0@33Tzd~}n$+jWZlD!tRH`D#%2 z<;46Vj+3t3p&h46EzI8^hMVv4{RVecWJPOqSp;e)9x!z@Ipj0!jQ zzGR_XU*ILdZ6AZTz#}5o$xA;-<6#6`+`Ywa_HeoP0c+FdijImzTc^-<*K<4LI2M+6 zM0gI2$M3tsuDYIU)@7MXDT7C)%ou}eQa&H(jtHiI+m){ZCHi##NTn3P6{M~1WNm0v z8kuXJl zXJi-+sUO-?tVzQ|HCS(}pIG$_<-kMY5A_-w8&|tgZpXCb{2y-dHY`1{_r9#LGbUL$ z4G~G(iR|lv7B_CFRRrQV@T#z)&*Uh)!eH>wPZl&>k%w=n9T9#aBCnUH{~`B`Y#aA! z?NV4jtDZt)u9G(ZSN1s3?|@#EMNo^J<&ShpD^=O`RKtr(NQm!?=p_7K?T5OUd~IAp zr|t7q^Rp8QRO&+62{#9ebZS4VMmZ$mNhz2S3GGc9X0x1ENMhY*E$AWc@y_ z(sJ%K;kr-TF}dLI=Ht@+qT$s|+2RYhBEW26`DVW!Aq$UY#6`|aM1)r6ZuxR?os z+0E>G`JB990vw=oUi$a;&N`-SQ!ie*=?chm0&)tz)rox8;`-fmkE0_8ge3R;TR}$- zVcggx5`o)k!}Z-C^$0g=M{OumP(!)x&m^ARVYHV1`C}v~@7LKMB&seuD^P*(c~NlQ z;kE0_5Ty`5h~aBFuR%Bvc+wfd8Dj0$R5P@99M?Y%xwATx&iy(9J_aYcGE(VW7UO^t#zLkC! zjX^f#%X1m~cy*qb5LzG3dNyXTMD(Yw;;hgUJ3hjn}Xc0Fk-QWgY^@3^j9$|u<9aCR!%aQt{o$rYl+*f3K?zpi0lV<}^Z zm72kJ*n&#ut|!q85L%UHRAyCgZ5LTpV}Z8w7^Zi23)-sz{yS3~;MU5{i+GOieF!4% z^=Ic60$)AO1kq)sjhe%h@0_X7HgLR~$$UfGg(5`tKI$QGD0@USpt2zQiB09{B(lmI zriri0bJv4)ju+0FFjA^A9{$FuXGo@LXnZgZ1DW4hrbxeSM_ z*Z_A4k9aN@x=1M&W306)fab}x7M>NeTNOLNSozh?#ZfoB$4yz2k>W9)6GhU|Z z5ayI-IB!no&9R4UrgP2PuOL8hri^=%<-QMIT|Z_FRKYd|omlCFRNcXEqbU-^LNU5@yZ} z@)!?qCw;sq@Q^v|P zz(R-Cx_sT-oj!~9h5pg=x+7ew_|)bb9ps&qkAv8|yZ&#Ac=rgXvHZr|Z;;UJ9xH^n z**&RS{l{eZ61&eN=@|Uqh)*K#xP_(YH8p;jO-_jjnWbqGj}m)7OPOi`?#64tCq@4jF?hX2Ubj}Xh-sz06IE@!JOw1Zm%P}m&%?Qu(?UY^Uo*H!0^|1UWnb%c=-rt;O){o$w1Ywo!&wQ^<1M))`|$w$zb#SC0BBlQr*TB zCN>4!3@uYLE|MM=H1NL3?dkCB`G|3X9(|JH~5q-a?=~y$0 z^ggRv&XGTMv5F>Xq#_PUrYzKOzr-uUHqiHxLwUIT;~>)a=muwjL@B(YT<^EqB5}tj z=L+ht_^=82{m@dQTg0)`jCM<1wb-y*YL(ssT{UmXiYd}-X69axD|3`Q6*3Wis%ga%Xzl2c(sea?srLEm|HrgfYYS*)Obt%Gb(i1A?h%ixjO zhp#KB!U92bL9G}EpD#M&^qcQ|R8n_g%ZLgDKP3CG@EA+O>}PSqxjFevEixsc`x(=V)>*FM zlBi`abS&Z#N7#?@x_dATo_ubx`ys#*2Vnl;9lvt)p+F|x3bE+PptPi2Hb zgH3X(3=2YjVo^aD%gL7U?+k*EvlwOR7o!Ou#Ad>$4KrwnaQZLR_9T>`iDKyZnqzQ2DesDR+;JbJuivFkkFL#B*ek4S{{ zsb8PC>}FpJU>RX$zi`Pl(qt&uZJwV^Xi^3PX=VrtC| z7q2BDlJ7;S$VWa3*Ybw(?#DkUs|k@UyhGRc4VEaZLqh0=sX19h7fDjY(<_ZiTcr2! z6lc_u$M&J{gZT1dn3sbGb2#AngjU{<{jRJWL^G1HT*p|Iiqe8bD$WuLB!glRMD~_I zm2KiiDgC8I1Z|G1kO^PUhv?H0u`#j#RQV7?sq0tbLDxR^>|`3fi`d~zw*AQF`iuoX zNG>{CDr}N4juKgIpLTeBL{ zffGY3PE+BVoIi+4?s3ClKxNy(Ji@bES6(n8DBl92b+P%|5fK_O9UqM-gmt2!;fsue z;~O~|n*pg?cisikmU7rrW*sO9!I%*)npnUcSy=fuFD_3d0(6oNN9bDUvG7wK`mg&S z{NrDn&dBeUnFvY1;`a|0vx1YK2gkY^yL7MDUxdKIF&=XU#-DF~Vdj`pd{bi+59Ed5 zcZ)2A^hO7Gua2P++u-`fiZ(obRn#KSS}Dj#GpgIkh^*kZ5A6e z@<)=4vyI4FA*D`^=o0OL_UEsRHlCN=Q=gN9Y|n1ySQ0Y`L0P_jxiatwddFDa8l4Yf zqvqGje)Dh6d2DiIGf5x667;o+!uTjiR``c-1c8CeP(MhKO=RR8eL+SKI}s`XoL$f5 z!BDoR$YbeGx3!`3<&@UzKJ#?P=Un5g;$6-->#W`vvtHUg=+zAB3-98M{4b)v5hsYs zS}fJaHV#+?oo*^zM>XwARa#HC&RsL%tV}I_o_}|!!k07gmTRt5(1A>mFv+o)KFpbA zus({yKZHO$N2ePV4Q)VND$0KV86o7TWgYEC7u&HzcP=$Imnfc#pxFL119#fg#8N-P z*TDwL!*N6kFdU&08cAt_9WFfcXTMTyJA?|y_l6dQAR^K=%{8&zmo^>!t&cH1iqvOP zkdA(WgwbKjlV4?4zfdC)o)PGZeORVD$R$T(?Z6j*P}xKkhUf%U29t)9+JC#KQ8a6@ z#ZvbeGj&J0xa*w0fI6XPWgY(xf;aQ}Q2D;DmW=J!#z~veY|_;-M}P+;FGLK*#=FXE zdqtwp7c74BPvG6YjLgP!P>a9QsJ!8T^Wv%Yr^hEIqyGvqOrFH^x1*n8rv}1R;6=a8{B}R{7kKHn!)~E! zQ1k$74;S&3?}C!CH95lK_`2;rNYDb%+IvbZGq2MX%E(-{uvZm=(?QHo%v0FGb8OmcjMLK1fRDz351WI-}4{XTh9o##%t$-FfoRA<+7k4j&z+Q6%v3GbIRbqrFBAF3=f?? zY189_O9}b@qF6`=?P3QB(dv9o_-4@nm(BtU8$Go$4idhOXLCq2acLn5WjSyR7D>ZIYz^hvxk|zK2wh)4I=;KON@y6E@e*i z9z7pExbWo|E)vWw?J}v{eRxaZJHg32`*Ke52ysa&-3j7NNbubz1zKXNN zx*DtSI8W7%X~fD1bT=q#&>6OKvJ-OGwbk>hjm!HPnqe`ud#^;|GH&ErVH&HjS)OiW zdI`VVUD2l32Psd9V$cjJ7Q9(yDkI`G@}Ez)$-Wp)bY(|p+U`FAGFcbkz6=N!jH5{S zvqB}B>qx!qI)^1bnIIlxxNUC{+I=h0TfR9f@XDxv4mJkeo#R@;^4Vh$uqo4P)s&te zjLVpK;;D2i!>bW%28$S#v1kvbN&{g1bUud>}LK(o_qiAG?=omF#Ep zkZ;|8gt3Ln=Hk<-WY_6UZX#m~;E${v?0%9UhxLO5?%tnFkUcirMsecaT%^UQc$db~ zD1^9I;u3zi`0aHuzVQ_r{o z-|=C$jI93cLaT8�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 IxY39I19mT-^#A|> diff --git a/mission9-10/infra/s3/policy.png b/mission9-10/infra/s3/policy.png deleted file mode 100644 index 65ac248503b348447a2dece167792db057033fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208287 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ìpLRD9dwqQZUp^SJIoA6o&?2s97A^b{ABb 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

A*(Fi;4q5?8M44`tJI31o@lp>($c{E0&hC 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.0.0" - } - }, - "node_modules/@aws-crypto/crc32c": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", - "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", - "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-s3": { - "version": "3.975.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.975.0.tgz", - "integrity": "sha512-aF1M/iMD29BPcpxjqoym0YFa4WR9Xie1/IhVumwOGH6TB45DaqYO7vLwantDBcYNRn/cZH6DFHksO7RmwTFBhw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha1-browser": "5.2.0", - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.1", - "@aws-sdk/credential-provider-node": "^3.972.1", - "@aws-sdk/middleware-bucket-endpoint": "^3.972.1", - "@aws-sdk/middleware-expect-continue": "^3.972.1", - "@aws-sdk/middleware-flexible-checksums": "^3.972.1", - "@aws-sdk/middleware-host-header": "^3.972.1", - "@aws-sdk/middleware-location-constraint": "^3.972.1", - "@aws-sdk/middleware-logger": "^3.972.1", - "@aws-sdk/middleware-recursion-detection": "^3.972.1", - "@aws-sdk/middleware-sdk-s3": "^3.972.2", - "@aws-sdk/middleware-ssec": "^3.972.1", - "@aws-sdk/middleware-user-agent": "^3.972.2", - "@aws-sdk/region-config-resolver": "^3.972.1", - "@aws-sdk/signature-v4-multi-region": "3.972.0", - "@aws-sdk/types": "^3.973.0", - "@aws-sdk/util-endpoints": "3.972.0", - "@aws-sdk/util-user-agent-browser": "^3.972.1", - "@aws-sdk/util-user-agent-node": "^3.972.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.21.1", - "@smithy/eventstream-serde-browser": "^4.2.8", - "@smithy/eventstream-serde-config-resolver": "^4.3.8", - "@smithy/eventstream-serde-node": "^4.2.8", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-blob-browser": "^4.2.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/hash-stream-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/md5-js": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.11", - "@smithy/middleware-retry": "^4.4.27", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.26", - "@smithy/util-defaults-mode-node": "^4.2.29", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.975.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.975.0.tgz", - "integrity": "sha512-HpgJuleH7P6uILxzJKQOmlHdwaCY+xYC6VgRDzlwVEqU/HXjo4m2gOAyjUbpXlBOCWfGgMUzfBlNJ9z3MboqEQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.1", - "@aws-sdk/middleware-host-header": "^3.972.1", - "@aws-sdk/middleware-logger": "^3.972.1", - "@aws-sdk/middleware-recursion-detection": "^3.972.1", - "@aws-sdk/middleware-user-agent": "^3.972.2", - "@aws-sdk/region-config-resolver": "^3.972.1", - "@aws-sdk/types": "^3.973.0", - "@aws-sdk/util-endpoints": "3.972.0", - "@aws-sdk/util-user-agent-browser": "^3.972.1", - "@aws-sdk/util-user-agent-node": "^3.972.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.21.1", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.11", - "@smithy/middleware-retry": "^4.4.27", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.26", - "@smithy/util-defaults-mode-node": "^4.2.29", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.973.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.3.tgz", - "integrity": "sha512-ZbM2Xy8ytAcfnNpkBltr6Qdw36W/4NW5nZdZieCuTfacoBFpi/NYiwb8U05KNJvLKeZnrV9Vi696i+r2DQFORg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/xml-builder": "^3.972.2", - "@smithy/core": "^3.21.1", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/crc64-nvme": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.0.tgz", - "integrity": "sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.2.tgz", - "integrity": "sha512-wzH1EdrZsytG1xN9UHaK12J9+kfrnd2+c8y0LVoS4O4laEjPoie1qVK3k8/rZe7KOtvULzyMnO3FT4Krr9Z0Dg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.3.tgz", - "integrity": "sha512-IbBGWhaxiEl64fznwh5PDEB0N7YJEAvK5b6nRtPVUKdKAHlOPgo6B9XB8mqWDs8Ct0oF/E34ZLiq2U0L5xDkrg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/types": "^3.973.1", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", - "@smithy/types": "^4.12.0", - "@smithy/util-stream": "^4.5.10", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.2.tgz", - "integrity": "sha512-Jrb8sLm6k8+L7520irBrvCtdLxNtrG7arIxe9TCeMJt/HxqMGJdbIjw8wILzkEHLMIi4MecF2FbXCln7OT1Tag==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/credential-provider-env": "^3.972.2", - "@aws-sdk/credential-provider-http": "^3.972.3", - "@aws-sdk/credential-provider-login": "^3.972.2", - "@aws-sdk/credential-provider-process": "^3.972.2", - "@aws-sdk/credential-provider-sso": "^3.972.2", - "@aws-sdk/credential-provider-web-identity": "^3.972.2", - "@aws-sdk/nested-clients": "3.975.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/credential-provider-imds": "^4.2.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.2.tgz", - "integrity": "sha512-mlaw2aiI3DrimW85ZMn3g7qrtHueidS58IGytZ+mbFpsYLK5wMjCAKZQtt7VatLMtSBG/dn/EY4njbnYXIDKeQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/nested-clients": "3.975.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.2.tgz", - "integrity": "sha512-Lz1J5IZdTjLYTVIcDP5DVDgi1xlgsF3p1cnvmbfKbjCRhQpftN2e2J4NFfRRvPD54W9+bZ8l5VipPXtTYK7aEg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.2", - "@aws-sdk/credential-provider-http": "^3.972.3", - "@aws-sdk/credential-provider-ini": "^3.972.2", - "@aws-sdk/credential-provider-process": "^3.972.2", - "@aws-sdk/credential-provider-sso": "^3.972.2", - "@aws-sdk/credential-provider-web-identity": "^3.972.2", - "@aws-sdk/types": "^3.973.1", - "@smithy/credential-provider-imds": "^4.2.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.2.tgz", - "integrity": "sha512-NLKLTT7jnUe9GpQAVkPTJO+cs2FjlQDt5fArIYS7h/Iw/CvamzgGYGFRVD2SE05nOHCMwafUSi42If8esGFV+g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.2.tgz", - "integrity": "sha512-YpwDn8g3gCGUl61cCV0sRxP2pFIwg+ZsMfWQ/GalSyjXtRkctCMFA+u0yPb/Q4uTfNEiya1Y4nm0C5rIHyPW5Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.975.0", - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/token-providers": "3.975.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.2.tgz", - "integrity": "sha512-x9DAiN9Qz+NjJ99ltDiVQ8d511M/tuF/9MFbe2jUgo7HZhD6+x4S3iT1YcP07ndwDUjmzKGmeOEgE24k4qvfdg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/nested-clients": "3.975.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.2.tgz", - "integrity": "sha512-ofuXBnitp9j8t05O4NQVrpMZDECPtUhRIWdLzR35baR5njOIPY7YqNtJE+yELVpSn2m4jt2sV1ezYMBY4/Lo+w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-arn-parser": "^3.972.2", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-config-provider": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.2.tgz", - "integrity": "sha512-d9bBQlGk1T5j5rWfof20M2tErddOSoSLDauP2/yyuXfeOfQRCSBUZNrApSxjJ9Hw+/RDGR/XL+LEOqmXxSlV3A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.972.2.tgz", - "integrity": "sha512-GgWVZJdzXzqhXxzNAYB3TnZCj7d5rZNdovqSIV91e97nowHVaExRoyaZ3H/Ydqot7veHGPTl8nBp464zZeLDTQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/crc64-nvme": "3.972.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.2.tgz", - "integrity": "sha512-42hZ8jEXT2uR6YybCzNq9OomqHPw43YIfRfz17biZjMQA4jKSQUaHIl6VvqO2Ddl5904pXg2Yd/ku78S0Ikgog==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.2.tgz", - "integrity": "sha512-pyayzpq+VQiG1o9pEUyr6BXEJ2g2t4JIPdNxDkIHp2AhR63Gy/10WQkXTBOgRnfQ7/aLPLOnjRIWwOPp0CfUlA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.2.tgz", - "integrity": "sha512-iUzdXKOgi4JVDDEG/VvoNw50FryRCEm0qAudw12DcZoiNJWl0rN6SYVLcL1xwugMfQncCXieK5UBlG6mhH7iYA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.2.tgz", - "integrity": "sha512-/mzlyzJDtngNFd/rAYvqx29a2d0VuiYKN84Y/Mu9mGw7cfMOCyRK+896tb9wV6MoPRHUX7IXuKCIL8nzz2Pz5A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.3.tgz", - "integrity": "sha512-ZVtakKpQ7vI9l7tE2SJjQgoPYv2f/Bw/HMip5wBigsQBDvVbN300h+6nPnm0gnEQwIGGG0yJF3XCvr1/4pZW9A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-arn-parser": "^3.972.2", - "@smithy/core": "^3.21.1", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", - "@smithy/types": "^4.12.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.2.tgz", - "integrity": "sha512-HJ3OmQnlQ1es6esrDWnx3nVPhBAN89WaFCzsDcb6oT7TMjBPUfZ5+1BpI7B0Hnme8cc6kp7qc4cgo2plrlROJA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.3.tgz", - "integrity": "sha512-zq6aTiO/BiAIOA8EH8nB+wYvvnZ14Md9Gomm5DDhParshVEVglAyNPO5ADK4ZXFQbftIoO+Vgcvf4gewW/+iYQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.2", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.972.0", - "@smithy/core": "^3.21.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/nested-clients": { - "version": "3.975.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.975.0.tgz", - "integrity": "sha512-OkeFHPlQj2c/Y5bQGkX14pxhDWUGUFt3LRHhjcDKsSCw6lrxKcxN3WFZN0qbJwKNydP+knL5nxvfgKiCLpTLRA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.1", - "@aws-sdk/middleware-host-header": "^3.972.1", - "@aws-sdk/middleware-logger": "^3.972.1", - "@aws-sdk/middleware-recursion-detection": "^3.972.1", - "@aws-sdk/middleware-user-agent": "^3.972.2", - "@aws-sdk/region-config-resolver": "^3.972.1", - "@aws-sdk/types": "^3.973.0", - "@aws-sdk/util-endpoints": "3.972.0", - "@aws-sdk/util-user-agent-browser": "^3.972.1", - "@aws-sdk/util-user-agent-node": "^3.972.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.21.1", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.11", - "@smithy/middleware-retry": "^4.4.27", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.26", - "@smithy/util-defaults-mode-node": "^4.2.29", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.2.tgz", - "integrity": "sha512-/7vRBsfmiOlg2X67EdKrzzQGw5/SbkXb7ALHQmlQLkZh8qNgvS2G2dDC6NtF3hzFlpP3j2k+KIEtql/6VrI6JA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.972.0.tgz", - "integrity": "sha512-2udiRijmjpN81Pvajje4TsjbXDZNP6K9bYUanBYH8hXa/tZG5qfGCySD+TyX0sgDxCQmEDMg3LaQdfjNHBDEgQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.972.0", - "@aws-sdk/types": "3.972.0", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/core": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.972.0.tgz", - "integrity": "sha512-nEeUW2M9F+xdIaD98F5MBcQ4ITtykj3yKbgFZ6J0JtL3bq+Z90szQ6Yy8H/BLPYXTs3V4n9ifnBo8cprRDiE6A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.972.0", - "@aws-sdk/xml-builder": "3.972.0", - "@smithy/core": "^3.20.6", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.10.8", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.0.tgz", - "integrity": "sha512-0bcKFXWx+NZ7tIlOo7KjQ+O2rydiHdIQahrq+fN6k9Osky29v17guy68urUKfhTobR6iY6KvxkroFWaFtTgS5w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.972.0", - "@aws-sdk/types": "3.972.0", - "@aws-sdk/util-arn-parser": "3.972.0", - "@smithy/core": "^3.20.6", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.10.8", - "@smithy/types": "^4.12.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz", - "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.0.tgz", - "integrity": "sha512-RM5Mmo/KJ593iMSrALlHEOcc9YOIyOsDmS5x2NLOMdEmzv1o00fcpAkCQ02IGu1eFneBFT7uX0Mpag0HI+Cz2g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/xml-builder": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.0.tgz", - "integrity": "sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "fast-xml-parser": "5.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.975.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.975.0.tgz", - "integrity": "sha512-AWQt64hkVbDQ+CmM09wnvSk2mVyH4iRROkmYkr3/lmUtFNbE2L/fnw26sckZnUcFCsHPqbkQrcsZAnTcBLbH4w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.1", - "@aws-sdk/nested-clients": "3.975.0", - "@aws-sdk/types": "^3.973.0", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.973.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", - "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.2.tgz", - "integrity": "sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.972.0.tgz", - "integrity": "sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.972.0", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-endpoints": "^3.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { - "version": "3.972.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz", - "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.965.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.4.tgz", - "integrity": "sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.2.tgz", - "integrity": "sha512-gz76bUyebPZRxIsBHJUd/v+yiyFzm9adHbr8NykP2nm+z/rFyvQneOHajrUejtmnc5tTBeaDPL4X25TnagRk4A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.2.tgz", - "integrity": "sha512-vnxOc4C6AR7hVbwyFo1YuH0GB6dgJlWt8nIOOJpnzJAWJPkUMPJ9Zv2lnKsSU7TTZbhP2hEO8OZ4PYH59XFv8Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.3", - "@aws-sdk/types": "^3.973.1", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.2.tgz", - "integrity": "sha512-jGOOV/bV1DhkkUhHiZ3/1GZ67cZyOXaDb7d1rYD6ZiXf5V9tBNOcgqXwRRPvrCbYaFRa1pPMFb3ZjqjWpR3YfA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "fast-xml-parser": "5.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws/lambda-invoke-store": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", - "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", - "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/core": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", - "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.2.0", - "@jest/pattern": "30.0.1", - "@jest/reporters": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-changed-files": "30.2.0", - "jest-config": "30.2.0", - "jest-haste-map": "30.2.0", - "jest-message-util": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-resolve-dependencies": "30.2.0", - "jest-runner": "30.2.0", - "jest-runtime": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "jest-watcher": "30.2.0", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/diff-sequences": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", - "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "jest-mock": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "30.2.0", - "jest-snapshot": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", - "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", - "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@sinonjs/fake-timers": "^13.0.0", - "@types/node": "*", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", - "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.2.0", - "@jest/expect": "30.2.0", - "@jest/types": "30.2.0", - "jest-mock": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/pattern": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", - "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@jridgewell/trace-mapping": "^0.3.25", - "@types/node": "*", - "chalk": "^4.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^5.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "jest-worker": "30.2.0", - "slash": "^3.0.0", - "string-length": "^4.0.2", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/snapshot-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", - "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jest/test-result": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", - "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.2.0", - "@jest/types": "30.2.0", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", - "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.2.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", - "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.2.0", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.1", - "chalk": "^4.1.2", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-util": "30.2.0", - "micromatch": "^4.0.8", - "pirates": "^4.0.7", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jest/types": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", - "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@paralleldrive/cuid2": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", - "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@noble/hashes": "^1.1.5" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@prisma/client": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.0.tgz", - "integrity": "sha512-QXFT+N/bva/QI2qoXmjBzL7D6aliPffIwP+81AdTGq0FXDoLxLkWivGMawG8iM5B9BKfxLIXxfWWAF6wbuJU6g==", - "hasInstallScript": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "peerDependencies": { - "prisma": "*", - "typescript": ">=5.1.0" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@prisma/config": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.0.tgz", - "integrity": "sha512-zwCayme+NzI/WfrvFEtkFhhOaZb/hI+X8TTjzjJ252VbPxAl2hWHK5NMczmnG9sXck2lsXrxIZuK524E25UNmg==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "c12": "3.1.0", - "deepmerge-ts": "7.1.5", - "effect": "3.18.4", - "empathic": "2.0.0" - } - }, - "node_modules/@prisma/debug": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.0.tgz", - "integrity": "sha512-8hAdGG7JmxrzFcTzXZajlQCidX0XNkMJkpqtfbLV54wC6LSSX6Vni25W/G+nAANwLnZ2TmwkfIuWetA7jJxJFA==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/engines": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.0.tgz", - "integrity": "sha512-pMRJ+1S6NVdXoB8QJAPIGpKZevFjxhKt0paCkRDTZiczKb7F4yTgRP8M4JdVkpQwmaD4EoJf6qA+p61godDokw==", - "devOptional": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.0", - "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", - "@prisma/fetch-engine": "6.19.0", - "@prisma/get-platform": "6.19.0" - } - }, - "node_modules/@prisma/engines-version": { - "version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773.tgz", - "integrity": "sha512-gV7uOBQfAFlWDvPJdQxMT1aSRur3a0EkU/6cfbAC5isV67tKDWUrPauyaHNpB+wN1ebM4A9jn/f4gH+3iHSYSQ==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/fetch-engine": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.0.tgz", - "integrity": "sha512-OOx2Lda0DGrZ1rodADT06ZGqHzr7HY7LNMaFE2Vp8dp146uJld58sRuasdX0OiwpHgl8SqDTUKHNUyzEq7pDdQ==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.0", - "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", - "@prisma/get-platform": "6.19.0" - } - }, - "node_modules/@prisma/get-platform": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.0.tgz", - "integrity": "sha512-ym85WDO2yDhC3fIXHWYpG3kVMBA49cL1XD2GCsCF8xbwoy2OkDQY44gEbAt2X46IQ4Apq9H6g0Ex1iFfPqEkHA==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.34.47", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.47.tgz", - "integrity": "sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, - "node_modules/@smithy/abort-controller": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", - "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", - "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", - "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-base64": "^4.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", - "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.22.0.tgz", - "integrity": "sha512-6vjCHD6vaY8KubeNw2Fg3EK0KLGQYdldG4fYgQmA0xSW0dJ8G2xFhSOdrlUakWVoP5JuWHtFODg3PNd/DN3FDA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^4.2.9", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.10", - "@smithy/util-utf8": "^4.2.0", - "@smithy/uuid": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", - "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.8.tgz", - "integrity": "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.12.0", - "@smithy/util-hex-encoding": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.8.tgz", - "integrity": "sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.8.tgz", - "integrity": "sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.8.tgz", - "integrity": "sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.8.tgz", - "integrity": "sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-codec": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", - "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.8", - "@smithy/querystring-builder": "^4.2.8", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-blob-browser": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.9.tgz", - "integrity": "sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/chunked-blob-reader": "^5.2.0", - "@smithy/chunked-blob-reader-native": "^4.2.1", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-node": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", - "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-stream-node": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.8.tgz", - "integrity": "sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", - "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", - "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/md5-js": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.8.tgz", - "integrity": "sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", - "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.12.tgz", - "integrity": "sha512-9JMKHVJtW9RysTNjcBZQHDwB0p3iTP6B1IfQV4m+uCevkVd/VuLgwfqk5cnI4RHcp4cPwoIvxQqN4B1sxeHo8Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.22.0", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-middleware": "^4.2.8", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "4.4.29", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.29.tgz", - "integrity": "sha512-bmTn75a4tmKRkC5w61yYQLb3DmxNzB8qSVu9SbTYqW6GAL0WXO2bDZuMAn/GJSbOdHEdjZvWxe+9Kk015bw6Cg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/service-error-classification": "^4.2.8", - "@smithy/smithy-client": "^4.11.1", - "@smithy/types": "^4.12.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/uuid": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", - "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", - "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", - "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", - "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/querystring-builder": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", - "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", - "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", - "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "@smithy/util-uri-escape": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", - "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", - "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", - "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.8.tgz", - "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-uri-escape": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.11.1.tgz", - "integrity": "sha512-SERgNg5Z1U+jfR6/2xPYjSEHY1t3pyTHC/Ma3YQl6qWtmiL42bvNId3W/oMUWIwu7ekL2FMPdqAmwbQegM7HeQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.22.0", - "@smithy/middleware-endpoint": "^4.4.12", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-stream": "^4.5.10", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", - "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", - "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-base64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", - "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", - "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", - "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", - "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", - "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.28", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.28.tgz", - "integrity": "sha512-/9zcatsCao9h6g18p/9vH9NIi5PSqhCkxQ/tb7pMgRFnqYp9XUOyOlGPDMHzr8n5ih6yYgwJEY2MLEobUgi47w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.8", - "@smithy/smithy-client": "^4.11.1", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.31", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.31.tgz", - "integrity": "sha512-JTvoApUXA5kbpceI2vuqQzRjeTbLpx1eoa5R/YEZbTgtxvIB7AQZxFJ0SEyfCpgPCyVV9IT7we+ytSeIB3CyWA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^4.4.6", - "@smithy/credential-provider-imds": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/smithy-client": "^4.11.1", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", - "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", - "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", - "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", - "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/service-error-classification": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "4.5.10", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", - "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/node-http-handler": "^4.4.8", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", - "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", - "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.8.tgz", - "integrity": "sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.8", - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/uuid": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", - "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/bcrypt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-6.0.0.tgz", - "integrity": "sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cookie-parser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.10.tgz", - "integrity": "sha512-B4xqkqfZ8Wek+rCOeRxsjMS9OgvzebEzzLYw7NHYuvzb7IdxOkI0ZHGgeEBX4PUM7QGVvNSK60T3OvWj3YfBRg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/cookiejar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", - "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", - "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^30.0.0", - "pretty-format": "^30.0.0" - } - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", - "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*", - "@types/node": "*" - } - }, - "node_modules/@types/methods": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mocha": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", - "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/multer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.0.0.tgz", - "integrity": "sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/superagent": { - "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", - "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/cookiejar": "^2.1.5", - "@types/methods": "^1.1.4", - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/supertest": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", - "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/methods": "^1.1.4", - "@types/superagent": "^8.1.0" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "license": "MIT" - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-jest": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", - "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "30.2.0", - "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.1", - "babel-preset-jest": "30.2.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", - "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", - "dev": true, - "license": "BSD-3-Clause", - "workspaces": [ - "test/babel-8" - ], - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", - "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/babel__core": "^7.20.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", - "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "30.2.0", - "babel-preset-current-node-syntax": "^1.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-beta.1" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.17", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", - "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/bcrypt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", - "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/body-parser/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/bowser": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", - "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/c12": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", - "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.3", - "confbox": "^0.2.2", - "defu": "^6.1.4", - "dotenv": "^16.6.1", - "exsolve": "^1.0.7", - "giget": "^2.0.0", - "jiti": "^2.4.2", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^2.2.0", - "rc9": "^2.1.2" - }, - "peerDependencies": { - "magicast": "^0.3.5" - }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } - } - }, - "node_modules/c12/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/c12/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001765", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz", - "integrity": "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/citty": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "consola": "^3.2.3" - } - }, - "node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-parser": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", - "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", - "license": "MIT", - "dependencies": { - "cookie": "0.7.2", - "cookie-signature": "1.0.6" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deepmerge-ts": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", - "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-cli": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-11.0.0.tgz", - "integrity": "sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.6", - "dotenv": "^17.1.0", - "dotenv-expand": "^12.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "dotenv": "cli.js" - } - }, - "node_modules/dotenv-cli/node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.3.tgz", - "integrity": "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==", - "license": "BSD-2-Clause", - "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/effect": { - "version": "3.18.4", - "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", - "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "fast-check": "^3.23.1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/empathic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", - "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/engine.io": { - "version": "6.6.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.5.tgz", - "integrity": "sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==", - "license": "MIT", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.4.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.18.3" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/exit-x": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "30.2.0", - "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-list-endpoints": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/express-list-endpoints/-/express-list-endpoints-7.1.1.tgz", - "integrity": "sha512-SA6YHH1r6DrioJ4fFJNqiwu1FweGFqJZO9KBApMzwPosoSGPOX2AW0wiMepOXjojjEXDuP9whIvckomheErbJA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/express/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/express/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/exsolve": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", - "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/fast-check": { - "version": "3.23.2", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", - "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", - "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT", - "dependencies": { - "pure-rand": "^6.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formidable": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", - "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@paralleldrive/cuid2": "^2.2.2", - "dezalgo": "^1.0.4", - "once": "^1.4.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", - "license": "ISC" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/giget": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", - "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.6", - "nypm": "^0.6.0", - "pathe": "^2.0.3" - }, - "bin": { - "giget": "dist/cli.mjs" - } - }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true, - "license": "ISC" - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-uuid": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-uuid/-/is-uuid-1.0.2.tgz", - "integrity": "sha512-tCByphFcJgf2qmiMo5hMCgNAquNSagOetVetDvBXswGkNfoyEMvGH1yDlF8cbZbKnbVBr4Y5/rlpMz9umxyBkQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", - "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "30.2.0", - "@jest/types": "30.2.0", - "import-local": "^3.2.0", - "jest-cli": "30.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", - "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.1.1", - "jest-util": "30.2.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-circus": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", - "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.2.0", - "@jest/expect": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "co": "^4.6.0", - "dedent": "^1.6.0", - "is-generator-fn": "^2.1.0", - "jest-each": "30.2.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-runtime": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "p-limit": "^3.1.0", - "pretty-format": "30.2.0", - "pure-rand": "^7.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-circus/node_modules/pure-rand": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", - "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/jest-cli": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", - "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", - "chalk": "^4.1.2", - "exit-x": "^0.2.2", - "import-local": "^3.2.0", - "jest-config": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "yargs": "^17.7.2" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", - "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/get-type": "30.1.0", - "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.2.0", - "@jest/types": "30.2.0", - "babel-jest": "30.2.0", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "deepmerge": "^4.3.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "jest-circus": "30.2.0", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-runner": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "micromatch": "^4.0.8", - "parse-json": "^5.2.0", - "pretty-format": "30.2.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "esbuild-register": ">=3.4.0", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "esbuild-register": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", - "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-each": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", - "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.2.0", - "chalk": "^4.1.2", - "jest-util": "30.2.0", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", - "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.2.0", - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "jest-mock": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", - "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "anymatch": "^3.1.3", - "fb-watchman": "^2.0.2", - "graceful-fs": "^4.2.11", - "jest-regex-util": "30.0.1", - "jest-util": "30.2.0", - "jest-worker": "30.2.0", - "micromatch": "^4.0.8", - "walker": "^1.0.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.3" - } - }, - "node_modules/jest-leak-detector": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", - "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", - "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "jest-diff": "30.2.0", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", - "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.2.0", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-mock": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", - "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "jest-util": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", - "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", - "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "slash": "^3.0.0", - "unrs-resolver": "^1.7.11" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", - "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "30.0.1", - "jest-snapshot": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runner": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", - "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.2.0", - "@jest/environment": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.2.0", - "jest-haste-map": "30.2.0", - "jest-leak-detector": "30.2.0", - "jest-message-util": "30.2.0", - "jest-resolve": "30.2.0", - "jest-runtime": "30.2.0", - "jest-util": "30.2.0", - "jest-watcher": "30.2.0", - "jest-worker": "30.2.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", - "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.2.0", - "@jest/fake-timers": "30.2.0", - "@jest/globals": "30.2.0", - "@jest/source-map": "30.0.1", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "cjs-module-lexer": "^2.1.0", - "collect-v8-coverage": "^1.0.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", - "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@babel/generator": "^7.27.5", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.2.0", - "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "babel-preset-current-node-syntax": "^1.2.0", - "chalk": "^4.1.2", - "expect": "30.2.0", - "graceful-fs": "^4.2.11", - "jest-diff": "30.2.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "pretty-format": "30.2.0", - "semver": "^7.7.2", - "synckit": "^0.11.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", - "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-validate": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", - "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.2.0", - "camelcase": "^6.3.0", - "chalk": "^4.1.2", - "leven": "^3.1.0", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", - "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "jest-util": "30.2.0", - "string-length": "^4.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-worker": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", - "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.2.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "devOptional": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "license": "MIT", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", - "license": "MIT", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.6.0", - "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">= 10.16.0" - } - }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nodemon": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", - "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nypm": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", - "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.2", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "tinyexec": "^1.0.1" - }, - "bin": { - "nypm": "dist/cli.mjs" - }, - "engines": { - "node": "^14.16.0 || >=16.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prisma": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.0.tgz", - "integrity": "sha512-F3eX7K+tWpkbhl3l4+VkFtrwJlLXbAM+f9jolgoUZbFcm1DgHZ4cq9AgVEgUym2au5Ad/TDLN8lg83D+M10ycw==", - "devOptional": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/config": "6.19.0", - "@prisma/engines": "6.19.0" - }, - "bin": { - "prisma": "build/index.js" - }, - "engines": { - "node": ">=18.18" - }, - "peerDependencies": { - "typescript": ">=5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "defu": "^6.1.4", - "destr": "^2.0.3" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/send/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/socket.io": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", - "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.4.1", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", - "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", - "license": "MIT", - "dependencies": { - "debug": "~4.4.1", - "ws": "~8.18.3" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz", - "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", - "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/superagent": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", - "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "component-emitter": "^1.3.1", - "cookiejar": "^2.1.4", - "debug": "^4.3.7", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.5", - "formidable": "^3.5.4", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.14.1" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/superstruct": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", - "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/supertest": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz", - "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cookie-signature": "^1.2.2", - "methods": "^1.1.2", - "superagent": "^10.3.0" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/supertest/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/synckit": { - "version": "0.11.12", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", - "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.9" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "license": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/ts-jest": { - "version": "29.4.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", - "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "^0.2.6", - "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.7.3", - "type-fest": "^4.41.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0 || ^30.0.0", - "@jest/types": "^29.0.0 || ^30.0.0", - "babel-jest": "^29.0.0 || ^30.0.0", - "jest": "^29.0.0 || ^30.0.0", - "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jest-util": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/mission9-10/package.json b/mission9-10/package.json deleted file mode 100644 index 435f38267..000000000 --- a/mission9-10/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "sprint-mission", - "version": "1.0.0", - "description": "", - "keywords": [], - "license": "ISC", - "author": "", - "main": "src/main.js", - "scripts": { - "dev": "nodemon --watch src --exec ts-node src/main.ts", - "build": "tsc -p tsconfig.build.json", - "start": "node dist/main.js", - "test": "dotenv -e .env.test -- npm run prisma:migrate && dotenv -e .env.test -- jest --runInBand", - "test:coverage": "jest --coverage", - "prisma:generate": "prisma generate", - "prisma:migrate": "prisma migrate dev", - "prisma:seed": "ts-node prisma/seed.ts" - }, - "dependencies": { - "@aws-sdk/client-s3": "^3.975.0", - "@prisma/client": "^6.19.0", - "bcrypt": "^6.0.0", - "cookie-parser": "^1.4.7", - "cors": "^2.8.5", - "dotenv": "^16.6.1", - "dotenv-cli": "^11.0.0", - "express": "^5.2.1", - "fs": "^0.0.1-security", - "is-uuid": "^1.0.2", - "jsonwebtoken": "^9.0.2", - "multer": "^2.0.2", - "socket.io": "^4.8.3", - "superstruct": "^2.0.2", - "tslib": "^2.8.1", - "uuid": "^13.0.0" - }, - "devDependencies": { - "@types/bcrypt": "^6.0.0", - "@types/cookie-parser": "^1.4.10", - "@types/cors": "^2.8.19", - "@types/express": "^5.0.6", - "@types/jest": "^30.0.0", - "@types/jsonwebtoken": "^9.0.10", - "@types/mocha": "^10.0.10", - "@types/multer": "^2.0.0", - "@types/node": "^24.10.1", - "@types/supertest": "^6.0.3", - "express-list-endpoints": "^7.1.1", - "jest": "^30.2.0", - "nodemon": "^3.1.11", - "prisma": "^6.19.0", - "supertest": "^7.2.2", - "ts-jest": "^29.4.6", - "ts-node": "^10.9.2", - "typescript": "^5.9.3" - }, - "prisma": { - "schema": "prisma/schema.prisma" - } -} diff --git a/mission9-10/prisma/migrations/20260119073239_add_notification/migration.sql b/mission9-10/prisma/migrations/20260119073239_add_notification/migration.sql deleted file mode 100644 index fc7d680ba..000000000 --- a/mission9-10/prisma/migrations/20260119073239_add_notification/migration.sql +++ /dev/null @@ -1,114 +0,0 @@ --- CreateTable -CREATE TABLE "Article" ( - "id" SERIAL NOT NULL, - "title" TEXT NOT NULL, - "content" TEXT NOT NULL, - "image" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "userId" INTEGER NOT NULL, - - CONSTRAINT "Article_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Product" ( - "id" SERIAL NOT NULL, - "name" TEXT NOT NULL, - "description" TEXT NOT NULL, - "price" INTEGER NOT NULL, - "tags" TEXT[], - "images" TEXT[], - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "userId" INTEGER NOT NULL, - - CONSTRAINT "Product_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Comment" ( - "id" SERIAL NOT NULL, - "content" TEXT NOT NULL, - "productId" INTEGER, - "articleId" INTEGER, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - "userId" INTEGER NOT NULL, - - CONSTRAINT "Comment_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "User" ( - "id" SERIAL NOT NULL, - "email" TEXT NOT NULL, - "nickname" TEXT NOT NULL, - "image" TEXT, - "password" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "User_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Like" ( - "id" SERIAL NOT NULL, - "userId" INTEGER NOT NULL, - "productId" INTEGER, - "articleId" INTEGER, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Like_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Notification" ( - "id" SERIAL NOT NULL, - "userId" INTEGER NOT NULL, - "message" TEXT NOT NULL, - "isRead" BOOLEAN NOT NULL DEFAULT false, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Notification_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); - --- CreateIndex -CREATE UNIQUE INDEX "User_nickname_key" ON "User"("nickname"); - --- CreateIndex -CREATE UNIQUE INDEX "Like_userId_productId_key" ON "Like"("userId", "productId"); - --- CreateIndex -CREATE UNIQUE INDEX "Like_userId_articleId_key" ON "Like"("userId", "articleId"); - --- AddForeignKey -ALTER TABLE "Article" ADD CONSTRAINT "Article_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Product" ADD CONSTRAINT "Product_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Comment" ADD CONSTRAINT "Comment_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Comment" ADD CONSTRAINT "Comment_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Comment" ADD CONSTRAINT "Comment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Like" ADD CONSTRAINT "Like_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Like" ADD CONSTRAINT "Like_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Like" ADD CONSTRAINT "Like_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/mission9-10/prisma/migrations/migration_lock.toml b/mission9-10/prisma/migrations/migration_lock.toml deleted file mode 100644 index 044d57cdb..000000000 --- a/mission9-10/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (e.g., Git) -provider = "postgresql" diff --git a/mission9-10/prisma/schema.prisma b/mission9-10/prisma/schema.prisma deleted file mode 100644 index f78c7da69..000000000 --- a/mission9-10/prisma/schema.prisma +++ /dev/null @@ -1,93 +0,0 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - -// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? -// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init - -generator client { - provider = "prisma-client-js" -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -model Article { - id Int @id @default(autoincrement()) - title String - content String - image String? - articleComment Comment[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - user User @relation(fields: [userId], references: [id]) - userId Int - likes Like[] -} - -model Product { - id Int @id @default(autoincrement()) - name String - description String - price Int - tags String[] - images String[] - productComment Comment[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - user User @relation(fields: [userId], references: [id]) - userId Int - likes Like[] -} - -model Comment { - id Int @id @default(autoincrement()) - content String - product Product? @relation(fields: [productId], references: [id], onDelete: Cascade) - productId Int? - article Article? @relation(fields: [articleId], references: [id], onDelete: Cascade) - articleId Int? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - user User @relation(fields: [userId], references: [id]) - userId Int -} - -model User { - id Int @id @default(autoincrement()) - email String @unique - nickname String @unique - image String? - password String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - products Product[] - articles Article[] - comments Comment[] - likes Like[] - notifications Notification[] -} - -model Like { - id Int @id @default(autoincrement()) - user User @relation(fields: [userId], references: [id]) - userId Int - product Product? @relation(fields: [productId], references: [id], onDelete: Cascade) - productId Int? - article Article? @relation(fields: [articleId], references: [id], onDelete: Cascade) - articleId Int? - createdAt DateTime @default(now()) - - @@unique([userId, productId]) - @@unique([userId, articleId]) -} - -model Notification { - id Int @id @default(autoincrement()) - userId Int - user User @relation(fields: [userId], references: [id]) - message String - isRead Boolean @default(false) - createdAt DateTime @default(now()) -} diff --git a/mission9-10/public/.gitkeep b/mission9-10/public/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/mission9-10/public/4f3edda9-25e4-462b-b18b-a45bb5f789ca.png b/mission9-10/public/4f3edda9-25e4-462b-b18b-a45bb5f789ca.png deleted file mode 100644 index 35a7b5616a6b18773cb64d62627874b0bde02271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6066 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 - - - - - Document - - -

Socket.IO client test

-
- - -
- - - - - diff --git a/mission9-10/readme.md b/mission9-10/readme.md deleted file mode 100644 index 886574b32..000000000 --- a/mission9-10/readme.md +++ /dev/null @@ -1,163 +0,0 @@ -# 스프린트 미션5 - -- 미션8 소켓io를 활용한 알림 api 기능 개발 - -## 추가된 주요 기능 - -- 자신의 알림 목록 조회 -- 자신이 읽지 않은 알림 개수 조회 -- 자신의 알림 읽음 처리 -- 클라이언트 실시간 알림 기능 -- 좋아요한 상품의 가격 변동 알림 -- 자신이 작성한 게시글의 댓글 알림 - -## ERD 다이어그램 - -```mermaid -erDiagram - USER { - Int id PK - String email "UNIQUE" - String nickname "UNIQUE" - String image "nullable" - String password - DateTime createdAt - DateTime updatedAt - } - - ARTICLE { - Int id PK - String title - String content - String image "nullable" - DateTime createdAt - DateTime updatedAt - Int userId FK - } - - PRODUCT { - Int id PK - String name - String description - Int price - String[] tags - String[] images - DateTime createdAt - DateTime updatedAt - Int userId FK - } - - COMMENT { - Int id PK - String content - Int productId FK "nullable" - Int articleId FK "nullable" - DateTime createdAt - DateTime updatedAt - Int userId FK - } - - LIKE { - Int id PK - Int userId FK - Int productId FK "nullable" - Int articleId FK "nullable" - DateTime createdAt - } - - NOTIFICATION { - Int id PK - Int userId FK - String message - Boolean isRead - DateTime createdAt - } - - USER ||--o{ ARTICLE : writes - USER ||--o{ PRODUCT : sells - USER ||--o{ COMMENT : writes - USER ||--o{ LIKE : creates - USER ||--o{ NOTIFICATION : receives - - ARTICLE ||--o{ COMMENT : has - PRODUCT ||--o{ COMMENT : has - - ARTICLE ||--o{ LIKE : likedBy - PRODUCT ||--o{ LIKE : likedBy - -``` - -- 한 유저는 같은 Product/Article 에 한 번만 좋아요를 누를 수 있습니다. (unique 제약) - -## 프로젝트 구조 - -``` -mission8 -├── prisma -│ ├── migrations -│ └── schema.prisma -├── public -│ └──socket-client-test.html -├── src -│ ├── controllers -│ │ ├── articlesController.ts -│ │ ├── commentsController.ts -│ │ ├── errorController.ts -│ │ ├── imagesController.ts -│ │ ├── notificationController.ts -│ │ ├── productsController.ts -│ │ └── usersController.ts -│ │ -│ ├── lib -│ │ ├── errors -│ │ │ ├── customErrors.ts -│ │ │ └── errorUtils.ts -│ │ ├── constants.ts -│ │ ├── cookies.ts -│ │ ├── prismaClient.ts -│ │ ├── token.ts -│ │ └── withAsync.ts -│ │ -│ ├── middlewares -│ │ └── authenticate.ts -│ │ -│ ├── repositories -│ │ ├── articleRepository.ts -│ │ ├── commentRepository.ts -│ │ ├── likeRepository.ts -│ │ ├── notificationRepository.ts -│ │ ├── productRepository.ts -│ │ └── userRepository.ts -│ │ -│ ├── routers -│ │ ├── articlesRouter.ts -│ │ ├── commentsRouter.ts -│ │ ├── imagesRouter.ts -│ │ ├── notificationRepository.ts -│ │ ├── productsRouter.ts -│ │ └── usersRouter.ts -│ │ -│ ├── services -│ │ ├── articleService.ts -│ │ ├── commentService.ts -│ │ ├── imageService.ts -│ │ ├── notificationService.ts -│ │ ├── productService.ts -│ │ └── userService.ts -│ │ -│ ├── structs -│ │ ├── articlesStructs.ts -│ │ ├── commentsStructs.ts -│ │ ├── commonStructs.ts -│ │ ├── productsStructs.ts -│ │ └── usersStructs.ts -│ │ -│ ├── socket.ts -│ └── main.ts -│ -├── tests -├── types -├── package.json -├── package-lock.json -└── readme.md -``` diff --git a/mission9-10/src/app.ts b/mission9-10/src/app.ts deleted file mode 100644 index 740e4bc17..000000000 --- a/mission9-10/src/app.ts +++ /dev/null @@ -1,30 +0,0 @@ -import express from 'express'; -import cors from 'cors'; -import articlesRouter from './routers/articlesRouter'; -import productsRouter from './routers/productsRouter'; -import commentsRouter from './routers/commentsRouter'; -import imagesRouter from './routers/imagesRouter'; -import usersRouter from './routers/usersRouter'; -import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController'; -import cookieParser from 'cookie-parser'; -import notificationRouter from './routers/notificationRouter'; -import { setupStatic } from './lib/setupStatic'; - -const app = express(); - -app.use(cors()); -app.use(cookieParser()); -app.use(express.json()); -setupStatic(app); - -app.use('/articles', articlesRouter); -app.use('/products', productsRouter); -app.use('/comments', commentsRouter); -app.use('/images', imagesRouter); -app.use('/users', usersRouter); -app.use('/notifications', notificationRouter); - -app.use(defaultNotFoundHandler); -app.use(globalErrorHandler); - -export default app; diff --git a/mission9-10/src/controllers/articlesController.ts b/mission9-10/src/controllers/articlesController.ts deleted file mode 100644 index 688e97352..000000000 --- a/mission9-10/src/controllers/articlesController.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { create } from 'superstruct'; -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { IdParamsStruct } from '../structs/commonStructs'; -import { - CreateArticleBodyStruct, - UpdateArticleBodyStruct, - GetArticleListParamsStruct, -} from '../structs/articlesStructs'; -import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct'; -import { Request, Response } from 'express'; -import { articleService } from '../services/articleService'; - -//게시물 생성 -export async function createArticle(req: Request, res: Response) { - const { title, content, image } = create(req.body, CreateArticleBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const article = await articleService.createArticle(user.id, title, content, image); - return res.status(201).send(article); -} -// 게시글 조회(좋아요 포함) -export async function getArticle(req: Request, res: Response) { - const { id } = create(req.params, IdParamsStruct); - const user = req.user; - const article = await articleService.getArticle(id, user?.id); - return res.send(article); -} -//게시물 수정 -export async function updateArticle(req: Request, res: Response) { - const { id } = create(req.params, IdParamsStruct); - const data = create(req.body, UpdateArticleBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const updated = await articleService.updateArticle(id, user.id, data); - return res.send(updated); -} -//게시물 삭제 -export async function deleteArticle(req: Request, res: Response) { - const { id } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - await articleService.deleteArticle(id, user.id); - return res.status(204).send(); -} - -//게시글 목록 조회(좋아요 포함) -export async function getArticleList(req: Request, res: Response) { - const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct); - const user = req.user; - const articles = await articleService.getArticleList(page, pageSize, orderBy, keyword, user?.id); - return res.send(articles); -} -//댓글 등록 -export async function createComment(req: Request, res: Response) { - const { id: articleId } = create(req.params, IdParamsStruct); - const { content } = create(req.body, CreateCommentBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const comment = await articleService.createComment(user.id, articleId, content); - return res.status(201).send(comment); -} -//댓글 목록 조회 -export async function getCommentList(req: Request, res: Response) { - const { id: articleId } = create(req.params, IdParamsStruct); - const { cursor, limit } = create(req.query, GetCommentListParamsStruct); - const commnetsList = await articleService.getCommentList(articleId, limit, cursor); - return res.send(commnetsList); -} -//게시글 좋아요 등록 -export async function likeArticle(req: Request, res: Response) { - const { id: articleId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const articleLike = await articleService.likeArticle(user.id, articleId); - return res.status(200).send(articleLike); -} - -//게시글 좋아요 취소 -export async function unlikeArticle(req: Request, res: Response) { - const { id: articleId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const articleUnlike = await articleService.unlikeArticle(user.id, articleId); - return res.status(200).send(articleUnlike); -} diff --git a/mission9-10/src/controllers/commentsController.ts b/mission9-10/src/controllers/commentsController.ts deleted file mode 100644 index ad89524bc..000000000 --- a/mission9-10/src/controllers/commentsController.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { create } from 'superstruct'; -import { UpdateCommentBodyStruct } from '../structs/commentsStruct'; -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { IdParamsStruct } from '../structs/commonStructs'; -import { Request, Response } from 'express'; -import { commnetService } from '../services/commentService'; - -//댓글 수정 -export async function updateComment(req: Request, res: Response) { - const { id: commentId } = create(req.params, IdParamsStruct); - const { content } = create(req.body, UpdateCommentBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const updatedComment = await commnetService.updateComment(commentId, user.id, content); - return res.send(updatedComment); -} - -//댓글 삭제 -export async function deleteComment(req: Request, res: Response) { - const { id: commentId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - await commnetService.deleteComment(commentId, user.id); - return res.status(204).send(); -} diff --git a/mission9-10/src/controllers/errorController.ts b/mission9-10/src/controllers/errorController.ts deleted file mode 100644 index 0ebb1e34a..000000000 --- a/mission9-10/src/controllers/errorController.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { StructError } from 'superstruct'; -import { - NotFoundError, - BadRequestError, - ForbiddenError, - UnauthorizedError, -} from '../lib/errors/customErrors'; -import { Prisma } from '@prisma/client'; -import { Request, Response, NextFunction } from 'express'; -import { isSyntaxJsonError } from '../lib/errors/errorUtils'; - -//404 처리 미들웨어 -export function defaultNotFoundHandler(req: Request, res: Response, next: NextFunction) { - return res.status(404).send({ message: '존재하지 않습니다' }); -} -//전역 에러 처리 미들웨어(400,401,403,404,500) -export function globalErrorHandler(err: unknown, req: Request, res: Response, next: NextFunction) { - if (err instanceof StructError || err instanceof BadRequestError) { - return res.status(400).send({ message: '잘못된 요청입니다' }); - } - if (isSyntaxJsonError(err)) { - return res.status(400).send({ message: '잘못된 요청입니다' }); - } - if (err instanceof UnauthorizedError) { - return res.status(401).json({ message: err.message }); - } - if (err instanceof ForbiddenError) { - return res.status(403).json({ message: err.message }); - } - if (err instanceof NotFoundError) { - return res.status(404).send({ message: err.message }); - } - //프리즈마 코드 에러, 그 외 known 에러 500처리 - if (err instanceof Prisma.PrismaClientKnownRequestError) { - if (err.code === 'P2025') { - return res.status(404).json({ message: '존재하지 않습니다' }); - } - if (err.code === 'P2002') { - return res.status(400).json({ message: '잘못된 요청입니다' }); - } - return res.status(500).json({ message: '데이터 처리 중 오류가 발생했습니다' }); - } - - console.error(err); - return res.status(500).send({ message: '데이터 처리 중 오류가 발생했습니다' }); -} diff --git a/mission9-10/src/controllers/imagesController.ts b/mission9-10/src/controllers/imagesController.ts deleted file mode 100644 index b34821e61..000000000 --- a/mission9-10/src/controllers/imagesController.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Request, Response } from 'express'; -import { imageService } from '../services/imageService'; - -export async function uploadImage(req: Request, res: Response) { - const response = await imageService.buildImageUrl(req); - return res.send(response); -} diff --git a/mission9-10/src/controllers/notificationController.ts b/mission9-10/src/controllers/notificationController.ts deleted file mode 100644 index 18917a816..000000000 --- a/mission9-10/src/controllers/notificationController.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Request, Response } from 'express'; -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { notificationService } from '../services/notificationService'; -import { IdParamsStruct } from '../structs/commonStructs'; -import { create } from 'superstruct'; - -export async function getNotifications(req: Request, res: Response) { - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const notifications = await notificationService.getNotifications(user.id); - return res.send(notifications); -} - -export async function getUnreadCount(req: Request, res: Response) { - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const count = await notificationService.getUnreadCount(user.id); - return res.send({ count }); -} - -export async function markAsRead(req: Request, res: Response) { - const { id: notificationId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const notification = await notificationService.markAsRead(notificationId, user.id); - return res.send(notification); -} diff --git a/mission9-10/src/controllers/productsController.ts b/mission9-10/src/controllers/productsController.ts deleted file mode 100644 index de9f9f6da..000000000 --- a/mission9-10/src/controllers/productsController.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { create } from 'superstruct'; -import { IdParamsStruct } from '../structs/commonStructs'; -import { - CreateProductBodyStruct, - GetProductListParamsStruct, - UpdateProductBodyStruct, -} from '../structs/productsStruct'; -import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct'; -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { Request, Response } from 'express'; -import { productService } from '../services/productService'; - -//상품 등록 -export async function createProduct(req: Request, res: Response) { - const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const product = await productService.createProduct({ - name, - description, - price, - tags, - images, - userId: user.id, - }); - return res.status(201).send(product); -} -//특정 상품 조회(좋아요 포함) -export async function getProduct(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const user = req.user; - const product = await productService.getProduct(productId, user?.id); - return res.send(product); -} -//상품 수정 -export async function updateProduct(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const data = create(req.body, UpdateProductBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const updatedProduct = await productService.updateProduct(productId, user.id, data); - return res.send(updatedProduct); -} -//상품 삭제 -export async function deleteProduct(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - await productService.deleteProduct(productId, user.id); - return res.status(204).send(); -} -//상품 목록 조회(좋아요 포함) -export async function getProductList(req: Request, res: Response) { - const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct); - const user = req.user; - const products = await productService.getProductList(page, pageSize, orderBy, keyword, user?.id); - return res.send(products); -} - -//댓글 등록 -export async function createComment(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const { content } = create(req.body, CreateCommentBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const comment = await productService.createComment(user.id, productId, content); - return res.status(201).send(comment); -} -//상품 댓글 목록 조회 -export async function getCommentList(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const { cursor, limit } = create(req.query, GetCommentListParamsStruct); - const commentList = await productService.getCommentList(productId, limit, cursor); - return res.send(commentList); -} -//상품 좋아요 등록 -export async function likeProduct(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const productLike = await productService.likeProduct(user.id, productId); - return res.status(200).send(productLike); -} -//상품 좋아요 취소 -export async function unlikeProduct(req: Request, res: Response) { - const { id: productId } = create(req.params, IdParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const productUnliked = await productService.unlikeProduct(user.id, productId); - return res.send(productUnliked); -} diff --git a/mission9-10/src/controllers/usersController.ts b/mission9-10/src/controllers/usersController.ts deleted file mode 100644 index fe8a9898b..000000000 --- a/mission9-10/src/controllers/usersController.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { - CreateUserBodyStruct, - UpdateUserBodyStruct, - LoginBodyStruct, - ChangePasswordBodyStruct, - GetMyProductListParamsStruct, - GetMyLikedProductListParamsStruct, -} from '../structs/usersStructs'; -import { create } from 'superstruct'; -import { clearTokenCookies, setTokenCookies } from '../lib/cookies'; -import { REFRESH_TOKEN_COOKIE_NAME } from '../lib/constants'; -import { Request, Response } from 'express'; -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { userService } from '../services/userService'; - -//회원가입 -export async function register(req: Request, res: Response) { - const { nickname, email, password, image } = create(req.body, CreateUserBodyStruct); - const user = await userService.register(nickname, email, password, image); - return res.status(201).send(user); -} -//로그인 -export async function login(req: Request, res: Response) { - const { email, password } = create(req.body, LoginBodyStruct); - const result = await userService.login(email, password); - setTokenCookies(res, result.tokens.accessToken, result.tokens.refreshToken); - return res.status(200).send({ message: result.message }); -} -//로그아웃 -export async function logout(req: Request, res: Response) { - clearTokenCookies(res); - return res.status(200).send({ message: '로그아웃에 성공했습니다.' }); -} -//내 프로필 조회 (최근 등록한 상품 5개, 최근 좋아요한 상품 5개 포함) -export async function getProfile(req: Request, res: Response) { - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const profile = await userService.getProfile(user.id); - return res.send(profile); -} -//내 프로필 수정 -export async function updateProfile(req: Request, res: Response) { - const { nickname, email, image } = create(req.body, UpdateUserBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const update = await userService.updateProfile(user.id, nickname, email, image); - return res.send(update); -} -//내 비밀번호 변경 -export async function patchPassword(req: Request, res: Response) { - const { currentPassword, newPassword } = create(req.body, ChangePasswordBodyStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - await userService.patchPassword(user.id, currentPassword, newPassword); - return res.status(200).send({ message: '비밀번호가 성공적으로 변경되었습니다.' }); -} -//내가 등록한 상품 목록 조회 (상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능) -export async function getMyProductList(req: Request, res: Response) { - const { page, pageSize, orderBy, keyword } = create(req.query, GetMyProductListParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const myProducts = await userService.getMyProductList(user.id, page, pageSize, orderBy, keyword); - return res.send(myProducts); -} -//토큰 갱신(리프레시) -export async function refreshToken(req: Request, res: Response) { - const refreshToken = req.cookies[REFRESH_TOKEN_COOKIE_NAME]; - if (!refreshToken) { - throw new UnauthorizedError('리프레시 토큰이 없습니다.'); - } - const tokens = await userService.refreshToken(refreshToken); - setTokenCookies(res, tokens.accessToken, tokens.refreshToken); - return res.status(200).send({ message: '토큰이 성공적으로 갱신되었습니다.' }); -} -//내가 좋아요한 상품 목록 조회(상품이 꽤 많이 있을 경우 페이징 처리) -export async function getMyLikedProducts(req: Request, res: Response) { - const { page, pageSize, orderBy } = create(req.query, GetMyLikedProductListParamsStruct); - const user = req.user; - if (!user) { - throw new UnauthorizedError(); - } - const myLikedProducts = await userService.getMyLikedProducts(user.id, page, pageSize, orderBy); - return res.send(myLikedProducts); -} diff --git a/mission9-10/src/lib/constants.ts b/mission9-10/src/lib/constants.ts deleted file mode 100644 index 51abd9949..000000000 --- a/mission9-10/src/lib/constants.ts +++ /dev/null @@ -1,26 +0,0 @@ -import dotenv from 'dotenv'; -dotenv.config(); - -const DATABASE_URL = process.env.DATABASE_URL; -const NODE_ENV = process.env.NODE_ENV || 'development'; -const PORT = process.env.PORT || 3000; -const PUBLIC_PATH = 'public'; -const STATIC_PATH = '/public'; -const JWT_ACCESS_TOKEN_SECRET = - process.env.JWT_ACCESS_TOKEN_SECRET || 'your_jwt_access_token_secret'; -const JWT_REFRESH_TOKEN_SECRET = - process.env.JWT_REFRESH_TOKEN_SECRET || 'your_jwt_refresh_token_secret'; -const ACCESS_TOKEN_COOKIE_NAME = 'access-token'; -const REFRESH_TOKEN_COOKIE_NAME = 'refresh-token'; - -export { - DATABASE_URL, - NODE_ENV, - PORT, - PUBLIC_PATH, - STATIC_PATH, - JWT_ACCESS_TOKEN_SECRET, - JWT_REFRESH_TOKEN_SECRET, - ACCESS_TOKEN_COOKIE_NAME, - REFRESH_TOKEN_COOKIE_NAME, -}; diff --git a/mission9-10/src/lib/cookies.ts b/mission9-10/src/lib/cookies.ts deleted file mode 100644 index 36311f1b2..000000000 --- a/mission9-10/src/lib/cookies.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { NODE_ENV, ACCESS_TOKEN_COOKIE_NAME, REFRESH_TOKEN_COOKIE_NAME } from './constants'; -import { Response } from 'express'; - -export function setTokenCookies(res: Response, accessToken: string, refreshToken: string) { - res.cookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, { - httpOnly: true, - secure: NODE_ENV === 'production', - maxAge: 1 * 60 * 60 * 1000, // 1시간 - }); - res.cookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken, { - httpOnly: true, - secure: NODE_ENV === 'production', - maxAge: 7 * 24 * 60 * 60 * 1000, // 7일 - path: '/users/refresh', - }); -} - -export function clearTokenCookies(res: Response) { - res.clearCookie(ACCESS_TOKEN_COOKIE_NAME, { - httpOnly: true, - secure: NODE_ENV === 'production', - }); - res.clearCookie(REFRESH_TOKEN_COOKIE_NAME, { - httpOnly: true, - secure: NODE_ENV === 'production', - path: '/users/refresh', - }); -} diff --git a/mission9-10/src/lib/errors/customErrors.ts b/mission9-10/src/lib/errors/customErrors.ts deleted file mode 100644 index 8bde3cfe8..000000000 --- a/mission9-10/src/lib/errors/customErrors.ts +++ /dev/null @@ -1,46 +0,0 @@ -export class BaseError extends Error { - statusCode: number; - constructor(message: string, statusCode: number) { - super(message); - this.name = new.target.name; - this.statusCode = statusCode; - } -} - -export class NotFoundError extends BaseError { - constructor(message = '존재하지 않습니다') { - super(message, 404); - } -} - -export class UnauthorizedError extends BaseError { - constructor(message = '인증이 필요합니다') { - super(message, 401); - } -} - -export class BadRequestError extends BaseError { - constructor(message = '잘못된 요청입니다') { - super(message, 400); - } -} - -export class ForbiddenError extends BaseError { - constructor(message = '비밀번호가 틀렸습니다') { - super(message, 403); - } -} - -export class AlreadyLikeError extends ForbiddenError { - constructor(message = '이미 좋아요를 눌렀습니다.') { - super(message); - this.name = new.target.name; - } -} - -export class AlreadyUnlikeError extends ForbiddenError { - constructor(message = '좋아요가 존재하지 않습니다.') { - super(message); - this.name = new.target.name; - } -} diff --git a/mission9-10/src/lib/errors/errorUtils.ts b/mission9-10/src/lib/errors/errorUtils.ts deleted file mode 100644 index 55c11df26..000000000 --- a/mission9-10/src/lib/errors/errorUtils.ts +++ /dev/null @@ -1,13 +0,0 @@ -interface SyntaxJsonError extends SyntaxError { - status?: number; - body?: unknown; -} - -export function isSyntaxJsonError(err: unknown): err is SyntaxJsonError { - if (!(err instanceof SyntaxError)) return false; - const e = err as Partial; - return typeof e.status === 'number' && 'body' in e; -} -// Partial; -// 얘는 SyntaxJsonError의 일부 프로퍼티만 가지고 있을 수도 있어” -// 라고 TS에게 알려서 e.status, e.body 같은 속성 접근을 가능하게 해주는 장치 diff --git a/mission9-10/src/lib/prismaClient.ts b/mission9-10/src/lib/prismaClient.ts deleted file mode 100644 index 9b6c4ce30..000000000 --- a/mission9-10/src/lib/prismaClient.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { PrismaClient } from '@prisma/client'; - -export const prisma = new PrismaClient(); diff --git a/mission9-10/src/lib/setupStatic.ts b/mission9-10/src/lib/setupStatic.ts deleted file mode 100644 index 06121ff65..000000000 --- a/mission9-10/src/lib/setupStatic.ts +++ /dev/null @@ -1,8 +0,0 @@ -import express from 'express'; -import path from 'path'; -import { PUBLIC_PATH, STATIC_PATH } from './constants'; - -export function setupStatic(app: express.Express) { - if (process.env.UPLOAD_PROVIDER === 's3') return; - app.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH))); -} diff --git a/mission9-10/src/lib/token.ts b/mission9-10/src/lib/token.ts deleted file mode 100644 index 0e16839c3..000000000 --- a/mission9-10/src/lib/token.ts +++ /dev/null @@ -1,22 +0,0 @@ -import jwt, { JwtPayload } from 'jsonwebtoken'; -import { JWT_ACCESS_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET } from './constants'; - -interface TokenPayload extends JwtPayload { - id: number; -} - -export function generateToken(userId: number) { - const accessToken = jwt.sign({ id: userId }, JWT_ACCESS_TOKEN_SECRET, { expiresIn: '1h' }); - const refreshToken = jwt.sign({ id: userId }, JWT_REFRESH_TOKEN_SECRET, { expiresIn: '1d' }); - return { accessToken, refreshToken }; -} - -export function verifyAccessToken(token: string) { - const decoded = jwt.verify(token, JWT_ACCESS_TOKEN_SECRET) as TokenPayload; - return { userId: decoded.id }; -} - -export function verifyRefreshToken(token: string) { - const decoded = jwt.verify(token, JWT_REFRESH_TOKEN_SECRET) as TokenPayload; - return { userId: decoded.id }; -} diff --git a/mission9-10/src/lib/withAsync.ts b/mission9-10/src/lib/withAsync.ts deleted file mode 100644 index 500839366..000000000 --- a/mission9-10/src/lib/withAsync.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { Request, Response, NextFunction, RequestHandler } from 'express'; - -export function withAsync( - handler: (req: Request, res: Response, next: NextFunction) => Promise, -): RequestHandler { - return async (req, res, next) => { - try { - await handler(req, res, next); - } catch (e) { - next(e); - } - }; -} diff --git a/mission9-10/src/main.ts b/mission9-10/src/main.ts deleted file mode 100644 index 8ed2dac0e..000000000 --- a/mission9-10/src/main.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { createServer } from 'http'; -import app from './app'; -import { PORT } from './lib/constants'; -import { initSocket } from './socket'; - -const server = createServer(app); - -initSocket(server); - -server.listen(PORT, () => { - console.log(`Server started on port ${PORT}`); -}); diff --git a/mission9-10/src/middlewares/authenticate.ts b/mission9-10/src/middlewares/authenticate.ts deleted file mode 100644 index 5c70effec..000000000 --- a/mission9-10/src/middlewares/authenticate.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { prisma } from '../lib/prismaClient'; -import { verifyAccessToken } from '../lib/token'; -import { ACCESS_TOKEN_COOKIE_NAME } from '../lib/constants'; -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { NextFunction, Request, Response } from 'express'; - -function authenticate(options = { optional: false }) { - return async (req: Request, res: Response, next: NextFunction) => { - const accessToken = req.cookies[ACCESS_TOKEN_COOKIE_NAME]; - if (!accessToken) { - if (options.optional) { - return next(); - } - return next(new UnauthorizedError()); - } - try { - const { userId } = verifyAccessToken(accessToken); //디코딩 된 토큰에서 user id 추출 - const user = await prisma.user.findUniqueOrThrow({ where: { id: userId } }); - req.user = user; - } catch (error) { - if (options.optional) { - return next(); - } - return next(new UnauthorizedError()); - } - next(); - }; -} - -export default authenticate; diff --git a/mission9-10/src/middlewares/upload.ts b/mission9-10/src/middlewares/upload.ts deleted file mode 100644 index c9f773f69..000000000 --- a/mission9-10/src/middlewares/upload.ts +++ /dev/null @@ -1,44 +0,0 @@ -import multer from 'multer'; -import path from 'path/win32'; -import { PUBLIC_PATH } from '../lib/constants'; -import { BadRequestError } from '../lib/errors/customErrors'; -import { v4 as uuidv4 } from 'uuid'; - -const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg']; -const FILE_SIZE_LIMIT = 5 * 1024 * 1024; -const uploadProvider = process.env.UPLOAD_PROVIDER ?? 'local'; - -function fileFilter(req: any, file: any, cb: any) { - if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) { - return cb(new BadRequestError('Only png, jpeg, and jpg are allowed')); - } - cb(null, true); -} - -function makeFilename(originalname: string) { - const ext = path.extname(originalname); - return `${uuidv4()}${ext}`; -} - -// local: 디스크 저장 -const localUpload = multer({ - storage: multer.diskStorage({ - destination(req, file, cb) { - cb(null, PUBLIC_PATH); - }, - filename(req, file, cb) { - cb(null, makeFilename(file.originalname)); - }, - }), - limits: { fileSize: FILE_SIZE_LIMIT }, - fileFilter, -}); - -// s3: memoryStorage (S3로 업로드는 서비스에서 처리) -const s3Upload = multer({ - storage: multer.memoryStorage(), - limits: { fileSize: FILE_SIZE_LIMIT }, - fileFilter, -}); - -export const upload = uploadProvider === 's3' ? s3Upload : localUpload; diff --git a/mission9-10/src/repositories/articleRepository.ts b/mission9-10/src/repositories/articleRepository.ts deleted file mode 100644 index 3505e0393..000000000 --- a/mission9-10/src/repositories/articleRepository.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Prisma } from '@prisma/client'; -import { prisma } from '../lib/prismaClient'; -import { ArticleLikesAndCount } from '../../types/article'; - -export class ArticleRepository { - async create(data: Prisma.ArticleCreateInput) { - return prisma.article.create({ data }); - } - async findById(id: number) { - return prisma.article.findUniqueOrThrow({ where: { id } }); - } - async findByIdWithLikes(id: number, userId?: number): Promise { - return prisma.article.findUniqueOrThrow({ - where: { id }, - include: { - _count: { select: { likes: true } }, - likes: { - //비로그인 시 -1을 줘서 []을 뱉도록 - where: { userId: userId ?? -1 }, - select: { id: true }, - }, - }, - }); - } - async findArticleListWithLikes(params: { - skip: number; - take: number; - orderBy: Prisma.ArticleOrderByWithRelationInput; - where: Prisma.ArticleWhereInput; - userId?: number; - }): Promise { - return prisma.article.findMany({ - skip: params.skip, - take: params.take, - orderBy: params.orderBy, - where: params.where, - include: { - _count: { select: { likes: true } }, - likes: { - where: { userId: params.userId ?? -1 }, - select: { id: true }, - }, - }, - }); - } - async count(where: Prisma.ArticleWhereInput) { - return prisma.article.count({ where }); - } - async update(id: number, data: Prisma.ArticleUpdateInput) { - return prisma.article.update({ where: { id }, data }); - } - async delete(id: number) { - return prisma.article.delete({ where: { id } }); - } -} - -export const articleRepo = new ArticleRepository(); diff --git a/mission9-10/src/repositories/commentRepository.ts b/mission9-10/src/repositories/commentRepository.ts deleted file mode 100644 index cc81be921..000000000 --- a/mission9-10/src/repositories/commentRepository.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Prisma } from '@prisma/client'; -import { prisma } from '../lib/prismaClient'; - -export class CommentRepository { - async create(data: Prisma.CommentCreateInput) { - return prisma.comment.create({ data }); - } - async findCommentListQuery( - whereCondition: { articleId: number } | { productId: number }, - limit: number, - cursor?: number, - ) { - return prisma.comment.findMany({ - cursor: cursor ? { id: cursor } : undefined, - take: limit + 1, - where: whereCondition, - orderBy: { createdAt: 'desc' }, - }); - } - async findById(id: number) { - return prisma.comment.findUniqueOrThrow({ where: { id } }); - } - async update(id: number, content?: string) { - return prisma.comment.update({ where: { id }, data: { content } }); - } - async delete(id: number) { - return prisma.comment.delete({ where: { id } }); - } -} - -export const commentRepo = new CommentRepository(); diff --git a/mission9-10/src/repositories/likeRepository.ts b/mission9-10/src/repositories/likeRepository.ts deleted file mode 100644 index 033015eaf..000000000 --- a/mission9-10/src/repositories/likeRepository.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { LikeTarget } from '../../types/like'; -import { prisma } from '../lib/prismaClient'; - -class LikdeRepository { - async findLike(userId: number, target: LikeTarget) { - const whereCondition = - 'articleId' in target - ? { userId_articleId: { userId, articleId: target.articleId } } - : { userId_productId: { userId, productId: target.productId } }; - return prisma.like.findUnique({ - where: whereCondition, - }); - } - async createLike(userId: number, target: LikeTarget) { - return prisma.like.create({ data: { userId, ...target } }); - } - async deleteLike(userId: number, target: LikeTarget) { - const whereCondition = - 'articleId' in target - ? { userId_articleId: { userId, articleId: target.articleId } } - : { userId_productId: { userId, productId: target.productId } }; - return prisma.like.delete({ - where: whereCondition, - }); - } - async getLikers(target: LikeTarget) { - const whereCondition = - 'articleId' in target ? { articleId: target.articleId } : { productId: target.productId }; - return prisma.like.findMany({ - where: whereCondition, - select: { userId: true }, - }); - } -} - -export const likeRepo = new LikdeRepository(); diff --git a/mission9-10/src/repositories/notificationRepository.ts b/mission9-10/src/repositories/notificationRepository.ts deleted file mode 100644 index 945c2b5ac..000000000 --- a/mission9-10/src/repositories/notificationRepository.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { prisma } from '../lib/prismaClient'; - -export class NotificationRepository { - async getNotification(userId: number) { - return prisma.notification.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } }); - } - async getUnreadCount(userId: number) { - return prisma.notification.count({ where: { userId, isRead: false } }); - } - async create(userId: number, message: string) { - return prisma.notification.create({ data: { userId, message } }); - } - async findByIds(notificationId: number, userId: number) { - return prisma.notification.findFirst({ - where: { id: notificationId, userId }, - }); - } - async updateRead(notificationId: number) { - return prisma.notification.update({ - where: { id: notificationId }, - data: { isRead: true }, - }); - } -} - -export const notificationRepo = new NotificationRepository(); diff --git a/mission9-10/src/repositories/productRepository.ts b/mission9-10/src/repositories/productRepository.ts deleted file mode 100644 index a461c300b..000000000 --- a/mission9-10/src/repositories/productRepository.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { ProductLikesAndCount } from '../../types/product'; -import { prisma } from '../lib/prismaClient'; -import { Prisma } from '@prisma/client'; -import type { ProductRecentType } from '../../types/product'; - -class ProductRepository { - async create(data: Prisma.ProductCreateInput) { - return prisma.product.create({ data }); - } - async findById(id: number) { - return prisma.product.findUniqueOrThrow({ where: { id } }); - } - async findByIdWithLikes(id: number, userId?: number): Promise { - return prisma.product.findUniqueOrThrow({ - where: { id }, - include: { - _count: { select: { likes: true } }, - likes: { - where: { userId: userId ?? -1 }, - select: { id: true }, - }, - }, - }); - } - async update(id: number, data: Prisma.ProductUpdateInput) { - return prisma.product.update({ where: { id }, data }); - } - async delete(id: number) { - return prisma.product.delete({ where: { id } }); - } - async findProductListWithLikes(params: { - skip: number; - take: number; - orderBy: Prisma.ProductOrderByWithRelationInput; - where: Prisma.ProductWhereInput; - userId?: number; - }): Promise { - return prisma.product.findMany({ - skip: params.skip, - take: params.take, - orderBy: params.orderBy, - where: params.where, - include: { - _count: { select: { likes: true } }, - likes: { - where: { userId: params.userId ?? -1 }, - select: { id: true }, - }, - }, - }); - } - async count(where: Prisma.ProductWhereInput) { - return prisma.product.count({ where }); - } - async findRecentProduct(userId: number, limit: number, type: ProductRecentType) { - const whereCondition = type === 'myUploaded' ? { userId } : { likes: { some: { userId } } }; - return prisma.product.findMany({ - where: whereCondition, - orderBy: { createdAt: 'desc' }, - take: limit, - }); - } -} - -export const productRepo = new ProductRepository(); diff --git a/mission9-10/src/repositories/userRepository.ts b/mission9-10/src/repositories/userRepository.ts deleted file mode 100644 index 0f337d690..000000000 --- a/mission9-10/src/repositories/userRepository.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { prisma } from '../lib/prismaClient'; -import { Prisma } from '@prisma/client'; - -class UserRepository { - async create(data: Prisma.UserCreateInput) { - return prisma.user.create({ data }); - } - async findByEmail(email: string) { - return prisma.user.findUnique({ where: { email } }); - } - async update(id: number, data: Prisma.UserUpdateInput) { - return prisma.user.update({ where: { id }, data }); - } - async findById(id: number) { - return prisma.user.findUnique({ where: { id } }); - } -} - -export const userRepo = new UserRepository(); diff --git a/mission9-10/src/routers/articlesRouter.ts b/mission9-10/src/routers/articlesRouter.ts deleted file mode 100644 index 1b4989b36..000000000 --- a/mission9-10/src/routers/articlesRouter.ts +++ /dev/null @@ -1,28 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync'; -import { - createArticle, - getArticleList, - getArticle, - updateArticle, - deleteArticle, - createComment, - getCommentList, - likeArticle, - unlikeArticle, -} from '../controllers/articlesController'; -import authenticate from '../middlewares/authenticate'; - -const articlesRouter = express.Router(); - -articlesRouter.post('/', authenticate(), withAsync(createArticle)); -articlesRouter.get('/', authenticate({ optional: true }), withAsync(getArticleList)); -articlesRouter.get('/:id', authenticate({ optional: true }), withAsync(getArticle)); -articlesRouter.patch('/:id', authenticate(), withAsync(updateArticle)); -articlesRouter.delete('/:id', authenticate(), withAsync(deleteArticle)); -articlesRouter.post('/:id/comments', authenticate(), withAsync(createComment)); -articlesRouter.get('/:id/comments', withAsync(getCommentList)); -articlesRouter.post('/:id/like', authenticate(), withAsync(likeArticle)); -articlesRouter.delete('/:id/like', authenticate(), withAsync(unlikeArticle)); - -export default articlesRouter; diff --git a/mission9-10/src/routers/commentsRouter.ts b/mission9-10/src/routers/commentsRouter.ts deleted file mode 100644 index f0da623c4..000000000 --- a/mission9-10/src/routers/commentsRouter.ts +++ /dev/null @@ -1,11 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync'; -import { updateComment, deleteComment } from '../controllers/commentsController'; -import authenticate from '../middlewares/authenticate'; - -const commentsRouter = express.Router(); - -commentsRouter.patch('/:id', authenticate(), withAsync(updateComment)); -commentsRouter.delete('/:id', authenticate(), withAsync(deleteComment)); - -export default commentsRouter; diff --git a/mission9-10/src/routers/imagesRouter.ts b/mission9-10/src/routers/imagesRouter.ts deleted file mode 100644 index 5a848d5f7..000000000 --- a/mission9-10/src/routers/imagesRouter.ts +++ /dev/null @@ -1,10 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync'; -import { uploadImage } from '../controllers/imagesController'; -import { upload } from '../middlewares/upload'; - -const imagesRouter = express.Router(); - -imagesRouter.post('/upload', upload.single('image'), withAsync(uploadImage)); - -export default imagesRouter; diff --git a/mission9-10/src/routers/notificationRouter.ts b/mission9-10/src/routers/notificationRouter.ts deleted file mode 100644 index 35209701a..000000000 --- a/mission9-10/src/routers/notificationRouter.ts +++ /dev/null @@ -1,16 +0,0 @@ -import express from 'express'; -import authenticate from '../middlewares/authenticate'; -import { withAsync } from '../lib/withAsync'; -import { - getNotifications, - getUnreadCount, - markAsRead, -} from '../controllers/notificationController'; - -const notificationRouter = express.Router(); - -notificationRouter.get('/', authenticate(), withAsync(getNotifications)); -notificationRouter.get('/unread-count', authenticate(), withAsync(getUnreadCount)); -notificationRouter.patch('/:id/read', authenticate(), withAsync(markAsRead)); - -export default notificationRouter; diff --git a/mission9-10/src/routers/productsRouter.ts b/mission9-10/src/routers/productsRouter.ts deleted file mode 100644 index f4907ccca..000000000 --- a/mission9-10/src/routers/productsRouter.ts +++ /dev/null @@ -1,31 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync'; -import { - createProduct, - getProduct, - updateProduct, - deleteProduct, - getProductList, - createComment, - getCommentList, - likeProduct, - unlikeProduct, -} from '../controllers/productsController'; -import authenticate from '../middlewares/authenticate'; -import { getMyLikedProducts, getMyProductList } from '../controllers/usersController'; - -const productsRouter = express.Router(); - -productsRouter.get('/me', authenticate(), withAsync(getMyProductList)); -productsRouter.get('/me/likes', authenticate(), withAsync(getMyLikedProducts)); -productsRouter.get('/', authenticate({ optional: true }), withAsync(getProductList)); -productsRouter.post('/', authenticate(), withAsync(createProduct)); -productsRouter.get('/:id', authenticate({ optional: true }), withAsync(getProduct)); -productsRouter.patch('/:id', authenticate(), withAsync(updateProduct)); -productsRouter.delete('/:id', authenticate(), withAsync(deleteProduct)); -productsRouter.post('/:id/comments', authenticate(), withAsync(createComment)); -productsRouter.get('/:id/comments', withAsync(getCommentList)); -productsRouter.post('/:id/like', authenticate(), withAsync(likeProduct)); -productsRouter.delete('/:id/like', authenticate(), withAsync(unlikeProduct)); - -export default productsRouter; diff --git a/mission9-10/src/routers/usersRouter.ts b/mission9-10/src/routers/usersRouter.ts deleted file mode 100644 index 1a4a28f8f..000000000 --- a/mission9-10/src/routers/usersRouter.ts +++ /dev/null @@ -1,24 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync'; -import { - register, - login, - logout, - getProfile, - patchPassword, - updateProfile, - refreshToken, -} from '../controllers/usersController'; -import authenticate from '../middlewares/authenticate'; - -const usersRouter = express.Router(); - -usersRouter.post('/register', withAsync(register)); -usersRouter.post('/login', withAsync(login)); -usersRouter.post('/logout', withAsync(logout)); -usersRouter.post('/refresh', withAsync(refreshToken)); -usersRouter.get('/me', authenticate(), withAsync(getProfile)); -usersRouter.patch('/me', authenticate(), withAsync(updateProfile)); -usersRouter.patch('/me/password', authenticate(), withAsync(patchPassword)); - -export default usersRouter; diff --git a/mission9-10/src/services/articleService.ts b/mission9-10/src/services/articleService.ts deleted file mode 100644 index 1c1e9c016..000000000 --- a/mission9-10/src/services/articleService.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { articleRepo } from '../repositories/articleRepository'; -import { ArticleLikesAndCount, ArticleListResponse, ArticleResponse } from '../../types/article'; -import { AlreadyLikeError, AlreadyUnlikeError, ForbiddenError } from '../lib/errors/customErrors'; -import { commentRepo } from '../repositories/commentRepository'; -import { likeRepo } from '../repositories/likeRepository'; -import { Prisma, Article, Comment } from '@prisma/client'; -import type { CursorPaginated } from '../../types/cursorPaginated'; -import { notificationService } from './notificationService'; - -//객체로 주면 콘트롤러에서 인자순서 상관없이 적용되지만, ()형태로 반환하게되면 인자순서를 서비스형태와 동일하게 넣어야 함 -export class ArticleService { - async createArticle( - userId: number, - title: string, - content: string, - image?: string | null, - ): Promise
{ - return articleRepo.create({ - title, - content, - image, - user: { connect: { id: userId } }, - }); - } - async getArticle(articleId: number, userId?: number): Promise { - const article: ArticleLikesAndCount = await articleRepo.findByIdWithLikes(articleId, userId); - const { likes, _count, ...articleData } = article; - const isLiked = userId ? (likes?.length ?? 0) > 0 : undefined; - return { ...articleData, likeCount: _count.likes, isLiked }; - } - async updateArticle( - articleId: number, - userId: number, - data: { title?: string; content?: string; image?: string | null }, - ): Promise
{ - const article = await articleRepo.findById(articleId); - if (article.userId !== userId) { - throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.'); - } - return articleRepo.update(articleId, data); - } - async deleteArticle(articleId: number, userId: number): Promise { - const article = await articleRepo.findById(articleId); - if (article.userId !== userId) { - throw new ForbiddenError('해당 게시글에 접근 권한이 없습니다.'); - } - await articleRepo.delete(articleId); - } - async getArticleList( - page: number, - pageSize: number, - orderBy?: 'recent' | 'desc' | 'asc', - keyword?: string, - userId?: number, - ): Promise { - const where = keyword - ? { - OR: [{ title: { contains: keyword } }, { content: { contains: keyword } }], - } - : {}; - const [totalCount, articles] = await Promise.all([ - articleRepo.count(where), - articleRepo.findArticleListWithLikes({ - skip: (page - 1) * pageSize, - take: pageSize, - orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, - where, - userId, - }), - ]); - const list: ArticleResponse[] = articles.map((m) => { - const { _count, likes, ...basicArticleData } = m; - const response: ArticleResponse = { - ...basicArticleData, - likeCount: _count.likes, - }; - if (!userId) { - return response; - } - const isLiked = (likes ?? []).length > 0; - return { ...basicArticleData, isLiked, likeCount: _count.likes }; - }); - const response: ArticleListResponse = { - list, - totalCount, - }; - return response; - } - async createComment(userId: number, articleId: number, content: string): Promise { - await articleRepo.findById(articleId); - const comment = await commentRepo.create({ - content, - user: { connect: { id: userId } }, - article: { connect: { id: articleId } }, - }); - const article = await articleRepo.findById(articleId); - if (article.userId !== userId) { - await notificationService.createNotification( - article.userId, - `내 게시글 "${article.title}"에 새로운 댓글이 달렸습니다.`, - ); - } - return comment; - } - async getCommentList( - articleId: number, - limit: number, - cursor?: number, - ): Promise> { - await articleRepo.findById(articleId); - const commentsWithCursor = await commentRepo.findCommentListQuery({ articleId }, limit, cursor); - const comments = commentsWithCursor.slice(0, limit); - const cursorComment = commentsWithCursor[commentsWithCursor.length - 1]; - const nextCursor = cursorComment ? cursorComment.id : null; - return { list: comments, nextCursor }; - } - //like , unlike 둘다 message를 반환해버려서 이게..프로미스로 타입 설정하는 것이 의미가 있는지...로직 수정 생각해봐야할 듯 - async likeArticle(userId: number, articleId: number): Promise<{ message: string }> { - const article = await articleRepo.findById(articleId); - const existingLike = await likeRepo.findLike(userId, { articleId }); - if (existingLike) { - throw new AlreadyLikeError(); - } - await likeRepo.createLike(userId, { articleId }); - return { message: `${article.title}게시글에 좋아요를 눌렀습니다.` }; - } - async unlikeArticle(userId: number, articleId: number): Promise<{ message: string }> { - const article = await articleRepo.findById(articleId); - try { - await likeRepo.deleteLike(userId, { articleId }); - } catch (error: unknown) { - if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') { - throw new AlreadyUnlikeError(); - } - throw error; - } - return { message: `${article.title}게시글의 좋아요를 취소했습니다` }; - } -} -export const articleService = new ArticleService(); diff --git a/mission9-10/src/services/commentService.ts b/mission9-10/src/services/commentService.ts deleted file mode 100644 index 24581974f..000000000 --- a/mission9-10/src/services/commentService.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { commentRepo } from '../repositories/commentRepository'; -import { ForbiddenError } from '../lib/errors/customErrors'; -import { Comment } from '@prisma/client'; - -export class CommentService { - async updateComment(commentId: number, userId: number, content?: string): Promise { - const comment = await commentRepo.findById(commentId); - if (comment.userId !== userId) { - throw new ForbiddenError('해당 댓글을 수정할 권한이 없습니다.'); - } - return commentRepo.update(commentId, content); - } - async deleteComment(commentId: number, userId: number): Promise { - const comment = await commentRepo.findById(commentId); - if (comment.userId !== userId) { - throw new ForbiddenError('해당 댓글을 삭제할 권한이 없습니다.'); - } - await commentRepo.delete(commentId); - } -} - -export const commnetService = new CommentService(); diff --git a/mission9-10/src/services/imageService.ts b/mission9-10/src/services/imageService.ts deleted file mode 100644 index 1adab9d10..000000000 --- a/mission9-10/src/services/imageService.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { uploadImageResponse } from '../../types/image'; -import { BadRequestError } from '../lib/errors/customErrors'; -import path from 'path'; -import { STATIC_PATH } from '../lib/constants'; -import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3'; -import type { MulterRequest } from '../../types/multer'; - -export class ImageService { - s3: S3Client | null; - constructor() { - if (process.env.UPLOAD_PROVIDER === 's3') { - this.s3 = new S3Client({ - region: process.env.AWS_REGION, - credentials: { - accessKeyId: process.env.AWS_ACCESS_KEY_ID ?? '', - secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY ?? '', - }, - }); - } else { - this.s3 = null; - } - } - - async buildImageUrl(req: MulterRequest): Promise { - if (process.env.UPLOAD_PROVIDER === 's3') { - return await this.buildImageUrlFromS3(req); - } - return this.buildImageUrlFromLocal(req); - } - - // 로컬 : static URL 생성 - buildImageUrlFromLocal(req: MulterRequest): uploadImageResponse { - const host = req.get('host'); - if (!host) { - throw new BadRequestError('요청 헤더에 host 정보가 없습니다.'); - } - - if (!req.file?.filename) { - throw new BadRequestError('업로드된 파일이 없습니다.'); - } - - const baseUrl = `${req.protocol}://${host}`; - const url = `${baseUrl}/${STATIC_PATH}/${req.file.filename}`; - return { url }; - } - - // 프로덕션 : 업로드하고 S3 URL 반환 - async buildImageUrlFromS3(req: MulterRequest): Promise { - if (!this.s3) { - throw new BadRequestError('S3 설정이 없습니다.'); - } - - const bucket = process.env.AWS_S3_BUCKET; - const region = process.env.AWS_REGION; - - if (!bucket || !region) { - throw new BadRequestError('S3 환경 변수가 없습니다.'); - } - - if (!req.file?.buffer || !req.file.originalname) { - throw new BadRequestError('S3 업로드용 파일이 없습니다.'); - } - - const ext = path.extname(req.file.originalname); - //s3에 uploads 폴더를 만들어서 그 안에 파일들이 들어가도록 설정 - const key = `uploads/${Date.now()}-${Math.random().toString(16).slice(2)}${ext}`; - - await this.s3.send( - new PutObjectCommand({ - Bucket: bucket, - Key: key, - Body: req.file.buffer, - ContentType: req.file.mimetype ?? 'application/octet-stream', - }), - ); - - const url = `https://${bucket}.s3.${region}.amazonaws.com/${key}`; - return { url }; - } -} - -export const imageService = new ImageService(); diff --git a/mission9-10/src/services/notificationService.ts b/mission9-10/src/services/notificationService.ts deleted file mode 100644 index bff17da06..000000000 --- a/mission9-10/src/services/notificationService.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { UnauthorizedError } from '../lib/errors/customErrors'; -import { notificationRepo } from '../repositories/notificationRepository'; -import { getIO } from '../socket'; -import type { Notification as PrismaNotification } from '@prisma/client'; - -export class NotificationService { - async getNotifications(userId: number): Promise { - return notificationRepo.getNotification(userId); - } - async getUnreadCount(userId: number): Promise { - return notificationRepo.getUnreadCount(userId); - } - async createNotification(userId: number, message: string): Promise { - const notification = await notificationRepo.create(userId, message); - const io = getIO(); - io.to(`user-${userId}`).emit('notification', notification); - return notification; - } - async markAsRead(notificationId: number, userId: number): Promise { - const notification = await notificationRepo.findByIds(notificationId, userId); - if (!notification) throw new UnauthorizedError(); - return notificationRepo.updateRead(notificationId); - } -} - -export const notificationService = new NotificationService(); diff --git a/mission9-10/src/services/productService.ts b/mission9-10/src/services/productService.ts deleted file mode 100644 index 922a43d57..000000000 --- a/mission9-10/src/services/productService.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { ProductLikesAndCount } from '../../types/product'; -import { productRepo } from '../repositories/productRepository'; -import { Product } from '@prisma/client'; -import type { ProductListResponse, ProductResponse } from '../../types/product'; -import { ForbiddenError } from '../lib/errors/customErrors'; -import { commentRepo } from '../repositories/commentRepository'; -import type { Comment } from '@prisma/client'; -import type { CursorPaginated } from '../../types/cursorPaginated'; -import { AlreadyLikeError, AlreadyUnlikeError } from '../lib/errors/customErrors'; -import { likeRepo } from '../repositories/likeRepository'; -import { Prisma } from '@prisma/client'; -import { notificationService } from './notificationService'; - -//인자 순서가 옵셔널 다음 필수파라미터가 들어오면 컴파일에러가 발생함 -//객체로 묶어 보내기, 이러면 필수인 userid의 파라미터 순서를 바꾸지 않아도 됨 -export class ProductService { - async createProduct(params: { - name: string; - description: string; - price: number; - tags?: string[]; - images?: string[]; - userId: number; - }): Promise { - const { name, description, price, tags, images, userId } = params; - return productRepo.create({ - name, - description, - price, - tags: tags ?? [], - images: images ?? [], - user: { connect: { id: userId } }, - }); - } - async getProduct(productId: number, userId?: number): Promise { - const product: ProductLikesAndCount = await productRepo.findByIdWithLikes(productId, userId); - const { likes, _count, ...productData } = product; - const baseResponse = { ...productData, likeCount: _count.likes }; - if (!userId) { - return baseResponse; - } - const isLiked = (likes?.length ?? 0) > 0; - return { ...baseResponse, isLiked }; - } - async updateProduct( - productId: number, - userId: number, - data: { - name?: string; - description?: string; - price?: number; - tags?: string[]; - images?: string[]; - }, - ): Promise { - const product = await productRepo.findById(productId); - if (product.userId !== userId) { - throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.'); - } - const updateProduct = await productRepo.update(productId, data); - //undefined가 아니면서 기존가격과 다른 경우 - if (data.price !== undefined && product.price !== data.price) { - const likers = await likeRepo.getLikers({ productId }); - for (const liker of likers) { - if (liker.userId !== userId) { - await notificationService.createNotification( - liker.userId, - `관심 상품 "${product.name}"의 가격이 변동되었습니다.`, - ); - } - } - } - return updateProduct; - } - async deleteProduct(productId: number, userId: number): Promise { - const product = await productRepo.findById(productId); - if (product.userId !== userId) { - throw new ForbiddenError('해당 상품에 접근 권한이 없습니다.'); - } - await productRepo.delete(productId); - } - async getProductList( - page: number, - pageSize: number, - orderBy?: 'recent' | 'desc' | 'asc', - keyword?: string, - userId?: number, - ): Promise { - const where = keyword - ? { - OR: [ - { name: { contains: keyword } }, - { description: { contains: keyword } }, - { tags: { has: keyword } }, - ], - } - : {}; - const [totalCount, products] = await Promise.all([ - productRepo.count(where), - productRepo.findProductListWithLikes({ - skip: (page - 1) * pageSize, - take: pageSize, - orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, - where, - userId, - }), - ]); - const list: ProductResponse[] = products.map((m) => { - const { _count, likes, ...basicProductData } = m; - const response: ProductResponse = { - ...basicProductData, - likeCount: _count.likes, - }; - if (!userId) { - return response; - } - const isLiked = (likes ?? []).length > 0; - return { ...basicProductData, isLiked, likeCount: _count.likes }; - }); - const response: ProductListResponse = { - list, - totalCount, - }; - return response; - } - async createComment(userId: number, productId: number, content: string): Promise { - await productRepo.findById(productId); - const comment = await commentRepo.create({ - content, - user: { connect: { id: userId } }, - product: { connect: { id: productId } }, - }); - const product = await productRepo.findById(productId); - if (product.userId !== userId) { - await notificationService.createNotification( - product.userId, - `내 상품 "${product.name}"에 새로운 댓글이 달렸습니다.`, - ); - } - return comment; - } - async getCommentList( - productId: number, - limit: number, - cursor?: number, - ): Promise> { - await productRepo.findById(productId); - const commentsWithCursor = await commentRepo.findCommentListQuery({ productId }, limit, cursor); - const comments = commentsWithCursor.slice(0, limit); - const cursorComment = commentsWithCursor[commentsWithCursor.length - 1]; - const nextCursor = cursorComment ? cursorComment.id : null; - return { list: comments, nextCursor }; - } - async likeProduct(userId: number, productId: number): Promise<{ message: string }> { - const product = await productRepo.findById(productId); - const existingLike = await likeRepo.findLike(userId, { productId }); - if (existingLike) { - throw new AlreadyLikeError(); - } - await likeRepo.createLike(userId, { productId }); - return { message: `${product.name}상품에 좋아요를 눌렀습니다.` }; - } - async unlikeProduct(userId: number, productId: number): Promise<{ message: string }> { - const product = await productRepo.findById(productId); - try { - await likeRepo.deleteLike(userId, { productId }); - } catch (error: unknown) { - if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2025') { - throw new AlreadyUnlikeError(); - } - throw error; - } - return { message: `${product.name}상품의 좋아요를 취소했습니다` }; - } -} - -export const productService = new ProductService(); diff --git a/mission9-10/src/services/userService.ts b/mission9-10/src/services/userService.ts deleted file mode 100644 index 850dad53b..000000000 --- a/mission9-10/src/services/userService.ts +++ /dev/null @@ -1,212 +0,0 @@ -import bcrypt from 'bcrypt'; -import { userRepo } from '../repositories/userRepository'; -import type { Prisma, User } from '@prisma/client'; -import { ForbiddenError, UnauthorizedError } from '../lib/errors/customErrors'; -import { generateToken, verifyRefreshToken } from '../lib/token'; -import { productRepo } from '../repositories/productRepository'; -import type { ProductListResponse } from '../../types/product'; -import { ProfileResponse } from '../../types/user'; - -class UserService { - async register( - nickname: string, - email: string, - password: string, - image?: string, - ): Promise> { - const salt = await bcrypt.genSalt(10); - const hashedPassword = await bcrypt.hash(password, salt); - const user = await userRepo.create({ - nickname, - email, - password: hashedPassword, - image, - }); - const { password: _, ...userWithoutPassword } = user; - return userWithoutPassword; - } - async login( - email: string, - password: string, - ): Promise<{ tokens: { accessToken: string; refreshToken: string }; message: string }> { - const user = await userRepo.findByEmail(email); - if (!user) { - //이메일, 비밀번호 검증에 대한 에러를 같은 메세지로 던짐으로써 좀 더 방어적으로 설계 - throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.'); - } - const isPasswordValid = await bcrypt.compare(password, user.password); - if (!isPasswordValid) { - throw new UnauthorizedError('이메일 또는 비밀번호가 올바르지 않습니다.'); - } - const tokens = generateToken(user.id); - return { tokens, message: '로그인에 성공했습니다.' }; - } - async getProfile(myId: number): Promise { - const user = await userRepo.findById(myId); - if (!user) throw new UnauthorizedError('사용자를 찾을 수 없습니다.'); - const { password: _, ...userInfo } = user; - const [myProductCount, myLikeProductCount, recentProductsRaw, recentLikedProductsRaw] = - await Promise.all([ - productRepo.count({ userId: myId }), - productRepo.count({ likes: { some: { userId: myId } } }), - productRepo.findProductListWithLikes({ - skip: 0, - take: 5, - orderBy: { createdAt: 'desc' }, - where: { userId: myId }, - userId: myId, - }), - productRepo.findProductListWithLikes({ - skip: 0, - take: 5, - orderBy: { createdAt: 'desc' }, - where: { likes: { some: { userId: myId } } }, - userId: myId, - }), - ]); - const myRecentProducts = recentProductsRaw.map((m) => { - const { _count, likes, ...rest } = m; - return { - ...rest, - likeCount: _count.likes, - isLiked: (likes?.length ?? 0) > 0, - }; - }); - const myRecentLikeProducts = recentLikedProductsRaw.map((m) => { - const { _count, likes, ...rest } = m; - return { - ...rest, - likeCount: _count.likes, - isLiked: (likes?.length ?? 0) > 0, - }; - }); - return { - user: userInfo, - myProducts: { - list: myRecentProducts, - totalCount: myProductCount, - }, - myLikedProducts: { - list: myRecentLikeProducts, - totalCount: myLikeProductCount, - }, - }; - } - - async updateProfile( - userId: number, - nickname?: string, - email?: string, - image?: string | null, - ): Promise> { - const data: Prisma.UserUpdateInput = {}; - if (nickname !== undefined) data.nickname = nickname; - if (email !== undefined) data.email = email; - if (image !== undefined) data.image = image; - const update = await userRepo.update(userId, data); - const { password: _, ...userWithoutPassword } = update; - return userWithoutPassword; - } - async patchPassword(userId: number, currentPassword: string, newPassword: string): Promise { - const user = await userRepo.findById(userId); - if (!user) { - throw new UnauthorizedError('사용자를 찾을 수 없습니다.'); - } - const isPasswordValid = await bcrypt.compare(currentPassword, user.password); - if (!isPasswordValid) { - throw new ForbiddenError('현재 비밀번호가 올바르지 않습니다.'); - } - const salt = await bcrypt.genSalt(10); - const hashedNewPassword = await bcrypt.hash(newPassword, salt); - await userRepo.update(userId, { password: hashedNewPassword }); - } - async getMyProductList( - myId: number, - page: number, - pageSize: number, - orderBy?: 'recent' | 'desc' | 'asc', - keyword?: string, - ): Promise { - const where = { - userId: myId, - ...(keyword - ? { - OR: [ - { name: { contains: keyword } }, - { description: { contains: keyword } }, - { tags: { has: keyword } }, - ], - } - : {}), - }; - const [totalCount, productsRaw] = await Promise.all([ - productRepo.count(where), - productRepo.findProductListWithLikes({ - skip: (page - 1) * pageSize, - take: pageSize, - orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, - where, - userId: myId, - }), - ]); - const list = productsRaw.map((m) => { - const { _count, likes, ...rest } = m; - return { - ...rest, - likeCount: _count.likes, - isLiked: (likes?.length ?? 0) > 0, - }; - }); - return { list, totalCount }; - } - async refreshToken(refreshToken: string) { - let userId: number; - try { - const payload = verifyRefreshToken(refreshToken); - userId = payload.userId; - } catch (error) { - throw new UnauthorizedError('유효하지 않은 리프레시 토큰입니다.'); - } - const user = await userRepo.findById(userId); - if (!user) { - throw new UnauthorizedError('존재하지 않는 사용자입니다.'); - } - const tokens = generateToken(user.id); - return tokens; - } - async getMyLikedProducts( - myId: number, - page: number, - pageSize: number, - orderBy?: 'recent' | 'desc' | 'asc', - ): Promise { - const where = { - likes: { - some: { - userId: myId, - }, - }, - }; - const [totalCount, productsRaw] = await Promise.all([ - productRepo.count(where), - productRepo.findProductListWithLikes({ - skip: (page - 1) * pageSize, - take: pageSize, - orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { createdAt: 'asc' }, - where, - userId: myId, - }), - ]); - const list = productsRaw.map((m) => { - const { _count, likes, ...rest } = m; - return { - ...rest, - likeCount: _count.likes, - isLiked: (likes?.length ?? 0) > 0, - }; - }); - return { list, totalCount }; - } -} - -export const userService = new UserService(); diff --git a/mission9-10/src/socket.ts b/mission9-10/src/socket.ts deleted file mode 100644 index cc35975ce..000000000 --- a/mission9-10/src/socket.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Server as SocketIOServer } from 'socket.io'; -import { Server as HttpServer } from 'http'; -import { verifyAccessToken } from './lib/token'; -import { UnauthorizedError } from './lib/errors/customErrors'; - -let io: SocketIOServer | null = null; - -export const initSocket = (Server: HttpServer) => { - io = new SocketIOServer(Server, { - cors: { - origin: '*', - methods: ['GET', 'POST'], - }, - }); - - io.use((socket, next) => { - try { - const token = socket.handshake.auth.accessToken; - if (!token) return next(new UnauthorizedError()); - const { userId } = verifyAccessToken(token); - if (!userId) return next(new UnauthorizedError()); - socket.data.userId = userId; - next(); - } catch (e) { - next(new UnauthorizedError()); - } - }); - - io.on('connection', (socket) => { - const userId = socket.data.userId; - console.log('User connected', socket.id); - socket.join(`user-${userId}`); - console.log(`User ${userId} joined room user-${userId}`); - }); - return io; -}; - -export const getIO = () => { - if (!io) { - throw new Error('Socket.IO 서버가 초기화되지 않았습니다.'); - } - return io; -}; diff --git a/mission9-10/src/structs/articlesStructs.ts b/mission9-10/src/structs/articlesStructs.ts deleted file mode 100644 index 3d25131b5..000000000 --- a/mission9-10/src/structs/articlesStructs.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { coerce, nonempty, nullable, object, partial, string } from 'superstruct'; -import { PageParamsStruct } from './commonStructs'; - -export const GetArticleListParamsStruct = PageParamsStruct; - -export const CreateArticleBodyStruct = object({ - title: coerce(nonempty(string()), string(), (value) => value.trim()), - content: nonempty(string()), - image: nullable(string()), -}); - -export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct); diff --git a/mission9-10/src/structs/commentsStruct.ts b/mission9-10/src/structs/commentsStruct.ts deleted file mode 100644 index dce57521b..000000000 --- a/mission9-10/src/structs/commentsStruct.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { nonempty, object, partial, string } from 'superstruct'; -import { CursorParamsStruct } from './commonStructs'; - -export const CreateCommentBodyStruct = object({ - content: nonempty(string()), -}); - -export const GetCommentListParamsStruct = CursorParamsStruct; - -export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct); diff --git a/mission9-10/src/structs/commonStructs.ts b/mission9-10/src/structs/commonStructs.ts deleted file mode 100644 index 00f563f2b..000000000 --- a/mission9-10/src/structs/commonStructs.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { coerce, integer, object, string, defaulted, optional, enums, nonempty } from 'superstruct'; - -const integerString = coerce(integer(), string(), (value) => parseInt(value)); - -export const IdParamsStruct = object({ - id: integerString, -}); - -export const PageParamsStruct = object({ - page: defaulted(integerString, 1), - pageSize: defaulted(integerString, 10), - orderBy: optional(enums(['recent'])), - keyword: optional(nonempty(string())), -}); - -export const CursorParamsStruct = object({ - cursor: defaulted(integerString, 0), - limit: defaulted(integerString, 10), - orderBy: optional(enums(['recent'])), - keyword: optional(nonempty(string())), -}); diff --git a/mission9-10/src/structs/productsStruct.ts b/mission9-10/src/structs/productsStruct.ts deleted file mode 100644 index 6c3f9781e..000000000 --- a/mission9-10/src/structs/productsStruct.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { - coerce, - partial, - object, - string, - min, - nonempty, - array, - integer, - optional, -} from 'superstruct'; -import { PageParamsStruct } from './commonStructs'; - -export const CreateProductBodyStruct = object({ - name: coerce(nonempty(string()), string(), (value) => value.trim()), - description: nonempty(string()), - price: min(integer(), 0), - tags: optional(array(string())), - images: optional(array(string())), -}); - -export const GetProductListParamsStruct = PageParamsStruct; - -export const UpdateProductBodyStruct = partial(CreateProductBodyStruct); - -export const LikeProductParamsStruct = PageParamsStruct; diff --git a/mission9-10/src/structs/usersStructs.ts b/mission9-10/src/structs/usersStructs.ts deleted file mode 100644 index 10740ff77..000000000 --- a/mission9-10/src/structs/usersStructs.ts +++ /dev/null @@ -1,48 +0,0 @@ -import * as s from 'superstruct'; -import { PageParamsStruct } from './commonStructs'; - -const CoercedNumber = s.coerce(s.number(), s.union([s.string(), s.number()]), (value) => - Number(value), -); -const Integer = s.refine(CoercedNumber, 'Integer', (value) => Number.isInteger(value) && value > 0); - -export const userIdStruct = s.object({ - userId: Integer, -}); -//이메일: 기본적인 이메일 형식 체크, 닉네임: 영어 + 숫자 + 한글, 2~10글자, 비밀번호: 8~16글자 -const email = s.refine(s.string(), 'Email', (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)); -const nickname = s.refine(s.string(), 'Nickname', (value) => - /^[A-Za-z0-9가-힣]{2,10}$/.test(value), -); -const password = s.refine( - s.string(), - 'Password', - (value) => value.length >= 8 && value.length <= 16, -); - -export const CreateUserBodyStruct = s.object({ - nickname: nickname, - email: email, - password: password, - image: s.optional(s.string()), -}); - -export const UpdateUserBodyStruct = s.partial(CreateUserBodyStruct); - -export const LoginBodyStruct = s.object({ - email: email, - password: password, -}); - -export const ChangePasswordBodyStruct = s.object({ - currentPassword: password, - newPassword: password, -}); - -export const RefreshTokenBodyStruct = s.object({ - refreshToken: s.string(), -}); - -export const GetMyProductListParamsStruct = PageParamsStruct; - -export const GetMyLikedProductListParamsStruct = PageParamsStruct; diff --git a/mission9-10/tests/articles.auth.test.ts b/mission9-10/tests/articles.auth.test.ts deleted file mode 100644 index f2df46476..000000000 --- a/mission9-10/tests/articles.auth.test.ts +++ /dev/null @@ -1,170 +0,0 @@ -import request from 'supertest'; -import app from '../src/app'; -import { prisma } from '../src/lib/prismaClient'; -import { cleanDb, disconnectDb } from './utils/cleanDb'; - -jest.mock('uuid', () => ({ - v4: () => 'test-uuid', -})); - -async function registerAndLogin(email: string, nickname: string) { - const agent = request.agent(app); - await agent.post('/users/register').send({ - email, - nickname, - password: 'password1', - }); - await agent.post('/users/login').send({ - email, - password: 'password1', - }); - return agent; -} - -describe('인증이 필요한 게시글 API 통합 테스트', () => { - beforeAll(async () => { - await cleanDb(); - }); - - beforeEach(async () => { - await prisma.like.deleteMany(); - await prisma.comment.deleteMany(); - await prisma.article.deleteMany(); - await prisma.user.deleteMany(); - }); - - afterAll(async () => { - await cleanDb(); - await disconnectDb(); - }); - - describe('POST /articles', () => { - test('로그인 없이 요청하면 401을 반환한다', async () => { - const res = await request(app).post('/articles').send({ - title: 'NoAuth', - content: 'x', - image: null, - }); - expect(res.status).toBe(401); - }); - - test('로그인 상태면 201과 게시글 정보를 반환한다', async () => { - const agent = await registerAndLogin('owner-a@example.com', 'ownerA'); - const res = await agent.post('/articles').send({ - title: 'MyArticle', - content: 'content', - image: null, - }); - expect(res.status).toBe(201); - expect(res.body).toHaveProperty('id'); - expect(res.body).toHaveProperty('title', 'MyArticle'); - }); - }); - - describe('PATCH /articles/:id', () => { - test('본인 게시글이면 수정된다', async () => { - const agent = await registerAndLogin('owner-b@example.com', 'ownerB'); - const article = await prisma.article.create({ - data: { - title: 'Old', - content: 'old', - image: null, - user: { connect: { email: 'owner-b@example.com' } }, - }, - }); - const res = await agent.patch(`/articles/${article.id}`).send({ title: 'New' }); - expect(res.status).toBe(200); - expect(res.body.title).toBe('New'); - }); - - test('다른 사람 게시글이면 403을 반환한다', async () => { - await prisma.user.create({ - data: { email: 'owner-c@example.com', nickname: 'ownerC', password: 'pw' }, - }); - const article = await prisma.article.create({ - data: { - title: 'Other', - content: 'x', - image: null, - user: { connect: { email: 'owner-c@example.com' } }, - }, - }); - const agent = await registerAndLogin('user-a@example.com', 'userA'); - const res = await agent.patch(`/articles/${article.id}`).send({ title: 'Nope' }); - expect(res.status).toBe(403); - }); - }); - - describe('DELETE /articles/:id', () => { - test('본인 게시글이면 삭제된다', async () => { - const agent = await registerAndLogin('owner-d@example.com', 'ownerD'); - const article = await prisma.article.create({ - data: { - title: 'DeleteMe', - content: 'x', - image: null, - user: { connect: { email: 'owner-d@example.com' } }, - }, - }); - const res = await agent.delete(`/articles/${article.id}`); - expect(res.status).toBe(204); - }); - - test('다른 사람 게시글이면 403을 반환한다', async () => { - await prisma.user.create({ - data: { email: 'owner-e@example.com', nickname: 'ownerE', password: 'pw' }, - }); - const article = await prisma.article.create({ - data: { - title: 'Other', - content: 'x', - image: null, - user: { connect: { email: 'owner-e@example.com' } }, - }, - }); - const agent = await registerAndLogin('user-b@example.com', 'userB'); - const res = await agent.delete(`/articles/${article.id}`); - expect(res.status).toBe(403); - }); - }); - - describe('POST /articles/:id/comments', () => { - test('로그인 상태면 댓글이 등록된다', async () => { - const agent = await registerAndLogin('owner-f@example.com', 'ownerF'); - const article = await prisma.article.create({ - data: { - title: 'WithComment', - content: 'x', - image: null, - user: { connect: { email: 'owner-f@example.com' } }, - }, - }); - - const res = await agent.post(`/articles/${article.id}/comments`).send({ content: 'hello' }); - - expect(res.status).toBe(201); - expect(res.body).toHaveProperty('id'); - expect(res.body).toHaveProperty('content', 'hello'); - }); - }); - - describe('POST/DELETE /articles/:id/like', () => { - test('좋아요 등록/취소가 동작한다', async () => { - const agent = await registerAndLogin('owner-g@example.com', 'ownerG'); - const article = await prisma.article.create({ - data: { - title: 'LikeMe', - content: 'x', - image: null, - user: { connect: { email: 'owner-g@example.com' } }, - }, - }); - - const likeRes = await agent.post(`/articles/${article.id}/like`); - expect(likeRes.status).toBe(200); - - const unlikeRes = await agent.delete(`/articles/${article.id}/like`); - expect(unlikeRes.status).toBe(200); - }); - }); -}); diff --git a/mission9-10/tests/articles.public.test.ts b/mission9-10/tests/articles.public.test.ts deleted file mode 100644 index 4c8b3582b..000000000 --- a/mission9-10/tests/articles.public.test.ts +++ /dev/null @@ -1,188 +0,0 @@ -import request from 'supertest'; -import app from '../src/app'; -import { prisma } from '../src/lib/prismaClient'; -import { createSeedUser } from './utils/createUser'; -import { cleanDb, disconnectDb } from './utils/cleanDb'; - -jest.mock('uuid', () => ({ - v4: () => 'test-uuid', -})); - -describe('인증이 필요하지 않은 게시글 API 통합 테스트', () => { - let ownerId: number; - - beforeAll(async () => { - await cleanDb(); - const owner = await createSeedUser(); - ownerId = owner.id; - }); - - beforeEach(async () => { - await prisma.like.deleteMany(); - await prisma.comment.deleteMany(); - await prisma.article.deleteMany(); - }); - - afterAll(async () => { - await cleanDb(); - await disconnectDb(); - }); - - describe('GET /articles (공개 조회)', () => { - it('게시글이 없으면 { list: [], totalCount: 0 }을 반환한다', async () => { - const res = await request(app).get('/articles'); - - expect(res.status).toBe(200); - expect(res.body).toEqual({ list: [], totalCount: 0 }); - }); - - it('여러 개의 게시글이 있으면 list/totalCount를 올바르게 반환한다', async () => { - await prisma.article.createMany({ - data: [ - { title: '글1', content: '내용1', image: null, userId: ownerId }, - { title: '글2', content: '내용2', image: null, userId: ownerId }, - ], - }); - - const res = await request(app) - .get('/articles') - .query({ page: 1, pageSize: 10, orderBy: 'recent' }); - - expect(res.status).toBe(200); - expect(res.body.totalCount).toBe(2); - expect(res.body.list).toHaveLength(2); - expect(res.body.list).toEqual( - expect.arrayContaining([ - expect.objectContaining({ title: '글1', content: '내용1' }), - expect.objectContaining({ title: '글2', content: '내용2' }), - ]), - ); - }); - - it('page/pageSize로 페이징이 된다', async () => { - await prisma.article.createMany({ - data: [ - { title: 'A1', content: 'C1', image: null, userId: ownerId }, - { title: 'A2', content: 'C2', image: null, userId: ownerId }, - { title: 'A3', content: 'C3', image: null, userId: ownerId }, - { title: 'A4', content: 'C4', image: null, userId: ownerId }, - { title: 'A5', content: 'C5', image: null, userId: ownerId }, - ], - }); - - const res1 = await request(app) - .get('/articles') - .query({ page: 1, pageSize: 2, orderBy: 'recent' }); - expect(res1.status).toBe(200); - expect(res1.body.totalCount).toBe(5); - expect(res1.body.list).toHaveLength(2); - - const res2 = await request(app) - .get('/articles') - .query({ page: 2, pageSize: 2, orderBy: 'recent' }); - expect(res2.status).toBe(200); - expect(res2.body.totalCount).toBe(5); - expect(res2.body.list).toHaveLength(2); - - // 실제로 다른 페이지인지 확인 - expect(res1.body.list[0].id).not.toBe(res2.body.list[0].id); - }); - - it("orderBy='asc' 같은 값은 허용되지 않아 400을 반환한다(Struct 기준)", async () => { - const res = await request(app) - .get('/articles') - .query({ page: 1, pageSize: 10, orderBy: 'asc' }); - - expect(res.status).toBe(400); - }); - - it('keyword 검색은 title/content에 매칭되면 포함된다', async () => { - await prisma.article.createMany({ - data: [ - { title: 'Apple Story', content: 'fresh', image: null, userId: ownerId }, - { title: 'Banana', content: 'yellowDescOnly', image: null, userId: ownerId }, - { title: 'Car', content: 'vehicle', image: null, userId: ownerId }, - ], - }); - - const r1 = await request(app) - .get('/articles') - .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'Apple' }); - expect(r1.status).toBe(200); - expect(r1.body.totalCount).toBe(1); - expect(r1.body.list[0].title).toContain('Apple'); - - const r2 = await request(app) - .get('/articles') - .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'yellowDescOnly' }); - expect(r2.status).toBe(200); - expect(r2.body.totalCount).toBe(1); - expect(r2.body.list[0].title).toBe('Banana'); - }); - - it('잘못된 쿼리(page가 숫자가 아님)는 400(또는 스펙 코드)을 반환한다', async () => { - const res = await request(app).get('/articles').query({ page: 'abc', pageSize: 10 }); - expect([400, 422]).toContain(res.status); - }); - }); - - describe('GET /articles/:id (공개 상세 조회)', () => { - it('ID로 게시글 상세를 반환한다', async () => { - const article = await prisma.article.create({ - data: { title: 'Detail', content: 'Detail content', image: null, userId: ownerId }, - }); - - const res = await request(app).get(`/articles/${article.id}`); - - expect(res.status).toBe(200); - expect(res.body.title).toBe('Detail'); - expect(res.body.content).toBe('Detail content'); - }); - - it('존재하지 않는 id면 404(또는 400)를 반환한다', async () => { - const res = await request(app).get('/articles/999999999'); - expect([404, 400]).toContain(res.status); - }); - }); - - describe('GET /articles/:id/comments (공개 댓글 목록 조회)', () => { - it('댓글이 없으면 빈 목록을 반환한다', async () => { - const article = await prisma.article.create({ - data: { title: 'A', content: 'C', image: null, userId: ownerId }, - }); - - const res = await request(app) - .get(`/articles/${article.id}/comments`) - .query({ cursor: 0, limit: 10 }); - - expect(res.status).toBe(200); - expect(res.body).toEqual({ list: [], nextCursor: null }); - }); - - it('cursor/limit로 페이지네이션이 된다(구현되어 있다면)', async () => { - const article = await prisma.article.create({ - data: { title: 'A', content: 'C', image: null, userId: ownerId }, - }); - - const commenter = await prisma.user.create({ - data: { email: `c+${Date.now()}@ex.com`, nickname: `c_${Date.now()}`, password: 'pw' }, - }); - - await prisma.comment.createMany({ - data: [ - { content: 'c1', articleId: article.id, userId: commenter.id }, - { content: 'c2', articleId: article.id, userId: commenter.id }, - { content: 'c3', articleId: article.id, userId: commenter.id }, - ], - }); - - const res = await request(app) - .get(`/articles/${article.id}/comments`) - .query({ cursor: 0, limit: 2 }); - - expect(res.status).toBe(200); - expect(res.body.list).toHaveLength(2); - expect(res.body.nextCursor).toBeTruthy(); - }); - }); -}); diff --git a/mission9-10/tests/auth.test.ts b/mission9-10/tests/auth.test.ts deleted file mode 100644 index acc5bd9f3..000000000 --- a/mission9-10/tests/auth.test.ts +++ /dev/null @@ -1,103 +0,0 @@ -import request from 'supertest'; -import app from '../src/app'; -import { prisma } from '../src/lib/prismaClient'; -import { cleanDb, disconnectDb } from './utils/cleanDb'; - -jest.mock('uuid', () => ({ - v4: () => 'test-uuid', -})); - -describe('인증 API 통합 테스트 (회원가입/로그인)', () => { - beforeAll(async () => { - await cleanDb(); - }); - - beforeEach(async () => { - await prisma.user.deleteMany(); - }); - - afterAll(async () => { - await cleanDb(); - await disconnectDb(); - }); - - describe('POST /users/register', () => { - test('정상 입력이면 201과 사용자 정보를 반환한다', async () => { - const res = await request(app).post('/users/register').send({ - email: 'newuser@example.com', - nickname: 'user01', - password: 'password1', - image: 'https://example.com/profile.png', - }); - - expect(res.status).toBe(201); - expect(res.body).toHaveProperty('id'); - expect(res.body).toHaveProperty('email', 'newuser@example.com'); - expect(res.body).toHaveProperty('nickname', 'user01'); - expect(res.body).not.toHaveProperty('password'); - }); - - test('이메일 형식이 틀리면 400을 반환한다', async () => { - const res = await request(app).post('/users/register').send({ - email: 'invalid-email', - nickname: 'user01', - password: 'password1', - }); - - expect(res.status).toBe(400); - }); - - test('중복 이메일이면 400을 반환한다', async () => { - await request(app).post('/users/register').send({ - email: 'dup@example.com', - nickname: 'user01', - password: 'password1', - }); - - const res = await request(app).post('/users/register').send({ - email: 'dup@example.com', - nickname: 'user02', - password: 'password1', - }); - - expect(res.status).toBe(400); - }); - }); - - describe('POST /users/login', () => { - test('올바른 이메일/비밀번호면 200과 쿠키를 반환한다', async () => { - await request(app).post('/users/register').send({ - email: 'login@example.com', - nickname: 'login01', - password: 'password1', - }); - - const res = await request(app).post('/users/login').send({ - email: 'login@example.com', - password: 'password1', - }); - - expect(res.status).toBe(200); - expect(res.body).toHaveProperty('message'); - const setCookie = res.headers['set-cookie'] ?? []; - const cookieHeader = Array.isArray(setCookie) ? setCookie.join(';') : setCookie; - expect(cookieHeader).toContain('access-token='); - expect(cookieHeader).toContain('refresh-token='); - }); - - test('잘못된 비밀번호면 401을 반환한다', async () => { - await request(app).post('/users/register').send({ - email: 'wrongpw@example.com', - nickname: 'wrongpw', - password: 'password1', - }); - - const res = await request(app).post('/users/login').send({ - email: 'wrongpw@example.com', - password: 'password2', - }); - - expect(res.status).toBe(401); - }); - }); -}); diff --git a/mission9-10/tests/product.service.unit.test.ts b/mission9-10/tests/product.service.unit.test.ts deleted file mode 100644 index 57aacc178..000000000 --- a/mission9-10/tests/product.service.unit.test.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { productService } from '../src/services/productService'; -import { productRepo } from '../src/repositories/productRepository'; -import { likeRepo } from '../src/repositories/likeRepository'; -import { commentRepo } from '../src/repositories/commentRepository'; -import { notificationService } from '../src/services/notificationService'; - -jest.mock('../src/repositories/productRepository', () => ({ - productRepo: { - create: jest.fn(), - findById: jest.fn(), - findByIdWithLikes: jest.fn(), - update: jest.fn(), - delete: jest.fn(), - findProductListWithLikes: jest.fn(), - count: jest.fn(), - }, -})); - -jest.mock('../src/repositories/likeRepository', () => ({ - likeRepo: { - findLike: jest.fn(), - createLike: jest.fn(), - deleteLike: jest.fn(), - getLikers: jest.fn(), - }, -})); - -jest.mock('../src/repositories/commentRepository', () => ({ - commentRepo: { - create: jest.fn(), - findCommentListQuery: jest.fn(), - }, -})); - -jest.mock('../src/services/notificationService', () => ({ - notificationService: { - createNotification: jest.fn(), - }, -})); - -const mockedProductRepo = productRepo as jest.Mocked; -const mockedLikeRepo = likeRepo as jest.Mocked; -const mockedCommentRepo = commentRepo as jest.Mocked; -const mockedNotificationService = notificationService as jest.Mocked; - -describe('ProductService (unit)', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - test('createProduct: tags/images가 없으면 빈 배열로 저장한다', async () => { - mockedProductRepo.create.mockResolvedValueOnce({ - id: 1, - name: 'P', - description: 'D', - price: 100, - tags: [], - images: [], - userId: 1, - } as any); - - await productService.createProduct({ - name: 'P', - description: 'D', - price: 100, - userId: 1, - }); - - expect(mockedProductRepo.create).toHaveBeenCalledWith({ - name: 'P', - description: 'D', - price: 100, - tags: [], - images: [], - user: { connect: { id: 1 } }, - }); - }); - - test('getProduct: 비로그인은 isLiked 키가 내려오지 않는다', async () => { - mockedProductRepo.findByIdWithLikes.mockResolvedValueOnce({ - id: 1, - name: 'P', - description: 'D', - price: 100, - tags: [], - images: [], - userId: 1, - likes: [], - _count: { likes: 0 }, - } as any); - - const res = await productService.getProduct(1); - - expect(res.likeCount).toBe(0); - expect(res).not.toHaveProperty('isLiked'); - }); - - test('updateProduct: 가격 변경 시 좋아요 누른 유저에게 알림을 보낸다', async () => { - mockedProductRepo.findById.mockResolvedValueOnce({ - id: 1, - name: 'P', - description: 'D', - price: 100, - tags: [], - images: [], - userId: 1, - } as any); - mockedProductRepo.update.mockResolvedValueOnce({ - id: 1, - name: 'P', - description: 'D', - price: 200, - tags: [], - images: [], - userId: 1, - } as any); - mockedLikeRepo.getLikers.mockResolvedValueOnce([{ userId: 2 }, { userId: 1 }]); - - await productService.updateProduct(1, 1, { price: 200 }); - - expect(mockedNotificationService.createNotification).toHaveBeenCalledTimes(1); - expect(mockedNotificationService.createNotification).toHaveBeenCalledWith( - 2, - '관심 상품 "P"의 가격이 변동되었습니다.', - ); - }); - - test('getProductList: 로그인 유저는 isLiked를 포함한다', async () => { - mockedProductRepo.count.mockResolvedValueOnce(1); - mockedProductRepo.findProductListWithLikes.mockResolvedValueOnce([ - { - id: 1, - name: 'P', - description: 'D', - price: 100, - tags: [], - images: [], - userId: 1, - likes: [{ id: 99 }], - _count: { likes: 1 }, - }, - ] as any); - - const res = await productService.getProductList(1, 10, 'recent', undefined, 1); - - expect(res.totalCount).toBe(1); - expect(res.list[0].isLiked).toBe(true); - expect(res.list[0].likeCount).toBe(1); - }); - - test('createComment: 댓글이 등록된다', async () => { - mockedProductRepo.findById.mockResolvedValue({ - id: 1, - name: 'P', - description: 'D', - price: 100, - tags: [], - images: [], - userId: 1, - } as any); - mockedCommentRepo.create.mockResolvedValueOnce({ - id: 10, - content: 'c1', - } as any); - - const res = await productService.createComment(1, 1, 'c1'); - - expect(res).toHaveProperty('id', 10); - expect(mockedCommentRepo.create).toHaveBeenCalledWith({ - content: 'c1', - user: { connect: { id: 1 } }, - product: { connect: { id: 1 } }, - }); - }); -}); diff --git a/mission9-10/tests/products.auth.test.ts b/mission9-10/tests/products.auth.test.ts deleted file mode 100644 index c80535280..000000000 --- a/mission9-10/tests/products.auth.test.ts +++ /dev/null @@ -1,254 +0,0 @@ -import request from 'supertest'; -import app from '../src/app'; -import { prisma } from '../src/lib/prismaClient'; -import { cleanDb, disconnectDb } from './utils/cleanDb'; - -jest.mock('uuid', () => ({ - v4: () => 'test-uuid', -})); - -async function registerAndLogin(email: string, nickname: string) { - const agent = request.agent(app); - await agent.post('/users/register').send({ - email, - nickname, - password: 'password1', - }); - await agent.post('/users/login').send({ - email, - password: 'password1', - }); - return agent; -} - -describe('인증이 필요한 상품 API 통합 테스트', () => { - beforeAll(async () => { - await cleanDb(); - }); - - beforeEach(async () => { - await prisma.like.deleteMany(); - await prisma.comment.deleteMany(); - await prisma.product.deleteMany(); - await prisma.user.deleteMany(); - }); - - afterAll(async () => { - await cleanDb(); - await disconnectDb(); - }); - - describe('POST /products', () => { - test('로그인 없이 요청하면 401을 반환한다', async () => { - const res = await request(app).post('/products').send({ - name: 'NoAuth', - description: 'x', - price: 100, - tags: [], - images: [], - }); - expect(res.status).toBe(401); - }); - - test('로그인 상태면 201과 상품 정보를 반환한다', async () => { - const agent = await registerAndLogin('owner@example.com', 'owner01'); - const res = await agent.post('/products').send({ - name: 'MyProduct', - description: 'desc', - price: 1000, - tags: ['t1'], - images: ['i1'], - }); - expect(res.status).toBe(201); - expect(res.body).toHaveProperty('id'); - expect(res.body).toHaveProperty('name', 'MyProduct'); - }); - }); - - describe('PATCH /products/:id', () => { - test('본인 상품이면 수정된다', async () => { - const agent = await registerAndLogin('owner2@example.com', 'owner02'); - const product = await prisma.product.create({ - data: { - name: 'Old', - description: 'old', - price: 1, - tags: [], - images: [], - user: { connect: { email: 'owner2@example.com' } }, - }, - }); - const res = await agent.patch(`/products/${product.id}`).send({ name: 'New' }); - expect(res.status).toBe(200); - expect(res.body.name).toBe('New'); - }); - - test('다른 사람 상품이면 403을 반환한다', async () => { - await prisma.user.create({ - data: { email: 'owner3@example.com', nickname: 'owner03', password: 'pw' }, - }); - const product = await prisma.product.create({ - data: { - name: 'Other', - description: 'x', - price: 1, - tags: [], - images: [], - user: { connect: { email: 'owner3@example.com' } }, - }, - }); - const agent = await registerAndLogin('user@example.com', 'user01'); - const res = await agent.patch(`/products/${product.id}`).send({ name: 'Nope' }); - expect(res.status).toBe(403); - }); - }); - - describe('DELETE /products/:id', () => { - test('본인 상품이면 삭제된다', async () => { - const agent = await registerAndLogin('owner4@example.com', 'owner04'); - const product = await prisma.product.create({ - data: { - name: 'DeleteMe', - description: 'x', - price: 1, - tags: [], - images: [], - user: { connect: { email: 'owner4@example.com' } }, - }, - }); - const res = await agent.delete(`/products/${product.id}`); - expect(res.status).toBe(204); - }); - - test('다른 사람 상품이면 403을 반환한다', async () => { - await prisma.user.create({ - data: { email: 'owner5@example.com', nickname: 'owner05', password: 'pw' }, - }); - const product = await prisma.product.create({ - data: { - name: 'Other', - description: 'x', - price: 1, - tags: [], - images: [], - user: { connect: { email: 'owner5@example.com' } }, - }, - }); - const agent = await registerAndLogin('user2@example.com', 'user02'); - const res = await agent.delete(`/products/${product.id}`); - expect(res.status).toBe(403); - }); - }); - - describe('POST /products/:id/comments', () => { - test('로그인 상태면 댓글이 등록된다', async () => { - const agent = await registerAndLogin('owner6@example.com', 'owner06'); - const product = await prisma.product.create({ - data: { - name: 'WithComment', - description: 'x', - price: 1, - tags: [], - images: [], - user: { connect: { email: 'owner6@example.com' } }, - }, - }); - - const res = await agent.post(`/products/${product.id}/comments`).send({ content: 'hello' }); - - expect(res.status).toBe(201); - expect(res.body).toHaveProperty('id'); - expect(res.body).toHaveProperty('content', 'hello'); - }); - }); - - describe('POST/DELETE /products/:id/like', () => { - test('좋아요 등록/취소가 동작한다', async () => { - const agent = await registerAndLogin('owner7@example.com', 'owner07'); - const product = await prisma.product.create({ - data: { - name: 'LikeMe', - description: 'x', - price: 1, - tags: [], - images: [], - user: { connect: { email: 'owner7@example.com' } }, - }, - }); - - const likeRes = await agent.post(`/products/${product.id}/like`); - expect(likeRes.status).toBe(200); - - const unlikeRes = await agent.delete(`/products/${product.id}/like`); - expect(unlikeRes.status).toBe(200); - }); - }); - - describe('GET /products/me', () => { - test('내가 등록한 상품 목록을 반환한다', async () => { - const agent = await registerAndLogin('owner8@example.com', 'owner08'); - const owner = await prisma.user.findUnique({ - where: { email: 'owner8@example.com' }, - select: { id: true }, - }); - if (!owner) { - throw new Error('Test user not found'); - } - await prisma.product.createMany({ - data: [ - { - name: 'Mine1', - description: 'x', - price: 1, - tags: [], - images: [], - userId: owner.id, - }, - { - name: 'Mine2', - description: 'x', - price: 2, - tags: [], - images: [], - userId: owner.id, - }, - ], - }); - - const res = await agent - .get('/products/me') - .query({ page: 1, pageSize: 10, orderBy: 'recent' }); - expect(res.status).toBe(200); - expect(res.body.totalCount).toBe(2); - expect(res.body.list).toHaveLength(2); - }); - }); - - describe('GET /products/me/likes', () => { - test('내가 좋아요한 상품 목록을 반환한다', async () => { - const agent = await registerAndLogin('owner9@example.com', 'owner09'); - const product = await prisma.product.create({ - data: { - name: 'Liked', - description: 'x', - price: 1, - tags: [], - images: [], - user: { - create: { email: 'seller@example.com', nickname: 'seller01', password: 'pw' }, - }, - }, - }); - - await agent.post(`/products/${product.id}/like`); - - const res = await agent - .get('/products/me/likes') - .query({ page: 1, pageSize: 10, orderBy: 'recent' }); - expect(res.status).toBe(200); - expect(res.body.totalCount).toBe(1); - expect(res.body.list).toHaveLength(1); - expect(res.body.list[0].id).toBe(product.id); - }); - }); -}); diff --git a/mission9-10/tests/products.public.test.ts b/mission9-10/tests/products.public.test.ts deleted file mode 100644 index f1aeffecc..000000000 --- a/mission9-10/tests/products.public.test.ts +++ /dev/null @@ -1,275 +0,0 @@ -import request from 'supertest'; -import app from '../src/app'; -import { prisma } from '../src/lib/prismaClient'; -import { createSeedUser } from './utils/createUser'; -import { cleanDb, disconnectDb } from './utils/cleanDb'; - -jest.mock('uuid', () => ({ - v4: () => 'test-uuid', -})); - -describe('인증이 필요하지 않은 상품 API 통합 테스트', () => { - let ownerId: number; - - beforeAll(async () => { - await cleanDb(); - const owner = await createSeedUser(); - ownerId = owner.id; - }); - - beforeEach(async () => { - await prisma.like.deleteMany(); - await prisma.comment.deleteMany(); - await prisma.product.deleteMany(); - }); - - afterAll(async () => { - await cleanDb(); - await disconnectDb(); - }); - - test('상품이 없을 때, { list: [], totalCount: 0 }을 반환한다', async () => { - const res = await request(app).get('/products'); - - expect(res.status).toBe(200); - expect(res.body).toEqual({ list: [], totalCount: 0 }); - }); - - test('여러 개의 상품이 있을 때, list/totalCount를 올바르게 반환한다', async () => { - await prisma.product.createMany({ - data: [ - { name: '상품1', price: 1000, description: '설명1', tags: [], images: [], userId: ownerId }, - { name: '상품2', price: 2000, description: '설명2', tags: [], images: [], userId: ownerId }, - ], - }); - - const res = await request(app) - .get('/products') - .query({ page: 1, pageSize: 10, orderBy: 'recent' }); - - expect(res.status).toBe(200); - expect(res.body.totalCount).toBe(2); - expect(res.body.list).toHaveLength(2); - expect(res.body.list[0]).toHaveProperty('likeCount'); - expect(res.body.list).toEqual( - expect.arrayContaining([ - expect.objectContaining({ name: '상품1', price: 1000, description: '설명1' }), - expect.objectContaining({ name: '상품2', price: 2000, description: '설명2' }), - ]), - ); - }); - - test('page/pageSize로 페이징이 된다', async () => { - await prisma.product.createMany({ - data: [ - { name: 'P1', price: 1, description: 'D1', tags: [], images: [], userId: ownerId }, - { name: 'P2', price: 2, description: 'D2', tags: [], images: [], userId: ownerId }, - { name: 'P3', price: 3, description: 'D3', tags: [], images: [], userId: ownerId }, - { name: 'P4', price: 4, description: 'D4', tags: [], images: [], userId: ownerId }, - { name: 'P5', price: 5, description: 'D5', tags: [], images: [], userId: ownerId }, - ], - }); - - const res1 = await request(app) - .get('/products') - .query({ page: 1, pageSize: 2, orderBy: 'recent' }); - expect(res1.status).toBe(200); - expect(res1.body.totalCount).toBe(5); - expect(res1.body.list).toHaveLength(2); - - const res2 = await request(app) - .get('/products') - .query({ page: 2, pageSize: 2, orderBy: 'recent' }); - expect(res2.status).toBe(200); - expect(res2.body.totalCount).toBe(5); - expect(res2.body.list).toHaveLength(2); - - const res3 = await request(app) - .get('/products') - .query({ page: 3, pageSize: 2, orderBy: 'recent' }); - expect(res3.status).toBe(200); - expect(res3.body.totalCount).toBe(5); - expect(res3.body.list).toHaveLength(1); - }); - - test('orderBy를 안 주면(기본) createdAt 오래된 순(오름차순)이다', async () => { - const oldOne = await prisma.product.create({ - data: { name: 'Old', price: 1, description: 'old', tags: [], images: [], userId: ownerId }, - }); - await new Promise((r) => setTimeout(r, 30)); - const newOne = await prisma.product.create({ - data: { name: 'New', price: 2, description: 'new', tags: [], images: [], userId: ownerId }, - }); - - const res = await request(app).get('/products').query({ page: 1, pageSize: 10 }); //orderBy 생략 - - expect(res.status).toBe(200); - expect(res.body.list[0].id).toBe(oldOne.id); - expect(res.body.list[1].id).toBe(newOne.id); - }); - - test("orderBy에 'asc' 같은 값은 허용되지 않아서 400을 반환한다", async () => { - const res = await request(app) - .get('/products') - .query({ page: 1, pageSize: 10, orderBy: 'asc' }); - - expect(res.status).toBe(400); - }); - - test('keyword 검색은 name/description/tags 중 하나라도 매칭되면 포함된다', async () => { - await prisma.product.createMany({ - data: [ - { - name: 'Apple', - price: 100, - description: 'fresh', - tags: ['fruitTagOnly'], - images: [], - userId: ownerId, - }, - { - name: 'Banana', - price: 200, - description: 'yellowDescOnly', - tags: ['tasty'], - images: [], - userId: ownerId, - }, - { - name: 'Car', - price: 300, - description: 'vehicle', - tags: ['transport'], - images: [], - userId: ownerId, - }, - ], - }); - - const r1 = await request(app) - .get('/products') - .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'App' }); - expect(r1.status).toBe(200); - expect(r1.body.totalCount).toBe(1); - expect(r1.body.list[0].name).toBe('Apple'); - - const r2 = await request(app) - .get('/products') - .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'yellowDescOnly' }); - expect(r2.status).toBe(200); - expect(r2.body.totalCount).toBe(1); - expect(r2.body.list[0].name).toBe('Banana'); - - const r3 = await request(app) - .get('/products') - .query({ page: 1, pageSize: 10, orderBy: 'recent', keyword: 'fruitTagOnly' }); - expect(r3.status).toBe(200); - expect(r3.body.totalCount).toBe(1); - expect(r3.body.list[0].name).toBe('Apple'); - }); - - test('공개 조회에서는 isLiked 필드가 내려오지 않는다(로그인 안 함)', async () => { - await prisma.product.create({ - data: { name: 'NoAuth', price: 10, description: 'x', tags: [], images: [], userId: ownerId }, - }); - - const res = await request(app) - .get('/products') - .query({ page: 1, pageSize: 10, orderBy: 'recent' }); - expect(res.status).toBe(200); - - // list 내 isLiked가 없어야 함 - for (const item of res.body.list) { - expect(item).not.toHaveProperty('isLiked'); - expect(item).toHaveProperty('likeCount'); - } - }); - - test('잘못된 쿼리(page가 숫자가 아님)는 400을 반환한다', async () => { - const res = await request(app).get('/products').query({ page: 'abc', pageSize: 10 }); - expect([400, 422]).toContain(res.status); - }); - - describe('GET /products/:id (공개 상세 조회)', () => { - test('ID로 상품 상세를 반환한다', async () => { - const product = await prisma.product.create({ - data: { - name: 'Detail', - description: 'Detail desc', - price: 123, - tags: [], - images: [], - userId: ownerId, - }, - }); - - const res = await request(app).get(`/products/${product.id}`); - - expect(res.status).toBe(200); - expect(res.body.name).toBe('Detail'); - expect(res.body.description).toBe('Detail desc'); - expect(res.body).toHaveProperty('likeCount'); - expect(res.body).not.toHaveProperty('isLiked'); - }); - - test('존재하지 않는 id면 404(또는 400)를 반환한다', async () => { - const res = await request(app).get('/products/999999999'); - expect([404, 400]).toContain(res.status); - }); - }); - - describe('GET /products/:id/comments (공개 댓글 목록 조회)', () => { - test('댓글이 없으면 빈 목록을 반환한다', async () => { - const product = await prisma.product.create({ - data: { - name: 'NoComment', - description: 'x', - price: 1, - tags: [], - images: [], - userId: ownerId, - }, - }); - - const res = await request(app) - .get(`/products/${product.id}/comments`) - .query({ cursor: 0, limit: 10 }); - - expect(res.status).toBe(200); - expect(res.body).toEqual({ list: [], nextCursor: null }); - }); - - test('cursor/limit로 페이지네이션이 된다', async () => { - const product = await prisma.product.create({ - data: { - name: 'WithComments', - description: 'x', - price: 1, - tags: [], - images: [], - userId: ownerId, - }, - }); - - const commenter = await prisma.user.create({ - data: { email: `c+${Date.now()}@ex.com`, nickname: `c_${Date.now()}`, password: 'pw' }, - }); - - await prisma.comment.createMany({ - data: [ - { content: 'c1', productId: product.id, userId: commenter.id }, - { content: 'c2', productId: product.id, userId: commenter.id }, - { content: 'c3', productId: product.id, userId: commenter.id }, - ], - }); - - const res = await request(app) - .get(`/products/${product.id}/comments`) - .query({ cursor: 0, limit: 2 }); - - expect(res.status).toBe(200); - expect(res.body.list).toHaveLength(2); - expect(res.body.nextCursor).toBeTruthy(); - }); - }); -}); diff --git a/mission9-10/tests/test.http b/mission9-10/tests/test.http deleted file mode 100644 index 82dfa1bf8..000000000 --- a/mission9-10/tests/test.http +++ /dev/null @@ -1,210 +0,0 @@ -### Article 목록 조회하기(좋아요 포함) -GET http://localhost:3000/articles/?page=1&pageSize=3&orderBy=recent&keyword=이것은 -Accept: application/json - -### 새로운 Article 만들기 -POST http://localhost:3000/articles -Content-Type: application/json - -{ - "title": "새로운 Article2 제목입니다.", - "content": "이것은 새로운 Article의 내용입니다.", - "image": "https://example.com/image.jpg" -} - -### 특정 ID의 Article 가져오기(좋아요 포함) -GET http://localhost:3000/articles/4 -Accept: application/json - -### Article 업데이트하기 -PATCH http://localhost:3000/articles/9 -Content-Type: application/json - -{ - "title": "Article 2 업데이트", - "content": "이것은 업데이트된 내용입니다." -} - -### Article 삭제하기 -DELETE http://localhost:3000/articles/9 -Accept: application/json - -### Article에 Comment 달기 테스트 -POST http://localhost:3000/articles/1/comments -Content-Type: application/json - -{ - "content": "이것은 Article에 대한 테스트 Comment입니다." -} - -### Article의 Comment 가져오기 테스트 -GET http://localhost:3000/articles/2/comments?limit=200 -Accept: application/json - -### Comment 업데이트 테스트 -PATCH http://localhost:3000/comments/6 -Content-Type: application/json - -{ - "content": "이것은 업데이트된 테스트 Comment입니다." -} - -### Comment 삭제 테스트 -DELETE http://localhost:3000/comments/7 -Accept: application/json - -### 새로운 Product 만들기 테스트 -POST http://localhost:3000/products -Content-Type: application/json - -{ - "name": "2025년 최신형 세탁기", - "description": "신상품입니다.", - "price": 2000000, - "tags": ["세탁기"], - "images": ["image1.png", "image2.png"] -} - -### 모든 Product 가져오기 테스트 -GET http://localhost:3000/products/?page=1&pageSize=10&orderBy=recent& -Accept: application/json - -### 특정 Product 조회 (좋아요 포함) -GET http://localhost:3000/products/4 -Accept: application/json - -### Product 업데이트하기 테스트 -PATCH http://localhost:3000/products/1 -Content-Type: application/json - -{ - "name": "업데이트된 테스트 Product", - "description": "이것은 업데이트된 테스트 Product 설명입니다.", - "price": 3000000, - "tags": ["업데이트", "Product"], - "images": ["업데이트된_image1.png"] -} - -### Product 삭제하기 테스트 -DELETE http://localhost:3000/products/60 -Accept: application/json - -### Product에 Comment 달기 테스트 -POST http://localhost:3000/products/1/comments -Content-Type: application/json - -{ - "content": "이것은 Product에 대한 테스트 Comment입니다." -} - -### Product의 Comment 가져오기 테스트 -GET http://localhost:3000/products/1/comments -Accept: application/json - - -### Comment 업데이트하기 테스트 -PATCH http://localhost:3000/comments/7 -Content-Type: application/json - -{ - "content": "이것은 업데이트된 테스트 Comment입니다." -} - -### Comment 삭제하기 테스트 -DELETE http://localhost:3000/comments/4 -Accept: application/json - -### 이미지 업로드 테스트(s3) -POST http://localhost:3000/images/upload -Content-Type: multipart/form-data; boundary=boundary - ---boundary -Content-Disposition: form-data; name="image"; filename="test.png" -Content-Type: image/png - -< ./test.png ---boundary-- - -### 사용자 등록 테스트 -POST http://localhost:3000/users/register -Content-Type: application/json - -{ - "email": "alstn7@gmail.com", - "password": "password123", - "nickname": "민수bingsu7" -} - -### 사용자 로그인 테스트 -POST http://localhost:3000/users/login -Content-Type: application/json - -{ - "email": "alstn6@gmail.com", - "password": "password123" -} - -### 사용자 로그아웃 테스트 -POST http://localhost:3000/users/logout - -### 사용자 정보 가져오기 테스트(최근 등록 상품 5개 포함, 최근 좋아요 상품 5개 포함) -GET http://localhost:3000/users/me -Accept: application/json - -### 사용자 정보 업데이트 테스트 -PATCH http://localhost:3000/users/me -Content-Type: application/json - -{ - "email": "chlalstn@gmail.com", - "nickname": "수정한닉네임", - "image": "https://example.com/newprofile.jpg" -} - -### 비밀번호 변경 테스트 -PATCH http://localhost:3000/users/me/password -Content-Type: application/json - -{ - "currentPassword": "password123", - "newPassword": "newpassword123" -} - -###refresh token 테스트 -POST http://localhost:3000/users/refresh - -###상품like 테스트 -POST http://localhost:3000/products/1/like -Accept: application/json - -###상품unlike 테스트 , 취소가 됐음에도 불구하고 다시 시도하는 경우 에러메세지(존재하지 않습니다) 변경 고려 -DELETE http://localhost:3000/products/35/like -Accept: application/json - -### Article like 테스트 -POST http://localhost:3000/articles/8/like -Accept: application/json - -### Article unlike 테스트 -DELETE http://localhost:3000/articles/8/like -Accept: application/json - -### 내가 좋아요한 product 목록 가져오기 테스트(상품이 꽤 많이 있을 경우 페이징 처리) -GET http://localhost:3000/products/me/likes/?page=1&pageSize=10&orderBy=recent -Accept: application/json - -### 내가 등록한 상품 목록 가져오기 테스트, &keword=세탁기(상품이 꽤 많이 있을 경우 페이징 처리, 키워드 검색 가능) -GET http://localhost:3000/products/me/?page=1&pageSize=10&orderBy=recent -Accept: application/json - -### 알림 목록 조회 테스트 -GET http://localhost:3000/notifications -Accept: application/json - -### 안 읽은 알림 개수 조회 테스트 -GET http://localhost:3000/notifications/unread-count -Accept: application/json - -### 알림 읽음 처리 테스트 -PATCH http://localhost:3000/notifications/6/read -Accept: application/json diff --git a/mission9-10/tests/test.js b/mission9-10/tests/test.js deleted file mode 100644 index 8cd82dc8c..000000000 --- a/mission9-10/tests/test.js +++ /dev/null @@ -1,68 +0,0 @@ -async function bulkArticleCreate() { - for (let i = 1; i <= 100; i++) { - await fetch(`http://localhost:3000/articles`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - title: `Article ${i}`, - content: `This is the content of article ${i}.`, - image: `https://example.com/image${i}.jpg`, - }), - }); - } -} - -async function bulkArticleCommentCreate(articleId) { - for (let i = 1; i <= 100; i++) { - await fetch(`http://localhost:3000/articles/${articleId}/comments`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - content: `This is the content of article ${articleId} comment${i}.`, - }), - }); - } -} - -async function bulkProductCreate() { - for (let i = 1; i <= 100; i++) { - await fetch(`http://localhost:3000/products`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - name: `Test Product ${i}`, - description: `This is a test product description ${i}.`, - price: 100, - tags: ['test', 'product'], - images: ['image1.png', 'image2.png'], - }), - }); - } -} - -async function bulkProductCommentCreate(productId) { - for (let i = 1; i <= 100; i++) { - await fetch(`http://localhost:3000/products/${productId}/comments`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - content: `This is the content of product ${productId} comment${i}.`, - }), - }); - } -} - -bulkArticleCreate(); -bulkArticleCommentCreate(1); -bulkArticleCommentCreate(2); -bulkProductCreate(); -bulkProductCommentCreate(1); -bulkProductCommentCreate(2); diff --git a/mission9-10/tests/test.png b/mission9-10/tests/test.png deleted file mode 100644 index 35a7b5616a6b18773cb64d62627874b0bde02271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6066 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 부모" 순서로 삭제해야 함 -// 스키마 기준: Like/Notification/Comment -> Product/Article -> User -export async function cleanDb() { - await prisma.like.deleteMany(); - await prisma.notification.deleteMany(); - await prisma.comment.deleteMany(); - await prisma.product.deleteMany(); - await prisma.article.deleteMany(); - await prisma.user.deleteMany(); -} -// 테스트 종료 시 prisma 연결 종료 -export async function disconnectDb() { - await prisma.$disconnect(); -} diff --git a/mission9-10/tests/utils/createUser.ts b/mission9-10/tests/utils/createUser.ts deleted file mode 100644 index 2a5f37cd0..000000000 --- a/mission9-10/tests/utils/createUser.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { prisma } from '../../src/lib/prismaClient'; - -export async function createSeedUser() { - const now = Date.now(); - return prisma.user.create({ - data: { - email: `seed+${now}@example.com`, - nickname: `seed_${now}`, - password: 'seed-password', - }, - }); -} diff --git a/mission9-10/tsconfig.build.json b/mission9-10/tsconfig.build.json deleted file mode 100644 index e4c703bb8..000000000 --- a/mission9-10/tsconfig.build.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "types": ["node"], - "rootDir": "./src", - "outDir": "./dist", - "noEmit": false - }, - "include": ["src"], - "exclude": ["tests", "node_modules", "dist"] -} diff --git a/mission9-10/tsconfig.json b/mission9-10/tsconfig.json deleted file mode 100644 index d9c28d604..000000000 --- a/mission9-10/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, - /* Modules */ - "module": "commonjs" /* Specify what module code is generated. */, - "rootDir": "." /* Allow src + tests in this tsconfig */, - "outDir": "./dist", - "baseUrl": ".", - "paths": { - "superstruct/src/*": ["node_modules/superstruct/dist/*"] - }, - "typeRoots": [ - "./types", - "./node_modules/@types" - ] /* Specify multiple folders that act like './node_modules/@types'. */, - "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, - "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, - /* Type Checking */ - "strict": true /* Enable all strict type-checking options. */, - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - }, - "include": ["src", "tests"], - "exclude": ["node_modules", "dist"] -} diff --git a/mission9-10/tsconfig.test.json b/mission9-10/tsconfig.test.json deleted file mode 100644 index fd329ed6a..000000000 --- a/mission9-10/tsconfig.test.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "types": ["jest", "node"], - "noEmit": true - }, - "include": ["tests", "src", "types"] -} diff --git a/mission9-10/types/article.d.ts b/mission9-10/types/article.d.ts deleted file mode 100644 index f57178922..000000000 --- a/mission9-10/types/article.d.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Prisma, Article, Comment } from '@prisma/client'; - -type ArticleLikesAndCount = Prisma.ArticleGetPayload<{ - include: { - _count: { - select: { - likes: true; - }; - }; - likes: { - select: { - id: true; - }; - }; - }; -}>; - -//db는 주방 냉장고, 클라이언트는 손님, dto는 서빙되는 접시(플레이팅된 요리) -//DTO 주방에서 재료를 꺼내 손님이 먹기 좋게 가공, 예쁜 그릇에 담은 상태 -//기술적인 의미로는 데이터베이스에 저장된 원본 데이터와 클라이언트가 실제로 받는 데이터의 모양이 다를때 dto사용 - -// DB/내부 모델을 ‘그대로’ 밖으로 내보내지 않고, -// 외부(프론트/외부 API)가 쓰기 좋은 모양으로 -// 한 번 가공해서 내보내는 역할을 하는 타입/객체 - -interface ArticleResponse extends Article { - likeCount: number; - isLiked?: boolean; -} - -interface ArticleListResponse { - list: ArticleResponse[]; - totalCount: number; -} diff --git a/mission9-10/types/cursorPaginated.d.ts b/mission9-10/types/cursorPaginated.d.ts deleted file mode 100644 index 1b168ea24..000000000 --- a/mission9-10/types/cursorPaginated.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type CursorPaginated = { - list: T[]; - nextCursor: number | null; -}; diff --git a/mission9-10/types/express.d.ts b/mission9-10/types/express.d.ts deleted file mode 100644 index 04e33bd43..000000000 --- a/mission9-10/types/express.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { User } from '@prisma/client'; - -declare global { - namespace Express { - interface Request { - user?: User; - } - } -} - -export {}; - -/*tsconfig에서 Include로 type경로를 지정해버리면 -실행 코드로 인식해버려 소스 코드가 되어버림, 심지어 d.ts 파일인데 import/export 구조 때문에 node가 실제 모듈처럼 취급하고 실행 경로에 영향을 줌. -실제 내가 사용하려고했던 글로벌 타입(확장)선언이 컴파일러 입장에서는 '타입이 아니고 실행모듈이네?'로 인식하게 된다는 것임. -결과적으로 내가 의도한 타입선언이 제대로 이루어지지 않은 것. -그래서 include를 제거하고 typeRoots : "./types" 해당 경로를 통하게 되면, 타입선언 전용으로만 참여하게 됨. => 정상작동*/ diff --git a/mission9-10/types/image.d.ts b/mission9-10/types/image.d.ts deleted file mode 100644 index 5045caa2d..000000000 --- a/mission9-10/types/image.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface uploadImageResponse { - url: string; -} diff --git a/mission9-10/types/like.d.ts b/mission9-10/types/like.d.ts deleted file mode 100644 index d2a0203d7..000000000 --- a/mission9-10/types/like.d.ts +++ /dev/null @@ -1 +0,0 @@ -export type LikeTarget = { articleId: number } | { productId: number }; diff --git a/mission9-10/types/multer.ts b/mission9-10/types/multer.ts deleted file mode 100644 index 6c52fe127..000000000 --- a/mission9-10/types/multer.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Request } from 'express'; - -export type MulterRequest = Request & { - file?: { - filename?: string; - buffer?: Buffer; - originalname?: string; - mimetype?: string; - }; -}; diff --git a/mission9-10/types/product.d.ts b/mission9-10/types/product.d.ts deleted file mode 100644 index 4d483852f..000000000 --- a/mission9-10/types/product.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Prisma, Product } from '@prisma/client'; - -type ProductLikesAndCount = Prisma.ProductGetPayload<{ - include: { - _count: { - select: { - likes: true; - }; - }; - likes: { - select: { - id: true; - }; - }; - }; -}>; - -type ProductRecentType = 'myUploaded' | 'myliked'; - -interface ProductResponse extends Product { - likeCount: number; - isLiked?: boolean; -} - -interface ProductListResponse { - list: ProductResponse[]; - totalCount: number; -} diff --git a/mission9-10/types/user.d.ts b/mission9-10/types/user.d.ts deleted file mode 100644 index 57314d2c5..000000000 --- a/mission9-10/types/user.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface ProfileResponse { - user: Omit; - myProducts: { - list: ProductResponse[]; - totalCount: number; - }; - myLikedProducts: { - list: ProductResponse[]; - totalCount: number; - }; -} From ee4d75e9a5891a52b9984261bec776b27212b9fa Mon Sep 17 00:00:00 2001 From: Minsoo Choi Date: Thu, 12 Feb 2026 23:04:46 +0900 Subject: [PATCH 08/17] sprint11 --- mission9-10-11/coverage/index.html | 2 +- mission9-10-11/coverage/src/app.ts.html | 2 +- .../coverage/src/controllers/articlesController.ts.html | 2 +- .../coverage/src/controllers/commentsController.ts.html | 2 +- mission9-10-11/coverage/src/controllers/index.html | 2 +- .../src/controllers/notificationController.ts.html | 2 +- .../coverage/src/controllers/productsController.ts.html | 2 +- .../coverage/src/controllers/usersController.ts.html | 2 +- mission9-10-11/coverage/src/index.html | 2 +- .../coverage/src/repositories/articleRepository.ts.html | 2 +- .../coverage/src/repositories/commentRepository.ts.html | 2 +- mission9-10-11/coverage/src/repositories/index.html | 2 +- .../coverage/src/repositories/likeRepository.ts.html | 2 +- .../src/repositories/notificationRepository.ts.html | 2 +- .../coverage/src/repositories/productRepository.ts.html | 2 +- .../coverage/src/repositories/userRepository.ts.html | 2 +- .../coverage/src/routers/articlesRouter.ts.html | 2 +- .../coverage/src/routers/commentsRouter.ts.html | 2 +- mission9-10-11/coverage/src/routers/imagesRouter.ts.html | 2 +- mission9-10-11/coverage/src/routers/index.html | 2 +- .../coverage/src/routers/notificationRouter.ts.html | 2 +- .../coverage/src/routers/productsRouter.ts.html | 2 +- mission9-10-11/coverage/src/routers/usersRouter.ts.html | 2 +- .../coverage/src/services/articleService.ts.html | 2 +- .../coverage/src/services/commentService.ts.html | 2 +- mission9-10-11/coverage/src/services/index.html | 2 +- .../coverage/src/services/notificationService.ts.html | 2 +- .../coverage/src/services/productService.ts.html | 2 +- mission9-10-11/coverage/src/services/userService.ts.html | 2 +- mission9-10-11/package-lock.json | 8 ++++---- mission9-10-11/package.json | 2 +- 31 files changed, 34 insertions(+), 34 deletions(-) diff --git a/mission9-10-11/coverage/index.html b/mission9-10-11/coverage/index.html index 962d11869..86bf3c5c7 100644 --- a/mission9-10-11/coverage/index.html +++ b/mission9-10-11/coverage/index.html @@ -161,7 +161,7 @@

All files

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 KfigaApZ@_FWqlg} diff --git a/mission9-10/infra/rds/secure-gruop-outbound.png b/mission9-10/infra/rds/secure-gruop-outbound.png deleted file mode 100644 index cb4e3aafe32b3f0666b1cd002df8046cf686e96d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91869 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ģzY`JJxyq6a1CJT0J9hGYjs09=pG@0>14x2dq{AA~ zW=01uDq|@DH%6_-O7WoV%H^gx^O4n<$0-FlL@X-WaG<>eKc zeQ~EsjhmFeA*b>H6=b5rju!_3DSHTThu~O7b}(6kKQp{3Kezwx0!grU_xFi|z9#7S z`1DCi^zB*RK>A=`?&Ztw%|xqKnIQK*#CvxD?xFH|80u!lO{FO_T>Xi)W}dG?){$j6 z5I=62bR!HS><^C>d$B#3AAkM_eg{v3Ke#fz%p7_=V%@*#fS;(5F*luT$cBJ|N{oMoF@NXFtl#`K9_*Rc$@(kP zuYhu)FV(>{?Tl0H#P|!Rivni93X7fU|04EipeKl$(>Yy6(iGP@;*dEP3`JlcwHPQn z=_l?W&h@4OY6#~x%@r3`nN0V9YJn(+rtw$g-%%7nQu7nKB$~{D7@*@s`f+@7B9Dvw z+#J0s{AcVV?|`aug!|

($55_Mro>f=e---bDdgw3g2h6}{|<}m#>F4`RUWrQEE5Y+>P zjG207#XD=YRR&8h1ZF*`*5_K`_+E3{`sJZdW>@h)aQY z`t%M94Cmw)3RL##C+ze)U}KKn%#^}-TO0*j0?{jxx&-A zKV1!?`Eg(Uyz|=PS%9F#!@2ju(v()2YHnEOT=|`oJ*atE+Wf)raTpHad&y3D-0O$c z0!ke?o}6ELbO57X`^B-_^#6Qj9L%VZ{?!x1}ov}k4uqnU*FO`#1{QVQW^hIjrw3K%Z&P! z`D|JIkE4WR$Iz3})lAX~i=KODYQn4sNh2llWWf__)LGwczXvU!cTVd7L)_=3Xdjkl zbq9ZrDA)?Wc3aIGl|*==E$r&AiRukIEz>?9uO6F(_;?UjIDZuIHz#_Mv>x*&zvo$$ z!A?8VNUPJ4u)r*Bx6M=#Mc!jY_$^}5J$PN?$xac-jxs<{432Njqj%d!>>w*C%2AJc z+;yHXbL|$fhKvtx2KH0m7ruLyYyFVGH)jtEf@r|@S#|q7r#^PLVgc>12{YdQtZ>(S zLDW$(|71KJd?Pb0FZL5lMpq&;F-hE|zy@zY7H?R`@$|2`RUgHRm>xRwtU<})>IcKf zsp16q5JYjAuT!SpKe6M+$DnGUj~8Fc<{E$ke4L;?qB#6Odkx_Zul+roDY5lj z@6&bWrJXts%M)l(8%Aw$-$gT(ercklJD zuHaIul*P_EEHl@L3bcugyy+|Rgi{+ij*ESeUZkKyS5aHu5f-dLq%VGrmpvRYY2Pv@ z#I2JX0>!w?hRZUPa6d#|v>Ne?{u~bf$qnNEV&XpFtf5B2`c40l-z7#fgP^_N-HKaO zKcJQsfZ5_nFs6LWyE|U+)Z6p87rFGz^#u$Uv*YaUy?gJz%giga-DzMDXsAk;pqTP- zy8racs2AvD?-6-u*cR3f-dbN-X&%mj0o9$&qFc97D)}^7g~AZL>35S=H4h~J^vm*e5UP<^FgUs^=q(;8 zYImVa|J(f`BPyZ1fw73dZek22ih$<|3JP39jC{nF|G1+Nio!?< zyJPr%2{Y0s^W&*YARKOUsQpB3$$l(1ksSwvxL4x+que357ES#v%U@IMBB(Ih-%|zh z?)e4oXkRVRjRl3>`QGS!L-o?*81x-S(n)4`$!X}5urQTB4@(v?x3fgm3E7E81|#E_ zS0F{@{`4?_aWgT9rB2~-LcPQj#Df@4) z{s>7zk`tRG)!Mwo`$3UUn@EDTK>ZL|o_V9}a&>k>O$ZBuA~4;fi^boIKkV(FKA{rC zWXBa&%)rhPJ}G!X{1&GR$pymnmKkFI{(gvwM%AolprT!zwlAGp?~*P*RRYNutzN7vizw{IVV{-C0AUiemBNc>?nO17pgbY}t4m+I#61+Nki z5g%vatf5b6Y>~#s*8!gk9y*7BANt)}JW%ixw|#rw z6aWkAUqqhGvcb|QG3qZbJ}9^7f#1&lJpa_@Sic#3`C1}OqDg#hS#FtmjAD~uZ*fATGk92T$2zW zSRfE2xCD0(?(PuW-CcsaOK^90_k+8;>p_A~bKjeJIybXstyyzc|2WdUPjzkST~%Lw zCDtwReuIZ^MqGOj^u2X~D&El9kb8dni0F>rPQWBlg_Dbm*YYc-Jp7LVGkYq}5Af@s z1Eh@<3p(@YXzD+zXO(6#ICZ2s4xzH)yv@#PRS_GaQ_0P`WiE`|`1I|h)XZ>K<+jV+ z1;Q_jSg&V)f-SlnmKAf`s7cv3C4n??o#xUQs|!rMZJY*kLbytaiTFR+hpdUL0D zDaC#7_Ux74L4aoA_R+)haUmO(OWzMmYiAujgqN{wjX_Cd39#%$s?x{WU+7l0YkSw^^){d|7hesIv`?4jzMYu}W|BJl1BBdj33KXx52NV|SLyL!A-Czx}AV~^nY zlX>tik@3zh5O=6+30cS5?6=z3^&P7v`oQR3e>Sl&&O98HQ(Azdpc9Ipdl)s|x9kAa zsd3z??YT7%aj-v6B)}6A1kVsG%_7M!+-mrhW*x5y7GK6M4Z=UCE4)P`yb9PC=n$9| zvar^hK3<%I%i9M4TImJj*)K&v?dILQDp5Tpd?=%&5y>&Fh7J+|AICS*J!!IWXxXyu z&$}s~uFVF_nw3|%A%Yla{Wz>vXN zw(JVXkH}X!SdM(nWqa%bxJx>Lv}`Pzj;%)M$P2rd)Z+DoxC|8%T3MKp)v#G845mB7 zaj)jfobqxM1+)TVv7S8PwCkcVYW1>%$99h+g8)oIDx=?@?q3eiXcg_)&Kr+Bnq|NR zF=-S7?H4yoLQVo9Ub4Brw-Jz!yyx2+VA+MEfxK?UTSiJ~o1;6r%ZZLwbbjt(c`v(oEIW?18n?k6g{`%kvLJJ>QjAuK zu6dHV(?{){X&|T6QFZ{8UzvMQUuWdHKaWLg_+sA8+0@(*d@h@LkWIVmu#7LSc+hWf z-;!l6JWS|5n&YZNN^rD|CLEI$L3nWZM8mFk*pE8-%J6n8hPvYaY@X9u)Y3+Sp#dP}%qUObytVC!Ll1N;TYL-R(XBBx`h$PKt*OI_D>3Nhh$~9lf49ocgr^ z5wq}6d9vg<01%)_DgBlM{G~s@3m)Ist);+#%O&ZPyF()wZxhu|UUiiy5_c>D8J8s& zs>SRs#12dgrPJRMcdM#w$&DjQ^NV@J1W6O!*_@+ zft0s5VT)FYtMS(OuN7zYfxc-8XS>yV2tOf>t*}i`0&KEa= z+{6RVREW+?xk`*?twyqZKhoh{Trz6W{oZidr`!%O!UK(c+zF`gtiNg*WL@Gk@Ahag zO6?8?JZwVeRl6rHItdq?x0uQ$l`ov-!^G|+m7{~LosB+Dg|tpGP7EjHwB~ z;0et}+0WX^&KCvR=<8%(PtnGK+XP$|vg+=sgt4ceA$pYV*NfldJTyrTQBdTJ^rcmGWBpPu9j*G0D zp${CNL6j{qVh}3!LfUdnHjBwT=yxDY3@-kS`efJ#^}efW=oLOBdjdAzjBz2 zYr|0|p=+eF4;sJf?p(Nop^};nmEn-*N`Zh4|KfKPk0iP_oKNcKK^M?_h_NH`9-N?s z=g>JhPrrs#Xb~@H5keLWFBWdyrK#5s|2S-DAf&v%FnsIvIvqheM5#HA>C`|2 zC681_keJ${Fyu;`Itu4uCA^e z{orT}#qU(MlvRxX2Lcg6?g165#l)gdM3=y5LZ=9SyQbq#EYoG?P-WFVfNPkZtxV)E z+5yB{AO;lV`q;qyx3+=hEa{DZGFA3g$Uj&4>#vcVkbn)*A7L8v-|Fw*f5{X7s>}b+ z!opP5-!G^&0}BAa+e92prO1&PM*2x4w)a=UK!^e*6vY_d-*4Kg4j$TH8Y(K!qt)f| zfndsD?obtDN^b zku*uk0JdpKdlPsEF)Ao1h@tKY@(wJX#g_#!^D@AXI%vS@l0$h^9_Ei2C?+D(mvD1_ zZdGnj(Yn_k7Gtf~CsLZsG-ZyuyBSgp5zsPA9|ok;w^22uQqbZnBvbXL|>cKK_C=KZF!Bts1rw2Q%_S3>VkU z2>@JaXW*kheOm;>$(Z)jF*O2>hD!2{vrLFmLB>H*RrOlZin4yL(4=(_Bl+CprCqV% zZnIdu4GQS%+M`%E{oCRnN(vM6I35vuc9aIzLf6z#IX62mh)yTf&K%IoUq2uP@kl#O z6E3S{rZa+C``Ek##B9s@fpyHgTKr9#S_Ics=0&RSKqT;FX?r|;+3wHqyjhB5w``YK zthII?Tj&Bxr$jfOwa&Sf$TmhVJDw2+hXqf#cDY4IMiQ<843X{6H!0t!0U+h&{P~7# zlbx~L?)G5J2@)E{rPi z)DKdcP6uBc@z5HZHQg#>DHMi+*83v}5?)m!wjo)dkJe*V&PwAHGj9*=c^mC5O>}LSLV)bd=9Y7J(8eKpBfOJmr z;v!}_cuI{mU+#t@>5qvRsItUQFb9(+J(bOG!m>JZsLVdz7fGRH35pN;JGPVc4$V%2 znFS=%IEaSZ-DR0a??>$PmCoD}-%h~pz47FcGr3|`87nI4*~;&|li@1& zXH=sim6BT|G&qE;U8G}{ViE|90YT{3(68})rZ?3r=;0OBF#G`vdxDUQtJ9K99UzF@ zR+5VI+#Rt$lTr8A&3yBQ`ax8HR~~RXx;A;PJ=e?FEH&3ZHfwty z9Cz&RC8XP~bUblANr59371;#{_d5)qIMu`i;;rTagB8E24P0!Mfmqx;6xg@Mc@t9I zejvR2n%N}@ZP<*gNih$~U@#omAQsNC?U$r?+5U=6`!kY+l(cF1F8O?}Z+~)v{&*vB zCusJmJAzyEVzYO|BiwTr8#|IhStp~}@rd+jwmbnqGZiJqNEIoRZmw?krm>|QY(#|7 zBP}D+C!Wty?-eCzxD@gr`S|C#yvJjY{|tUkJEK-qSc2j`Igjc-bxs8~Sa6z-z z=6Z5pp2*-`N`Hli$K%Wt4a!Au6Zr-pMLj*-8aeM-G@Pm$TTcjjcoJ8&Kxm+Uekj=J zzGB(V0SaA8Ih-vJzaL6S(CZIxEXFJFac4)a1)^wNcUxoF(K&M)I7~(2TS8&mwFz2L z-nYo~M`|AcQcRoIiI~u_JDOq;wL9qt6v#>3GIz^>Zu-rO*U`QZ)g3DNN=R{BKdMQFU!By)a24`{5Z+uS;T0T^h|EZrO=ZVl6%57~7mvNeGt7 zTos>p9M3lVA3^u zaru3gecEi!y)ob)z1e)`*T~Ot>V-8_A$*}I3X*BjYW(kyaplfz)4 ziAxigLLI+SR7%Ox!u2+8KJ|Re6QuZxO#6E(W9%xD-};Co&x5Scb%(gh@#K@r#foyU z@wf`1&^x%WNPmJA8dt@qT)z0DRWvAm%G$VSz&PU%4Fw}45XCEC|+LA;KPVqCey5C1N3BJv3u$ahTqRE&Wcn*L^`X*oD!sjZ^`Qx^#V-?JYs)fYGTdl7U{8t--jK!k zeg>au`!w73l=CBrevviqwg{2p$xh!6m^ za04qTYVIB~OEL&1|7{3)$qT^YMiGX?94W!pbdQZ^jP!7rV!1tq${o2{zkGb^cQkpY zi^u6w`i@*y04A8^+Tm{2sh2Pmi)~ahDRPwo%D%I>$2co1OXz2zMseQA^8-QS(aqB6 z*BN2q@Ypa-{AaGDM28yD2Zxi9`|4*d&X9+lInn`_69E9umBsPc{=&*a_LHTn(EVZM z_BHry5I_3hn9gxA|FcoyuI10=aKPHRFn(MzlgYjvm%H|IWFCsAdCSx6^F4p6lo02I zpV?a5N=Zs=EXhifgTh3ye8ZvcGkvlhcs6y0 zejSl)K6V(2qae{Elp$r5ik;Y+=N({hT^+0zj+fkx$s*`Ru7R^zORJuOFqX^xVt&B2MYY z6UeinjyK0UVLX%QmK`hUexui^zqEc(?aTz%m}H&M%bVP(lX_z9(8K+Hpkx7{wYgnu z6i?Dqb+L@l~%zI$*Df60)EJtbg}&p|JyE$hF|7%!^0ms|%>SVEY-<-?B&P7}4#KBn2W6 z;vs8gnlSvMHGAB4iwTwvxyK5qD3r-&sdvFwAKT>*wb;e-xa})dzO=j8*RMlI2aQ8 zGtYLbws79xEZd@vw@`Ubrc#2>RiQy?IMAE@61|v!5_NaBLM$_*mUu@=8Wsh`u9$Q` z#C$-c6J;>+*pNE~T^<<;Iq4F_b#~-_u*`Db%&99quvDky#v+6u+*gDK4iPB&3PZQM z9zK&N`C$1H;7@NaZ_4WMv%SXi$_PH9NE<8ZmgmNGLYP0Sz~`)N#yulng@9l^ZmQ<& zmuwXUM+hV2VEoSISTRdJrIC?*%f9NCbB)fu@v1{oz2m2tbJ(h^hD{dgNY6EFZH^c; zw$fFF?wt&H_nmdgxi*$|bDwwA_{7zk4U)f)>R5hngbZ$lCcdRf*9+V-*ohb$WPW%P2`Cgb^}sTv~Q z(p&zu=Fg7d;62{pBI_s@FLz^*Z_l@v!S*whND~T1#i=?hD%s^!ewbeZMfr;tjMuIn ze{S)VYTmIEe5P28&|5wrGE4w-I${ibkK#QwV^9->B(eGckJM;c5q=Y@(78xw;rI^!RN>YjbrHMW+#RH(+8@mww8UsC70R?GC!q?>qFo}{ z$I__Hj^LD}GokgMQ5$*3Q)+>j*5YsHgle#eq)J45uRnaV4x1J%!?u&>`@xSpUI@1V zfSBWVdEXfj*{Prs`GtlqVH>geS1nObBhTH+;9MegO^_h7?u`Ozkza3@-RsR(s|4{~ zu4Ehw2rUg*BVPCU@Ps`iNJJ7a|>&f`tXLd1j$5$8p~< zDOqlh$S`Mo!4+)hns%ziAHIzWTW-v? zy>!0U&5S=q4TGi^e{*+ih3d~siyh3Ee$6&UGiCtn-#Y~e#rWa7fqIFQ^=mH07YMf_ z;KZ2Q#4lHl1vy;hB>P@(LKr*ka#AzQTi0(`YW3RN%pQ;Q7IKMt5Q>c6BBd?D5x_37 zo#CD&QkUt9V8TaOb4Db?;J=`mAR4k|ozS~Wa<&*%BcRhcguj~xJ?btl;MN~Ig58uV zd&6YQ7Ty~=%U}P3-k6lk`Sdn7DJW`^usHxo9C78RyACs$`q#B(=G;>q_qQoiw zndEMq3p1}&`K~GN(=*ZbVsI=8@`=LW$WmPgQ_$}n_Y6@{|Pxyw6O?ql2PYWnyb$9MIMCFps7dtQobq=&uw!?6cj5#Fpjk+437tgN->!e3Ye+`=rgX#_0IVE2g3oWv)j^_1tc(pZIZas`;(yYzC zNW@p2mKk-ZCxS~%4whj2f@x#4KJ-?g$)64CGaA(e&mx+(sBjEpPExV$Nghy0!a#_F zS(Q_1GJKLeQwJRlC(E_IEN^57N7uAZ%X1LdvfZ4E{e|cet0w~>*Tu1h9Uc!3O#Mca z;{w)R1!9)umhBJe0hLMN5f=O(F+$HDEbnYsqX8#9cXn{}m+XIB_po{pbTB&6uou0j#Ju~sJ!7TvOlq@bZJ~B zxqUfyeXczWvsG(&cbE7u5mR8*o-8wlkC%2fDvLFx^!slNaT3IpYK> zFu?D!iz!7i0M1jN=#Jdv?%ZC%Z=qN}u1#h_|Ii70;zr`WnIqZ0s&Z~!9dA*Hqg0qi zsm4%Uy?z6Z(nQ_B{)wzZk}+Yb@Z}qe*)*_I5=>7fh0ekIq9Mqs+sAd6(c)puL zZ#zo`zNk&mWbR^Z`9QeXz4TU-d*A^kBGnoP$98}HAuRDZ#096z6+<)kqnq?^0c*Mb z(-l{<8RJ!Jjqp&rIMHe^0+9|>?~wQE#D*J!yJK!?TFCQSh zpC85p@nva*=9pN>&geFH!`HIM+8!ZO055eJDOyq592`*qt-2(?1?K#8ROw2imJ5gD z{qvy8tYn~IV>%{huUBl205R9RjWFtQym9toV#GdeoBpyc`BX#7fdI-k)kV9{-BTT^ zt)@Z)KDTG~uGRB*A2-%=Zozrkp4U<|DGP$r-7t!`hdM6!>GN=<2CvCvWk898{?B$9GbXxX!UINnpz^^s6ZbVA-bE6invFmM!d)Ha(X ziK|{iUXVD5w^_j~e*16oYBKet?6ay-1a&%X=R zgJU+gb9Ee`cXHmDv!#*d|IQ1Sr?%^Mz!eCok+1{$1{gg?UN6;pQ_tFq5>zTx@}wRY zjZXuP7;p%XK`>z;dcXBQJ9FeX@yDi97Jdgl4cdY@TI|*O2c8yDu))VPv(nnLCv*@H@RmSuHnJ zvyqUpYtS`G$PWryu0oFT(7@;>NWTXGp4`tbBWc+iPK(%Msn6~YIhZE*H>dszHOKwC zoROZw3RXTu8Na5^X@gF51z2s4&1Ng~+eWl-WE5O&cI$K#rA=9f_gimVc!Q4N!SVR4#Q;C<4hxX9L+&Op`r`w?#cHw zhKtQ*GCa|-j*>-!xI`wVFRYb0c+Rz4`8$~7iSku2Q8oQoz2dun_pH< z9gtbg>+A&i*-|<1=0pOeOaX`OL&4$AlI{_(;g1T2HOPRIj9vl-X!>zv7Yd{M?9te|$Y#vj69; zR3GO3k|4472!@Cxmx&@gvc$vEX(_(eUP66UsxV|HpEf|~OfSs|B2rW=ljpUVrX32y zWsY@yi^NDoX?ux}iGRH_oG^u!W;)|)Ygj?3%RZ(D>8dmqKe-sSd|k*|WjF+lm-`Z& zg|5+@mh(x}>K9{r(4hwBveW$hovR`!`p@XEQDL~Rk_<%2skbtP=_6mE&ajt)J3qD~HfD$%Qc;Q_e^QI0G5<$YlLLl*H6{raZSx``1H~>VMibnD(HY z%={FtM%m%aPB1IwDU7pxp3}p4_<1l8bHuvBx=&cPQNxn>N^s8Hh@*@U=N>1-egn@E z$1idGf%3)({-OF$Yqw)uQjowrvPzyZ>j(T;m?LHx) zqNs9n=TNLv{EX$H`M7wZ(Du#{e*4BF6|yeNZHyICgyM8mEY2pZT-z+W=sl^;RqBWTulvNwbdNybwr^ghjI$A7s9EoEsgC;C?ad z^3`FaoaG1MeT-i2-hvwRNF(YS=|XxY`hkmdv~&%454C%eeBYuX@O|qD|M`DR`~sa^pA)vsjm4iNkt&b_8PLDPke3oB?%P1+p|czG04@j`ZPNz8TH!K9 z?0{+7z7n**w6SwoNv`N=&Obte-FzdBqz>HafY848n--eLW&FmUfPpVdQQIVA7}`7% zx;^$aP*8cW3X-UEG0J^OzTwZH8&ztuWiK^iSWq-(zq&6h05E$9))UULLRZocjU~Qs z`J|}sK>ghNZXu7TlA^8wp=zllB9r0ZfhUMLv614urp5910g2Y13pC`lxogh@U|X1tGgC_dg#c4=%b8M8%ekL#B@%%5`)&N!LZEfEZOwcOL?i=mk3?R^(AV z?k6^s7YUf+Ut!W)rc3@^8c%P?Md9nnRb0ok+n*GadHB0JqZN4IdnkT--~{1aqJXEiK=)t0Z3g0bWe+Xfs!>fTUbAyE)Ri{b=DM~WCSgeYAZ9N0htdvS6_Kz6?j-o zg^Y3KJ@l)uTcZEIhn6R$;jDin&hjw=zd7`b8nUsKAdqhq`@5`V>sB~}G-WY~w=Msh z%|270%9Ul?b$sYY<`Jhn!ZUb2XCeX#dHL8u>@7RFo0-Y6wm*F5HaK13I=J>n)3#$M zN@ob6Hmg~UZ?y+lq-zTLdKKup95x#fU4Li`Fd=2v=>UPpB0@Svgm(kwsM>lfeEup0 zFE^)4rW^s0dj>|SM}|nE#X6vK!>9YEE?f6I&ljV3n0wSgpXNd`DIgbI{;SGQMblzk zEVI$3+E-4MRw51qzNf?_&F4GQEthK-isCy9YO~cJyU!2hg;{aC*WTYIPL^nYjwUll zosoK4?)uVqR(U;o(do{t?SDz#+dgG+b_l z$fT&x%c|afp{C0(q=WCF^@#0fGm-Zbg@#Aozg`?VQfsDv!AbLM>HIv*vOkbJM*l^I&@HHT-B7MK87;R2wYVnH;GhM z)rJjt=WGD6uErLHt5oac_c*EG%bmHeA5;l0mk1j7?ULl2l*bGKZalTpOMc#t-tT4g7fEEIxPO${e}z=T6~ZHkf9h^5}*n{zGIWb23c8s9I@G2~RWLeQerJ5^Um#^KRZgfDiKDm{5R8 zw;&78^$fV2aq!bHy(7$z-U95@4l)QQ4(V_r)#X0JGa1bo6$OtXBJ3kI!O!rtzAzm47MXEgpK*(d&pLuR zS-X@xiS^E44ZfgPyMiP;pdN{j(QK`fe{+Wa?GGZ5+w~|*9;_3LPD-|LShRC;eHM@h zZfqj-u|9P1kAH};NCW43S#xesi2C_zr$>ige*nZ{y=D7_ED+R-2;oo3F)~@rNUAo< zUx)|uJ1p5RX*jYLPc5TjnVtrETwWHJV~0EOoUR;wP$|s{Aw=?)xx3t9B%9=VlAOy` zNgx0$+Dm*0C)&-Xu*kRu5Ky|THwZNF;$zB}kAlb4FHZN~H2%n*W7%#JkNfm6$Cp;F z(dNs6`|!6awel>6=SeGUN~PrUU;>lyN}zTku(lJ_3W|Tgm72((UIG9c9^=vmWI0&@ zb9V+q<+38+jE&@AE3@;e&ND_!HG_UAk%!k}Uo;uDiw;S#=sP`#mSP?XN3awJZB0n{+JT*)-?1v2!lC*BhU~1d<_FWP-s~NprL{=BU!L(rCzec6pXx@Q z7O6DZPreaP*EH7TF~+ND1=+Kv{!lo3 z?S2ypZ31#Nra6%nO8i+`rHkZa_w?8j2k!u8SDr|uRTntC#a7V@?&~t_LZ6{q*(x!) zYa|m>n{}R?!cx&SFc#93{`JexG&aJ@;k3LHO410Hv$nccjb0L3^0_OUtz4fvr6arM z6bVAiXJ8${Yi5$iTSQx`NC`-Bm9;(kp)gS%4}Sm)F=jl&wxYvjk$RD3>(FHE#OD8j z(jXk3vg^G}B`IIGbKJx-BTV-%N=v2bDCqZ0+B0mcMEx-+qIbW_WOVX>r;1o#cjpu@ z>j?>++~He$bS;b~~C<8N0uORZP`t*u`&RuNFwrs&HR*X2_7 zIZ!ruC~OpQIGnT(J8B?)%k}gX>gMRlZH5P*DhK&7Y&lQCw6Q^sYzoCrY&3~|4vqoM zD6&6?zxhVC%#2l~PS>AtQks^m2I+Vk{;UyVgfGH#OUp@;uz(QM6jsaiG=_bOK6~bQ zm37b|4D!)rS4{t|F#oDlmWobj7PtS=^(1VHC5~<)cl5L0Xy-7F01_P2xlPhd zzuiiI_$$1n`eWA+1HeRGLc6t_;*$K9HAnzEX|&LGaw~5)7${{I*eOHW4>9|;e~u}M zY4HvJ_d26~F1^J-<}N5$gOWQ_;;!OW@Tw~*#EnLMv&CrzYPNmzY##@^WV$p_0pP21 zi08?v)ahSlz{6ZHPspYykNJqL(x{uuxb}aOc3Dd zyUW-3Z{Tn}`(usRDU80I5*571Eo)wN3-AIj9+e%j`#q9|r3~Z(8M$kIx#BM|m0Nv- z{HPp+OxJ9xMe?zC8hoq8n1yrtd-gN(1uv`aFHqNAg+F0&Gvz+Tr>2%TBN!&0r<}tH zgfo~vY+-KOjZ*NA46r*|uFOVHHET?xc$dZb@%n^u`@{wZ_Raiw3g|AC)EmG^ z&}r)ISM*uyMc~2tOIp%t?P0-3^Uz{?k-1lsN-U4T%qP6a*YGB8@rV@c7$4>M^x z2S{izUZB6H88U^dP2ctJI+AzeH7aNFqv4mt**5h)SvxN;x$C_isng=0DNDO-a^OLI z7sNyxoAD5T)c7tdQ+t1;%yATs!TbeJV!m)`;fw8BBfl!@bC(}x^)Q<5P*Oc{HZ!3k z98%iRbvd3vG3^e&N>l`Ov{4Cp2}w^>fR2O15+)JsHWyv%iMlT!d_8M}|ny>NJ>Z>3H48EDz6 zJc}iD485lp@ra>n&Z>B z$WlM?*S4NB`!F5e)ikR*B|crqV{J(&@(YTzlsN66xaal%$}hdYaOMm=5(iv`xs|&v zkPJ102-WF3Cq{4~wA<2M!#Il&miVexXah=Ybv~A!lq-SBOosza$VZ@q)#c^t{Kqo9 z!e)o&ODgEa#KirN2PJ9c=~?lR8W}slLsK1^cCt|{ZV0E^Gp_OCybtE$K9KXVBHT?a zYUkq^oVlVX`>9fyYFwEu;*wvW6wGzQe3QLeG8)r<1&_rmA=(hiwd!C65p3DE>aJkV>fXh43IAV*V!%$pITcb18XGg@0&WCx|qFAb_ z$3e+CSDR6+R7?%9u|}DwqVgS-%pM(=C%c+nU?}}WR0}_QwRXS54#$%hx5uzUKA(V& znU&L_ZHOWKZv4rxIrdup$FJrLSM~0Rdv-d--lTQGh54bW-+P_fvwWsxie~0-o8(~R z9`1@z-}IaFDP%wlc+bFUhGM3c1tlBq`V9enqroL*eaHCxhFr0&%tib-A!oXUA>H87 zom!ov5AHo0-+I{AD7}eq{bf3My)w$}r`F;p!h0mm7B@~_l&DzZ)r?-SanPymBD#mw z14X&pXWgPgBMBnbkM+Eg__wF%oAyhKJja+e?SE9qYzaU;Mt;`5&H*;vEk!2}qASIL zgTJMo^NBV{^%MgF^ful-%f1zVPlZ7a(;Y&wR;oGYTR#eaeLQ$*?JLG$(mofKzLTUQ zvoq?f#}5lzJ?MGxK~I2{7CFC}2Bf#PScBqgr$6by?J0hym-Pn=G(Kp) z5TSq+mm2V10qd`a_xcxUa5OJYys>l>-k*!-WQ@{{28x;%O~3^{DS5FeTX-$8IH<<= z?2()A(m@qFtZB33BU(>y1VCQ5ogs@oJ!EE|9oQ~^q_1t*w)iffo2Wmx?K!=DG+#yd zb{-x~wJS!kYnkQ;6EzA{{)wNpOIo1>rpc(<)P}< zihUAT*wfuaKI;~n4rEi4IB zIuaFDbn_oM$~=%p89eE?1*{Juje>wUBWRf-G1#h9;{U*nTam(lx{YDH{b7+}|8F?% zjz&_Rs9kkWsAaBK{IGr)kI1azmg?W((E!%`3$R0JhHm`Fh5sC7uOIb_HTT&v`Fp#O z8n0M$@yMfplkwl<%m4j*o)52B^UvSQ{*fH}&zt^#Cai~lGA5an*mLCL!V1b9+5Z|0 z|GPKd9KvsK5NcvelC`o(zw9Kwqf(|VzP9E3w?6&XIq_c_7^sHM%;FIrEV_Gd5*-us zg^`i*|Kh@E6mex`WyPaCmw&FX*Iy%z;CcAH*M&+iKO8gdv2+a#)q==(G>RPTOIuBU*Bjb2bY>h6gSSJp2BLC7 zXTYYzNhAy)nE0=1Ia5$2rvThO5*sj`;tjW1~Ym^e#z>aq|{&&3VHu4*00BjHPXq;Ck&?B z@oxj!JCp2q^pTqL5RqC%o#qM}(= zTcRl$e^r^yHwZWe7{m{Zi^9svi2{DYBEWbP6`4=S)?}1?v+%*h%z%i9$OoEDM`y$E zEy4#Xk~@3+|AP!AAMXyJfXx?RqM{o_N29zJEZ)fhvB$*g@r@>#ksOi!eK@sOz%gutm^+en$C|CT*QNQ03n z9fQ@baEkd?0i@9~r7_=WVd9GZb?Lx*eWv_cqqq(Js{mi&9=V(2F0juf?DXCMFHu2B KfigaApZ@_FWqlg} literal 0 HcmV?d00001 diff --git a/mission9-10-11/infra/rds/secure-gruop-outbound.png b/mission9-10-11/infra/rds/secure-gruop-outbound.png new file mode 100644 index 0000000000000000000000000000000000000000..cb4e3aafe32b3f0666b1cd002df8046cf686e96d GIT binary patch literal 91869 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ģzY`JJxyq6a1CJT0J9hGYjs09=pG@0>14x2dq{AA~ zW=01uDq|@DH%6_-O7WoV%H^gx^O4n<$0-FlL@X-WaG<>eKc zeQ~EsjhmFeA*b>H6=b5rju!_3DSHTThu~O7b}(6kKQp{3Kezwx0!grU_xFi|z9#7S z`1DCi^zB*RK>A=`?&Ztw%|xqKnIQK*#CvxD?xFH|80u!lO{FO_T>Xi)W}dG?){$j6 z5I=62bR!HS><^C>d$B#3AAkM_eg{v3Ke#fz%p7_=V%@*#fS;(5F*luT$cBJ|N{oMoF@NXFtl#`K9_*Rc$@(kP zuYhu)FV(>{?Tl0H#P|!Rivni93X7fU|04EipeKl$(>Yy6(iGP@;*dEP3`JlcwHPQn z=_l?W&h@4OY6#~x%@r3`nN0V9YJn(+rtw$g-%%7nQu7nKB$~{D7@*@s`f+@7B9Dvw z+#J0s{AcVV?|`aug!|

-
-

All files / controllers articlesController.ts

-
- -
- 23.07% - Statements - 15/65 -
- - -
- 0% - Branches - 0/20 -
- - -
- 0% - Functions - 0/9 -
- - -
- 23.07% - Lines - 15/65 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -981x -1x -1x -1x -  -  -  -  -1x -  -1x -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  - 
import { create } from 'superstruct';
-import { UnauthorizedError } from '../lib/errors/customErrors';
-import { IdParamsStruct } from '../structs/commonStructs';
-import {
-  CreateArticleBodyStruct,
-  UpdateArticleBodyStruct,
-  GetArticleListParamsStruct,
-} from '../structs/articlesStructs';
-import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
-import { Request, Response } from 'express';
-import { articleService } from '../services/articleService';
- 
-//게시물 생성
-export async function createArticle(req: Request, res: Response) {
-  const { title, content, image } = create(req.body, CreateArticleBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const article = await articleService.createArticle(user.id, title, content, image);
-  return res.status(201).send(article);
-}
-// 게시글 조회(좋아요 포함)
-export async function getArticle(req: Request, res: Response) {
-  const { id } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  const article = await articleService.getArticle(id, user?.id);
-  return res.send(article);
-}
-//게시물 수정
-export async function updateArticle(req: Request, res: Response) {
-  const { id } = create(req.params, IdParamsStruct);
-  const data = create(req.body, UpdateArticleBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const updated = await articleService.updateArticle(id, user.id, data);
-  return res.send(updated);
-}
-//게시물 삭제
-export async function deleteArticle(req: Request, res: Response) {
-  const { id } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  await articleService.deleteArticle(id, user.id);
-  return res.status(204).send();
-}
- 
-//게시글 목록 조회(좋아요 포함)
-export async function getArticleList(req: Request, res: Response) {
-  const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct);
-  const user = req.user;
-  const articles = await articleService.getArticleList(page, pageSize, orderBy, keyword, user?.id);
-  return res.send(articles);
-}
-//댓글 등록
-export async function createComment(req: Request, res: Response) {
-  const { id: articleId } = create(req.params, IdParamsStruct);
-  const { content } = create(req.body, CreateCommentBodyStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const comment = await articleService.createComment(user.id, articleId, content);
-  return res.status(201).send(comment);
-}
-//댓글 목록 조회
-export async function getCommentList(req: Request, res: Response) {
-  const { id: articleId } = create(req.params, IdParamsStruct);
-  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
-  const commnetsList = await articleService.getCommentList(articleId, limit, cursor);
-  return res.send(commnetsList);
-}
-//게시글 좋아요 등록
-export async function likeArticle(req: Request, res: Response) {
-  const { id: articleId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const articleLike = await articleService.likeArticle(user.id, articleId);
-  return res.status(200).send(articleLike);
-}
- 
-//게시글 좋아요 취소
-export async function unlikeArticle(req: Request, res: Response) {
-  const { id: articleId } = create(req.params, IdParamsStruct);
-  const user = req.user;
-  if (!user) {
-    throw new UnauthorizedError();
-  }
-  const articleUnlike = await articleService.unlikeArticle(user.id, articleId);
-  return res.status(200).send(articleUnlike);
-}
- 
- -
-

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 KfigaApZ@_FWqlg} literal 0 HcmV?d00001 diff --git a/mission9-10/infra/rds/secure-gruop-outbound.png b/mission9-10/infra/rds/secure-gruop-outbound.png new file mode 100644 index 0000000000000000000000000000000000000000..cb4e3aafe32b3f0666b1cd002df8046cf686e96d GIT binary patch literal 91869 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ģzY`JJxyq6a1CJT0J9hGYjs09=pG@0>14x2dq{AA~ zW=01uDq|@DH%6_-O7WoV%H^gx^O4n<$0-FlL@X-WaG<>eKc zeQ~EsjhmFeA*b>H6=b5rju!_3DSHTThu~O7b}(6kKQp{3Kezwx0!grU_xFi|z9#7S z`1DCi^zB*RK>A=`?&Ztw%|xqKnIQK*#CvxD?xFH|80u!lO{FO_T>Xi)W}dG?){$j6 z5I=62bR!HS><^C>d$B#3AAkM_eg{v3Ke#fz%p7_=V%@*#fS;(5F*luT$cBJ|N{oMoF@NXFtl#`K9_*Rc$@(kP zuYhu)FV(>{?Tl0H#P|!Rivni93X7fU|04EipeKl$(>Yy6(iGP@;*dEP3`JlcwHPQn z=_l?W&h@4OY6#~x%@r3`nN0V9YJn(+rtw$g-%%7nQu7nKB$~{D7@*@s`f+@7B9Dvw z+#J0s{AcVV?|`aug!|