From d7f821a048fce6c5ef4481388e3f887c9c430070 Mon Sep 17 00:00:00 2001 From: "Francois G." Date: Fri, 3 Jul 2026 18:10:26 +0200 Subject: [PATCH] Added unit test coverage and PR-level CI - Added 24 spec files covering controllers (webhook signature verification, event routing), services (config, es/gh clients), bull processors, and all fetchNode payload processors (113 tests) - Vendored the @bit/zencrepes.zindexer tarballs in .yarn-offline-mirror since the bit.dev registry is gone, so fresh installs work again - Updated lint-test workflow to run on pull requests, pinned to node:22-alpine (matching the Dockerfile) with frozen lockfile installs - Added a util.isString shim for @nestjs/bull on Node >= 23 --- .github/workflows/lint-test.yml | 30 +-- .yarn-offline-mirror/.gitignore | 7 + .../zencrepes.zindexer.config-0.0.17.tgz | Bin 0 -> 9433 bytes .../zencrepes.zindexer.config-0.0.28.tgz | Bin 0 -> 9776 bytes .../zencrepes.zindexer.es-utils-0.0.14.tgz | Bin 0 -> 8760 bytes ...encrepes.zindexer.github-issues-0.0.21.tgz | Bin 0 -> 24996 bytes ...encrepes.zindexer.github-labels-0.0.15.tgz | Bin 0 -> 18101 bytes ...epes.zindexer.github-milestones-0.0.10.tgz | Bin 0 -> 18903 bytes ...crepes.zindexer.github-projects-0.0.11.tgz | Bin 0 -> 20092 bytes ...es.zindexer.github-pullrequests-0.0.18.tgz | Bin 0 -> 24212 bytes ...crepes.zindexer.github-releases-0.0.10.tgz | Bin 0 -> 18977 bytes ...zencrepes.zindexer.github-repos-0.0.18.tgz | Bin 0 -> 15433 bytes ...epes.zindexer.github-stargazers-0.0.10.tgz | Bin 0 -> 20127 bytes ...crepes.zindexer.github-watchers-0.0.10.tgz | Bin 0 -> 20285 bytes ...encrepes.zindexer.testing-perfs-0.0.32.tgz | Bin 0 -> 11448 bytes .../zencrepes.zindexer.testing-runs-0.0.3.tgz | Bin 0 -> 9148 bytes ...encrepes.zindexer.testing-states-0.0.5.tgz | Bin 0 -> 8822 bytes .yarnrc | 1 + package.json | 3 +- src/config.service.spec.ts | 96 ++++++++ src/esClient.service.spec.ts | 91 +++++++ src/ghClient.service.spec.ts | 126 ++++++++++ src/github/fetchNode/index.spec.ts | 87 +++++++ src/github/fetchNode/processIssue.spec.ts | 166 +++++++++++++ src/github/fetchNode/processLabel.spec.ts | 154 ++++++++++++ src/github/fetchNode/processMilestone.spec.ts | 145 +++++++++++ src/github/fetchNode/processProject.spec.ts | 226 ++++++++++++++++++ .../fetchNode/processPullrequest.spec.ts | 151 ++++++++++++ src/github/fetchNode/processRelease.spec.ts | 159 ++++++++++++ .../fetchNode/processRepository.spec.ts | 160 +++++++++++++ src/github/fetchNode/processStargazer.spec.ts | 181 ++++++++++++++ src/github/fetchNode/processWatcher.spec.ts | 181 ++++++++++++++ src/github/github.controller.spec.ts | 200 ++++++++++++++++ src/github/github.processor.spec.ts | 44 ++++ .../githubStorePayload.processor.spec.ts | 41 ++++ .../githubStoreRawPayload.processor.spec.ts | 41 ++++ src/github/storePayload/index.spec.ts | 63 +++++ src/github/storeRawPayload/index.spec.ts | 67 ++++++ src/perfs/perfs.controller.spec.ts | 68 ++++++ src/perfs/perfsStorePayload.processor.spec.ts | 140 +++++++++++ src/testing/cases/utils.spec.ts | 50 ++++ src/testing/testing.controller.spec.ts | 68 ++++++ .../testingStorePayload.processor.spec.ts | 161 +++++++++++++ test/jest.setup.js | 9 + yarn.lock | 60 ++--- 45 files changed, 2930 insertions(+), 46 deletions(-) create mode 100644 .yarn-offline-mirror/.gitignore create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.config-0.0.17.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.config-0.0.28.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.es-utils-0.0.14.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.github-issues-0.0.21.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.github-labels-0.0.15.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.github-milestones-0.0.10.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.github-projects-0.0.11.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.github-pullrequests-0.0.18.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.github-releases-0.0.10.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.github-repos-0.0.18.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.github-stargazers-0.0.10.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.github-watchers-0.0.10.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.testing-perfs-0.0.32.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.testing-runs-0.0.3.tgz create mode 100644 .yarn-offline-mirror/zencrepes.zindexer.testing-states-0.0.5.tgz create mode 100644 .yarnrc create mode 100644 src/config.service.spec.ts create mode 100644 src/esClient.service.spec.ts create mode 100644 src/ghClient.service.spec.ts create mode 100644 src/github/fetchNode/index.spec.ts create mode 100644 src/github/fetchNode/processIssue.spec.ts create mode 100644 src/github/fetchNode/processLabel.spec.ts create mode 100644 src/github/fetchNode/processMilestone.spec.ts create mode 100644 src/github/fetchNode/processProject.spec.ts create mode 100644 src/github/fetchNode/processPullrequest.spec.ts create mode 100644 src/github/fetchNode/processRelease.spec.ts create mode 100644 src/github/fetchNode/processRepository.spec.ts create mode 100644 src/github/fetchNode/processStargazer.spec.ts create mode 100644 src/github/fetchNode/processWatcher.spec.ts create mode 100644 src/github/github.controller.spec.ts create mode 100644 src/github/github.processor.spec.ts create mode 100644 src/github/githubStorePayload.processor.spec.ts create mode 100644 src/github/githubStoreRawPayload.processor.spec.ts create mode 100644 src/github/storePayload/index.spec.ts create mode 100644 src/github/storeRawPayload/index.spec.ts create mode 100644 src/perfs/perfs.controller.spec.ts create mode 100644 src/perfs/perfsStorePayload.processor.spec.ts create mode 100644 src/testing/cases/utils.spec.ts create mode 100644 src/testing/testing.controller.spec.ts create mode 100644 src/testing/testingStorePayload.processor.spec.ts create mode 100644 test/jest.setup.js diff --git a/.github/workflows/lint-test.yml b/.github/workflows/lint-test.yml index 6dac471..498d7d4 100644 --- a/.github/workflows/lint-test.yml +++ b/.github/workflows/lint-test.yml @@ -1,9 +1,10 @@ name: Lint and test -# This workflow is triggered on pushes to the repository. + on: + pull_request: push: branches: - - '**' + - master jobs: lint: @@ -11,11 +12,13 @@ jobs: runs-on: ubuntu-latest container: - image: node:alpine + # Node is pinned to 22 to match the runtime image (see Dockerfile); + # @nestjs/bull 0.1.x is incompatible with Node >= 23. + image: node:22-alpine steps: - - uses: actions/checkout@v2 - - run: yarn + - uses: actions/checkout@v4 + - run: yarn install --frozen-lockfile - run: yarn run lint:ci --max-warnings 1 tests: @@ -24,25 +27,22 @@ jobs: runs-on: ubuntu-latest container: - image: node:lts-alpine + image: node:22-alpine steps: - - uses: actions/checkout@v2 - - run: yarn - - run: yarn run test + - uses: actions/checkout@v4 + - run: yarn install --frozen-lockfile + - run: yarn run test:cov build: needs: [lint, tests] name: Build runs-on: ubuntu-latest - # if: github.event_name == 'push' && github.ref == 'refs/heads/master' container: - image: node:lts-alpine + image: node:22-alpine steps: - - uses: actions/checkout@v2 - - run: yarn - - run: npm install -g typescript@3.8.3 - - run: tsc --version + - uses: actions/checkout@v4 + - run: yarn install --frozen-lockfile - run: yarn run build diff --git a/.yarn-offline-mirror/.gitignore b/.yarn-offline-mirror/.gitignore new file mode 100644 index 0000000..8066f35 --- /dev/null +++ b/.yarn-offline-mirror/.gitignore @@ -0,0 +1,7 @@ +# Only the zencrepes.zindexer (bit.dev) tarballs are vendored: the bit.dev +# registry is gone, so they cannot be fetched anymore. Everything else is +# available from the npm registry and does not need to be committed, even +# though yarn copies every downloaded tarball into this mirror. +* +!.gitignore +!zencrepes.zindexer.*.tgz diff --git a/.yarn-offline-mirror/zencrepes.zindexer.config-0.0.17.tgz b/.yarn-offline-mirror/zencrepes.zindexer.config-0.0.17.tgz new file mode 100644 index 0000000000000000000000000000000000000000..abe296d9ed587a35b668bfad30988b90673e2e82 GIT binary patch literal 9433 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 literal 0 HcmV?d00001 diff --git a/.yarn-offline-mirror/zencrepes.zindexer.config-0.0.28.tgz b/.yarn-offline-mirror/zencrepes.zindexer.config-0.0.28.tgz new file mode 100644 index 0000000000000000000000000000000000000000..3a5b7166b7c34147074fed83edceb9b61732a406 GIT binary patch literal 9776 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 literal 0 HcmV?d00001 diff --git a/.yarn-offline-mirror/zencrepes.zindexer.github-labels-0.0.15.tgz b/.yarn-offline-mirror/zencrepes.zindexer.github-labels-0.0.15.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9daa3c75d9d3176032e020fdaa425de762148a2c GIT binary patch literal 18101 zcmZsCQ+Q@g({=1jY}>YN+qONiZQHq%Ol)J~WMWQiJDJ$`m*+kD5B`0!PxijLYt`!N zTGd@du`nS2Jz&5qe_v1h_C~9(<6l|MZV8w43j3c$37$7mDFj=?31)oHjwR+E|EQH6 zkgQIx33XgGcl?zedwjST?}>e_liRabDZ7Jhi$Kuf!mHj4x^Ds9Va;lV>GdWrPmg$7 zJu?v!XHei#eKtpt$R%N?wY~{LX-(Ts9qM7KWl^V}5z34lH=hw7$Akf+5@&Zi$P1!W zuq3^&fkc01*KT}wfO|)ty_q|YZ@pGbeZU&v$_?;iEtBbYz&{7zJJzhPQP0O>?Be#l z(DU!F`{!P)S)%|UnuJ8(@Av!u{=3lURm<~xGXSvTE`)S@;?wnIrkQ4?>~~aG-@JEp zh9nWYv)c2Oo%C@0W|dOm__;GS`>!L&P~}*MIqK556oYfvd@6$5k2}ay9a={EQA0qWPI7EZ?~9YO?wSrzi?-Kg$CaX zrM&si9|x_OC-4l9c4ebJo4$CvP!oK5VI=-EU$EjKUO35lX=w(QBS1A~^_)*z&wS~B zE*(;J<0rU!U45J~TOK}WtlbE7vo^CAfx%@4eyQU&8Vi+GS`~z{{TRM$$-y(z# z{2F?%v5m$?C3x#Q^w0VV2o;X7W4QFidS~fW9v@CGF9RPa7fic8KOZ-Q{0(>D zmFhPi0~0@ieAJWnUOFvRAoklp8nWv5KFa(r;O=uEmwV{5gl2Tw`LmIw>2&<03bug( zQc>8-qLv#y>(yL0w#y!mnNKf0;SDX5}12EnRoNf zl-E=tjmx$6*n0$UowD1A#ndFf3+$nPg}XK$v+ z!cmlYJj&k49f_`x||af<}%@`dObVD)rBc*muu`A3tUZm=3&e zj_!8~9s;mNy;&w^eRtBmIeYleJ{j>M@Nd~pdNYUa7PtFoZF0L&zrsk}-#qKJV3*Er zOw^|WruQZ+hU^3Q$BToSguLI2-?)ArrP3EXmovP&E8aakv~b}*{mv(fJ9hHvowOAx ze1@7CDtaNe@Kz~U(e+($gKf{&NffO8TT3)*i{x@boe}fslR6=n*wD)*tD#V<%Zis; zwnCJ!{3-Z;HI#?-GJEsY8t|gj_jP}dRp0m020YSY`u+7a^oD3Fc#YV-q$~15?O6@= z3cUQBTwNz@koZz7cAN;5A-^~bqyh@jz9yE&1Qc{XpY&=m6#}0M`vj7bm;}d_JL~+N zC6<7&7S;+KoKb&`B+R#y2=Y^a#)rT|{MGZV*&okB>e0D(g;m#I&!7{)cE+3Ot8y-i ze;<%BI}Sv;=%Y9N&VG~$QPD>Tsu@1cY z%NSpWwbMQ#SF61;WyB~slvX=+cy?fr!$sHSw0LY}xKb02=-?4Qy?xpC=eX?I$Rd_< z(|%v~(YUSEeZ60*7dVS0o~zrB31n*Z0S-kIZ+!uUX9HVxmfm}wWjtbdvR}>e1ntfFXst2h`O{jIYBUI28viJ%cS23jB_yJ8HD}91_ z4^=s<``&Z`l@O?hI|_Pkzpb&JN_jaIfP9~ly#`8&f;D_(e|@&8p)Tky$&e%DE&{hq zIw3_GM!tq9j2eM-irtUE-DRM?1pOMCPvP@+LenbQvo(>et#ordmBKH7r|~$~#ibMl zN1w4*W7-BNwOlSST={+fzCS zL&20`q;0~ZU}5aiy-j>-C%M3lK(=NMe>Y(VYrLzwU3OBQpl9*a_KadRnvw=q5&evB z{jsa%D_D~c(EkW{2N8agHkSf_=zTM;uejqSmzQ4|n|{{@=J)&_Yg7D8#>?T`L0;i%-#f}U-hXGJyjJa{V)$7W_EA+# zw7R`m*}VK#=XX`NOStyCxHi3DfjNDp_sv7MQ&~x|oy~La;&z_nw`#B=or9Gd(N~^P zm&sGCm__4X!wP zG7zV-)xZ8~KRmwut9SaPhut`q_wv`L(~)nh4Q&Vghk`{$shC)Hq6jO$QI;^LGpQrJ z#*JO=q2my+`tifUV(?7kXQo28zQ(1y31F@5>`M8|?DUIk$MME@%dwRY`e*$k%k5sh zU76B4Z7!!=y@1b8E)MG|fdFouz;PCyKCY}COw7`m{imYKz(ruemvUT$L!jCHXQHwX z1rR#DDHhm~NrY}XM%|t;>pRv5A_=K4=EB=eD3HIpA($(Ugby(14uJPgj*rj|&P!3F zrApk1tJ_^S&^0-;HFJc`b79&sy^<;#nt<$B!wlV7@E7D;B*rp# zIa)ve6OWkoZF_5NCE&?{8$5tnVUA-)z(J2iTCUHY@f`zZ=Bv8OUbJot_Nlns?c)*$ z{?0J}!I*}@Ql&^EK+!y^!6X<9sP>^xGMYs1Hmy9g-YmCfH-)jT139Zh#?XoT0b62vP=m*5uEF#;4CCH%vM>HIt& zwe!*!2DF{p}X#`l?;&$D@0BhD4S_F<@`H zZrZS}p>p|3NGr#+v0S>|lOH#8w%M=kPlA?5*ulb4rm_MpHFmL&LH27~;AW`=fssZ# z#EvKnZrtPs9LzxdNRVEl0Jc@uerN8QZKLETrw zm=J5Z&cpf0@ZrmX8^G}{FE;-+WkU~fQ%5rE{M9+&1_Rhk2lx#=H}4VS4SI6Sa9X>_ zQN$u11yFC3R8xwY8YD^q*37vD^z=aLB%St5-8u9m5EaHKUazcMeikb%iyZ0P`LOzp ztcmjz)Te!%bj@fUJV9gY4^dt#I5ptzXuV4%r{hU_aQk?B2>cP%e2To`@;e*5d{fHq z^8()+J61iNnd?WOj<~JUUwp??60C_zwa11!fU$!mDlGW?dbaB8lld85Hg@X>p8UpK zn~U;G?tQ!kM~ z#A6f^%`De|IMUD}5fqw;D0Ex$W+G+yJwLbg8Q?}lK7%PDegqOr1$7LI-AXuNzvt8-_ zvll>N8>F@?VD*I&>RK(($mz2_A6oCIKSwwBXh578o$1a0{?euoI4HIQzmB3HLkT=U~C}dljwg=f~k4 z(jzHo?5Y)&7Sr2jp`kI#>&M|q8L3doVF$K;UPWx>;ps*!TGInXKdIHMVnEmFGmr`{ zBEZ|_?m#seI86Gn2HSo599UKHCpNV(GbT)mf}e9Zu$>a}8^}t{yFizbt`A_}@mu|D zC_!m|$qT2>?cXJ^+rrPUK*hHE*sqb@wQ-{N&uS|wrZ=o1tG}uvMrawNvy{KSu+kyC z=5PAE-cS+2Fw*-T-ve`%U(Nb}W43mMC|5@EUyn^YeR)f{>R)m|)7uYozxlqGgRono zcdQ+G%xCzItGl(5L8G_NzPz4GqdBXW>A-rGTK3q?&sZUOTg|I19J&dsR#uKH!1>)+ zx&I|9&|gcWK>?Uq{R$M%1U_o%0}=0ytBJMsoMNv7)n0*nIE>w2(HGBKjwfH?<8%Cc zdKzzyT^B812Ft+U9xkr>K$$edX&_VAJ+Qw03+vwaBBc;xtL?@}{`vFV=x@`H&w#9( z?5DN(m5$E0kv4xu^Dn~#_x?!lUXvCp#}`&WBC@Dn7hVm%Nz@NP1x37;9SFh&$RVN>71bXW6 zR*&I6u>k?gH$eW^L7iTSMH+4Y&h3(YojxP^381sf80Iwe@l7k#G|@8Fea}_j(gt@S zx6}1Rt}Tj!ppV#sJj|B1Bb}Q4=i)LY8tvb|Lni*G$4Z%ppy$&<3Q(uhBP6)Z0fYtu zVsgTddCR$KzK%$Pxv#v2RIOSab1ieab~Ap8Uxm7M$4J0!X5Sl1l0GpUBiJ{1_Qp+q z8I1`w&m^ColfG~|BYuV(Iv~}7ZXFNMV;@1)VTf2j2qnPbLJkzUG=UBubJhiA;W7OTG$@5Pf~r1gssl!Yo#DVdonke-;?DzN_5 z6#SIp_k^h$8g!NuVf;@4)7Z0{N;1n-EIhV-4lgDdRXBO_v6aW`j5 zua&|f9#zHo(=dz16V&<}&EqFUFPn)oh0lMMhN_v9*$1=o~hr!;FA;&{ar>CAz zM`I=%_X@#VgT8&)AFyYStwBTe-zxvSFvkSpg9}N~e{KN%fc3ur+CSqN-i7o+f%7AQ zJBv!tYuh4io=H~(=I>I7YugSR&mLceQgK7W&OiP)FQR|GJAl*!y>uAzxI}W%K!U*{4d5!_N4+ zS$ER<`u>*(_w(8iZo&IUE*HoakYy8b{*!2kBk6j}<*e`IwH|ZWyZ%H70z{h!XtOo~ z1md3bb*>6k$$SDVivwH8u@jg7i~u}HUn*2~i8#jJmw&6T=x9lN&J^m%H5%4Z9wjcr zz5+N{zpN#OiE1-%rMh8X033I{YSrC^P@jPc5Ked}K@49zX|?--GTVE7A8>C#{KIbv zB-6tYxy<|Z@bF5l{`%k?QWKSg%kR}*LAd*7gx3?O^tO}p!o;Z4{&jO;)imXsDTJuJ z({V0PdBp91_i$?c_GQ#-LEVeAxNu=6*szZn9J1>xgotc&^NZ#1M(C9wCk*B1{r_Kb z55?6<-}gMbYR?2+xoQm-DtBj}1XsJ~18~q~Sl&6HA&@dWDP?!ZOWqx}Q=KlYVfB6|J>eO>{QQ{{iH zoCR*p))xV{q&HoiKNF=pQ-E^H%eBC0Fu;XM98{4&y7E8-iN2i-d`c5*=YvxJXdM&af! zHaGV`j?cq*UL`7|Us;Ab3Ku&SU+%4q^Jam7$EF(z5r)JpB2+IAyV0zH5mxU`AprqLOrAxsTMMbpw^|nD$ss&-Br~D^N5Fp4W24DW0-m(n-9tW`^CviU!MNuF=^D`;;?#~ zSV!Q}83n8zb&i|P@ZtWJ(ic7!dX@@1xRFp?yF20!CX0`T^sWj6uG4h-aL#+=Rf(6w z*KCFpNZW9r-JsSz(DM!W`9bgWffhD-&jA(W?RB+~dJ#;wNZqF!a4wqNYaq^}MEIRv zlr$Q%^i@mkXcb&Np5ON`{~fDls3=H)4h1@g{>#x?40i@FG|L*PU%vsr!vmqD^cwR1 z;b-JF@M6o34J&@F6`n{?f=r5{PB~1U9#Nmei$WjcLQkOVQc5-Z6N)cl!?lRtA4RPnn2YGF5*-6Z#O?0Zlo9Ps_c%B&o77uvI;Rx?a1Rf zvv@ap^{i$V_Pm_u-T*lR*^GMO)1GPcpJ!^b3e_Cj_UluzYTHd|tu=93h2*#F|4bZ= zMl7|aQMKC}!oL2M-DsfrwMadYJN>?HAaWtEyAg9P-o>huK}2}>9!qw7Mj1iBk9ys! z^B457g*TS7^?LTT49~Jp9rf_XRW<#a9s5R(=KJBKtoeiOoq4`(x1;Oy-wmxr%a4nQ z^DlBe_nNk_b0j<2q4U^i$)xXcM5=~Fz}ahLYB{I;k$OEPAE!(^1%bN`HbeVQgTHvZ zGhN&Ck`*SqoR1dMr4D&7h|}9`{29C|Oae2|O1d|5>)yW|=Iw9R$}yH#2V}}Z-S01s z{#C$VM$B9?b3)skH5ECgoKMCc9(R{%xE^d3YyG(o|L3N_w7=f|__Qo*ZwVC91vatv zKhaj7@s8{C3L0o@=0coBxJF(Na_w-o_c^j`Z^vGhA#G*$G1fLLbzCpk{~^$ApIz3x zIwDeBHZW{=4Z8|hzXQ_6GB<<0xNt_TF~|S#`#K46`;7}6vN-|zG6_-hCe+`fP^R+~ z*sNjvSe-P%#TbK6Wi9dN_zct+Hq0yAL>!`~WBfh|iBk>f;m^&xm_2qBwqnD|YF?bI z;lJ1Mj>ry>6vNJtc(mgb*3G)LY$`U%{-4Nyp%K97>Z%Ix=ZHA~rBBB*Cj|0@i)wOd zk9oMgfF0L()&-#id&# zx0|YVg=27{hQx zm5^j%sN=XI`h#uieHh)~G1dY7XrRcRa6Jm4nj zqM&3IShCy`dBvma)&zfsLrgNL3rd%k=$zOq{-hwr1C}WFr1)ernZy1ooZJ(KV~2d_ zv}y!r-Z2vrA{DT*$W-hew8#?uRpK~S;w+=wDw}9j2Fi6VN$cbv*3dL`BvQHe8R5ez z5F#SDlK{0CsY00c5Sr9dX?ET{$i(1bY#i>r)H(Lx!x+hQeOp6m2GoESGxz+&x+c>} zWR&`R3RN3eTCV|W#I$U2d{4zw>WW)=Iol|+W!?+@v}7^kW$qg_Yt7aT@{g>@)2(-g zw)V6X)&l63@!V2=s&y8eaCKU+bPyH2X@O`FNeeVWmTV-(xqk9rO>0lfq~E3q^N_3K zwAo7-qS(Q>N$MQnvu#6Fa{p5C8c%H@=O(n?O^_L<*c0d8O{NxYU2a=*-TDs@@sW2r zAzXVx5=H7v+{Db_YV=OG0h{V{;xO;J%7g^%>C%IVN^}@-tPYh0S6P{+>B!}82Rxy? z;Xs8FMFI-jZFXeQB<16HdGR#nbh(v!GlFHy^NS%k*c{>!2T^fA8SG}HB|_U-gqs)U zzNg8ndA?*q`+M=fT2Y6D$1Y*1m~v3ms0DGJWOZj3X)n>~ZusmEhp2R6>d zth3QP6teZ3Ebc`QXMcbV9%d!$zBwVS3#v*{rK+fy*{I_(IH7wv5G0}I%jA3J#>37u z9v&bm2^@vV|M^Y|rqO`dZ~(&x+;RDz^g{?Ok?2F79zz-PHic=vF$g6LA|r?gqqQ7+ z<`Rl1Dr6;s^=R(2=r^T%4%8*E99TAajw+9fIz1+Is{flCJ$vo~E?7mmq6^zA@Yix*A_CXpOi@9>&pK0Ksd_OC=G6j99fHM+ z;)LGeX~--YOo;)oUcUOaOgeHruWSF4`O?~uVmCgHR$7ifTGdXjb`cYXg_Nf%9A+uh zlU4#1QdY_2B5wL(df$oj;_Ao>a?`oP@D^Q2nd4iNr$|xM9%j7# z$&TC2PD#l5qjB$V^dEG{N6xS}b?w^Ph|w}~WHMk>p<<8-5YNkSlbx`{K@!B06mlF# z#s(z`73LgVIj@#u5#Qh~pfsuF&RNzMQMXzdO41^7AxC4(tff&mV-gFa4y(zro9$w> zZbKGVsH*ajrlz;7(N#zcCjJci*$7!lT$#zjdZfL}{xc$Ea6r!rXh9FL zO;wImlnJpDY-^KwnNOHgTyMkF_hC?z*GH|!29F0O5Gs>~lk+!DV2i+lkm(0W2cJtj zHxo;8;B|k880$#u%y{Zfacsa3XZT%gE>i9O4dnyr+xcxj(&Q{bJNNDtcMvlXp?)7kEyB zQ83jGEB4_AA(IJ-Z;SGqctwj?ia{5-E+!pN9fNU%&<|Mg(5*GN4?lLVB?qO=PIuA{<90zCb&fCLt zw#P`1kwKxkU{x-u%OrRFkn}DmJ#I@{$0q6^=e4FYKaxcSak^WGFus3+X&+B>eIP>! zoQiOXmFZWZDNS505XNp)EY@O_(@j1sG35jkN8-iBvQJ^vCPa|aEGG}Q{!Q$V>YVH6 zGJ;7K{geVJ>94+dzMB;j?dyQ9lprBf;jHLYSZbPPSDXG<-kYebRWxi*z0zN!g-gQ)zseBFbpK%apHD2OB#%Sr1jT_eje^Ud-`E zIVWs8waYKwRqDXlHR1MKNo6O%Pz4upoD4%$rs4#7iyS9Q0nFn#IZCL~w(^90(S#fs z!)T$SbC_MSb8e5zQ7%I?IXPB36}^ixO>)YrwTL*>l1*V+DZ5vEHvU%UAQUD=cWg(C=6WA zz*rJ_v1Ytgrh}mzeGgH;lR?pPo(8M;R}M~9Z+RHlTe_ST&o6RWB}f+$=(-jWf=O*$ zjK939?&o%xE#EM@k*zxb8&g#F(cFgN7zV&vvAZW!5#(vV1+S57dIq!ZVD9u!F z5_MS&`^JMV`6iei@vPMAW&L@gLnfcFMhZU-p%)lJ%E@URia=_xjYQ4UFsluYtk_=1 zQyvv5%)GT;IUb|uI@u8@-5TW{=jz>$L2Rwrhjs@;gLI_42J9;gRB5<~PGgK%S{YPt*%|TT z_?BfpI*5TRt?_7SN#?T$D5HaKHuh)mlAcB!#)!)%7FY?hWG0t!!a9jSn8cm1L&#CL z;iVi*F%#fF&&ZxZH2N%->BWX^Z1`;UAL((L#RSU^duM`?v9qG`!;?w}Un2{9OHWmh z=V#y|g6fX;n=T30?nl@&zqftko?t%2N`$e}O)g}j8vINCUm6Uz^2F#LhLto}9ClFC ztlf?$*my>48Z&pOlm`)B@hGP!7wcqaJwNXYD4gTN9a5Q6R~85<;UKhr)e=Qkg($cT z?)VuTR^$)>quDDZcbqHaurQvz{p7cK7CfYTz~p}|2^Khs9-Fo=eVfV>wk!zsB>%mXu# zORVimsygL`SG$1|v3mr`~cpZ_}_)m%xMjCGJtHe9brb-@fb+SkP~6FBIA z1R)E4-|aOn3Z_V0_H;y$Cavan2A$5a&kfVVqTlEUfn5(dp1?uvTsDLduC7v#aGugC z3QI1Eg2^Hvr>4+P%E6^d)#8sjHdD$C+c=!qs0mSCE8oUbn)|oG8}a0h!J=1+K0{GP zGs*)UB<$cS16Vi`306qZsVXs1w^zQ|Altmw56*(ra%^T*krErcs50({FU*pyh>*03 zYRNzWbfQks5b$SWLc}kixev#LxRi6rXJW#(k7p6EV?r5g6p@=+^N}m4L>Cp222r9q z^+F~ulwqfU$T6GsSPZL{gut7NA!~kHBS5NE{=vXjwt&_lS`T)NbFegT4Ku&aYZKnI zfMyBaDhPK`K~4;sAJf7zBMv{!R;Dmm>uM2MY08~GPfgd4JP?I~LXV*vaq0k*XPwkx z1VbCX3}^O$7~x}wy#6lDd3foV>g+K z23s%5PaXm_=!6_5p>m5@Mydxvl~WI8oqUti>1P((kHq&hiens#{)*Bcvo^X11BD=E z>XHK-RB#m-^d%C!C`{(alwreMn?GBmIv{`VrfX|jszovm7q4ZINb63dB`V?&Mq3Ws zDw0#~{+uGOG+5BpK8PM5A1pBC_5vd_YoK-blQaLl+CRJ~EyF4|^S^K$($>69uabGeORoMpfRV#G}aA)EtxE=_$xI)w%n!vV(PN zl7(S#pSG)CORp}W7ELiZcJWHyDhN zZ(%?cgy^G9>jW!PNyuEHZf|#+6d%jBpro;d2s?}##rK+l1RtgT1rc0?KtgUC@mwX! zN7lQv{&LFI!Ty~t5pPax9bvq2lMU6;QY%&XWwzhbTh{^FW_WCzIho^*tYVO}so@2K zwa96Ug01b$SXrH?^B(ZqX%urQymP~l2AXN5M~*Vh%<)MHt_N$Bw|>#$%rgxIK_+Td z63Q=Rg<&pEW=lt7F4(0;rHAoa-VUERtRK#8k?w`E*zGYj<*TJ2i-uB&>n5I&N4d`U zR_TlPAOw3)01}7o9?TQii(N=%2-6}e+-))S9Z&_ae_39*jM+%QA`K`L*0dQm3*U~4 z1DKlsZF3U@E91d5CWKknu#TsQhkL}4J}BO=)hY}^n_AyQes45=z1UVN`3!BreV*z4Ql9} zdDX&k4Foj)GHyb+pI44Km~d}X?+5^=PF`<=FiK}C&diQ&0p8B&6*s+=G+HDv7-{m? zOPi()d8dnCjKBl>r-WqK5jh;HK1ldFinSu5iL4$jbrMK4&J-{BjMUsr4z`&*YW#fT z8cw&uV5I3vM-cZ)XWKok&JiMax%d)2SbH9AC4Gsj@tx6R_%gml9nw^YCku-vk2;$& zX*pss^EZRY>z{J8w&l)gvHh}LhyV#LOxtwo3>5SPBd}gLyDYY5LCz+VU8iV=z~2;xXn;4 z)%H?+WxP~XA%@#`^XyXmniYD!4K?0)te|EU3VL!B#=0OTph0n;6CbOEct?T#7rKTDeH)AF!j~~PxI)l0`!Gt9Wu|iwv0qtl3 z&+OL|Cxcz)b7WL38b!mmeitjO-iDuv;|~TfF&xrTEQAJ!n$c*B4MvbwrK-Ns@H#% zX!^(eZiC>PLqbkA??ORpw!kAJ0D9FLyItg<25*)xJCQ_wON^Gcl*cR*o)Cm1Y!A|Lsu!AjXL*iE~q}j#5-;DCyuugVS=H%R|3%0}uS9RhoS142739J-&;&52P&^>IEIO9{ctL0Fcl^<9csQtvSRX2q}y9=8+ps3N-INdQhV{@ zUJ-zG>McnJhYK`rS#Mo%zb{58ydlI1wWThFq^31AFOCVi%zzyV>hrc*w5)fEu&FVw zsq%pRT;DfSupJc=*BA?78VGKJ$XnTYbF|Hg$x77p;Db?P8dOIgd}O02`>w63QQU{5rb!* zipcjx0fgQjG`HxtQk{E5sc-BpVhhB_8S9!nv&=+6_VcRJlt<*_yhahIqM^<~Ou_{u zqUF&>(%>d`W0KifvHGdE?2En)6u3;}W0bKC&KbroGh_w}qT#23ABGlDPE}XuL)6u| zKt)T2RwzjrHC6{$1v@k-wn)7=U#=f0!hrMgps~tKq8>zm%B}mHnMLX2sE~N75Fwie zNirj(6o;{r;d{01#Q?rT!~r_OnATs$PO|P6kdZhza&6;0I;;v%2^J4%@VMq`QXR+9ux$;CFahWM)Rtn((`YaElWNAMkP++Lq7T;VO*DC_})r zrAaBax{`)jv*hZe~4PJck^itkl&M0K9~$4&5sLz|sJPVD~~ z&_gi8n%8|GXvI_$HX;7BQ5~t5HFM5}}e8$6+Zp5~Jv55SK*lliLDvkkY;-Po_8D%MevD3atb@9$@~5 zo2+C4k99cuxVIG06FP^Ts?6E%a`Xs7OW0#{Pk% zY)UE6LCtqY<>tt6CRHinu8X${Rz5*EZh+09x)sOCCSOY%ZQ&TKZ7gG@7TXMFTBZ{% zQJOF>L!5K^ zD5O{{8dOlSDJ;A`Ry8FVzJsbs{blOvs^@9Qc{~*CDp_c>w9F+spx>5l$mbA!U%v8g zNeVMpbfKxq)JT{S&U2aXDCKd6_#?l$tH6x4%=!@6xD6r349@EC6mFk-JFuFXD49O* zIEkKPj~ho-h+1um(Rv@pVi^u6B74%xmJCV9{Ckn&7ho76Y}4x&57p#bCTS2dFf^ql z*8P-Slq@Ax)j=F&bSFS+Vl~r(N*3 zn+rwiR-^g6Xq%8b+T+CI+80@1vAbi$j!cku|ezMDmJ?G+^Wqp-s)2*MI-RCju=ES`qY*Ha%;YecaG^? z;9i;GDv$i|Bh)(%a1M8E0V3c1R1{e zk*h$+fa)mlgxy|OON*?PutprWTTmSYqD+etm1Z*nIYKNMLqk7D6Jl4~+ZwEV#P6w! zHpzLY=aB4NT~mp$%J**+!Z?N&$+~WTL5-2wMq)oq!h(4oQ>6eVImARo$Nl84;sTCN z0|Bp&c7xoHc{{H90>BV`V6e1_TF|4ZsTwKREfQ2V4<;^=(q5oU%a5T8jY(ihs+=)e zp%4X|^IZE~@0cLfO8Zkpun@FyYO$Nq zO$yx9eHhQLto7ZDMasR5S2l#YOr5Cw6zP218UsDq)7 zMe7(40v0nIITN)gL*Fnx3wh8LM$e=DV;?>1Kw|MwX3Q4iO%*0}))c*CzioW31G{VL`qjVj*I_)+paDuD zN7kAqh!->M*vmIXdbh~5CgOPh?4lqQcWd5MXQHF@k71%M5DGj)hcA#gS#lnWt!XG!g4x0MeHlKg{ z5i_d^o{m~l6OvsDvIN4AEDFYWKvF4Q0$NLw9Kd1{@q$haOY*NOIP{-!jzQJ;*5Rq? zr`a`Wu!<7hrjNU){Q&1xq|QrtmL_N*a3MNn6Au751MDi7+mfJAu@kPgKrgJ-5eu8GGKs&)Ni!XSjTM??_4o4H@} zjlv4K)@2Zz)`OV-Uly2@6W0huL=oSpgDG4xjlhqz=mAx!(}+;A#~5mPlCv~fRJKtx z2{qGYTYhQ@WZ8{jjDa*b6m?hQ5=6#b8(3{Tgxj0u4tTWE>L9xO$D*EcO$H;=Bl;#yGX{k01HeYV?khUR6V2l5v(|TMG;-03g zG0oD1QzWZ#xik5_M#E*tM~4|A7#%uVD8f)sLp6g_gKTvArD#HS2WX<36J(0P%bglY z$sK3T z1?bo*6_SM<#eG<4Tw;?2q(FU^K%y+*p(wY@$h$^(yT>)iQWY&k?UGS73}Dnt40^7< zf7QAQj}hNq%u@DUr%7iBTU zcOLu3al-E8)9`dC7Z_+lv{gW4c%g-gtawXBA)K;+Oida~uxI7uxdfYBz=0*J;K8JW zmuu-mbdqd|=7v3s{xsZ|qK+{T;pk|jp+ON}Qgs#M_zPur){@qt+q*widWeJV2!c3F z&wCAM28-H8U-_+z4l|I6*hpJUEh@%ZY+&RA&0({}M-ulU;G{z{QHb|SzM$SxxB zHDREXEf~mRa@VdL2c@xnb8t_X+ZVQ9ef}sXZivmXBp`S*{|cZjz3P4*x=zq@C~E7$vP{p-<2%U279d!v>&FrQzBa>ZfwjhTj}a%ae2$6vWkn9%yf&rP4ZmMFF>aAJ90R!p_Vw!^ z*xgpmDSuH9yuo!8qh2QbQHP%Z+35tLwsk zU5=M|xZp?Te>y1i3-EPOCY%&#zFr+Wqv2nV@uoU))imp_)cG|Bmif7-V=zzHG4e&G zSfEkAc#A&-Jf0U6v}b|($~8T@otPKqc!X8z#UC)db;j8~GMCO3|C%9<-4KxP#4}!m z&bRf%59(6>q|Us#T1wn{_!m!V8tEf<(1Wz{{4S3+w_NA9Q$L~06+v)bixjY3wm5S>g+;gdGg~RT- zldN~Pqe!+oSgNx>`|008$N@b6r~CF~HmR_AG^DHK#FW||;l5S8*KRv(EB^qVrPh9W z_Lj#8y>jGax7iWz|D1r<#KJIFJrwnoe+SqqAyR0(d?rTK&H6=`d>koo?x=Wij}jBY zr+9~$TvC5s52+BG_3Ta-xFf%l1-!j=tJyPm=}xGbRC!_1mHj!1|8hRRiiBI@Wpvey zRI4$r_yllPD_pOBh40i(&$y`zfrL0O>&fLT+5uP z+U(>Aw;*Xa`Fj_Ekn5|mo<-xtBuh7b_*Au()^909is#yMDPiq^o7PK1evyJ@fP8Tn={1u@&5Y3jDo)hE2~^b~|;wi_+qtI#CbFT2aBnNUCbOvhYX1NDoK% zf|Ov8ovMkTq`!yGaX`y6n_T-);>4AkTg3dB&5x}lrUx_rX-<-sp7qH-7c2JS)b6A$ zQ0EiQ2dZtbD6vlLuYE^yD(p+Zp6=$79!egRgeLnhmRhbN1ShelvAxq16Y#g!+A{`m zdH7*m<7OuXC&Z>b2Wt|TUw8=-H}#SSrY>LIY}1y;vm46z36_`eH$%I1{)7pmLsb^Y zC;hdazqlERXRJK=4s~s}P8kkEWyt@T3qW%{I77Zt40o#(>@7{d`{#$oO7My2_TM;4 zuo3l6lMdqt;9BtvXIFHP{a>^8`jzAX#{t~Dq%Dy-&(4`;50+&$kE!J)^OEVNrePP& zQoO{f_!A_~zmKv;CUWS&JyukxJBo^64G&O>hi&^E;9EbZ?Nj9!d5kC-ZipDPlt8D9wO_Q zU@gbdIAfP1mm^#)-DWZ*GHK-VIjUhR`?iJmhQ;BE!F^_6NVbc)No#{$nJ#eXh3y<& z82H}g8$EQQdMh>zJ(M*TpLzgjxmj?4-q%geRV{m^xHYZ0IDh!jBUM2PQ29Cys*_makwF`U?Q9HorV zHeUj<=FiXCf5;HJPlaieJZO}>E(DeF+~j)G=u_PQUmKFsKfv8PVGk1vXGH?xISk{A z$vshX)I9n?YAEjl-e%n5r;CKR_Eq>c7)yn9_LbM+`@PqBBdw9*J>s1I!?`~Dv%eD< zb&Ap0>}{3AMbj^j(U&{QmF=s${7Uk#!ET2O?0f%o6r~0HD#GsE7HzXb1b-C@DeS&V z^Wc{&ol(-tI*qOV#ZfeDyu0I=8)${(`e2?dW&KoJielej=lt8hD2dIqg_?TXNJ^ww}ol36PNI)cq2)&B|`%q+2g9P85K!(1H1D_uu zM`w;o9SvEfU9-45QCa0hXQwpR!I&$AtJf(Dn>X^2O&t)k2a07w0j?zw3C9W;^MS~i zmH_q2(=O_Gx4mt$y2F_E_Kl>de|&J{*2u@fB68*X}nCsjzbq@AEPLBWj3l2^1h z5}Vl*{=_Y`UJF7Ld#aM~WnX7mpx*B7s#mSniSmk6Ydr@e7r*xe!re)RcHKcSdvmlL z*yv8gwrjiwT5CfW0COsrE|@GbYVS3pI4R1QDmzE6Xj97l9uKtlzM*a_lz8ch)w|O8 z0Nd&Y&L#f29Z{?Fdd;$wE;J2!c-s2Eu@ZYo5-j!q(%AU)&M-yQ-PE=fFYdaAu=X7L z55^L?AnQy)k7{@A0nbo%`m&5fhI6SBniGJ7134-Wv`uNtTQuHfSuo}qn@L{xi%8Rd z5at%q`1RCFt+Qx+6(L_8Q4ldey@mFy(`K;5@n(n+@AM8HNaT@tLsYpKu=Wk9cZlb_>a0%<+rsS(sh5gxy<&A85OPoGE6(~r- z0yq`oBLxizTb|w={YQ8q&LA{#7s&m|g#My@BjY!+b>;SM|K$AwtPbebcY{hYwy1f!+a``w$=lIIeBrpRoiIAC%tYQwjBNI!$YHykMG&9 hy|XL$wiu;zVDYVt;W=wOlzX6fnhPeO$ literal 0 HcmV?d00001 diff --git a/.yarn-offline-mirror/zencrepes.zindexer.github-milestones-0.0.10.tgz b/.yarn-offline-mirror/zencrepes.zindexer.github-milestones-0.0.10.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ec7da74cea2970c5bc2fafeccc5311b0ea75d642 GIT binary patch literal 18903 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 M%&BSHx|O#54LFh!MgRZ+ literal 0 HcmV?d00001 diff --git a/.yarn-offline-mirror/zencrepes.zindexer.github-projects-0.0.11.tgz b/.yarn-offline-mirror/zencrepes.zindexer.github-projects-0.0.11.tgz new file mode 100644 index 0000000000000000000000000000000000000000..771aad419672144a4e10449af4a933e51e401d41 GIT binary patch literal 20092 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 R>X>#2NFE-%$*{r1@J|fzrhxze literal 0 HcmV?d00001 diff --git a/.yarn-offline-mirror/zencrepes.zindexer.github-pullrequests-0.0.18.tgz b/.yarn-offline-mirror/zencrepes.zindexer.github-pullrequests-0.0.18.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2be13e7b3d1d291c53a01e7e050abaecf2aa4f64 GIT binary patch literal 24212 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 literal 0 HcmV?d00001 diff --git a/.yarn-offline-mirror/zencrepes.zindexer.github-releases-0.0.10.tgz b/.yarn-offline-mirror/zencrepes.zindexer.github-releases-0.0.10.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5668d2bfdaa777e541c333e4d3e37f40205eae33 GIT binary patch literal 18977 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

Q=wx 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%0Dfn-LBW=i=j-(I!Ed*LgxRfeN@ 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 literal 0 HcmV?d00001 diff --git a/.yarn-offline-mirror/zencrepes.zindexer.github-watchers-0.0.10.tgz b/.yarn-offline-mirror/zencrepes.zindexer.github-watchers-0.0.10.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2fca658796c1212db45d5496d02cd20c4d14a131 GIT binary patch literal 20285 zcmYg%Q($CW6K!nUw(W_XiH(Uf(Zsf`Nz$=3v2EL)*fu6k`u6wV`*8cc&fZnEcAd4> zK1~_}2ln3&0(jYN>q9u2NS8hPf{pnrSH@jD*{@e+^n^)rJf5eAs-=pioiblK$pyATPfI+-mP13xV5}+{MxRbcEH89&mw{_?d>dGc7 zF5B{PL;TABX7)6gmlu%t4Jb@#uAB?JUE948@qJ%Qo9*#>+S-kM!+)D|K686b52&;R+>1vX&j7C% z!}agz(`RiY&Bc43Tp{Tb(C*{06xv*he_UcMVDo(i2vr~y`}-dK!;M2YLhkh%)6+*d z7ceZg67Y%~E;{}<>@_WVW>K!X(x&hc4(T>2|MhAYp z^25BpW@+-?bu?qj3QcKdE*rSEI1%9AYfKH)N95$$`+_2kB6i)~%jIU=_Hr+ib&vcF zvL0`OO~?p#yyNk`$-!HN@Tye{N;BOLe&)y5u*{{P% z+f{!1Gc%>bjje4H8|Om!$}&ftBFZurgxOpqD5Jf7#a0IhM{TZyn4yhI?YZqA~VSXxIs4bhZ|ny<-YfZlei}E@tX6RZ7Qd{5R>gKSM)QUgw6iW4B?8{PWit3+EJbepK`Ii`(@d)0sRPg zcx-mi?pXyiw<|3Yr|s?tDM@R^@gVwF+;(~r@~vBICs{8 z=Gx}PfE|`rvpW9{BlL3{T;M|+FYblvy2qkPhM%F_b%KwK3@~-t{IZ?r<@u)Pt*eHB zB)9zmcKX%u9JnK)dt9_ws1DiZ{+Y)i&ifdkNOBqAVF>h~-`Yb%F~M^q47jHAmH~W z`FGl3Pv>kuBP9@u#GWF2v1kIfh%9Gij!M@Yuv>H5FnYvs1b~8*4B-O6Z?Q4MwU|qU z(yt3o>_HF{{g)T-+v3$9R0*SNM9Io&WT>d9jdyhK_SPMS{$kLL+SJ~ z>lP-pD=gNk?&Q(cY^$}T%J^Agxa-yS{A$mhhaGOxT!Mh_gAUV^H@8_1dBQ%g!yX~5 zz5Y+rs5e=tV@Dmf{M3Z_cX8RN%pbt<&Xf8^PGeYLsc8sMfr9i92>S(ex(k5PM54ib zzUK3}`#8G+zP=Nh-Vf9ABdj)~@alZ-#9&`BJ0L%7g7BRmchJOTy_i6C|of~w;K?^zFzfS`#-TRdM zfbI_gG-u%-$|_1zJy5UjhKt1A9`(EKA3O^Slb@|u`C!jV(z zpQ6Ck&o$b-pS>2Cbfw9v-9YFKpX~11g4Q|_hyB)<2GZck^|aAjh%g!~R;V+clAnu0 zb*K}#)huz&nDQH{GQ`HbZ*Gcv&Jum8t9T;}-qjMi{BW%(rFUbSKC+C}wLDcg8d>3~ z2}%WYmW%B?sq3YFziYL7nN}EexC&k`#ytV|$if_~+pyhI%aesImtMrx(uvkiHrsM% zR#zWJN^)sxeeusCdSh|VB9g+Jz)j81+Lq{s*+ylCZ>MDMZY>Td$L}XzLS^miq)c1) zBGbaa9Ty8r7(4HH!(UF|HNoM6SINrv7&A7@mIS)Z0VjiwQi*x-!n&Uqt7n1hG!{LZ7yR{Q@ZA(k(d*NSFIECMPt`KHXCN)bLxNKhNB!7)RdnRIxhY&0|1 zKYCq;E<*e^eRhibmdiFK63#n4VYT(vfQlmvD0uxf??&}^U&?edBu~Jc4PeZ2hpEzx z@a%T%Lwcfq6KXU0f<3kTgGFBT+Wczll?&zc!b8idqn|*4#e#k}?GM8qmMt|)u(Vq8 z;{X;CktyIW{|h#tPQW@FYeld5>9WI5)-G8~2VtBWe1c!!ZJ$b>n_*s0U3Xv@QPw7< zi<_5^r>{q_uP3k{&xyD;9cz=lpQrzAdbO?|`uKRM>mN}3+FN7Jem<6(!2S|R^XY5> zvpWLPU6dmOl`BXtMLaaWLR2%-Za`I*DfN1_IR~=0{uI&EfLmsm6gIkFI`GO0p)M7g zAz{v%mYw=ffq5yex%$Wuz_#Jkg4^uf>8Efw>L!QH*qIh6sx1S zL8m9HBlbPL9R6sd_QI)Sw-wv(5re?&#FP2PTHxDYg6+=9uYEoRd!4>vP=8hjy~nY$ z*o8CvdKAqS(zBZr@w}Wk3q6kwu_t3n=Ae@hGrIAWn_A2j^F)vuxHX~Bg|dAxc@Km) zOzPc<|IH&8I!g#{HYnkky|mES`4ScBBnF@`t{tN#ybcmq`tKC@K3vsg8ch+6HOln< z8$J0v_yWFl1S}H&1D+$~DnIVwJmGqhqc)e$0Md-5iTmxE`Qe}z=*%vH?EzEt- zXMMPzRZpN*mrvV7Vg$4ggEKGX9)mageagZvRy8#fk=-7%WvzBn4pvs?Fq=wiQu;hS zecZ;!me=s|CRl4x+SWLm6}_EYicr^lWw^T=Jmb^vRi!7~PRcXPtPCCNq3$Hm9^vW_ z4Y83Z%}O%{KhP-JLXEGkJs?Qwi_FY3GxWZO%S$0oOVjC?xFhuB{CJxb$+mbes&pgI zuqo>Dp*&z6qEec`+?+I&$Yq#&L*>`As{bndLcU0CvKe7nLJ*1D;-GusuSPS2Ahymv zKct~@tkBw)`hA>(!4!8T!h8XlSL0viF*Qs19&TdsR}7mnjgkbkR98M=OXb0XYf8z- zs)oTxtC+6G9Ea~A$Am{2{4GbO`}^{{{jbl$@4y+L&x<-ciQCrb(|Z6p?`J^SkYGW? zdtMe$3}#Ix_pivzTQ5Y<|TPr z{&vA?QD*UgH=^3)Z6andQf5(7?%)wzoWK6Vq<&BI1N^ZRvEnFF0R_;t2A`yspTGoS zHD}rPZhqKH8P5mT>b=WB{=P$N$}#vh6|KH9f#OF;p044D+5MNQvx8nUow$9gwe$)J zA6e_g6X?i_=(aw$bXYuW?9ZNnC#LuF*YQS&o`BSEz@K*)v1r1qtiQwNv%bRQ@*A{{ zCDI=+enR|mf-B-3p5J$I(kQ^BdG&g|`S?wO(7gZwd*PqasZ3H!Tr{clbv~gTc?n%b znU@ehLGg&1sgFccs@`=VZPTkGIQy38heM9ERm>sztljg~h;R5oK?*@K7@Sr{;< z^5TyBi-=qN>t_$^1O<~)|DBbeRZIe*c?I(O#=}I*whHy++ky2fR~{3NU%*59O`5$k z!g677FnUGSIg|3Wf7a5HNTt1fZ-}W-cIv}tjJ>JiF3xk;?EE_SHawPC*xlNi=cD>O z)J(y{*z=9_5hL9L+w+c>A^!u`RUK{QIpIr!snDDEyrRPL+k|yBlvTr&(`WmhI^01N z<7hJT=Sh)?aPW;Szz%&#%LYgP{8OV#N^Lq_axrrBVAzyT$fgR+@_^ToLswdUL#F)ytAn*L8WE`NV_ z;VB726zQ9m$43DXAj30lEm@a+Z5Yc>=Al4SD2K`L`P!7O9b?*8I;2u`0`OTI=^sDn-#v^8SyhICOy7$N`+Nox+ypq#@$JNa&OSHTOpxz-#|FQE#_zpO#FvMV$ki zxyUfb|2;m#&-u3qA<`e^y98ck%c}kN{@wRzO`?wvDBw4IBp5-Zhm#PIZ?9+L{V(Qh zjtR;zw6(cRc;k)Gl;!!tY)O6xz#j>)mw$o2oWL}VOY*P9(K_JjNxFaV7|Y8R`Sogh1tg3% zZ!iNY^ke`fA|pP5dr!dO?)Ug=;mWp%72vfw8{goAuc$IgG;96oM*pt<$7n%tZ5~lw za{um0MYItAi$#fiAH&l)xQ_r{S;fTbV#uNhuO`0_58lT|Rq*}eZdwXMZDM&gk}}HQ z#(q&vx0yWRY~k8f`U-)g@gRW=L^4PpXHl&>@G9rW!`&0mW0l8#!5oeEU!*Vq+c-CW zDtzS4wDr}z)S63tokR=00DZ?kjf`M@9D`y&tfYU{1#wpdCL~~L<}tZ{{C2$G2qvVF z7Iqefwup9_WYB1_e+MSSTJ!CAynpASq*U{a@x$Zx^3J6RP0Kid2+2P?=yTHeHtl@Z z=#hgjwYUpv1WpFvgzmfaYT7KG4<4Iu7?@ky$Y z#+KW4-qh^pd7h2_?CkQe?!R;MY6udW9{09=Sf=;cwO5^#y}f7)5W?b*U+H7R25D_A z8F0Q8-2-L|b#r1>L5b!6;&K4=>9_7SC zj8MkG7~0i^KD~PmNe=xcyj3Y9RB+;6w0{rSCLZnL-7 z=J;nAE-{Pr=VCJ9>D?Bn>sy#i{%&d)E+6J>c-q5{G~S;_-oe8T=Vsr0g4K9%fOY7zV7`wrA25(9d;(0)~$BDxJX?#BjH zUYaY+{arL7%@giV{9&yBFCq-6OSslhx2@}@WV(kCl%}bEC0mUG(A`_7Kez?FqSJT9 z%X0g<+!B7EO(x`CO8%S~t;^0^nix**7oE!Q;xFH8m-IJ-A(|1T%w2XK9e99A4Lfr1 zIN%r2XP|QvI$^9B0FHCtRi%RA*yk2KEd0=6xlnRfdeKCyN+-ZU;iby(I$LM24|-~_ z_o9SbIewfD_iUZFRVb8)Z{^8P9)ggX;^yT;OP}*H#Sn1@}!$ckDqhkz~TdwH^I68RWvJYg8?hz(@ z0}g)fRDVouPxlM`6{fMD6`p+qetT;jhTJyte?3BDJCz|p8GJc)&6ME_o}cfk0^^0R zjh~5FT=dl-3Oh50D7uGh4oLUaI_w>=T!h$p?E)EKz;E9CjU+_CXSzw_&;+Ob%kGtc zgc-}dpDuJ2wO&JB>()tOLAL7gha+$m`uqdVK`(GNmyMz7H9Z8qIre8Jx=bZA&mZJBGvXMq19f*3Qyg#~>UdzY9v$%aVYV#) zY6T5sY428v=R_0c$1J2Q7G7OI*AuKfNlD(fY+L@bnY@RQW54-@Z`F-nY9q)hp;e=i z5pk5YtRw05t9G79r@q_&o0^GFwfALji{7N?>lM)vh2uF4{evoeDO)=jAVH}X(Q5pV zCDRao#S|qC{e_nyKA(>K`jE}@y>SH5h8tI^5?k-ZQBcI*!cy?BW%G$v`smNW=+!0v zm5XYpH#?#L#FHI=h)Zq&G3~&<<)`^y_5gjkPFy8L+R^PeUgf0jOdeiaBfC^nmw z-eRmwV?@nUzHZx|J0tQ0J%C05!&`2o8~*~z;df$zB_!8Cha*d=8(`jcT-j%L*vgK+ z`kPO4NR4)mT{m+4QYHOIH;n(XzUs4&?Wm=L#Mq_XL~8fZ{JO1qbocuB>W0v*x9y36 z!-MBVGsouk%3zf??x8pGe!skP)n`XWPK1x<@S?5daEd%(gj_9)>*LB{>~@D@dSlGn7(yp?m-zKg&cEdgK(%sSFk4(l`@us;qb#gAg zbIM&#D3~r;^6SyP?6g}8xqG!H|C#3zu&pK6xcVpO`APk|H?oaf?GMJYW;*I__nhKZ zb?URLlElZ%ru%K2lCIUVWFz<-n4i54i^#{l%7Y`)aRky1KX8Gb|DSzW5U`Wu))Q|t zxxNA8bw#$Wt=RoYamii2*==hz(ybNNxth}BmuTLk;MU3frJjb{*SQ@q9`|mfG%WE^ zis}u#khXuR8MD;tJWnu6Ycc0#9;Hh|EeK6}aKNSM;+k}EHL-eQsvN4@MJU6iX!Pe7 zH@O`+eIt}qw5HB`c*RcKTEK6t2%u@b=s&#pZ58z68~I&5>X>He`a$dO;hYC zGEru7!MBO7WO9HaAsyYAgM?YJnln|6bnnvSdJ`7t=nmDBO$;3|_`y`G#-0o$iTgtr z(MwdCHq6KyHS8o!dg%?!eCpLhYt?TCs*3Yo1?UNb$N=2?PSVx0jY03~%%cxuZ2f8< zu8$&9+v>!vkKIR4W9~V{E=}c5XO?v2zn|PJJGQ3x-7q9O8^(9tKT&oz68fJBUf!q2 z5>Z8-cRwv9pn6#z1Bq{X={I(P;`bnVg-Qktcx|mU{JOfC?RmfB%YuFdnkO2S0MGUo zoywd&b|Kb`$tP1$eGiqcfg`&)t(3s}=@-=O$%vPP)_cy4|a*gG{rpd;-a{ z_rp!E#g6a$2{+8`2oR*a_{-*{7r6au?O>iiuyj1A;O7Tqs;#YaUk?lA)FQ~7BbbW2-hjSZOm zbMoaJ0IaptG%BL}bUwK4_-HrE_nz6)?60oy_qVrfgb5Yq&5im;-UCO7i{yHyKHSM> z4i7!Wt)>q~54|e;Dd4 z*oLKy`!a`&R^8b^TsVcs36VxbM7S8>Am)E78d*WY*L{lE(OOyc!BQiQPe-K%R!cf` z*C2U%y(&B3lL5bt1)z$Mihk)MZu%bFlO{S-e)Z>WFF#Pl=p2PQ|nh@id$O@KT5 zUpr$!bcc(tG}#qLpaRJua3c|T_i5k^-ta#M1vot{MQRw2v+Q?yu>HPWQIOxF7T>5W z-3T-k^}L%6xmxBs8`<7*Ze#NVwwrnW5gE0s82i0uX#1BaMv9`bmZ3^(*54eimz6N zt?Er%!#4)2l7EndZG`W=)NZSGV*$SwzXnrQKy5T@17_S@!SpyfVFQjYX!IX4bzG{` zcZQfG$Q}u@El&3Qy(MD_U9pU4$r|j3}d(E_1uHT}tO${u2*$ z2;G0k;L^I4efY$LV?SDDk5}%Hciq2c0ZCb}y=xL55&EyX*dOBDz)@tFK8wqYl%$6O z#zjx(7QJ)vjNW#*VQxmruwF^CJ!ticXf0-2Mpav$7+&@=`O?9?fR4SUy~XUJs=WrQ zN2z}X&p;x}Mb%J10@+MY@9dY6d!>~jS>p}bc0e@G*g0Jv=8d_37K3)CCQmov+zwN|v!zT<4o5xu8dAk{-DhKk z(Er-puvFB0zXM~++kKy7Y{T7<7N79$9~!wtl^I z1#AM1@}5!OOoSLrG@cRyF0`>uNuRap9ZizXNFR501K&muKi^s8gj?gAtCyljXd4BX z4?oF$-Yz5hA8K>I{V1Q~x%XWXy62W;f%zx|-XG~2V!fU|9!-9U)CzsHn>UFCAtvv< z?OLYQj?JpCn?Wvd*U02hwzEmrP`2xS1)=@oiL+-j_jF00w)J%cT)=F^9W=hBe)IA1 zf9b!g(obBy%l4aG5pfT-K7yGyMk&jHaLnq;eETH@W!nJvE0RGWxi5wvr?)yokmLv# zsa!fCZh)VH^XbRCj(V$>{tqj4?!;0>EIlPX$l&J22Jl7VlPl^vhw!HUW^KS&i}d1n zT_P5)`c4DI6FF2g*9LtMa*bTD^jd}6B`?ReV!v|?n|G8dPt%V^L|0)zd*Sb8jYzxm z;d5gx*QDhFF7EEL`X%hTV{q;Z2Ordm>Q_b7DvY5X8&gukiB)Q?4e!A>l#WEZMLK1B z*&=Ox`7E-Hy`?4;n=mzNT-XX!cqdzuIfe?K*gXzfUAL-U5v%*w&K@zxqpw<~fdPcm z(pR?QBCZ~jcha=XdF1!JUDP`f`xDq_8K5uC{xdFwnaGiZr?C7%VSrP~l8BIy&3k}G zLrf8uQxV%tjCwktc7(paSSWMtF+SD4PX-ZpwPFPKh^bDf?TYzbHwVHA#-9>rGVCL0tImjJtqnZHp>w6&|qvs zL=3g)sK4f1jSK|UMStX)l@!wg2}}R%Z+iIHFU8v(w9ShVSbKi&w-)b4kcM!Yr|wTK z6_8g*DrJzLH6@FuCXG`xfGKc&Z#hG|^~)jb_Op*IinSprRyDT32zDV88zu|A@5f^S zz)q_}5N1Qbt@96u$O*xeCfns?v4HQawzF@XNYj94K7gr$S!m%M2dWljL;h5UVvK#r zB={K$w<$+!9cw^mqcfM=^w9Lbi298a7{KaxHi_Vdfim#pY2~MfjBKlEk5u04UnnVo4`69kn1R zIb!SyzEa{=l)~FCH~S7KU)GbKAdB|OWiUz3U;}PmhP2vwlMg|BY`48+MfRF5WnEWJ ztx1oT5}AEIOE$@Ap=kzGw;M*~LNFL+=DVTF;)_s8j0Bp_<$jcIa4*|4^RMQXcvO8G$A>K;DaET>vVtthEgabNfd>Kt=$Im>JNyXR&|Xo!H0vrC;a_T=W^9< zB!iN%97HAkYAEt47ezPMAsZTEZKV=Xytcl$q*QhJBs*=rPAK0U%TruD6r+TZ-piz( z6q?v{JU3UKiu`8BTyJK`l<$HP@bW*`2?#@}IUw{_vJ<0W9LxgU3koFqo?UB}3I_3d zBL4I6ogz;AzR5<&fm0Hs1vwIAs0lmuW3&b{4#XYL>+E;ktw>o?vyH?ZjU+MSEP;T$ z7_|_=d2)WmDcStY1#MeWl8Yu+LdC>Eos`T0Gsq1u4l`aQH!$88xu%z!ikV#=;WI0s7g~uvGi}s76Xo0VSa-C0w*K`Z!pPE5XnD zlDDA5HeUN#>ywD0uNDv4BSYCSl1$`P6gSK&Z@BO6GSR?o|D|*d^abh_CrO)f1y+B~`DK8O>DESpyNh4E9DNnhK!~qZ=~0 z2u)00eqAa8wA@X``s~O#6g&mNG3F7yWaN}QE}r)u+^qn@K&U1FmLbTBi?9x>35q<3 zfn~$*`+os?bypL9r`87Eh*lK8k7@(@DVlr^=m4W|(=#p%qCO z^Hb+F7$~Q;Nto+zF+yGx#Bog2q}kX4P{ecpC^=BLFvg3Lw44?E4!=v^ewUL`JgoTa zsa5EEc8{iUL~xk((9uDTl2f3RgP;wO07rs)UO|{_hbIe^B9o?8;65_`Q5aul&drOLC&A1d%0T(aieYxC)vEe)j^ka^LfuxHi)bd5MfVN zsQj<7S7v5)1_ep@2n zeHWDQF`#6}#h2k;gr|u#M^b}Ry?|pl)nP9-?~W8@!e;TlXhWi6qv2C_pX62pt#N|H z?tJ>N=-U)B8Aa9honR*xZ#)FhM|Ao-$y5@Z=8j|8dXg_@ijFxff1L_Ypq{k5zP$1u zfbiE9)>ncRYAvFp6il(r^6z#|!THr>2QVvR(E(s=1JIFJW${p`h^88y^_~AK^%H+& zl0qo^IamT%{Eajeq9>sZ5xlSfK6B#)!afokb}R&iINFd3*r-)!*&Jvl2}-1OFt-{= z5#!@gmMidt9#Wlbs>4g$THoU%G-$PlAi4*TD@B5bpx> zVVz#Q`*;_s6sxdNY|b2zJffEfrkLB;-G73jA!$+Q#y+&W!AkQV&`vB_?N7q;qqW>m zB>4`&r#V@?_Jufk(5C6lGy>UU+hpCAh7fFnRTu7>!Z!XlV&@DgBq9-#TE(p`yY@Fl z!Cwz*tz@>TG+hK4{F z#bO4@pErY#FlGAvKoZv*>|YyePS(&A6rn?>X8*m;nlo?rP1l6_D2Zck$R?|)F^cms z9fyZtH<6(bDQZfNA#!1p&0Z3s{9rlnK~#0hCBeRX(fIqCv0KxOo*8weAujdq6x58` z{)jiWsD|Nh9H`cHm_5FfO)KTr&0{^A@;WMMsYr@U`ch){HnINVd}i8cZ_4D`B)q{4 zSv=T4^kL%XPy@eR#toC)=>sd_L*fs5HM^px2{x%<1xbaIY*=ZX?}c6QO##DAQxU`S89pZ-w~(?>Osi9k=7DWkN#+_D1Xf%l=%e_H z1CGbZSWJ2Y26Iq3Q`HTr8}3Q2pwJ|wty9-%C*z;5$L?s<(inhW>&SCS{SKlMR--aCvb-N6P8~3`G~2fQ>@j;hzowM555iK+BG&8+_a3 zkEWgD`XtqTOqU@9=6;Cg7x$DBymSqw{R_WwO@t(>$?TXBxDvJ}@j?K@!iWt)FvzNzVwq(wDVrYu%7*)3kz{m>sY$i?9BA^4uLXkpoDEIf&vl){{H z5V|-!G;E>wNnE2)d?StdSM#f4aS9LRy)dA`2g~Ne@z60i4G_{q;Zx`YjKa%^?yg)x zg}`<7LNtlqu>9IUQJo1^!uTc^w!qFl+?7BdE{hMJ$aYl%r3m;3;kvM^sWC4GpcfS_ z==LLYgKL9qSW*{n6!cgl)8f_ z3VmuURp{Hw`DTAgGh9PQN`O=!1vWoHHHVXKF3C}jg)I-=<-5QkNgL)qV4Hh;9OBgU z$QN0-wek%Z-!*OpWHa1&Q9?dAml5|1IS4jjn@9Al*AfJa^$8hcz)>f3=( z`S0wx)V@^44;F9_`qmuf+dmGhd&o_Qdf)jN6L3S5e(rHtH}Dn zPB!bQqB!_guQ=?|0y~S5^>*Fs^pFSC(GY$Cq+KX2mh_!%a&oqPP2T!C#z!u|kqU@b^(vsl!=kJzn3u6=Tg`;S%rSxQ z%P-$nxe-SKoVvGHgTfM_7suP3Q5)!7N420?>q-rv$D<;YKn{qNVNO z@4|g1r6LF5jjt+8{tL1|b!WsZ;jm&P78sGmO^I8PAr%#u6_*+ZudOIPQbp)$LXu{; zON!6Wpwt&naffYF=feT5&nbi;a=StRk(5pYW`}!*j4_l~MZKbwRY{m(Oil)YG$vR(omhJu6ud%Os=Y-4 z>?VX6Npe#Tl9u7iYYfL$A2`$aKYxhDiQKq~^WETJx^AP&C9TZo@hPe;hOBBro#kO? zRW}P&y@OG5(PuTfE&e-C3Imr;9Qrl=^yn$_0GZjySSEZk_+rs^?tu(63buXZ6ayXH zV&%-J^hn2GyZR;2)Ks6;cMI#d$d!P`mE{8Ac>3)I8e#wjAEuPP?+~&~{OCz1B%yagdKgtWvCbJ-ncu3+rRnUDi_~Cc zx=%LYF?0o6uP_{8CF%e8AD>0IW&rCa^CB=FJ&WOq6jmGuyTY-m5hr}?GwQ}M*vhU5 zgOm<1OpBxC2!z~%nl~^zpf%Zg{p0Zl)}pdbKh_|U7_bop9! zW!-{TNV0#y!203Il6pt0Gs6>G{<+&6=W~ek@b(5*EzGGgIdrs-kuI+=@Go1DxUg=t|PqCBeX> zgW^u*7y|c~jU*!i@TtKaHoP1`&840yeq%G6z~em_NHZJtN{PMgr^TfZ?nfjSP)Lp$ zH$CPYX(FdEX41eF4S_gnr(}?xNE}yN?wJM=E6k?M`1`!lK=_DCwW;CO$t24l#;^

45ue0a2L;^e?wJW)4_5i3e$N--$RW`qGTDmi+oqtsD-Vu&7iHRMrB$D+H_tu;?Q zCi<2TKibUSjC?gJJW&fSN>q!I1&q~4OKeF7x9CZ#>25B?fbAI*Q;QrXBH+lu{}SM!hnuZ2scx1IO^_28u7>Xk~ne|2|m1GYW7n+)J-XC z&FCvJUXVb=l#~a3M;|_`tir)pc^@qPugYA8h%pnZz$)D=Ua+=o;rpM7pgAjMux^~l zMKQ71aDCS%33U?TA~rmorf>0@5rGcDh7Oxlqv~~zm}4?0i_WN~&45{TYvx1bl)A+?Lhmc+^97@ZhNLVy^M^pP7B%& zst6ShUbJg7j<)GD$5)k}6vKdKVu!@L+99mQ=AMUC*q!rniV5lw?Bk`?VE(&I!bEIj zNh3ifI~d#`FP+DBo+BrYzn8r<UEP-k{BdQ@TtvBldm!5JkgcJ!T}!a6hTk}PXToj=y<@tcXcNDACf`|;!2CG!JWKd zuIuD6YN@?X*pJMy67Tc7F|s!#3+40u08l$<(k4>IiFjt&`7_owlpCf>AX`as?#$N! ztDTgE*T_j2ymgWvT;unPke(p*uieZ_(YrSUx`S;<9k?mmXw|;#1dT%H%Iqhs;8s(G zu2+!8nX1s6qwhi-{E@|~TbWU>VU3ITY^5y~r@2NJ<$_e9ZIaZ0)mAj1la`)@4#77G z(Rh`b3JN0l;bkjNUtq9d^~0KhM+4YEq(A&N{xTOsrj-tv z)0dq2FQJ$YvPJ&yPcB+ZaxOGP9jXkz9AIm4=oBn+=s0)s*a6VENN!b-P^fkBGzd6x@Dl*$k;XO4CZ z&n9lsHw#hAGSI=^`bV%@loJjcq2_{II$f6s6;-g7U9O}Ch3I~wK298JV&P;+3WL-Y zKRD%vaxZ9qvHj2vBcs+1$ZPT=fcb2%s2hP0Ol(*fOr1WDIHk!`xPL2w3k;Gatc=j+r=fddzpbaWkW6`6NXnRMex&y`HP$+nmiUW1T{_Ui+NW>D8RCu57DEir;KJ$oSD z7@bIB7mc*seF8p>&e4+n%LR@^f)MVc=z+%xyHC(2=ij^<;)GYk4c7WMIzcF37vCNZ zEN!Zdh(*RTU5pul^5CQR(_QKmvcmfQU=tQE6ZUlX-367x;6{LMB>av;By)BTXi&J} z^7(9cd9;BoiHhEXO$35TZu29#j$wM+;Uk{<7pQP>FgV$W%AJEr#QGexLe-sv-q^(h zqd&bS$hEjO?&^5cf5(>KL4;^o3c9g4$?Gxg3>pWQ>K%PkBg!;jEPv~8Oj zo}%3<8cLFN2DehjMsHoS=6V%Urt~wGck!I+;TB=DpluRLs*pzwAq_;?N+h|YGpTSA z8epxrVpf9W0ER6pu8yNd5YCL32{&H&tAw0*w~yl8(m1M z{sJvXO)ZWJGAjQI$Q`ITETEtxCK6D?gP9)#8$nksiRL1wJBl5GinBPL234NDy= zxPBu4pnz6i4Ho1Gj*M~QCp_0l!Y8Usn+v@H(#_L)5#6>U}0_OfOSm`3U;N_9GZd zZ?sCx`8G+464RK=E%IHZ@k7vUP`F9_Nc%T9s*1lXv69dTNU##*{4gv8XyO#O$We5} z^lxGZhixohDdIm}4T{qmN#ZqzVf#fu-~P z)D|BAK?)YzyzXhMlTQ+&n8Dn>0Fs%X3r@p^7t*x&nB*&yRumOy@t6|rsPYR`A^(*A zN^;T8Lo?IYt2z_FB}Q?;h&i-}pQAXIE|rH4wBauHV_hK3kywfH4Pvhj9W2_+xXy*5 z%W+fEz}$E`rpnefmkO_AWh`#k!-MPudb{vj9@K*hA=F{dhE)vtB|7pHYPwqfL0?C# zACzzc^l}wRt5h~!d&)s_sZ}+()}yj^ks~b*bs%je{|8_5$s2qY|DW26q$HGmB>6lQ zOHs+lDB04v6A@Knsyv2o6is5H*V7^?%bol{wI) zK%-yObcGysie_IqpNihAMh;~-X;04l%iQDqA1mfcF|lG@58O9+2_)dW#lw$Lr9Wc# z{xcA$5rs(|q>GOMO9-DX+U3?S7v_-ki8I>{GL{_lu~$Vb_e3+HFNj+}KCXpuslrxJ2?N2Z%i^+U z9?s}3x!LUEqH^i`kYv#*6AH6ZxYuP!D7H)&PeFqa!CG}~*q`AkAH@kO7G6#8Joac4 zGuM-%VB%U*eRsr(CCZ&0zP1^82C)PihRjKR-TluZ^=?-F3>&M-e)v06K3EjoLAC^{ z+hnY=oTCyom^w))^$2xIlM1~zDI8mWh2vvvk(p2DGRO@ezNuDqJeuLm!5{!2451fL zk7~1Pm@pydR*6|FHtGy>{Rv0JZ(qcFM|6#)*GmoF!mue2?Aw|ccf6*l>1wms^6Hg{ zgy|Ak4R)02RvDMI&ln7~iPDL3!tO3*(seCpP&HPgJ2z07P-s2!F9k)am1Q5Eyq;MJ z1>qUCM30THrG_1L$9BkX37l!8;?Ge?DBo0m~L@AS~e*8x6nv7 zW;WVEQ;L4Bsylp}`hBr4)+f~Fg|91tVf*~qjH7-qbZyRoFgtUUWh(6>*l~CgnV2aL zjSLqey&l=7_i@PXHlK04!}lV^{*d}y1Z5(rQq8=%(g8K= z5cNKG4-&cywqJGfzlFkEn?%`?!vA7OgD#?o(Jb-K_N~$mgZ`zvWovt)jT39gzIEsa_PmUsIm}#-n1SuyWew?HdWOG@c4gvx$bW^9PW)$s?=<) zqP1gFqajMwXhf;i*rOUd@u6mHYPVH;epE}TQPCol7&W4#F=CZiwPM9CQtQ?8{r&~- z5AS_`zvtZNhkMU?p7Y!xMIjKBdo)eYcqjbM<6p&@Id?9hj?6`Z_+r9&HhFE8FM`Oo z`IA~0s0fmb;EDvOtMtbl33~bhvwR^EmN7Z>5pW-M8_<;@$rJ5q(3_=hxOUxSlADxa zkmhTY@E)Lm@$E1KMgAhOLv?=f(K7veRcvyO##$)S|31~ZY|8N`8gYxd-l6XtmT)?V zHFw-VPVp_-o%V{zwyvjNZgw_u-byvMgyG;*^kN;f{XN}s!4%0R0{H<$g=m8q7|uSI zY`T_kLspa;0M5>Uv10;F44!IOI%SBp`vg{&EM*x+3ch9qCOuj5()7Z|(`a*ms%|sF zbqpG#6hv#E<{-Z{IbO%ozA<7Y7tq2Oe&vwqoiSdCQvjM2HLMm-qL>&}T%e1hQ-MEE zq&nLbvHmWR%3iBzxwb1lvhon;M(pj>eK?3DN0C%JG zvO;U)a@S}x3%i_BN9jM6ZXS~?I(5vc5=@Ff*^K1-QI0{JdRtVd4%D>QZzc?}J4;Da zzdSUuj+RZ?RNH$+nn5d=0lZiVQOvJ_m@y{8-N8hgUk~QgbXEbM>_2Z8$&220(|f?q zUEMfsJtjKm$v}N>AN*>exMFX>rEQbL%Jh<}LJ%ZWC<;lI*RoU|1{XI}vsi2>lc}>6 zk96wk8O=?Eb38RKUu?#(_lE7UyDN1xH4qQ6nJ!0K*f%zzn3^o=Jw?mV`H})BTb=%b zXsyTkG@%JwEl^w9T=e4L8te84)0e10Vb1Q>UOR2hUiE4!4EoxGRgq9(lMif6L;uj5 z7M(vVi2|AiU-sRO0(;aK`9WAeUL5IqrGp~+J6ZZnS;g8Nx%1Y(F!{4GaIYi6^op&I zQ{qFgPJ-mFBgf?@^@Uzw*o5d@CF-Rb@LuvlZP-I?nT2l)=_Wr84HI(xqTGtSz)TuORqzqnW#N<%X(CM0p+BV#qi^){oY^JYrf(r{>W5Wj%T?L&wv zF!oDCK_YBOTH|nhGt_8*DV`_wZ@#UHM)xq~4*GESm zO(=|gAW-aLY3D9w0{G{9mFio^GVeLfq@9&@x{^#rwvIvkg`E9%jtn&P9VwsM2E5q$ zG5^(GN|1SvE!2T8M0Xmy)r}p0o75mRqGdcvSI=@>?^N(=w!QbL3V93jnx=Ys3%jt^ znVekiZNG3D92;TpXqmb>APyUwKK> zHKBBhjz4IO&69Z&AM@(Qqa+H}F+k#Y@Ov2?UM?UQH}*UiyxeeS47Ub04+F+vt&YkpuVG9s=@bau{)xpMt8P zmBnY|aSeQfS&!}U+qoa0GvZv$}*{)(`x!wsW4&Ifv;BRhL4N#J9_ExZR?H=Cdb~PG>0%Bi@)XE{uC*U~N zu>2N#SKTnJW5SYta~71+t^dKl4%R&rl0ycoJJ_1;+u-7m%1kPz6*I2`dspBj>v)y~`!0AC%TE6ay!S3`Zx2>y) z^;O``e3ns6=}NF1BF%Dqs^3N+qOFl%lyqtL3w)qS6WdI_7B|ISbaaC*%TuUDK;@_# z?)%;*uLQR?tKPK|gS&6Z$d3Bmd9jw6kJ903App?IZ%*w9Ttp5B%+X_2YABDc z^Q|7PhO$g}V&>83BqIMyr2gPGSA(#b3U)Dk#|QU~yu;=V`FBWcr+gXMyhWKj(g>2nP`CZTpf#vXT(XJ29)pax0d$-GI=` zh%Dn^(ByaDa8bv-_=)QnO7kDW&wPC3jTkabdA-s{XjBaN z<+K|J8K_ct16O;F+|ElEa-f@Z!`y-fam9`EklaB07Tou3mrdFP>Mq2(uf8ajic3`i zB=t7N5nXoNlI4K-+*6;h$VXNRC|YmD@O1qIj-%i_<6E-mQ)R9G6VJFgf`8;<@$fI{ zTCZvUJziGVa;W-KPjaxWdgPOW&P77rp(ugdf!{i$bk?(dBd%;9(xP;q5ogpc6O3#a ztPZ}XTDsG!Rz$al5v!RjjeMJZ(V=j zsTe)`TcJLGe(U7>X8ONQxcV+TLG$6I@8`2K{7Wj#v`#lkU(2+B?WJ`YVj$tdui6_3 zTj3r(^wmeAo3Amn0BV~=S8;gHiOd^GPU#eyeysZ5shHWYNMYpxg40T_%(b}>0glOc z$%63CH05hqT;fZ(A+=7#mfU}R8OXcn_NJD2OaB2;%Jcql1TSW#1o>_B$DUqd%d@n_ zV12)VKbt3E6;O(b#vaEJmtct61DbyXxwvD_`7K|beHIo!o%T+z9irt)0U&&S%!6H1 zIyj>K=Ws{R8_^nxa3$GF_`drdOJgMB%6OOU0;!F1b2|Sm{&G|Nm!$t|pjICF|AXmE zdeFN)T~Mw3f*&@fNJ>?f;)j=$QJSRKS@rWG+PfQ60#GXBJ5+_Iz<&v=f7 z_lh6s1Rt_d(uNYR34PKpDNXRAbN6bK_BX5k!0;(U0-&44D*43pMY7oEbrHsW%|ZH7Z!y^yw~L_Qh%4T z=koArm#5JKu3C*S)|)=eNP794z~D?sQc1chZklk#w2zYbXf?4H#}+?$;laCgWizDf znD-DTk%G?wGmdPfJVRF2>cQa=vSA^&BeDkO0#Ovn0&;`|T zoAD`>M?}L;e#Hzg>RHjH9#dwgbKxmFK3uHyRK-Nrsz}yivvp~Wti#XNpmjm+WI(8l zb>pP#*-rivZ&ov1)hfH81Liby*q3Jg)rV8m7&Ke9w-)0CA9wsSPmZXtvzt7hof?(T zj5iEu5bB!=(}Zw&BQyCWYr-`dbvI^HWY2!s#JS@p5S>8>JLHW?nQ8pSJc;kxMZI=a P3#YDoT(3cOKtuH((LcX* literal 0 HcmV?d00001 diff --git a/.yarn-offline-mirror/zencrepes.zindexer.testing-perfs-0.0.32.tgz b/.yarn-offline-mirror/zencrepes.zindexer.testing-perfs-0.0.32.tgz new file mode 100644 index 0000000000000000000000000000000000000000..89ecc9f852271ff893b033b06b068eeb3ac4578b GIT binary patch literal 11448 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 A2mk;8 literal 0 HcmV?d00001 diff --git a/.yarn-offline-mirror/zencrepes.zindexer.testing-states-0.0.5.tgz b/.yarn-offline-mirror/zencrepes.zindexer.testing-states-0.0.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5e162d0fe1f429fcec41d9acc2ce750fa57f2ba1 GIT binary patch literal 8822 zcmV-+B8lA}iwFP!00002|LuMGciTpiaDLWbfyaGs?aatj--rD9+o2^T}=*ej`h#o(A{$TLa^Y0&gd-Ck$$HDWHt{P5u5&6_uU zH&l5Mo4!d8&c?BI2QE37q~%U!=KNqZ9G}HWeqhE~=91#zLXAc)dyvO}xCi50ow@#b zaWUL`nWy8-xWm0Da*5JIXDbZ$MisuX%R^pl!=F)9T#eje^x9p$Ni(|_MTxp_&78u$ zEy|xhc0-$2Sy5e~{<#dN`r@-B&D=|+(@S?4AP5kDRdKVb`X#$FUz zH*$$}iJ1^KislJjLQM-bJW9t&vDi|a6z?XQbNH`klr+%Wsnk(~|KFAmeTLJKv= z*>KG$YKLJmrwV5WMN?9(D%@Ta<%KF-i;9|5&Bn>|AXLo~6IrTqPshf%Ja5ULLHI_+ z!*S-?%Ir0IHBYqvdAK)G_+cJU<6#j!Ds}q9y@P{)iz@9qu@ip!@w-P&qoIGHMmwA8 z4%>gHt|;Qe?TjE1go zFDF@3jqc-NQ5Ou~gJ_t(ahXxMYorA;;$?D{sf(!%^4cYFXd>v=#Hz^zFxS>7b3T5% zxt5wU&9v^zg(+%%Gp!Jt)n+)93#5k!FVV#!8)*VJZOOtw*t@M4P zTXACD+n~EkHD1|bFRK~2Ka4Np;xK{$>?Pw1?Xs7tf0>`F%;tv?{D9e_p<;H^#h0c3 zt8uW=wf{BrKSpFx|3k*XPXFII{eP*lXlf3=gwdlYbH9({%-!$xXU?VG*XtXa6%OsV zWPIVWu-2~{+mFs%aTxh=Vv0CTqWfP*@1o2V<1A^mUu&d?(fbB^wf8e4svzTn_@O?xecvx5f7J$RwiBtr88GNu{TC&(q_M`T_e*v zuhgn*H>G@p{tph8ey|R1)Bg(~TlW7FMtA!E&guVF$!rd)opgTD@?Wak+qVAzCwR&J z<7g-UcTfK7m0&qtM~|Y*G`10_{Q~20Z0GHVkkXs_4Mv$8ofcV~oJEhK`}x<=qyHbh zE0?SjYas7uZZuTJ-9Px{zrh2k9{e$Q@bhm6XZz8;dtdj9^t-UEK2o{6|MkPY_sjU) zpYCN`HK13m$M&?yqDKuZ8m0STTj1;H&mFlFSNzux8}NSm>B;fSXM?9Fr#}piPNGNA zJ;RX|9-;?OK=FVWEgxv7>;pm=CWa7bAiVdm+2M*}{Y!ek#BP59Xw}J9rCUq#T7^3& z{}cOf(;8r<{6j$5lKdmMoB!{u|IZ~wTwH|_U${K1b56rnM}Du)H{~FU9!YP__fDSv@chL>{$zo57k%fL8nW3H!e^zYF}V!h!( zQSLRi<9phc^?8WfJZR7_PYLwPwZnR%A2({Q=*zS3qctVJsa)>Sy?4EI)I03`zem0O zo=KC!B}MP>U9Uv7ci5Xlb$0lnx8EyOV($>VfB$)jwq6e$yHUUV_ZLsG4NF58$*!f2 zN~&G1mF_Q@aKBZ56~P5p8GMHgLdJ!=$R|W>or4=KoTgdv&5DWAq{Hz=GB*h?bFD$# zc#-H$wsmJtu+2-myrodyK(iG}C{Q^h7bv!lq6@=uW#?Mv-NlJ}6CGS3_~j;LoV>1! zj%vhQnvH|-NqLrxfg`DcNq2laEZy>$mRV%%Kdbg^(St& z2jwi8_ks}gCKgqw0s5d%tJL%K!j05f38=pKq2u68ygZl!KBxg7v;n?QaS3(qFjAEj zPVl9POTsCFdb!feO*-m8yjO|qv}-NRwe@6gBJ*?0u33ZShQ(pj`)|?5eON>JOW57a z59TsK6V&DL0<|6g$_qTJM)JWUq6R%b4esnPB4N1;o3OOYt*rQ_l_&T0YZEzeZFLS<(z z@Vw`81R!rKGo5{UT@zmKqIBW^=<;+pE+*suS!!JyxZ2_WBq>~$t_2!Ene^f!O0igQ=Q=D34Gf$JJbu%4BnK;ES(?^^p?}a?z+I%5?kK&erKkh- zAd)|(X{(@Ba!?-od0DY9Kd6*hZ>i*OZJjOo_E$F?xmDDgY%g`@m%2TVixpf=(kB2*B%F4jlq&b;m}HH>u^FvZQ?k_L`Pw8`hKj2gB67?kqH~nAg(T#(7u~)P0(#!CnVFdg)Ag&kEK5 zs{RgtzTbO)cP_(s-v8dkd}dZ~LXi9rAwL?@ex$xV6gvmFnGHEWH5NL|LtJ# z?ZXXxM}zd_=l!F>;OOCCaP-ao>&JtEtC|Rjz4yB_em9W+PjWeDjr=3NbpH?U&i{U1 z`EQJaYbbze>CI_?qruhVomk(p{C}cL6zk^y;OkpF|4(=KzdoP*&s=Y7M87I{4XM96 z8VoLu!@uFte*SGp`hGC@KK!AAfb+-u=x8wby(~hH_TS7EF`rVDRUl5C+B3 z{_D9S{|rU&t+`S#@m(OJn7<+}LfU(+Q?cagbX3<79)Qh_#u zfvM`{M}t8=E5MJdTBo5@S+&HX#ILN>?9x$jH2Zx+McZ-zXQLWmwfs}am+gN}cI*Go zC;zi?uvP=qMc1tXjwUPr@{e-Fmm*v*@DCm@WCtP84G9k!A?+WPz?Erdj|YRZ$04?bbKo3s`M?SQ8e61FPjEBUm*>w;K+Z1CR_VB;pvN#r<VG+B3j)a>Jw1t;`z zHG7;4j(*(#{bVrs{UnsWJozNZ)T8^=ha>X=oCqF)s}h;>PLere=j`~Q_!KQA0D1P4&9rfTyi2L{-e>oX=1anprgvfq}jV^ zQQuHvWhbh{g`TOU1mHeCFrY2x|gwFpkeK}e^c2E|gThs5EM{-2~S4C|0OCpgox#abSJ2!f?zs@S=p z)ha;iNH{GzeEcae3BtKdlXg_5WwVb(MFlV71pW+{DKC@txJ=7lZWAt3fgUw+nPNCv zkIS^|+Z*6=8q{v7dym4_&BVq#sW)++)@z!bPw0!=|E;(3ZNJEGY5j)*ZF&C{@BBZv z@>RzrT{QP}Ywy?Olf2#kYf?Yn|7)`FdjGFU<1P1)8{6`)h1aP=QhC*+nHL@quYONn z4X=L8o(ivjw*c#S6g*_r53JupQ|0sMpSYbmBNUl?)4!^-K>meS{TG{SJT+ctRqy&Q z7OWnVou#%kGkw~>nb7*S|9pYQ80mbMeKET+cG@4JU(Q=#K-*LFZFy@DSuq&e9{ImR zC^yFP7m06Mp~b4)`?od-d(M`d-}RHRqkFwAJ=s^AzW%+gNS?A&%+t{Xe#g|8y(gE@aa# zWYaEW(=KGwE@aa-glxLG&DM4Pf0GWNHSr$+U5fvJ;cox`^ZI|Lv3tTIVH&)rS~0Xo z@2S^Ildv_j4&(%>Y7&qkY@TR|?z@wrJ`?NH}xHiG%owdSMw zOjDcTeCotTJfCTs3juw8O|BQw=hvhqq|a^%_^-MCYh2>F)%70)u;u-Cx{LqzIo5x> zkZu1$A=`H9efPE8|FfH(0oL9BV_^CHf3(y8xAILi!Mmw0Q28u`TJ%0Bp^NBV7ZGld@3}&U$j4abor`LVR}R9-cHGN z$$x#5^Ha2O^ZUP5OrV|o@8o~8^1qY!mGl4XD(5Yp{{n1z{||Ard;jw` zhWyXV;GzV!$ls#$ElT}5vH$1>yM=wPL(-Szd_l?=Wqhwq!1vmud#_crzohp8Tkikg z_WB>emiT|+O!!XzKmE62;=jgp`+nw0Y;Gf#7W-i{+-6e{%g~!OgxZLIzgwDrR{5`A za=88VKg0+uum2g@$^Wg$|3xK#mo%)$!xQ$Gv|c%fU-$O*K2}Avhxe^ZOat+LK#<=6 z{NNyZejex1nM+)z3Kyv)8Yl7ZV;99X(kgd0N|UHK56bC6$4NOA*T1Wn0+C8=6c_oN z?NC8>(UapS&Z9iO7!9u?RfgaVjZMNem6WQ0B}Nr)0zUPT8V(~jbmjBh0oJp$a8Yrt zin4gKr6_355T(S~5|dD~B2JlOhE65UM)%7ts3`0~mBm7l(Wu5DNs~woN9QUTU$`tb zY8aVwl_^uWEdRRJvkm<`9}js+K?jy>E;91oM}|e-n~RCu84!7IccbuQ?7#Xkj}2RZ zYtDaTOqSn&f;<1ut$g!_o0$s-x!(UWi^tqdt%EV^G!3fj;aoiC`?E*l8}T}u)f<7L z7L%7TSO~nim^F>6N449@>JjK)b7^4eDU@1y^XZWYaDK+x-T;r-XO^J;w@&kl%< z=$(rtrhz-}ziSDCx>$MzB^JVYwPoksXv|0NT4Ld92G0dDT;}mIpFdLv8^IPg+W#-D zb772cs%z81|Nh}D9NTnbsgA|Ao87NJ|Igm>y6yEJ$8`Dr7a}|V&#in12hq=U@U)5G zOuUtmPqS*h;*ugRt|rU4>PIl#Cn41)!J!}SHBE@<(bSn+RoLH~MLk`PDm}9!YN%y$ zZAjE{d}?QDuS#cZZtH=CO~1|3trXrih9((k>bYkII{KSNTxJd2mS# zWAi!>ZWfh9FH2gyjP%&NcE#S3fjgbWHyZiAeJE~*=BuRk*p2#8(j~h83IzWMb=XDl zH43Vv`Q-|g@GnR9`u1WO>8xcz*jNm9g@7{}TBl>d9x6{}bZx|F1Z`VFaBhm7pOrrZ$yU8Ex8}Jw&W5cWnU74^8iBgI8;i5y z(#-xLo#~RfTj)=V8MexJoA1<|#W&xjwyFyY(vA0J-bCoKCvL!(#flrkvpmqyf@gi! z;X_buse40gXZN_55Dt;$Cr2*Y(eB8+CgRJrH;ek@U`RXa9huieeYy6A#z?@sKD*M6 zcvtQk4UbE?;bFXz7Z`@tWya|nId{?9auYLV-4JhXA*(@*XHVHEJC^FIXd_J3~Y zdshac&(d(Ia288G!~uAc__P_QJiPYb^tp;pykYRX55FV;%nQyPTFgm~#P%XJHPa z9tX-X0vScZF=3E%Tr(sjLI7A~6vL2HDG9cOAnAqXTxvRg5#Y zX~4>RXNvsWVXD>e)TE<2I`*R4zC(OL0Ip$;HG~`D6=PazDI_o+aE1Y~4k>9U0?w)xwBgw4b+;ZqyCu=qdxRo`{K+<=VH*AgAC@i?4f(mTCQ5-jJO-WIEQgS_yVOY5w*+DfLdP|y)Vjm8p6L9v36 zawRG7R&wqI6+l=mEbu~6(aD=l0^U}gM*Aks+-e4~FijhXEbyFTNq{8ULg@q{jCd&s zP#ypd9n}(3VVn(d7@+gcLn|!mWY8u7Z|xe#q{E>z!L_xTOQmsZB}R@&#)5(&P!mQJ zL`py*rIpH2kBmSPFzhMiP%|yKV-|U7I=Qq-z+20u$(4aLTg@b6jnPUfEXpN4_LeD2 z02GE1pa_SG8Nh&(%tM3`UcxV;T1X}~Fwa6)=J>k$hiW#)bE8i_h8w9+yJQ`)`MVzl;5zt)8aM_zW zW;8(%8i<4k3M)mpC6H*uDHK2pQj48IQYfvx={B`D33!`X^!93v@6CJ9gvJIF zjD=?!1FjIYgfeCwq|R9`Io7}$YMJz5iHWpP1{y>$q}{%^4FcX;24&6%lVQzNq#2L` zASIX-N+F@8p$ubaiKf_735>!98mthdm;wxla@Ya}Am?0md#*PLcxzddUtQ>QxSB&4 zKumd9UK-52#Y!2)C1(Txq%nuwDj+$c3NyvL0mvzX1)~x}2)yiGv~CjcwsYu>8xCJ5 z>6>-dH{$>SVJ){xT4p#WN<+=5ffR8iAPANjmqHpM0ktl8)|8+O8ZE7H-A2O(0dFa< zSYKtCy6VS?8IJ85(*bKo6(khf;9Pb9LyH*G9uwrTB$xp#IJQCprG=KtDoGteSV$}+ zSm8n4B;YM&6z^B3B3E+=a;>2^Qc?*u02ERRkVTAmMX5Ccb6^NH6iMNUq6PthDdpt? zh$_^*M%pCct>sX7+t=9(cadi6Y&>8!flM1?HO7)tN`zJ(NJWry!VvD1aZoA4Ww@CG z6#&3PN11RO;cmCkCIN3RpUU%4YaDlqX~?nTSSqHZWJoGOCDC3ZNsQqbN$oY)2yqXQ zgPt1*wSf$4L3#Hs>m~tjEr;TySYzNpq%Z`8a6>J^hFf5%QAl|Pn8Vrvp}bX0LI5CR z90R2#G7L#6oz^Q%@J#~VTKYk zL&t_41+0}O2tfxuvzBz*cAEserEC&?m0u<1n(kHLw4jz5DuD);axS4%Tsi;*@d|Q6 z4Af35<}I+qNeT%@UO{Iar4V$R4x0qL-JH6fk5v(1h!seCh`q7SB1x4&;S>&Wnp*-8 zkqlx3sRKN?4UjjSIzk;}n0B8r*(BhtWz_na$$Dvo;>akWfwK&GN;uF2A|Mo?f_vaO z_CRr~kq8SP#F6n5Q5@W(ZiWADbAY#&KiBesYmF@S8c+o-@?IMy2{(qDaP-3>?4Sh{ zTSg_t5^9SPwN4{O6%-b;?)|<^0^V8{W$w(q9j)=O3Sd2_f&%XpH7Xcjj$kb%kr)f( zh(p!^!MubVVkeb{3NSA@798pBgAJPmyrmqH6Q9uPQ$dz;jWo583M`xjk|-s;he%52 zjPnF&C;>;vX$GZMhA_w&}Z$Y5x-$J_&8yunB# z6&9b!K^c5H%6Uz-=rNYzzgAl>k%N5&5n*_X_973S4Qwi#b(4U%mP6OFwmHF6bLy?f6i9}UCz z6AdI2fkg1uCahG}Sfjf)CN>FpYx#36ZKnx=43>Up4=}DM23T?MRz+20qYncqjGUv4rm=22f)xxGegcdZH;10wdzXI{*kUtgr^)!#n=R z^bL>hsRCh)g31;eNoJ(cxSUrx#Yj-asYZxsYrQ5;V;e4Dd2X!LhyxDfiqkrXQt7OK zVcQyd&ciKxr;tz_L*uORnxW9HcLsZE3_}(p&8el*QT!1%x#yI?UrH@-5JCksVj6c_ zHcS(#q;;G~<-^8>rrJ1Yg)syfuN)JQ85@>Ym{CEzm54GeG;$Ql?$N(Vz&9gD9nPg& z(RnVsks2Fg4FEy_#Ra0)JL8Nc+#yZ`WWI2eZ#rSqkQG&eGChXE0N)flvFhXTuKEn`Lp*4_5QL4f+SUF3XvC;$N zZaBW1PfYgGQMg?<_dZQJE{@|Y;MG5vLhcnRJ99V_k?+`V9c zn_@Awv?cSnSR!YVKDihTV-pvHv;5CtdGu}dA*o7jP*SBi&v(X(5~j=Z{nf* zK^5l}#b!@!y~@+1H#f91=UwI!<7~yIckQx1Prx}dZ+{`HX$kEw(S52j=d-3$$b53c zyjbe#{KT`C!%Gu%4RDSe)mv`PR$`Ig5t__(A$J!l2`V5~XGxkDvB`gMSr`!woI5e@ z#&@pwom1gW&7@X#c37C(azXp30b4{{5b9xQ)3z_Z7F{M&H)lsoJJnM_Y6+=T1M4diSs0Y{kWtZMeFz z1(zG{^jo^yaCc!FPWNxa`S)!&A%3SHU*3uX;M;ISdbHthe`m7d&nE?Y`Z&`|j}ff9|7Fi2x`80Ct6bDgXcg literal 0 HcmV?d00001 diff --git a/.yarnrc b/.yarnrc new file mode 100644 index 0000000..d35ece1 --- /dev/null +++ b/.yarnrc @@ -0,0 +1 @@ +yarn-offline-mirror "./.yarn-offline-mirror" diff --git a/package.json b/package.json index 4c815f9..7c71499 100644 --- a/package.json +++ b/package.json @@ -85,9 +85,10 @@ "ts" ], "rootDir": "src", + "setupFiles": ["/../test/jest.setup.js"], "testRegex": ".spec.ts$", "transform": { - "^.+\\.(t|j)s$": "ts-jest" + "^.+\\.ts$": "ts-jest" }, "coverageDirectory": "../coverage", "testEnvironment": "node" diff --git a/src/config.service.spec.ts b/src/config.service.spec.ts new file mode 100644 index 0000000..f19d786 --- /dev/null +++ b/src/config.service.spec.ts @@ -0,0 +1,96 @@ +import { Logger } from '@nestjs/common'; +import * as fs from 'fs'; +import * as jsYaml from 'js-yaml'; +import * as os from 'os'; +import * as path from 'path'; + +import { ConfigService } from './config.service'; + +describe('ConfigService', () => { + let configDir: string; + let exitSpy: jest.SpyInstance; + const initialEnv = { ...process.env }; + + beforeAll(() => { + jest.spyOn(Logger.prototype, 'log').mockImplementation(() => undefined); + jest.spyOn(Logger.prototype, 'error').mockImplementation(() => undefined); + }); + + beforeEach(() => { + configDir = fs.mkdtempSync(path.join(os.tmpdir(), 'zqueue-config-')); + process.env.CONFIG_PATH = configDir; + delete process.env.APP_VERSION; + exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => { + throw new Error('process.exit called'); + }); + }); + + afterEach(() => { + exitSpy.mockRestore(); + process.env = { ...initialEnv }; + }); + + it('initializes a default configuration file and exits when none exists', () => { + expect(() => new ConfigService()).toThrow('process.exit called'); + + expect(exitSpy).toHaveBeenCalledWith(1); + const configFile = path.join(configDir, 'config.yml'); + expect(fs.existsSync(configFile)).toBe(true); + const written = jsYaml.safeLoad(fs.readFileSync(configFile, 'utf8')); + expect(written).toHaveProperty('elasticsearch'); + expect(written).toHaveProperty('github'); + }); + + it('loads an existing configuration file', () => { + const userConfig = { + elasticsearch: { host: 'http://127.0.0.1:9200' }, + github: { webhook: { secret: 'fake-secret' } }, + }; + fs.writeFileSync( + path.join(configDir, 'config.yml'), + jsYaml.safeDump(userConfig), + ); + + const service = new ConfigService(); + + expect(exitSpy).not.toHaveBeenCalled(); + expect(service.getUserConfig()).toEqual(userConfig); + }); + + it('exposes the environment configuration through get()', () => { + fs.writeFileSync( + path.join(configDir, 'config.yml'), + jsYaml.safeDump({ elasticsearch: {} }), + ); + + const service = new ConfigService(); + + expect(service.get('CONFIG_DIR')).toEqual(configDir); + expect(service.get('APP_VERSION')).toEqual('develop'); + }); + + it('reads the application version from the environment', () => { + process.env.APP_VERSION = '1.2.3'; + fs.writeFileSync( + path.join(configDir, 'config.yml'), + jsYaml.safeDump({ elasticsearch: {} }), + ); + + const service = new ConfigService(); + + expect(service.get('APP_VERSION')).toEqual('1.2.3'); + }); + + it('allows replacing the user configuration', () => { + fs.writeFileSync( + path.join(configDir, 'config.yml'), + jsYaml.safeDump({ elasticsearch: {} }), + ); + const service = new ConfigService(); + const newConfig = { elasticsearch: { host: 'http://other:9200' } } as any; + + service.setUserConfig(newConfig); + + expect(service.getUserConfig()).toEqual(newConfig); + }); +}); diff --git a/src/esClient.service.spec.ts b/src/esClient.service.spec.ts new file mode 100644 index 0000000..96fd490 --- /dev/null +++ b/src/esClient.service.spec.ts @@ -0,0 +1,91 @@ +import { Logger } from '@nestjs/common'; +import { Client } from '@elastic/elasticsearch'; +import * as fs from 'fs'; + +import { EsClientService } from './esClient.service'; +import { ConfigService } from './config.service'; + +jest.mock('@elastic/elasticsearch', () => ({ + Client: jest.fn(), +})); + +const buildConfigService = (elasticsearch) => + ({ + getUserConfig: () => ({ elasticsearch }), + } as ConfigService); + +describe('EsClientService', () => { + beforeAll(() => { + jest.spyOn(Logger.prototype, 'log').mockImplementation(() => undefined); + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('connects to Elastic Cloud when cloud credentials are provided', () => { + new EsClientService( + buildConfigService({ + cloudId: 'deployment:abcdef', + username: 'elastic', + password: 'fake-password', + host: 'http://127.0.0.1:9200', + }), + ); + + expect(Client).toHaveBeenCalledWith({ + cloud: { + id: 'deployment:abcdef', + username: 'elastic', + password: 'fake-password', + }, + }); + }); + + it('connects with an SSL certificate authority when configured', () => { + const readFileSyncSpy = jest + .spyOn(fs, 'readFileSync') + .mockReturnValue('FAKE-CA-CONTENT'); + + new EsClientService( + buildConfigService({ + host: 'https://es.internal:9200', + sslCa: '/path/to/ca.pem', + }), + ); + + expect(readFileSyncSpy).toHaveBeenCalledWith('/path/to/ca.pem'); + expect(Client).toHaveBeenCalledWith({ + node: 'https://es.internal:9200', + ssl: { ca: 'FAKE-CA-CONTENT' }, + }); + readFileSyncSpy.mockRestore(); + }); + + it('connects to a plain host when no cloud or ssl settings are provided', () => { + new EsClientService(buildConfigService({ host: 'http://127.0.0.1:9200' })); + + expect(Client).toHaveBeenCalledWith({ node: 'http://127.0.0.1:9200' }); + }); + + it('ignores incomplete cloud credentials', () => { + new EsClientService( + buildConfigService({ + cloudId: 'deployment:abcdef', + username: '', + password: '', + host: 'http://127.0.0.1:9200', + }), + ); + + expect(Client).toHaveBeenCalledWith({ node: 'http://127.0.0.1:9200' }); + }); + + it('exposes the created client', () => { + const service = new EsClientService( + buildConfigService({ host: 'http://127.0.0.1:9200' }), + ); + + expect(service.getEsClient()).toBe((Client as jest.Mock).mock.instances[0]); + }); +}); diff --git a/src/ghClient.service.spec.ts b/src/ghClient.service.spec.ts new file mode 100644 index 0000000..bf2c7ba --- /dev/null +++ b/src/ghClient.service.spec.ts @@ -0,0 +1,126 @@ +import { Logger } from '@nestjs/common'; + +import { GhClientService } from './ghClient.service'; +import { ConfigService } from './config.service'; + +const buildConfigService = () => + ({ + getUserConfig: () => ({ github: { token: 'fake-token-1234' } }), + } as ConfigService); + +describe('GhClientService', () => { + let service: GhClientService; + + beforeAll(() => { + jest.spyOn(Logger.prototype, 'log').mockImplementation(() => undefined); + jest.spyOn(Logger.prototype, 'warn').mockImplementation(() => undefined); + jest.spyOn(Logger.prototype, 'debug').mockImplementation(() => undefined); + }); + + beforeEach(() => { + jest.clearAllMocks(); + service = new GhClientService(buildConfigService()); + // Avoid real 1s pauses between queries + (service as any).sleep = jest.fn().mockResolvedValue(undefined); + }); + + it('initializes an apollo client', () => { + expect(service.getGhClient()).toBeDefined(); + }); + + it('starts with a full rate limit', () => { + expect(service.getRateLimit()).toEqual({ + limit: 5000, + cost: 1, + remaining: 5000, + resetAt: null, + }); + }); + + it('stores an updated rate limit', () => { + const rateLimit = { limit: 5000, cost: 2, remaining: 42, resetAt: 'later' }; + + service.setRateLimit(rateLimit); + + expect(service.getRateLimit()).toEqual(rateLimit); + }); + + describe('graphqlQuery', () => { + it('returns the query result and tracks the rate limit', async () => { + const rateLimit = { + limit: 5000, + cost: 1, + remaining: 4900, + resetAt: '2026-01-01T00:00:00Z', + }; + const queryMock = jest.fn().mockResolvedValue({ + data: { nodes: ['node-1'], rateLimit }, + }); + (service.getGhClient() as any).query = queryMock; + + const result = await service.graphqlQuery('QUERY', { id: '1' }); + + expect(queryMock).toHaveBeenCalledWith({ + query: 'QUERY', + variables: { id: '1' }, + fetchPolicy: 'no-cache', + errorPolicy: 'ignore', + }); + expect(result.data.nodes).toEqual(['node-1']); + expect(service.getRateLimit()).toEqual(rateLimit); + }); + + it('logs graphql errors returned in the response', async () => { + const warnSpy = jest.spyOn(Logger.prototype, 'warn'); + (service.getGhClient() as any).query = jest.fn().mockResolvedValue({ + data: { + errors: [{ message: 'Something went wrong' }], + rateLimit: { limit: 5000, cost: 1, remaining: 4900, resetAt: 'x' }, + }, + }); + + await service.graphqlQuery('QUERY', {}); + + expect(warnSpy).toHaveBeenCalledWith('Something went wrong'); + }); + }); + + describe('fetchNodesById', () => { + it('returns the fetched nodes', async () => { + (service as any).graphqlQuery = jest + .fn() + .mockResolvedValue({ data: { nodes: ['node-1', 'node-2'] } }); + + const nodes = await service.fetchNodesById('QUERY', { + nodesArray: ['id-1'], + }); + + expect(nodes).toEqual(['node-1', 'node-2']); + }); + + it('retries on failure and eventually recovers', async () => { + (service as any).graphqlQuery = jest + .fn() + .mockResolvedValueOnce({}) + .mockResolvedValueOnce({ data: { nodes: ['node-1'] } }); + + const nodes = await service.fetchNodesById('QUERY', { + nodesArray: ['id-1'], + }); + + expect(nodes).toEqual(['node-1']); + expect((service as any).graphqlQuery).toHaveBeenCalledTimes(2); + }); + + it('gives up after too many consecutive failures', async () => { + (service as any).graphqlQuery = jest.fn().mockResolvedValue({}); + + const result = await service.fetchNodesById('QUERY', { + nodesArray: ['id-1'], + }); + + expect(result).toEqual({}); + expect((service as any).graphqlQuery).toHaveBeenCalledTimes(4); + }); + }); +}); diff --git a/src/github/fetchNode/index.spec.ts b/src/github/fetchNode/index.spec.ts new file mode 100644 index 0000000..1114272 --- /dev/null +++ b/src/github/fetchNode/index.spec.ts @@ -0,0 +1,87 @@ +import fetchNode from './index'; + +import processLabelPayload from './processLabel'; +import processIssuePayload from './processIssue'; +import processPullrequestPayload from './processPullrequest'; +import processMilestonePayload from './processMilestone'; +import processReleasePayload from './processRelease'; +import processProjectPayload from './processProject'; +import processRepositoryPayload from './processRepository'; +import processStargazerPayload from './processStargazer'; +import processWatcherPayload from './processWatcher'; + +jest.mock('./processLabel'); +jest.mock('./processIssue'); +jest.mock('./processPullrequest'); +jest.mock('./processMilestone'); +jest.mock('./processRelease'); +jest.mock('./processProject'); +jest.mock('./processRepository'); +jest.mock('./processStargazer'); +jest.mock('./processWatcher'); + +const processors: Array<[string, jest.Mock]> = [ + ['labels', processLabelPayload as jest.Mock], + ['issues', processIssuePayload as jest.Mock], + ['pullrequests', processPullrequestPayload as jest.Mock], + ['milestones', processMilestonePayload as jest.Mock], + ['releases', processReleasePayload as jest.Mock], + ['projects', processProjectPayload as jest.Mock], + ['repos', processRepositoryPayload as jest.Mock], + ['stargazers', processStargazerPayload as jest.Mock], + ['watchers', processWatcherPayload as jest.Mock], +]; + +describe('fetchNode dispatcher', () => { + const ghClientService = { fetchNodesById: jest.fn() }; + const esClient = {}; + const userConfig = {}; + const logger = { log: jest.fn(), debug: jest.fn() }; + const payload = { action: 'opened' }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it.each(processors)( + 'routes a %s event to its processor', + (eventType, processor) => { + fetchNode( + ghClientService, + esClient, + userConfig, + logger, + payload, + eventType, + ); + + expect(processor).toHaveBeenCalledWith( + ghClientService, + esClient, + userConfig, + logger, + payload, + ); + for (const [, other] of processors) { + if (other !== processor) { + expect(other).not.toHaveBeenCalled(); + } + } + }, + ); + + it('does nothing for an unknown event type', () => { + fetchNode( + ghClientService, + esClient, + userConfig, + logger, + payload, + 'unknown', + ); + + for (const [, processor] of processors) { + expect(processor).not.toHaveBeenCalled(); + } + }); +}); diff --git a/src/github/fetchNode/processIssue.spec.ts b/src/github/fetchNode/processIssue.spec.ts new file mode 100644 index 0000000..83e62c2 --- /dev/null +++ b/src/github/fetchNode/processIssue.spec.ts @@ -0,0 +1,166 @@ +import processIssuePayload from './processIssue'; + +import { ingestNodes } from '@bit/zencrepes.zindexer.github-issues'; +import { + getEsIndex, + checkEsIndex, + pushEsNodes, + aliasEsIndex, +} from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.github-issues', () => ({ + fetchNodesById: 'FETCH_NODES_QUERY', + ingestNodes: jest.fn(), + esMapping: { mappings: {} }, + esSettings: { settings: {} }, +})); + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + getEsIndex: jest.fn(), + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), + aliasEsIndex: jest.fn(), +})); + +const buildUserConfig = (oneIndexPerSource = false) => ({ + elasticsearch: { + oneIndexPerSource, + dataIndices: { githubIssues: 'gh_issues' }, + }, +}); + +const buildPayload = (action: string) => ({ + action, + issue: { node_id: 'node-1' }, +}); + +const remoteNode = { + id: 'issue-id', + repository: { + id: 'repo-id', + name: 'zqueue', + owner: { login: 'zencrepes' }, + }, +}; + +describe('processIssuePayload', () => { + let ghClientService: { fetchNodesById: jest.Mock }; + let esClient: { delete: jest.Mock }; + let logger: { log: jest.Mock; debug: jest.Mock }; + + beforeEach(() => { + jest.clearAllMocks(); + jest.spyOn(console, 'log').mockImplementation(() => undefined); + ghClientService = { fetchNodesById: jest.fn().mockResolvedValue([]) }; + esClient = { delete: jest.fn().mockResolvedValue({}) }; + logger = { log: jest.fn(), debug: jest.fn() }; + }); + + afterEach(() => { + (console.log as jest.Mock).mockRestore(); + }); + + it('deletes the node from Elasticsearch on a deleted action', async () => { + await processIssuePayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('deleted'), + ); + + expect(esClient.delete).toHaveBeenCalledWith({ + id: 'node-1', + index: 'gh_issues', + }); + expect(ghClientService.fetchNodesById).not.toHaveBeenCalled(); + }); + + it('deletes the node from Elasticsearch on a transferred action', async () => { + await processIssuePayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('transferred'), + ); + + expect(esClient.delete).toHaveBeenCalledWith({ + id: 'node-1', + index: 'gh_issues', + }); + }); + + it('fetches the node and pushes it to Elasticsearch on other actions', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_issues'); + const userConfig = buildUserConfig(); + + await processIssuePayload( + ghClientService, + esClient, + userConfig, + logger, + buildPayload('opened'), + ); + + expect(ghClientService.fetchNodesById).toHaveBeenCalledWith( + 'FETCH_NODES_QUERY', + { nodesArray: ['node-1'] }, + ); + expect(ingestNodes).toHaveBeenCalledWith( + [remoteNode], + 'zqueue', + userConfig, + 'repo-id', + ); + expect(getEsIndex).toHaveBeenCalledWith( + 'gh_issues', + false, + 'zencrepes/zqueue', + ); + expect(checkEsIndex).toHaveBeenCalled(); + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'gh_issues', + ['ingested-node'], + expect.any(Function), + ); + expect(aliasEsIndex).not.toHaveBeenCalled(); + }); + + it('creates an index alias when using one index per source', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_issues_zencrepes_zqueue'); + + await processIssuePayload( + ghClientService, + esClient, + buildUserConfig(true), + logger, + buildPayload('opened'), + ); + + expect(aliasEsIndex).toHaveBeenCalledWith( + esClient, + 'gh_issues', + expect.any(Function), + ); + }); + + it('does not push anything when the node cannot be fetched', async () => { + ghClientService.fetchNodesById.mockResolvedValue([]); + + await processIssuePayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('opened'), + ); + + expect(pushEsNodes).not.toHaveBeenCalled(); + }); +}); diff --git a/src/github/fetchNode/processLabel.spec.ts b/src/github/fetchNode/processLabel.spec.ts new file mode 100644 index 0000000..668eb2f --- /dev/null +++ b/src/github/fetchNode/processLabel.spec.ts @@ -0,0 +1,154 @@ +import processLabelPayload from './processLabel'; + +import { ingestNodes } from '@bit/zencrepes.zindexer.github-labels'; +import { + getEsIndex, + checkEsIndex, + pushEsNodes, + aliasEsIndex, +} from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.github-labels', () => ({ + fetchNodesById: 'FETCH_NODES_QUERY', + ingestNodes: jest.fn(), + esMapping: { mappings: {} }, + esSettings: { settings: {} }, +})); + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + getEsIndex: jest.fn(), + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), + aliasEsIndex: jest.fn(), +})); + +const buildUserConfig = (oneIndexPerSource = false) => ({ + elasticsearch: { + oneIndexPerSource, + dataIndices: { githubLabels: 'gh_labels' }, + }, +}); + +const buildPayload = (action: string) => ({ + action, + label: { node_id: 'label-1' }, +}); + +const remoteNode = { + id: 'label-id', + repository: { + id: 'repo-id', + name: 'zqueue', + owner: { login: 'zencrepes' }, + }, +}; + +describe('processLabelPayload', () => { + let ghClientService: { fetchNodesById: jest.Mock }; + let esClient: { delete: jest.Mock }; + let logger: { log: jest.Mock; debug: jest.Mock }; + + beforeEach(() => { + jest.clearAllMocks(); + jest.spyOn(console, 'log').mockImplementation(() => undefined); + ghClientService = { fetchNodesById: jest.fn().mockResolvedValue([]) }; + esClient = { delete: jest.fn().mockResolvedValue({}) }; + logger = { log: jest.fn(), debug: jest.fn() }; + }); + + afterEach(() => { + (console.log as jest.Mock).mockRestore(); + }); + + it('deletes the node from Elasticsearch on a deleted action', async () => { + await processLabelPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('deleted'), + ); + + expect(esClient.delete).toHaveBeenCalledWith({ + id: 'label-1', + index: 'gh_labels', + }); + expect(ghClientService.fetchNodesById).not.toHaveBeenCalled(); + }); + + it('survives a failed deletion (node already gone)', async () => { + esClient.delete.mockRejectedValue(new Error('document missing')); + + await expect( + processLabelPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('deleted'), + ), + ).resolves.toBeUndefined(); + }); + + it('fetches the node and pushes it to Elasticsearch on other actions', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_labels'); + + await processLabelPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('created'), + ); + + expect(ghClientService.fetchNodesById).toHaveBeenCalledWith( + 'FETCH_NODES_QUERY', + { nodesArray: ['label-1'] }, + ); + expect(ingestNodes).toHaveBeenCalledWith([remoteNode], 'zqueue', 'repo-id'); + expect(checkEsIndex).toHaveBeenCalled(); + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'gh_labels', + ['ingested-node'], + expect.any(Function), + ); + expect(aliasEsIndex).not.toHaveBeenCalled(); + }); + + it('creates an index alias when using one index per source', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_labels_zencrepes_zqueue'); + + await processLabelPayload( + ghClientService, + esClient, + buildUserConfig(true), + logger, + buildPayload('created'), + ); + + expect(aliasEsIndex).toHaveBeenCalledWith( + esClient, + 'gh_labels', + expect.any(Function), + ); + }); + + it('does not push anything when the node cannot be fetched', async () => { + ghClientService.fetchNodesById.mockResolvedValue([]); + + await processLabelPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('created'), + ); + + expect(pushEsNodes).not.toHaveBeenCalled(); + }); +}); diff --git a/src/github/fetchNode/processMilestone.spec.ts b/src/github/fetchNode/processMilestone.spec.ts new file mode 100644 index 0000000..a9e290c --- /dev/null +++ b/src/github/fetchNode/processMilestone.spec.ts @@ -0,0 +1,145 @@ +import processMilestonePayload from './processMilestone'; + +import { ingestNodes } from '@bit/zencrepes.zindexer.github-milestones'; +import { + getEsIndex, + checkEsIndex, + pushEsNodes, + aliasEsIndex, +} from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.github-milestones', () => ({ + fetchNodesById: 'FETCH_NODES_QUERY', + ingestNodes: jest.fn(), + esMapping: { mappings: {} }, + esSettings: { settings: {} }, +})); + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + getEsIndex: jest.fn(), + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), + aliasEsIndex: jest.fn(), +})); + +const buildUserConfig = (oneIndexPerSource = false) => ({ + elasticsearch: { + oneIndexPerSource, + dataIndices: { githubMilestones: 'gh_milestones' }, + }, +}); + +const buildPayload = (action: string) => ({ + action, + milestone: { node_id: 'milestone-1' }, +}); + +const remoteNode = { + id: 'milestone-id', + repository: { + id: 'repo-id', + name: 'zqueue', + owner: { login: 'zencrepes' }, + }, +}; + +describe('processMilestonePayload', () => { + let ghClientService: { fetchNodesById: jest.Mock }; + let esClient: { delete: jest.Mock }; + let logger: { log: jest.Mock; debug: jest.Mock }; + + beforeEach(() => { + jest.clearAllMocks(); + jest.spyOn(console, 'log').mockImplementation(() => undefined); + ghClientService = { fetchNodesById: jest.fn().mockResolvedValue([]) }; + esClient = { delete: jest.fn().mockResolvedValue({}) }; + logger = { log: jest.fn(), debug: jest.fn() }; + }); + + afterEach(() => { + (console.log as jest.Mock).mockRestore(); + }); + + it('deletes the node from Elasticsearch on a deleted action', async () => { + await processMilestonePayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('deleted'), + ); + + expect(esClient.delete).toHaveBeenCalledWith({ + id: 'milestone-1', + index: 'gh_milestones', + }); + expect(ghClientService.fetchNodesById).not.toHaveBeenCalled(); + }); + + it('fetches the node and pushes it to Elasticsearch on other actions', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_milestones'); + + await processMilestonePayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('created'), + ); + + expect(ghClientService.fetchNodesById).toHaveBeenCalledWith( + 'FETCH_NODES_QUERY', + { nodesArray: ['milestone-1'] }, + ); + expect(ingestNodes).toHaveBeenCalledWith([remoteNode], 'zqueue', 'repo-id'); + expect(getEsIndex).toHaveBeenCalledWith( + 'gh_milestones', + false, + 'zencrepes/zqueue', + ); + expect(checkEsIndex).toHaveBeenCalled(); + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'gh_milestones', + ['ingested-node'], + expect.any(Function), + ); + expect(aliasEsIndex).not.toHaveBeenCalled(); + }); + + it('creates an index alias when using one index per source', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_milestones_zencrepes_zqueue'); + + await processMilestonePayload( + ghClientService, + esClient, + buildUserConfig(true), + logger, + buildPayload('created'), + ); + + expect(aliasEsIndex).toHaveBeenCalledWith( + esClient, + 'gh_milestones', + expect.any(Function), + ); + }); + + it('does not push anything when the node cannot be fetched', async () => { + ghClientService.fetchNodesById.mockResolvedValue([]); + + await processMilestonePayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('created'), + ); + + expect(pushEsNodes).not.toHaveBeenCalled(); + }); +}); diff --git a/src/github/fetchNode/processProject.spec.ts b/src/github/fetchNode/processProject.spec.ts new file mode 100644 index 0000000..42bdf84 --- /dev/null +++ b/src/github/fetchNode/processProject.spec.ts @@ -0,0 +1,226 @@ +import processProjectPayload from './processProject'; + +import { ingestNodes } from '@bit/zencrepes.zindexer.github-projects'; +import { + getEsIndex, + checkEsIndex, + pushEsNodes, + aliasEsIndex, +} from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.github-projects', () => ({ + fetchNodesById: 'FETCH_NODES_QUERY', + ingestNodes: jest.fn(), + esMapping: { mappings: {} }, + esSettings: { settings: {} }, +})); + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + getEsIndex: jest.fn(), + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), + aliasEsIndex: jest.fn(), +})); + +const buildUserConfig = (oneIndexPerSource = false) => ({ + elasticsearch: { + oneIndexPerSource, + dataIndices: { githubProjects: 'gh_projects' }, + }, +}); + +const buildOrgPayload = (action: string) => ({ + action, + project: { node_id: 'project-1' }, + organization: { node_id: 'org-id', login: 'zencrepes' }, +}); + +const buildRepoPayload = (action: string) => ({ + action, + project: { node_id: 'project-1' }, + repository: { + node_id: 'repo-id', + name: 'zqueue', + owner: { node_id: 'owner-id', login: 'zencrepes' }, + }, +}); + +const expectedRepoObj = { + id: 'repo-id', + name: 'zqueue', + url: 'https://github.com/zencrepes/zqueue', + owner: { + id: 'owner-id', + login: 'zencrepes', + url: 'https://github.com/zencrepes', + }, +}; + +const remoteNode = { id: 'project-id' }; + +describe('processProjectPayload', () => { + let ghClientService: { fetchNodesById: jest.Mock }; + let esClient: { delete: jest.Mock }; + let logger: { log: jest.Mock; debug: jest.Mock }; + + beforeEach(() => { + jest.clearAllMocks(); + jest.spyOn(console, 'log').mockImplementation(() => undefined); + ghClientService = { fetchNodesById: jest.fn().mockResolvedValue([]) }; + esClient = { delete: jest.fn().mockResolvedValue({}) }; + logger = { log: jest.fn(), debug: jest.fn() }; + }); + + afterEach(() => { + (console.log as jest.Mock).mockRestore(); + }); + + it('deletes the node from Elasticsearch on a deleted action', async () => { + await processProjectPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildRepoPayload('deleted'), + ); + + expect(esClient.delete).toHaveBeenCalledWith({ + id: 'project-1', + index: 'gh_projects', + }); + expect(ghClientService.fetchNodesById).not.toHaveBeenCalled(); + }); + + it('processes a repo-level project and pushes it to Elasticsearch', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_projects'); + + await processProjectPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildRepoPayload('created'), + ); + + expect(ghClientService.fetchNodesById).toHaveBeenCalledWith( + 'FETCH_NODES_QUERY', + { nodesArray: ['project-1'] }, + ); + expect(ingestNodes).toHaveBeenCalledWith( + [remoteNode], + 'zindexer', + 'repository', + 'repo-id', + expectedRepoObj.owner, + expectedRepoObj, + ); + expect(getEsIndex).toHaveBeenCalledWith( + 'gh_projects', + false, + 'zencrepes/zqueue', + ); + expect(checkEsIndex).toHaveBeenCalled(); + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'gh_projects', + ['ingested-node'], + expect.any(Function), + ); + expect(aliasEsIndex).not.toHaveBeenCalled(); + }); + + it('processes an org-level project and pushes it to Elasticsearch', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + + await processProjectPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildOrgPayload('created'), + ); + + expect(ingestNodes).toHaveBeenCalledWith( + [remoteNode], + 'zqueue', + 'organization', + null, + { + id: 'org-id', + login: 'zencrepes', + url: 'https://github.com/zencrepes', + }, + null, + ); + expect(getEsIndex).not.toHaveBeenCalled(); + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'gh_projects', + ['ingested-node'], + expect.any(Function), + ); + expect(aliasEsIndex).not.toHaveBeenCalled(); + }); + + it('uses a suffixed index for an org-level project with one index per source', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + + await processProjectPayload( + ghClientService, + esClient, + buildUserConfig(true), + logger, + buildOrgPayload('created'), + ); + + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'gh_projectsabcd', + ['ingested-node'], + expect.any(Function), + ); + expect(aliasEsIndex).toHaveBeenCalledWith( + esClient, + 'gh_projects', + expect.any(Function), + ); + }); + + it('creates an index alias for a repo-level project with one index per source', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_projects_zencrepes_zqueue'); + + await processProjectPayload( + ghClientService, + esClient, + buildUserConfig(true), + logger, + buildRepoPayload('created'), + ); + + expect(aliasEsIndex).toHaveBeenCalledWith( + esClient, + 'gh_projects', + expect.any(Function), + ); + }); + + it('does not push anything when the node cannot be fetched', async () => { + ghClientService.fetchNodesById.mockResolvedValue([]); + + await processProjectPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildRepoPayload('created'), + ); + + expect(pushEsNodes).not.toHaveBeenCalled(); + }); +}); diff --git a/src/github/fetchNode/processPullrequest.spec.ts b/src/github/fetchNode/processPullrequest.spec.ts new file mode 100644 index 0000000..4430320 --- /dev/null +++ b/src/github/fetchNode/processPullrequest.spec.ts @@ -0,0 +1,151 @@ +import processPullrequestPayload from './processPullrequest'; + +import { ingestNodes } from '@bit/zencrepes.zindexer.github-pullrequests'; +import { + getEsIndex, + checkEsIndex, + pushEsNodes, + aliasEsIndex, +} from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.github-pullrequests', () => ({ + fetchNodesById: 'FETCH_NODES_QUERY', + ingestNodes: jest.fn(), + esMapping: { mappings: {} }, + esSettings: { settings: {} }, +})); + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + getEsIndex: jest.fn(), + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), + aliasEsIndex: jest.fn(), +})); + +const buildUserConfig = (oneIndexPerSource = false) => ({ + elasticsearch: { + oneIndexPerSource, + dataIndices: { githubPullrequests: 'gh_prs' }, + }, +}); + +const buildPayload = (action: string) => ({ + action, + pull_request: { node_id: 'pr-1' }, +}); + +const remoteNode = { + id: 'pr-id', + repository: { + id: 'repo-id', + name: 'zqueue', + owner: { login: 'zencrepes' }, + }, +}; + +describe('processPullrequestPayload', () => { + let ghClientService: { fetchNodesById: jest.Mock }; + let esClient: { delete: jest.Mock }; + let logger: { log: jest.Mock; debug: jest.Mock }; + + beforeEach(() => { + jest.clearAllMocks(); + jest.spyOn(console, 'log').mockImplementation(() => undefined); + ghClientService = { fetchNodesById: jest.fn().mockResolvedValue([]) }; + esClient = { delete: jest.fn().mockResolvedValue({}) }; + logger = { log: jest.fn(), debug: jest.fn() }; + }); + + afterEach(() => { + (console.log as jest.Mock).mockRestore(); + }); + + it('deletes the node from Elasticsearch on a deleted action', async () => { + await processPullrequestPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('deleted'), + ); + + expect(esClient.delete).toHaveBeenCalledWith({ + id: 'pr-1', + index: 'gh_prs', + }); + expect(ghClientService.fetchNodesById).not.toHaveBeenCalled(); + }); + + it('fetches the node and pushes it to Elasticsearch on other actions', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_prs'); + const userConfig = buildUserConfig(); + + await processPullrequestPayload( + ghClientService, + esClient, + userConfig, + logger, + buildPayload('opened'), + ); + + expect(ghClientService.fetchNodesById).toHaveBeenCalledWith( + 'FETCH_NODES_QUERY', + { nodesArray: ['pr-1'] }, + ); + expect(ingestNodes).toHaveBeenCalledWith( + [remoteNode], + 'zqueue', + userConfig, + 'repo-id', + ); + expect(getEsIndex).toHaveBeenCalledWith( + 'gh_prs', + false, + 'zencrepes/zqueue', + ); + expect(checkEsIndex).toHaveBeenCalled(); + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'gh_prs', + ['ingested-node'], + expect.any(Function), + ); + expect(aliasEsIndex).not.toHaveBeenCalled(); + }); + + it('creates an index alias when using one index per source', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_prs_zencrepes_zqueue'); + + await processPullrequestPayload( + ghClientService, + esClient, + buildUserConfig(true), + logger, + buildPayload('opened'), + ); + + expect(aliasEsIndex).toHaveBeenCalledWith( + esClient, + 'gh_prs', + expect.any(Function), + ); + }); + + it('does not push anything when the node cannot be fetched', async () => { + ghClientService.fetchNodesById.mockResolvedValue([]); + + await processPullrequestPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('opened'), + ); + + expect(pushEsNodes).not.toHaveBeenCalled(); + }); +}); diff --git a/src/github/fetchNode/processRelease.spec.ts b/src/github/fetchNode/processRelease.spec.ts new file mode 100644 index 0000000..5b76173 --- /dev/null +++ b/src/github/fetchNode/processRelease.spec.ts @@ -0,0 +1,159 @@ +import processReleasePayload from './processRelease'; + +import { ingestNodes } from '@bit/zencrepes.zindexer.github-releases'; +import { + getEsIndex, + checkEsIndex, + pushEsNodes, + aliasEsIndex, +} from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.github-releases', () => ({ + fetchNodesById: 'FETCH_NODES_QUERY', + ingestNodes: jest.fn(), + esMapping: { mappings: {} }, + esSettings: { settings: {} }, +})); + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + getEsIndex: jest.fn(), + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), + aliasEsIndex: jest.fn(), +})); + +const buildUserConfig = (oneIndexPerSource = false) => ({ + elasticsearch: { + oneIndexPerSource, + dataIndices: { githubReleases: 'gh_releases' }, + }, +}); + +const buildPayload = (action: string) => ({ + action, + release: { node_id: 'release-1' }, + repository: { + node_id: 'repo-id', + name: 'zqueue', + owner: { node_id: 'owner-id', login: 'zencrepes' }, + }, +}); + +const expectedRepoObj = { + id: 'repo-id', + name: 'zqueue', + url: 'https://github.com/zencrepes/zqueue', + owner: { + id: 'owner-id', + login: 'zencrepes', + url: 'https://github.com/zencrepes', + }, +}; + +const remoteNode = { id: 'release-id' }; + +describe('processReleasePayload', () => { + let ghClientService: { fetchNodesById: jest.Mock }; + let esClient: { delete: jest.Mock }; + let logger: { log: jest.Mock; debug: jest.Mock }; + + beforeEach(() => { + jest.clearAllMocks(); + jest.spyOn(console, 'log').mockImplementation(() => undefined); + ghClientService = { fetchNodesById: jest.fn().mockResolvedValue([]) }; + esClient = { delete: jest.fn().mockResolvedValue({}) }; + logger = { log: jest.fn(), debug: jest.fn() }; + }); + + afterEach(() => { + (console.log as jest.Mock).mockRestore(); + }); + + it('deletes the node from Elasticsearch on a deleted action', async () => { + await processReleasePayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('deleted'), + ); + + expect(esClient.delete).toHaveBeenCalledWith({ + id: 'release-1', + index: 'gh_releases', + }); + expect(ghClientService.fetchNodesById).not.toHaveBeenCalled(); + }); + + it('fetches the node and pushes it to Elasticsearch on other actions', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_releases'); + + await processReleasePayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('published'), + ); + + expect(ghClientService.fetchNodesById).toHaveBeenCalledWith( + 'FETCH_NODES_QUERY', + { nodesArray: ['release-1'] }, + ); + expect(ingestNodes).toHaveBeenCalledWith( + [remoteNode], + 'zqueue', + 'repo-id', + expectedRepoObj, + ); + expect(getEsIndex).toHaveBeenCalledWith( + 'gh_releases', + false, + 'zencrepes/zqueue', + ); + expect(checkEsIndex).toHaveBeenCalled(); + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'gh_releases', + ['ingested-node'], + expect.any(Function), + ); + expect(aliasEsIndex).not.toHaveBeenCalled(); + }); + + it('creates an index alias when using one index per source', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_releases_zencrepes_zqueue'); + + await processReleasePayload( + ghClientService, + esClient, + buildUserConfig(true), + logger, + buildPayload('published'), + ); + + expect(aliasEsIndex).toHaveBeenCalledWith( + esClient, + 'gh_releases', + expect.any(Function), + ); + }); + + it('does not push anything when the node cannot be fetched', async () => { + ghClientService.fetchNodesById.mockResolvedValue([]); + + await processReleasePayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('published'), + ); + + expect(pushEsNodes).not.toHaveBeenCalled(); + }); +}); diff --git a/src/github/fetchNode/processRepository.spec.ts b/src/github/fetchNode/processRepository.spec.ts new file mode 100644 index 0000000..a1c46df --- /dev/null +++ b/src/github/fetchNode/processRepository.spec.ts @@ -0,0 +1,160 @@ +import processRepositoryPayload from './processRepository'; + +import { ingestNodes } from '@bit/zencrepes.zindexer.github-repos'; +import { + getEsIndex, + checkEsIndex, + pushEsNodes, + aliasEsIndex, +} from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.github-repos', () => ({ + fetchNodesById: 'FETCH_NODES_QUERY', + ingestNodes: jest.fn(), + esMapping: { mappings: {} }, + esSettings: { settings: {} }, +})); + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + getEsIndex: jest.fn(), + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), + aliasEsIndex: jest.fn(), +})); + +const buildUserConfig = (oneIndexPerSource = false) => ({ + elasticsearch: { + oneIndexPerSource, + dataIndices: { githubRepos: 'gh_repos' }, + }, +}); + +const buildPayload = (action: string) => ({ + action, + repository: { node_id: 'repo-1' }, +}); + +const remoteNode = { + id: 'repo-id', + name: 'zqueue', + owner: { login: 'zencrepes' }, +}; + +describe('processRepositoryPayload', () => { + let ghClientService: { fetchNodesById: jest.Mock }; + let esClient: { delete: jest.Mock }; + let logger: { log: jest.Mock; debug: jest.Mock }; + + beforeEach(() => { + jest.clearAllMocks(); + jest.spyOn(console, 'log').mockImplementation(() => undefined); + ghClientService = { fetchNodesById: jest.fn().mockResolvedValue([]) }; + esClient = { delete: jest.fn().mockResolvedValue({}) }; + logger = { log: jest.fn(), debug: jest.fn() }; + }); + + afterEach(() => { + (console.log as jest.Mock).mockRestore(); + }); + + it('deletes the node from Elasticsearch on a deleted action', async () => { + await processRepositoryPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('deleted'), + ); + + expect(esClient.delete).toHaveBeenCalledWith({ + id: 'repo-1', + index: 'gh_repos', + }); + expect(ghClientService.fetchNodesById).not.toHaveBeenCalled(); + }); + + it('fetches the node and pushes it to Elasticsearch on other actions', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_repos'); + + await processRepositoryPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('edited'), + ); + + expect(ghClientService.fetchNodesById).toHaveBeenCalledWith( + 'FETCH_NODES_QUERY', + { nodesArray: ['repo-1'] }, + ); + expect(ingestNodes).toHaveBeenCalledWith([remoteNode], 'zqueue'); + expect(getEsIndex).toHaveBeenCalledWith( + 'gh_repos', + false, + 'zencrepes/zqueue', + ); + expect(checkEsIndex).toHaveBeenCalled(); + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'gh_repos', + ['ingested-node'], + expect.any(Function), + ); + expect(aliasEsIndex).not.toHaveBeenCalled(); + }); + + it('creates an index alias when using one index per source', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_repos_zencrepes_zqueue'); + + await processRepositoryPayload( + ghClientService, + esClient, + buildUserConfig(true), + logger, + buildPayload('edited'), + ); + + // The source reads dataIndices.GithubRepos (capital G), which is not + // defined in the configuration, so the alias name is undefined. + expect(aliasEsIndex).toHaveBeenCalledWith( + esClient, + undefined, + expect.any(Function), + ); + }); + + it('still attempts the alias when the node cannot be fetched', async () => { + ghClientService.fetchNodesById.mockResolvedValue([]); + + await processRepositoryPayload( + ghClientService, + esClient, + buildUserConfig(true), + logger, + buildPayload('edited'), + ); + + expect(pushEsNodes).not.toHaveBeenCalled(); + expect(aliasEsIndex).toHaveBeenCalled(); + }); + + it('does not push anything when the node cannot be fetched', async () => { + ghClientService.fetchNodesById.mockResolvedValue([]); + + await processRepositoryPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('edited'), + ); + + expect(pushEsNodes).not.toHaveBeenCalled(); + expect(aliasEsIndex).not.toHaveBeenCalled(); + }); +}); diff --git a/src/github/fetchNode/processStargazer.spec.ts b/src/github/fetchNode/processStargazer.spec.ts new file mode 100644 index 0000000..483517e --- /dev/null +++ b/src/github/fetchNode/processStargazer.spec.ts @@ -0,0 +1,181 @@ +import processStargazerPayload from './processStargazer'; + +import { ingestNodes } from '@bit/zencrepes.zindexer.github-stargazers'; +import { + getEsIndex, + checkEsIndex, + pushEsNodes, + aliasEsIndex, +} from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.github-stargazers', () => ({ + fetchNodesById: 'FETCH_NODES_QUERY', + ingestNodes: jest.fn(), + esMapping: { mappings: {} }, + esSettings: { settings: {} }, +})); + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + getEsIndex: jest.fn(), + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), + aliasEsIndex: jest.fn(), +})); + +const buildUserConfig = (oneIndexPerSource = false) => ({ + elasticsearch: { + oneIndexPerSource, + dataIndices: { githubStargazers: 'gh_stargazers' }, + }, +}); + +const buildPayload = (action: string) => ({ + action, + repository: { + node_id: 'repo-id', + name: 'zqueue', + owner: { node_id: 'owner-id', login: 'zencrepes' }, + }, + sender: { node_id: 'user-id' }, + starred_at: '2026-07-03T00:00:00Z', +}); + +const expectedRepoObj = { + id: 'repo-id', + name: 'zqueue', + url: 'https://github.com/zencrepes/zqueue', + owner: { + id: 'owner-id', + login: 'zencrepes', + url: 'https://github.com/zencrepes', + }, +}; + +const remoteNode = { id: 'user-id', login: 'octocat' }; + +describe('processStargazerPayload', () => { + let ghClientService: { fetchNodesById: jest.Mock }; + let esClient: { delete: jest.Mock }; + let logger: { log: jest.Mock; debug: jest.Mock }; + + beforeEach(() => { + jest.clearAllMocks(); + jest.spyOn(console, 'log').mockImplementation(() => undefined); + ghClientService = { fetchNodesById: jest.fn().mockResolvedValue([]) }; + esClient = { delete: jest.fn().mockResolvedValue({}) }; + logger = { log: jest.fn(), debug: jest.fn() }; + }); + + afterEach(() => { + (console.log as jest.Mock).mockRestore(); + }); + + it('deletes the node from Elasticsearch on a deleted action', async () => { + await processStargazerPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('deleted'), + ); + + expect(esClient.delete).toHaveBeenCalledWith({ + id: 'stargazers-repo-iduser-id', + index: 'gh_stargazers', + }); + expect(ghClientService.fetchNodesById).not.toHaveBeenCalled(); + }); + + it('survives a failed deletion (node already gone)', async () => { + esClient.delete.mockRejectedValue(new Error('document missing')); + + await expect( + processStargazerPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('deleted'), + ), + ).resolves.toBeUndefined(); + }); + + it('fetches the sender, decorates it and pushes it to Elasticsearch', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_stargazers'); + + await processStargazerPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('created'), + ); + + expect(ghClientService.fetchNodesById).toHaveBeenCalledWith( + 'FETCH_NODES_QUERY', + { nodesArray: ['user-id'] }, + ); + expect(ingestNodes).toHaveBeenCalledWith( + [ + { + ...remoteNode, + repository: expectedRepoObj, + starredAt: '2026-07-03T00:00:00Z', + }, + ], + 'zqueue', + 'repo-id', + expectedRepoObj, + 'stargazers', + ); + expect(getEsIndex).toHaveBeenCalledWith( + 'gh_stargazers', + false, + 'zencrepes/zqueue', + ); + expect(checkEsIndex).toHaveBeenCalled(); + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'gh_stargazers', + ['ingested-node'], + expect.any(Function), + ); + expect(aliasEsIndex).not.toHaveBeenCalled(); + }); + + it('creates an index alias when using one index per source', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_stargazers_zencrepes_zqueue'); + + await processStargazerPayload( + ghClientService, + esClient, + buildUserConfig(true), + logger, + buildPayload('created'), + ); + + expect(aliasEsIndex).toHaveBeenCalledWith( + esClient, + 'gh_stargazers', + expect.any(Function), + ); + }); + + it('does not push anything when the sender cannot be fetched', async () => { + ghClientService.fetchNodesById.mockResolvedValue([]); + + await processStargazerPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('created'), + ); + + expect(pushEsNodes).not.toHaveBeenCalled(); + }); +}); diff --git a/src/github/fetchNode/processWatcher.spec.ts b/src/github/fetchNode/processWatcher.spec.ts new file mode 100644 index 0000000..043e1ca --- /dev/null +++ b/src/github/fetchNode/processWatcher.spec.ts @@ -0,0 +1,181 @@ +import processWatcherPayload from './processWatcher'; + +import { ingestNodes } from '@bit/zencrepes.zindexer.github-watchers'; +import { + getEsIndex, + checkEsIndex, + pushEsNodes, + aliasEsIndex, +} from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.github-watchers', () => ({ + fetchNodesById: 'FETCH_NODES_QUERY', + ingestNodes: jest.fn(), + esMapping: { mappings: {} }, + esSettings: { settings: {} }, +})); + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + getEsIndex: jest.fn(), + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), + aliasEsIndex: jest.fn(), +})); + +const buildUserConfig = (oneIndexPerSource = false) => ({ + elasticsearch: { + oneIndexPerSource, + dataIndices: { githubWatchers: 'gh_watchers' }, + }, +}); + +const buildPayload = (action: string) => ({ + action, + repository: { + node_id: 'repo-id', + name: 'zqueue', + owner: { node_id: 'owner-id', login: 'zencrepes' }, + }, + sender: { node_id: 'user-id' }, +}); + +const expectedRepoObj = { + id: 'repo-id', + name: 'zqueue', + url: 'https://github.com/zencrepes/zqueue', + owner: { + id: 'owner-id', + login: 'zencrepes', + url: 'https://github.com/zencrepes', + }, +}; + +const remoteNode = { id: 'user-id', login: 'octocat' }; + +describe('processWatcherPayload', () => { + let ghClientService: { fetchNodesById: jest.Mock }; + let esClient: { delete: jest.Mock }; + let logger: { log: jest.Mock; debug: jest.Mock }; + + beforeEach(() => { + jest.clearAllMocks(); + jest.spyOn(console, 'log').mockImplementation(() => undefined); + ghClientService = { fetchNodesById: jest.fn().mockResolvedValue([]) }; + esClient = { delete: jest.fn().mockResolvedValue({}) }; + logger = { log: jest.fn(), debug: jest.fn() }; + }); + + afterEach(() => { + (console.log as jest.Mock).mockRestore(); + }); + + it('deletes the node from Elasticsearch on a deleted action', async () => { + await processWatcherPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('deleted'), + ); + + expect(esClient.delete).toHaveBeenCalledWith({ + id: 'watchers-repo-iduser-id', + index: 'gh_watchers', + }); + expect(ghClientService.fetchNodesById).not.toHaveBeenCalled(); + }); + + it('survives a failed deletion (node already gone)', async () => { + esClient.delete.mockRejectedValue(new Error('document missing')); + + await expect( + processWatcherPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('deleted'), + ), + ).resolves.toBeUndefined(); + }); + + it('fetches the sender, decorates it and pushes it to Elasticsearch', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_watchers'); + + await processWatcherPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('started'), + ); + + expect(ghClientService.fetchNodesById).toHaveBeenCalledWith( + 'FETCH_NODES_QUERY', + { nodesArray: ['user-id'] }, + ); + expect(ingestNodes).toHaveBeenCalledWith( + [ + expect.objectContaining({ + id: 'user-id', + login: 'octocat', + repository: expectedRepoObj, + watchedAt: expect.any(String), + }), + ], + 'zqueue', + 'repo-id', + expectedRepoObj, + 'watchers', + ); + expect(getEsIndex).toHaveBeenCalledWith( + 'gh_watchers', + false, + 'zencrepes/zqueue', + ); + expect(checkEsIndex).toHaveBeenCalled(); + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'gh_watchers', + ['ingested-node'], + expect.any(Function), + ); + expect(aliasEsIndex).not.toHaveBeenCalled(); + }); + + it('creates an index alias when using one index per source', async () => { + ghClientService.fetchNodesById.mockResolvedValue([remoteNode]); + (ingestNodes as jest.Mock).mockReturnValue(['ingested-node']); + (getEsIndex as jest.Mock).mockReturnValue('gh_watchers_zencrepes_zqueue'); + + await processWatcherPayload( + ghClientService, + esClient, + buildUserConfig(true), + logger, + buildPayload('started'), + ); + + expect(aliasEsIndex).toHaveBeenCalledWith( + esClient, + 'gh_watchers', + expect.any(Function), + ); + }); + + it('does not push anything when the sender cannot be fetched', async () => { + ghClientService.fetchNodesById.mockResolvedValue([]); + + await processWatcherPayload( + ghClientService, + esClient, + buildUserConfig(), + logger, + buildPayload('started'), + ); + + expect(pushEsNodes).not.toHaveBeenCalled(); + }); +}); diff --git a/src/github/github.controller.spec.ts b/src/github/github.controller.spec.ts new file mode 100644 index 0000000..d9a01d6 --- /dev/null +++ b/src/github/github.controller.spec.ts @@ -0,0 +1,200 @@ +import { Logger } from '@nestjs/common'; +import * as crypto from 'crypto'; + +import { GithubController } from './github.controller'; +import { ConfigService } from '../config.service'; +import { WebhookPayload } from './webhookPayload.type'; + +const SECRET = 'test-webhook-secret'; + +const sign = (payload: WebhookPayload, secret: string = SECRET) => { + const hmac = crypto.createHmac('sha1', secret); + return 'sha1=' + hmac.update(JSON.stringify(payload)).digest('hex'); +}; + +const buildUserConfig = (webhookOverrides = {}) => ({ + github: { + webhook: { + secret: SECRET, + events: [ + { githubEvent: 'issues', zencrepesEntity: 'issues' }, + { githubEvent: 'label', zencrepesEntity: 'labels' }, + ], + fetchNode: { includeGithubEvents: ['*'], excludeGithubEvents: [] }, + nodePayload: { includeGithubEvents: ['*'], excludeGithubEvents: [] }, + timelinePayload: { includeGithubEvents: ['*'], excludeGithubEvents: [] }, + ...webhookOverrides, + }, + }, +}); + +describe('GithubController', () => { + let controller: GithubController; + let githubQueue: { add: jest.Mock }; + let storePayloadQueue: { add: jest.Mock }; + let storeRawPayloadQueue: { add: jest.Mock }; + let userConfig; + + const callWebhook = (payload: WebhookPayload, headers = {}) => { + return controller.processWebhook(payload, {} as any, headers as any); + }; + + beforeAll(() => { + jest.spyOn(Logger.prototype, 'log').mockImplementation(() => undefined); + jest.spyOn(Logger.prototype, 'warn').mockImplementation(() => undefined); + }); + + beforeEach(() => { + jest.clearAllMocks(); + githubQueue = { add: jest.fn() }; + storePayloadQueue = { add: jest.fn() }; + storeRawPayloadQueue = { add: jest.fn() }; + userConfig = buildUserConfig(); + const configService = { + getUserConfig: () => userConfig, + } as ConfigService; + controller = new GithubController( + githubQueue as any, + storePayloadQueue as any, + storeRawPayloadQueue as any, + configService, + ); + }); + + it('ignores requests with an invalid signature', async () => { + const payload = { action: 'opened', issue: { node_id: 'abc' } }; + + await callWebhook(payload, { + 'x-github-event': 'issues', + 'x-hub-signature': sign(payload, 'wrong-secret'), + }); + + expect(githubQueue.add).not.toHaveBeenCalled(); + expect(storePayloadQueue.add).not.toHaveBeenCalled(); + expect(storeRawPayloadQueue.add).not.toHaveBeenCalled(); + }); + + it('ignores requests without a signature header', async () => { + const payload = { action: 'opened', issue: { node_id: 'abc' } }; + + await callWebhook(payload, { 'x-github-event': 'issues' }); + + expect(githubQueue.add).not.toHaveBeenCalled(); + expect(storePayloadQueue.add).not.toHaveBeenCalled(); + expect(storeRawPayloadQueue.add).not.toHaveBeenCalled(); + }); + + it('does nothing on a ping event', async () => { + const payload = { action: 'ping' } as WebhookPayload; + + await callWebhook(payload, { + 'x-github-event': 'ping', + 'x-hub-signature': sign(payload), + }); + + expect(githubQueue.add).not.toHaveBeenCalled(); + expect(storePayloadQueue.add).not.toHaveBeenCalled(); + expect(storeRawPayloadQueue.add).not.toHaveBeenCalled(); + }); + + it('queues a known event on all three queues with its zencrepes entity', async () => { + const payload = { action: 'opened', issue: { node_id: 'abc' } }; + + await callWebhook(payload, { + 'x-github-event': 'issues', + 'x-hub-signature': sign(payload), + }); + + expect(githubQueue.add).toHaveBeenCalledWith('fetchRemoteNode', { + payload, + eventType: 'issues', + }); + expect(storePayloadQueue.add).toHaveBeenCalledWith('store', { + payload, + eventType: 'issues', + }); + expect(storeRawPayloadQueue.add).toHaveBeenCalledWith('store', { + payload, + eventType: 'issues', + }); + }); + + it('maps the github event to its configured zencrepes entity', async () => { + const payload = { action: 'created', label: { node_id: 'lbl' } }; + + await callWebhook(payload, { + 'x-github-event': 'label', + 'x-hub-signature': sign(payload), + }); + + expect(githubQueue.add).toHaveBeenCalledWith('fetchRemoteNode', { + payload, + eventType: 'labels', + }); + }); + + it('does not queue a node fetch for events absent from the events mapping', async () => { + const payload = { action: 'completed' } as WebhookPayload; + + await callWebhook(payload, { + 'x-github-event': 'workflow_run', + 'x-hub-signature': sign(payload), + }); + + expect(githubQueue.add).not.toHaveBeenCalled(); + // Payload storage does not depend on the events mapping + expect(storePayloadQueue.add).toHaveBeenCalledWith('store', { + payload, + eventType: 'workflow_run', + }); + expect(storeRawPayloadQueue.add).toHaveBeenCalledWith('store', { + payload, + eventType: 'workflow_run', + }); + }); + + it('skips queues whose configuration excludes the event', async () => { + userConfig = buildUserConfig({ + fetchNode: { + includeGithubEvents: ['*'], + excludeGithubEvents: ['issues'], + }, + nodePayload: { + includeGithubEvents: ['*'], + excludeGithubEvents: ['issues'], + }, + timelinePayload: { includeGithubEvents: ['*'], excludeGithubEvents: [] }, + }); + const payload = { action: 'opened', issue: { node_id: 'abc' } }; + + await callWebhook(payload, { + 'x-github-event': 'issues', + 'x-hub-signature': sign(payload), + }); + + expect(githubQueue.add).not.toHaveBeenCalled(); + expect(storePayloadQueue.add).not.toHaveBeenCalled(); + expect(storeRawPayloadQueue.add).toHaveBeenCalled(); + }); + + it('processes an explicitly included event even when everything else is excluded', async () => { + userConfig = buildUserConfig({ + fetchNode: { + includeGithubEvents: ['issues'], + excludeGithubEvents: ['*'], + }, + nodePayload: { includeGithubEvents: [], excludeGithubEvents: ['*'] }, + timelinePayload: { includeGithubEvents: [], excludeGithubEvents: ['*'] }, + }); + const payload = { action: 'opened', issue: { node_id: 'abc' } }; + + await callWebhook(payload, { + 'x-github-event': 'issues', + 'x-hub-signature': sign(payload), + }); + + expect(githubQueue.add).toHaveBeenCalled(); + expect(storePayloadQueue.add).not.toHaveBeenCalled(); + expect(storeRawPayloadQueue.add).not.toHaveBeenCalled(); + }); +}); diff --git a/src/github/github.processor.spec.ts b/src/github/github.processor.spec.ts new file mode 100644 index 0000000..1d62c47 --- /dev/null +++ b/src/github/github.processor.spec.ts @@ -0,0 +1,44 @@ +import { Logger } from '@nestjs/common'; + +import { GithubProcessor } from './github.processor'; +import fetchNode from './fetchNode/index'; + +jest.mock('./fetchNode/index'); + +describe('GithubProcessor', () => { + const esClient = { search: jest.fn() }; + const userConfig = { github: {} }; + const configService = { getUserConfig: () => userConfig }; + const esClientService = { getEsClient: () => esClient }; + const ghClientService = { fetchNodesById: jest.fn() }; + + beforeAll(() => { + jest.spyOn(Logger.prototype, 'log').mockImplementation(() => undefined); + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('delegates a fetchRemoteNode job to the fetchNode dispatcher', () => { + const processor = new GithubProcessor( + configService as any, + ghClientService as any, + esClientService as any, + ); + const job = { + data: { payload: { action: 'opened' }, eventType: 'issues' }, + }; + + processor.handlFetchNode(job as any); + + expect(fetchNode).toHaveBeenCalledWith( + ghClientService, + esClient, + userConfig, + expect.any(Logger), + { action: 'opened' }, + 'issues', + ); + }); +}); diff --git a/src/github/githubStorePayload.processor.spec.ts b/src/github/githubStorePayload.processor.spec.ts new file mode 100644 index 0000000..3ed54d4 --- /dev/null +++ b/src/github/githubStorePayload.processor.spec.ts @@ -0,0 +1,41 @@ +import { Logger } from '@nestjs/common'; + +import { GithubStorePayloadProcessor } from './githubStorePayload.processor'; +import storePayload from './storePayload/index'; + +jest.mock('./storePayload/index'); + +describe('GithubStorePayloadProcessor', () => { + const esClient = { search: jest.fn() }; + const userConfig = { github: {} }; + const configService = { getUserConfig: () => userConfig }; + const esClientService = { getEsClient: () => esClient }; + + beforeAll(() => { + jest.spyOn(Logger.prototype, 'log').mockImplementation(() => undefined); + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('delegates a store job to storePayload', () => { + const processor = new GithubStorePayloadProcessor( + configService as any, + esClientService as any, + ); + const job = { + data: { payload: { action: 'opened' }, eventType: 'issues' }, + }; + + processor.pushNodeToEs(job as any); + + expect(storePayload).toHaveBeenCalledWith( + esClient, + userConfig, + expect.any(Logger), + { action: 'opened' }, + 'issues', + ); + }); +}); diff --git a/src/github/githubStoreRawPayload.processor.spec.ts b/src/github/githubStoreRawPayload.processor.spec.ts new file mode 100644 index 0000000..3f1e206 --- /dev/null +++ b/src/github/githubStoreRawPayload.processor.spec.ts @@ -0,0 +1,41 @@ +import { Logger } from '@nestjs/common'; + +import { GithubStoreRawPayloadProcessor } from './githubStoreRawPayload.processor'; +import storeRawPayload from './storeRawPayload/index'; + +jest.mock('./storeRawPayload/index'); + +describe('GithubStoreRawPayloadProcessor', () => { + const esClient = { search: jest.fn() }; + const userConfig = { github: {} }; + const configService = { getUserConfig: () => userConfig }; + const esClientService = { getEsClient: () => esClient }; + + beforeAll(() => { + jest.spyOn(Logger.prototype, 'log').mockImplementation(() => undefined); + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('delegates a store job to storeRawPayload', () => { + const processor = new GithubStoreRawPayloadProcessor( + configService as any, + esClientService as any, + ); + const job = { + data: { payload: { action: 'opened' }, eventType: 'issues' }, + }; + + processor.pushRawToEs(job as any); + + expect(storeRawPayload).toHaveBeenCalledWith( + esClient, + userConfig, + expect.any(Logger), + { action: 'opened' }, + 'issues', + ); + }); +}); diff --git a/src/github/storePayload/index.spec.ts b/src/github/storePayload/index.spec.ts new file mode 100644 index 0000000..85f48a5 --- /dev/null +++ b/src/github/storePayload/index.spec.ts @@ -0,0 +1,63 @@ +import storePayload from './index'; + +import { checkEsIndex, pushEsNodes } from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), +})); + +const UUID_V4_REGEXP = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/; + +const userConfig = { + github: { + webhook: { + nodePayload: { esIndexPrefix: 'gh_payload_' }, + }, + }, +}; + +describe('storePayload', () => { + const esClient = {}; + const logger = { log: jest.fn() }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('checks the index derived from the configured prefix and event type', async () => { + await storePayload(esClient, userConfig, logger, { action: 'x' }, 'issues'); + + expect(checkEsIndex).toHaveBeenCalledWith( + esClient, + 'gh_payload_issues', + expect.anything(), + expect.anything(), + expect.any(Function), + ); + }); + + it('uses the entity node_id as document id when present', async () => { + const payload = { action: 'opened', issue: { node_id: 'node-42' } }; + + await storePayload(esClient, userConfig, logger, payload, 'issue'); + + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'gh_payload_issue', + [{ id: 'node-42', ...payload }], + expect.any(Function), + ); + }); + + it('falls back to a generated uuid when the payload has no node id', async () => { + const payload = { action: 'completed' }; + + await storePayload(esClient, userConfig, logger, payload, 'workflow_run'); + + const pushedNodes = (pushEsNodes as jest.Mock).mock.calls[0][2]; + expect(pushedNodes).toHaveLength(1); + expect(pushedNodes[0].id).toMatch(UUID_V4_REGEXP); + expect(pushedNodes[0].action).toEqual('completed'); + }); +}); diff --git a/src/github/storeRawPayload/index.spec.ts b/src/github/storeRawPayload/index.spec.ts new file mode 100644 index 0000000..9131202 --- /dev/null +++ b/src/github/storeRawPayload/index.spec.ts @@ -0,0 +1,67 @@ +import storeRawPayload from './index'; + +import { checkEsIndex, pushEsNodes } from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), +})); + +const UUID_V4_REGEXP = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/; + +const userConfig = { + github: { + webhook: { + timelinePayload: { esIndexPrefix: 'gh_timeline_' }, + }, + }, +}; + +describe('storeRawPayload', () => { + const esClient = {}; + const logger = { log: jest.fn() }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('checks the index derived from the configured prefix and event type', async () => { + await storeRawPayload( + esClient, + userConfig, + logger, + { action: 'x' }, + 'issues', + ); + + expect(checkEsIndex).toHaveBeenCalledWith( + esClient, + 'gh_timeline_issues', + expect.anything(), + expect.anything(), + expect.any(Function), + ); + }); + + it('pushes the payload with a generated id and a received date', async () => { + const payload = { action: 'opened', issue: { node_id: 'node-42' } }; + + await storeRawPayload(esClient, userConfig, logger, payload, 'issues'); + + const pushedNodes = (pushEsNodes as jest.Mock).mock.calls[0][2]; + expect(pushedNodes).toHaveLength(1); + expect(pushedNodes[0].id).toMatch(UUID_V4_REGEXP); + expect(pushedNodes[0].dateReceived).toEqual(expect.any(String)); + expect(pushedNodes[0].action).toEqual('opened'); + expect(pushedNodes[0].issue).toEqual({ node_id: 'node-42' }); + }); + + it('generates a different id for every payload', async () => { + await storeRawPayload(esClient, userConfig, logger, { a: 1 }, 'issues'); + await storeRawPayload(esClient, userConfig, logger, { a: 1 }, 'issues'); + + const first = (pushEsNodes as jest.Mock).mock.calls[0][2][0]; + const second = (pushEsNodes as jest.Mock).mock.calls[1][2][0]; + expect(first.id).not.toEqual(second.id); + }); +}); diff --git a/src/perfs/perfs.controller.spec.ts b/src/perfs/perfs.controller.spec.ts new file mode 100644 index 0000000..e537c8e --- /dev/null +++ b/src/perfs/perfs.controller.spec.ts @@ -0,0 +1,68 @@ +import { Logger } from '@nestjs/common'; +import * as crypto from 'crypto'; + +import { PerfsController } from './perfs.controller'; +import { ConfigService } from '../config.service'; + +const SECRET = 'test-perfs-secret'; + +const sign = (payload, secret: string = SECRET) => { + const hmac = crypto.createHmac('sha1', secret); + return 'sha1=' + hmac.update(JSON.stringify(payload)).digest('hex'); +}; + +describe('PerfsController', () => { + let controller: PerfsController; + let storePayloadQueue: { add: jest.Mock }; + + beforeAll(() => { + jest.spyOn(Logger.prototype, 'log').mockImplementation(() => undefined); + jest.spyOn(Logger.prototype, 'warn').mockImplementation(() => undefined); + }); + + beforeEach(() => { + jest.clearAllMocks(); + storePayloadQueue = { add: jest.fn() }; + const configService = { + getUserConfig: () => ({ + testing: { webhook: { secret: SECRET } }, + }), + } as ConfigService; + controller = new PerfsController(storePayloadQueue as any, configService); + }); + + it('rejects a payload with an invalid signature', async () => { + const payload = { name: 'my-perf-run' } as any; + + const result = await controller.processWebhook(payload, {} as any, { + 'x-hub-signature': sign(payload, 'wrong-secret'), + } as any); + + expect(result).toEqual({ success: false }); + expect(storePayloadQueue.add).not.toHaveBeenCalled(); + }); + + it('rejects a payload without a signature header', async () => { + const payload = { name: 'my-perf-run' } as any; + + const result = await controller.processWebhook( + payload, + {} as any, + {} as any, + ); + + expect(result).toEqual({ success: false }); + expect(storePayloadQueue.add).not.toHaveBeenCalled(); + }); + + it('queues a correctly signed payload', async () => { + const payload = { name: 'my-perf-run' } as any; + + const result = await controller.processWebhook(payload, {} as any, { + 'x-hub-signature': sign(payload), + } as any); + + expect(result).toEqual({ success: true }); + expect(storePayloadQueue.add).toHaveBeenCalledWith('perfsstore', payload); + }); +}); diff --git a/src/perfs/perfsStorePayload.processor.spec.ts b/src/perfs/perfsStorePayload.processor.spec.ts new file mode 100644 index 0000000..92c1e2f --- /dev/null +++ b/src/perfs/perfsStorePayload.processor.spec.ts @@ -0,0 +1,140 @@ +import { Logger } from '@nestjs/common'; + +import { PerfsStorePayloadProcessor } from './perfsStorePayload.processor'; +import { checkEsIndex, pushEsNodes } from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.testing-perfs', () => ({ + esMapping: { mappings: {} }, + esSettings: { settings: {} }, + getId: jest.fn((node) => `perf-id-${node.name}`), +})); + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), +})); + +const userConfig = { + elasticsearch: { + dataIndices: { testingPerfs: 'testing_perfs' }, + }, +}; + +const buildJobData = (overrides = {}) => ({ + name: 'load-test', + resources: [{ name: 'small-vm', size: '2cpu' }], + runs: [ + { + name: 'run-1', + statistics: { + stat1: { transaction: 'login', mean: 12 }, + stat2: { transaction: 'checkout', mean: 40 }, + }, + }, + { + name: 'run-2', + statistics: { + stat1: { transaction: 'login', mean: 14 }, + }, + }, + ], + ...overrides, +}); + +describe('PerfsStorePayloadProcessor', () => { + let processor: PerfsStorePayloadProcessor; + const esClient = {}; + const configService = { getUserConfig: () => userConfig }; + const esClientService = { getEsClient: () => esClient }; + + const pushedState = () => (pushEsNodes as jest.Mock).mock.calls[0][2][0]; + + beforeAll(() => { + jest.spyOn(Logger.prototype, 'log').mockImplementation(() => undefined); + }); + + beforeEach(() => { + jest.clearAllMocks(); + processor = new PerfsStorePayloadProcessor( + configService as any, + esClientService as any, + ); + }); + + it('pushes a single transformed document to the perfs index', async () => { + await processor.pushNodeToEs({ data: buildJobData() } as any); + + expect(checkEsIndex).toHaveBeenCalledWith( + esClient, + 'testing_perfs', + expect.anything(), + expect.anything(), + expect.any(Function), + ); + expect(pushEsNodes).toHaveBeenCalledWith( + esClient, + 'testing_perfs', + [expect.objectContaining({ id: 'perf-id-load-test' })], + expect.any(Function), + ); + }); + + it('collects unique transaction names across all runs', async () => { + await processor.pushNodeToEs({ data: buildJobData() } as any); + + expect(pushedState().transactions).toEqual({ + edges: [{ node: { name: 'login' } }, { node: { name: 'checkout' } }], + totalCount: 2, + }); + }); + + it('transforms resources with a name_size identifier', async () => { + await processor.pushNodeToEs({ data: buildJobData() } as any); + + expect(pushedState().resources).toEqual({ + edges: [ + { + node: expect.objectContaining({ + name: 'small-vm', + size: '2cpu', + name_size: 'small-vm_2cpu', + }), + }, + ], + totalCount: 1, + }); + }); + + it('defaults to an empty description and tags when absent', async () => { + await processor.pushNodeToEs({ data: buildJobData() } as any); + + expect(pushedState().description).toEqual(''); + expect(pushedState().tags).toEqual({ edges: [], totalCount: 0 }); + }); + + it('maps tags when provided', async () => { + const jobData = buildJobData({ + description: 'nightly perf run', + tags: [{ name: 'nightly' }, { name: 'baseline' }], + }); + + await processor.pushNodeToEs({ data: jobData } as any); + + expect(pushedState().description).toEqual('nightly perf run'); + expect(pushedState().tags).toEqual({ + edges: [{ node: { name: 'nightly' } }, { node: { name: 'baseline' } }], + totalCount: 2, + }); + }); + + it('flattens run statistics into an array', async () => { + await processor.pushNodeToEs({ data: buildJobData() } as any); + + const runs = pushedState().runs; + expect(runs.totalCount).toEqual(2); + expect(runs.edges[0].node.statistics).toEqual([ + { transaction: 'login', mean: 12 }, + { transaction: 'checkout', mean: 40 }, + ]); + }); +}); diff --git a/src/testing/cases/utils.spec.ts b/src/testing/cases/utils.spec.ts new file mode 100644 index 0000000..28f87a6 --- /dev/null +++ b/src/testing/cases/utils.spec.ts @@ -0,0 +1,50 @@ +import { getId, getCaseId } from './utils'; + +const UUID_V5_REGEXP = /^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/; + +describe('testing cases utils', () => { + describe('getId', () => { + it('generates a uuid v5', () => { + const id = getId({ name: 'my-app', version: '1.0.0' }); + expect(id).toMatch(UUID_V5_REGEXP); + }); + + it('is deterministic for the same dependency', () => { + const a = getId({ name: 'my-app', version: '1.0.0' }); + const b = getId({ name: 'my-app', version: '1.0.0' }); + expect(a).toEqual(b); + }); + + it('changes when the version changes', () => { + const a = getId({ name: 'my-app', version: '1.0.0' }); + const b = getId({ name: 'my-app', version: '2.0.0' }); + expect(a).not.toEqual(b); + }); + + it('ignores case and non-alphanumerical characters', () => { + const a = getId({ name: 'My-App', version: '1.0.0' }); + const b = getId({ name: 'myapp', version: '100' }); + expect(a).toEqual(b); + }); + }); + + describe('getCaseId', () => { + const testCase = { + id: 'case-1', + createdAt: '2026-01-01T00:00:00Z', + } as any; + + it('generates a uuid v5', () => { + expect(getCaseId(testCase)).toMatch(UUID_V5_REGEXP); + }); + + it('is deterministic for the same case', () => { + expect(getCaseId(testCase)).toEqual(getCaseId({ ...testCase })); + }); + + it('changes when the creation date changes', () => { + const other = { ...testCase, createdAt: '2026-01-02T00:00:00Z' }; + expect(getCaseId(testCase)).not.toEqual(getCaseId(other)); + }); + }); +}); diff --git a/src/testing/testing.controller.spec.ts b/src/testing/testing.controller.spec.ts new file mode 100644 index 0000000..fabe1d7 --- /dev/null +++ b/src/testing/testing.controller.spec.ts @@ -0,0 +1,68 @@ +import { Logger } from '@nestjs/common'; +import * as crypto from 'crypto'; + +import { TestingController } from './testing.controller'; +import { ConfigService } from '../config.service'; + +const SECRET = 'test-states-secret'; + +const sign = (payload, secret: string = SECRET) => { + const hmac = crypto.createHmac('sha1', secret); + return 'sha1=' + hmac.update(JSON.stringify(payload)).digest('hex'); +}; + +describe('TestingController', () => { + let controller: TestingController; + let storePayloadQueue: { add: jest.Mock }; + + beforeAll(() => { + jest.spyOn(Logger.prototype, 'log').mockImplementation(() => undefined); + jest.spyOn(Logger.prototype, 'warn').mockImplementation(() => undefined); + }); + + beforeEach(() => { + jest.clearAllMocks(); + storePayloadQueue = { add: jest.fn() }; + const configService = { + getUserConfig: () => ({ + testing: { webhook: { secret: SECRET } }, + }), + } as ConfigService; + controller = new TestingController(storePayloadQueue as any, configService); + }); + + it('rejects a payload with an invalid signature', async () => { + const payload = { name: 'my-component', version: '1.0.0' } as any; + + const result = await controller.processWebhook(payload, {} as any, { + 'x-hub-signature': sign(payload, 'wrong-secret'), + } as any); + + expect(result).toEqual({ success: false }); + expect(storePayloadQueue.add).not.toHaveBeenCalled(); + }); + + it('rejects a payload without a signature header', async () => { + const payload = { name: 'my-component', version: '1.0.0' } as any; + + const result = await controller.processWebhook( + payload, + {} as any, + {} as any, + ); + + expect(result).toEqual({ success: false }); + expect(storePayloadQueue.add).not.toHaveBeenCalled(); + }); + + it('queues a correctly signed payload', async () => { + const payload = { name: 'my-component', version: '1.0.0' } as any; + + const result = await controller.processWebhook(payload, {} as any, { + 'x-hub-signature': sign(payload), + } as any); + + expect(result).toEqual({ success: true }); + expect(storePayloadQueue.add).toHaveBeenCalledWith('testingstore', payload); + }); +}); diff --git a/src/testing/testingStorePayload.processor.spec.ts b/src/testing/testingStorePayload.processor.spec.ts new file mode 100644 index 0000000..b9ebab2 --- /dev/null +++ b/src/testing/testingStorePayload.processor.spec.ts @@ -0,0 +1,161 @@ +import { Logger } from '@nestjs/common'; + +import { TestingStorePayloadProcessor } from './testingStorePayload.processor'; +import { checkEsIndex, pushEsNodes } from '@bit/zencrepes.zindexer.es-utils'; + +jest.mock('@bit/zencrepes.zindexer.testing-states', () => ({ + esMapping: { mappings: {} }, + esSettings: { settings: {} }, + getId: jest.fn((d) => `dep-id-${d.name}`), +})); + +jest.mock('@bit/zencrepes.zindexer.testing-runs', () => ({ + esMapping: { mappings: {} }, + esSettings: { settings: {} }, + getRunId: jest.fn(() => 'run-id-1'), +})); + +jest.mock('@bit/zencrepes.zindexer.es-utils', () => ({ + checkEsIndex: jest.fn(), + pushEsNodes: jest.fn(), +})); + +const userConfig = { + elasticsearch: { + dataIndices: { + testingStates: 'testing_states', + testingRuns: 'testing_runs', + testingCases: 'testing_cases', + }, + }, +}; + +const buildJobData = (overrides = {}) => ({ + name: 'my-component', + version: '1.0.0', + url: 'https://ci.example.com/run/1', + runSuccess: 3, + runFailure: 1, + runTotal: 4, + dependencies: [{ name: 'dep-a', version: '2.0.0' }], + ...overrides, +}); + +describe('TestingStorePayloadProcessor', () => { + let processor: TestingStorePayloadProcessor; + const esClient = {}; + const configService = { getUserConfig: () => userConfig }; + const esClientService = { getEsClient: () => esClient }; + + const pushedNodesForIndex = (index: string) => { + const call = (pushEsNodes as jest.Mock).mock.calls.find( + (c) => c[1] === index, + ); + return call !== undefined ? call[2] : undefined; + }; + + beforeAll(() => { + jest.spyOn(Logger.prototype, 'log').mockImplementation(() => undefined); + }); + + beforeEach(() => { + jest.clearAllMocks(); + processor = new TestingStorePayloadProcessor( + configService as any, + esClientService as any, + ); + }); + + it('pushes a state and a run document, but no cases when absent', async () => { + await processor.pushNodeToEs({ data: buildJobData() } as any); + + expect(checkEsIndex).toHaveBeenCalledTimes(2); + expect(pushEsNodes).toHaveBeenCalledTimes(2); + expect(pushedNodesForIndex('testing_states')).toBeDefined(); + expect(pushedNodesForIndex('testing_runs')).toBeDefined(); + expect(pushedNodesForIndex('testing_cases')).toBeUndefined(); + }); + + it('transforms the state with a full name and graphql-like dependencies', async () => { + await processor.pushNodeToEs({ data: buildJobData() } as any); + + const state = pushedNodesForIndex('testing_states')[0]; + expect(state.full).toEqual('my-component_1.0.0'); + expect(state.dependencies).toEqual({ + edges: [ + { + node: { + name: 'dep-a', + version: '2.0.0', + full: 'dep-a_2.0.0', + id: 'dep-id-dep-a', + }, + }, + ], + totalCount: 1, + }); + }); + + it('computes success and failure rates on the run document', async () => { + await processor.pushNodeToEs({ data: buildJobData() } as any); + + const run = pushedNodesForIndex('testing_runs')[0]; + expect(run.id).toEqual('run-id-1'); + expect(run.runSuccessRate).toEqual(75); + expect(run.runFailureRate).toEqual(25); + }); + + it('strips the cases from state and run documents', async () => { + const jobData = buildJobData({ + cases: [ + { + id: 'case-1', + createdAt: '2026-01-01T00:00:00Z', + suite: 'login', + name: 'accepts valid credentials', + caseSuccess: 1, + caseFailure: 1, + caseTotal: 2, + }, + ], + }); + + await processor.pushNodeToEs({ data: jobData } as any); + + expect(pushedNodesForIndex('testing_states')[0].cases).toBeUndefined(); + expect(pushedNodesForIndex('testing_runs')[0].cases).toBeUndefined(); + }); + + it('pushes enriched case documents when cases are present', async () => { + const jobData = buildJobData({ + cases: [ + { + id: 'case-1', + createdAt: '2026-01-01T00:00:00Z', + suite: 'login', + name: 'accepts valid credentials', + caseSuccess: 1, + caseFailure: 1, + caseTotal: 2, + }, + ], + }); + + await processor.pushNodeToEs({ data: jobData } as any); + + const cases = pushedNodesForIndex('testing_cases'); + expect(cases).toHaveLength(1); + expect(cases[0]).toEqual( + expect.objectContaining({ + full: 'login - accepts valid credentials', + runId: 'run-id-1', + url: 'https://ci.example.com/run/1', + project: 'my-component', + caseSuccessRate: 50, + caseFailureRate: 50, + }), + ); + // The case id is derived from the case content (uuid v5) + expect(cases[0].id).toMatch(/^[0-9a-f-]{36}$/); + }); +}); diff --git a/test/jest.setup.js b/test/jest.setup.js new file mode 100644 index 0000000..a0800bf --- /dev/null +++ b/test/jest.setup.js @@ -0,0 +1,9 @@ +// @nestjs/bull 0.1.x relies on util.isString, which was removed in Node 23. +// The runtime image is pinned to Node 22 (see Dockerfile); this shim keeps +// the test suite runnable on newer local Node versions until dependencies +// are modernized. +const util = require('util'); + +if (typeof util.isString !== 'function') { + util.isString = (value) => typeof value === 'string'; +} diff --git a/yarn.lock b/yarn.lock index 7987ad4..5fe69d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -326,18 +326,18 @@ "@bit/zencrepes.zindexer.config@0.0.17": version "0.0.17" - resolved "https://node.bit.dev/zencrepes.zindexer.config/-/zencrepes.zindexer.config-0.0.17.tgz#bde38df4bd451d59bbe2d46014aa92e8625c5107" - integrity sha1-veON9L1FHVm74tRgFKqS6GJcUQc= + resolved "https://node.bit.dev/zencrepes.zindexer.config/-/zencrepes.zindexer.config-0.0.17.tgz#17d620ae5f05bd04baf9999f7c7d15aef89ff5dd" + integrity sha1-F9Ygrl8FvQS6+ZmffH0Vrvif9d0= "@bit/zencrepes.zindexer.config@^0.0.28": version "0.0.28" - resolved "https://node.bit.dev/zencrepes.zindexer.config/-/zencrepes.zindexer.config-0.0.28.tgz#872c0ab840cb06c9440e8dc6a6b688a4cd62acff" - integrity sha1-hywKuEDLBslEDo3GpraIpM1irP8= + resolved "https://node.bit.dev/zencrepes.zindexer.config/-/zencrepes.zindexer.config-0.0.28.tgz#3628c137003e3ab9116ab7922485b9da254f4175" + integrity sha1-NijBNwA+OrkRareSJIW52iVPQXU= "@bit/zencrepes.zindexer.es-utils@^0.0.14": version "0.0.14" - resolved "https://node.bit.dev/zencrepes.zindexer.es-utils/-/zencrepes.zindexer.es-utils-0.0.14.tgz#20cd8a27bce36cb13dd71bfb9605985185b7032c" - integrity sha1-IM2KJ7zjbLE91xv7lgWYUYW3Ayw= + resolved "https://node.bit.dev/zencrepes.zindexer.es-utils/-/zencrepes.zindexer.es-utils-0.0.14.tgz#51120563836d996193faf8a6a384fb3e3f988b36" + integrity sha1-URIFY4NtmWGT+vimo4T7Pj+YizY= dependencies: "@elastic/elasticsearch" "^7.8.0" "@types/js-yaml" "^3.12.1" @@ -345,8 +345,8 @@ "@bit/zencrepes.zindexer.github-issues@^0.0.21": version "0.0.21" - resolved "https://node.bit.dev/zencrepes.zindexer.github-issues/-/zencrepes.zindexer.github-issues-0.0.21.tgz#64a0c0a82629096412f344258cd6c723f0d6da90" - integrity sha1-ZKDAqCYpCWQS80QljNbHI/DW2pA= + resolved "https://node.bit.dev/zencrepes.zindexer.github-issues/-/zencrepes.zindexer.github-issues-0.0.21.tgz#c8a87ba62a77100eebb7d12faa07e6fb26d7b88e" + integrity sha1-yKh7pip3EA7rt9Evqgfm+ybXuI4= dependencies: "@bit/zencrepes.zindexer.config" "0.0.17" "@types/xregexp" "^4.3.0" @@ -356,29 +356,29 @@ "@bit/zencrepes.zindexer.github-labels@^0.0.15": version "0.0.15" - resolved "https://node.bit.dev/zencrepes.zindexer.github-labels/-/zencrepes.zindexer.github-labels-0.0.15.tgz#c66f1963463c30599f73c8bdb2caf85b6a69b85d" - integrity sha1-xm8ZY0Y8MFmfc8i9ssr4W2ppuF0= + resolved "https://node.bit.dev/zencrepes.zindexer.github-labels/-/zencrepes.zindexer.github-labels-0.0.15.tgz#3d5b4d0373719195c87b27f9c6ff154e5e1b8868" + integrity sha1-PVtNA3NxkZXIeyf5xv8VTl4biGg= dependencies: graphql-tag "^2.10.1" "@bit/zencrepes.zindexer.github-milestones@^0.0.10": version "0.0.10" - resolved "https://node.bit.dev/zencrepes.zindexer.github-milestones/-/zencrepes.zindexer.github-milestones-0.0.10.tgz#6f3b1fa627bfe6105d74ce0f7e2c4cc11dece7fe" - integrity sha1-bzsfpie/5hBddM4PfixMwR3s5/4= + resolved "https://node.bit.dev/zencrepes.zindexer.github-milestones/-/zencrepes.zindexer.github-milestones-0.0.10.tgz#2dc484e69a8455ab39e6c678966057102ea7474a" + integrity sha1-LcSE5pqEVas55sZ4lmBXEC6nR0o= dependencies: graphql-tag "^2.10.1" "@bit/zencrepes.zindexer.github-projects@^0.0.11": version "0.0.11" - resolved "https://node.bit.dev/zencrepes.zindexer.github-projects/-/zencrepes.zindexer.github-projects-0.0.11.tgz#5ee5f18da016130c547d10854b48f329aea5a8c2" - integrity sha1-XuXxjaAWEwxUfRCFS0jzKa6lqMI= + resolved "https://node.bit.dev/zencrepes.zindexer.github-projects/-/zencrepes.zindexer.github-projects-0.0.11.tgz#03f0b9ef9f515117b41c315aedb040db5974462b" + integrity sha1-A/C5759RURe0HDFa7bBA21l0Ris= dependencies: graphql-tag "^2.10.1" "@bit/zencrepes.zindexer.github-pullrequests@^0.0.18": version "0.0.18" - resolved "https://node.bit.dev/zencrepes.zindexer.github-pullrequests/-/zencrepes.zindexer.github-pullrequests-0.0.18.tgz#bd7aced101da898760311c58b9916d865b777ffa" - integrity sha1-vXrO0QHaiYdgMRxYuZFthlt3f/o= + resolved "https://node.bit.dev/zencrepes.zindexer.github-pullrequests/-/zencrepes.zindexer.github-pullrequests-0.0.18.tgz#2bd5b04a81776b13161e5eb66f82f77e5c194104" + integrity sha1-K9WwSoF3axMWHl62b4L3flwZQQQ= dependencies: "@bit/zencrepes.zindexer.config" "0.0.17" date-fns "^2.8.1" @@ -386,52 +386,52 @@ "@bit/zencrepes.zindexer.github-releases@^0.0.10": version "0.0.10" - resolved "https://node.bit.dev/zencrepes.zindexer.github-releases/-/zencrepes.zindexer.github-releases-0.0.10.tgz#720403ed31ba6c86ab5c459f255688311f787c15" - integrity sha1-cgQD7TG6bIarXEWfJVaIMR94fBU= + resolved "https://node.bit.dev/zencrepes.zindexer.github-releases/-/zencrepes.zindexer.github-releases-0.0.10.tgz#67f0d3bec31de9a654e57193ef547e922db4856f" + integrity sha1-Z/DTvsMd6aZU5XGT71R+ki20hW8= dependencies: graphql-tag "^2.10.1" "@bit/zencrepes.zindexer.github-repos@^0.0.18": version "0.0.18" - resolved "https://node.bit.dev/zencrepes.zindexer.github-repos/-/zencrepes.zindexer.github-repos-0.0.18.tgz#ebcb9cb4ef815a7e2f7fbe85c35f6b6b93cdc1be" - integrity sha1-68uctO+BWn4vf76Fw19ra5PNwb4= + resolved "https://node.bit.dev/zencrepes.zindexer.github-repos/-/zencrepes.zindexer.github-repos-0.0.18.tgz#b216ec8055259399994fc3210a1063e241302db7" + integrity sha1-shbsgFUlk5mZT8MhChBj4kEwLbc= dependencies: graphql-tag "^2.10.1" "@bit/zencrepes.zindexer.github-stargazers@^0.0.10": version "0.0.10" - resolved "https://node.bit.dev/zencrepes.zindexer.github-stargazers/-/zencrepes.zindexer.github-stargazers-0.0.10.tgz#33f3a9e0008cdb3bb3b6e6a3e15e404fd3bce12a" - integrity sha1-M/Op4ACM2zuztuaj4V5AT9O84So= + resolved "https://node.bit.dev/zencrepes.zindexer.github-stargazers/-/zencrepes.zindexer.github-stargazers-0.0.10.tgz#457ef372a45e5b645f4d7fca801a47b59088ba49" + integrity sha1-RX7zcqReW2RfTX/KgBpHtZCIukk= dependencies: graphql-tag "^2.10.1" "@bit/zencrepes.zindexer.github-watchers@^0.0.10": version "0.0.10" - resolved "https://node.bit.dev/zencrepes.zindexer.github-watchers/-/zencrepes.zindexer.github-watchers-0.0.10.tgz#2c69f7c62c377c360870f8937aa3d9c5bf9c406c" - integrity sha1-LGn3xiw3fDYIcPiTeqPZxb+cQGw= + resolved "https://node.bit.dev/zencrepes.zindexer.github-watchers/-/zencrepes.zindexer.github-watchers-0.0.10.tgz#95cf204429eb1ff36b580ccad16420739a242c30" + integrity sha1-lc8gRCnrH/NrWAzK0WQgc5okLDA= dependencies: graphql-tag "^2.10.1" "@bit/zencrepes.zindexer.testing-perfs@^0.0.32": version "0.0.32" - resolved "https://node.bit.dev/zencrepes.zindexer.testing-perfs/-/zencrepes.zindexer.testing-perfs-0.0.32.tgz#49d9a9eab2a1891823a57966baede0c58a144a16" - integrity sha1-Sdmp6rKhiRgjpXlmuu3gxYoUShY= + resolved "https://node.bit.dev/zencrepes.zindexer.testing-perfs/-/zencrepes.zindexer.testing-perfs-0.0.32.tgz#83ef420797c1e835f4d794cb3e0ed551715946d0" + integrity sha1-g+9CB5fB6DX015TLPg7VUXFZRtA= dependencies: "@types/uuid" "^8.3.0" uuid "^8.3.1" "@bit/zencrepes.zindexer.testing-runs@^0.0.3": version "0.0.3" - resolved "https://node.bit.dev/zencrepes.zindexer.testing-runs/-/zencrepes.zindexer.testing-runs-0.0.3.tgz#fe46354dc43a746cc3f7401863f6816ea1d5bcc3" - integrity sha1-/kY1TcQ6dGzD90AYY/aBbqHVvMM= + resolved "https://node.bit.dev/zencrepes.zindexer.testing-runs/-/zencrepes.zindexer.testing-runs-0.0.3.tgz#d78734f2d6a0567687347845ce41d7bd0120ece7" + integrity sha1-14c08tagVnaHNHhFzkHXvQEg7Oc= dependencies: "@types/uuid" "^8.3.0" uuid "^8.3.1" "@bit/zencrepes.zindexer.testing-states@^0.0.5": version "0.0.5" - resolved "https://node.bit.dev/zencrepes.zindexer.testing-states/-/zencrepes.zindexer.testing-states-0.0.5.tgz#24b1bb1e1f7f5ae594e0a3b4b7d92a662119af58" - integrity sha1-JLG7Hh9/WuWU4KO0t9kqZiEZr1g= + resolved "https://node.bit.dev/zencrepes.zindexer.testing-states/-/zencrepes.zindexer.testing-states-0.0.5.tgz#634b74980f4f707de6363eb722c903739ea3327c" + integrity sha1-Y0t0mA9PcH3mNj63IskDc56jMnw= dependencies: "@types/uuid" "^8.3.0" uuid "^8.3.1"