From 6251c8c9f913a104ef19d35b09c5a7f9cabd596e Mon Sep 17 00:00:00 2001 From: Iain Lane Date: Mon, 2 Dec 2024 14:36:05 +0000 Subject: [PATCH] feat(check-for-non-releasable-actions): find reusable workflows too We need to release reusable workflows just like we do for Actions. The current linter didn't check for that, so it's added here. This required an extra library to parse the YAML, and GitHub scripts can't install new dependencies, so it's broken out to a small `internal/` composite action which can. Now we have two Typescript actions, it made sense to centralise some of the setup. We have a shared `eslint` config now, and `bun` workspaces for each of the modules so they can cross-reference. --- .../check-for-non-releasable-actions.yaml | 28 +-- ...r-title.yml => test-typescript-action.yml} | 21 +- .gitignore | 13 ++ actions/lint-pr-title/.gitignore | 17 -- actions/lint-pr-title/bun.lockb | Bin 103613 -> 0 bytes actions/lint-pr-title/eslint.config.mjs | 41 +--- actions/lint-pr-title/package.json | 3 +- bun.lockb | Bin 0 -> 137688 bytes .../README.md | 15 ++ .../action.yml | 24 +++ .../eslint.config.mjs | 3 + .../filesystem.ts | 35 +++ .../check-for-non-releasable-actions/index.ts | 6 + .../main.test.ts | 176 ++++++++++++++++ .../check-for-non-releasable-actions/main.ts | 199 ++++++++++++++++++ .../package.json | 23 ++ .../eslint.config.mjs | 43 ++++ .../package.json | 23 ++ package.json | 9 + .../tsconfig.json => tsconfig.json | 10 +- 20 files changed, 600 insertions(+), 89 deletions(-) rename .github/workflows/{test-lint-pr-title.yml => test-typescript-action.yml} (56%) delete mode 100644 actions/lint-pr-title/.gitignore delete mode 100755 actions/lint-pr-title/bun.lockb create mode 100755 bun.lockb create mode 100644 internal/check-for-non-releasable-actions/README.md create mode 100644 internal/check-for-non-releasable-actions/action.yml create mode 100644 internal/check-for-non-releasable-actions/eslint.config.mjs create mode 100644 internal/check-for-non-releasable-actions/filesystem.ts create mode 100644 internal/check-for-non-releasable-actions/index.ts create mode 100644 internal/check-for-non-releasable-actions/main.test.ts create mode 100644 internal/check-for-non-releasable-actions/main.ts create mode 100644 internal/check-for-non-releasable-actions/package.json create mode 100644 internal/eslint-config-shared-workflows/eslint.config.mjs create mode 100644 internal/eslint-config-shared-workflows/package.json create mode 100644 package.json rename actions/lint-pr-title/tsconfig.json => tsconfig.json (65%) diff --git a/.github/workflows/check-for-non-releasable-actions.yaml b/.github/workflows/check-for-non-releasable-actions.yaml index 29e1e4b6e..7b8419681 100644 --- a/.github/workflows/check-for-non-releasable-actions.yaml +++ b/.github/workflows/check-for-non-releasable-actions.yaml @@ -24,32 +24,10 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: sparse-checkout: | + ./.github/workflows ./actions + ./internal ./release-please-config.json - name: Check for non-releasable actions - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7 - with: - script: | - const fs = require('fs/promises'); - const releasePleaseConfig = JSON.parse(await fs.readFile('release-please-config.json', 'utf-8')); - - const configuredPackageNames = new Set(Object.keys(releasePleaseConfig.packages)); - const packageNames = new Set(); - - const folders = await fs.readdir('actions', { withFileTypes: true }); - for (const folder of folders) { - if (folder.isDirectory()) { - packageNames.add('actions/' + folder.name); - } - } - - const missingConfigurations = [...packageNames].filter(pkg => !configuredPackageNames.has(pkg)); - - if (missingConfigurations.length > 0) { - console.log('The following actions are missing from the release-please-config.json file and thus won\'t be automatically released:'); - console.log(missingConfigurations.join('\n')); - console.log('Please add them in release-please-config.json!'); - } else { - console.log('All actions are releasable!'); - } + uses: ./internal/check-for-non-releasable-actions diff --git a/.github/workflows/test-lint-pr-title.yml b/.github/workflows/test-typescript-action.yml similarity index 56% rename from .github/workflows/test-lint-pr-title.yml rename to .github/workflows/test-typescript-action.yml index de2ccfff8..cfb8c88cc 100644 --- a/.github/workflows/test-lint-pr-title.yml +++ b/.github/workflows/test-typescript-action.yml @@ -4,13 +4,15 @@ on: branches: - main paths: - - .github/workflows/test-lint-pr-title.yml + - .github/workflows/test-typescript-action.yml - actions/lint-pr-title/** + - internal/check-for-non-releasable-actions/** pull_request: paths: - - .github/workflows/test-lint-pr-title.yml + - .github/workflows/test-typescript-action.yml - actions/lint-pr-title/** + - internal/check-for-non-releasable-actions/** types: - edited - opened @@ -20,12 +22,20 @@ on: merge_group: jobs: - build-lint-pr-title: + build-lint-test: runs-on: ubuntu-latest + strategy: + matrix: + directory: + - actions/lint-pr-title + - internal/check-for-non-releasable-actions + + name: Build, lint, and test `${{ matrix.directory }}` + defaults: run: - working-directory: actions/lint-pr-title + working-directory: ${{ matrix.directory }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -33,9 +43,10 @@ jobs: - name: Install bun package manager uses: oven-sh/setup-bun@4bc047ad259df6fc24a6c9b0f9a0cb08cf17fbe5 # v2.0.1 with: - bun-version-file: "actions/lint-pr-title/package.json" + bun-version-file: "${{ matrix.directory }}/package.json" - name: Install lint-pr-title dependencies + working-directory: ${{ github.workspace }} run: bun install --frozen-lockfile - name: Lint diff --git a/.gitignore b/.gitignore index 9f11b755a..a72cb4f2f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,14 @@ .idea/ + +# JS / Bun bits +**/node_modules/ +**/.*.bun-build + +# Test files +**/coverage/ + +# Generated build output +**/dist/ + +# Don't commit any log files +**/*.log diff --git a/actions/lint-pr-title/.gitignore b/actions/lint-pr-title/.gitignore deleted file mode 100644 index 479ff5ee3..000000000 --- a/actions/lint-pr-title/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -node_modules/ - -coverage/ -dist/ - -.*.bun-build - -# Editor -.idea diff --git a/actions/lint-pr-title/bun.lockb b/actions/lint-pr-title/bun.lockb deleted file mode 100755 index c8c450f6335d16182956a438a53dce436775654d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103613 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 z 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ξ6(Q_c89rP8cFpV}7jGSFb*(wQ^gj!wI|TF;pZ3AZ;W4O`R znVp}a4c2@R7}mJ^mY(46KBDdeM!I*`Dg~UB?x!L^V^SHMKL3nmpo~05zRW@EJowX?X@@rx7q1ncr(FA|fh`PQuRg>O(4Ab0Yp4{Wv!>!@DV~C@?O3dMY z@76wBHj)&V?Za7SYVv~OQOCOEc=i4ddv5~H)z|*}o97TRgiH~c=MhZ zN{BKQ36ThyB4ZMnG8B<1N{Gyql&Q=b{O?tqXaAq`Jm-I%>pcJKI=^$QZ?Es(d);fj z*S+q&_S$=YJ|BBu=Kt#L;mOZ-kFzbV!d%f4dp#M0)s?+;>g2boJBx!O{GF4ORMPBP zJ#K8#k}RIqQt#r0Hpgz*?j`=^>iXp?f#i99BLnBwkV+hGF1oWgd&n*YX_)@R_#2DW zJ?PLX?6biurf zhSs<%{%a5SISNKR>UP5D-p1;l7%-Da>BE=3u=kOGF-wc%sZ6yFq0`h-mZYq1MxXkx zQ*{Pa`4ST1vrFHaP zZ}C{&&&FPrrERt@E&Y!=4A{9Z98g{!XYvg(knKK6UlJ6PSyGtn|OD=E%1ZT68lO)=Lite5+}7-B}l;=<0d zowzO<{7PbcfAZtEGnGArLoN2RI9{&jLRvbMlFxZP;Zwix3=@Y0tZua5xero~)_wK` zLr#>3zgn!EFJ!f4uK%_{%Ey1Q;?ku@=IuQ0$E}WAp0d*ZSePx+_cJjkTWD9*59<#f zq}A;yFuHfKy7TiX^vq_>{_De|Ci(RZ>epNw848I-s_pR86D3HJJy@qp^Uu5wZWDRL ze4>9MgweY+-B>%J{I+~6%THf*=64v~M67OxOsceI$`3)VC!&JsQL>Mehw~HMMKnm_ zxQeDJEhdaDV%r%i@{NiZc~8Vny$U0~=Smk^5b*JE_WSE^>nl{IF}g`uU4jzn6KC{I zz2*~YxJM3_+Z1uG7w|pzEnuXlkJXHP>eF}i3H}e>A4PjgW5@8D#Z0U`GIzV44a(D$ zcupqqY8?A{)IF@Oil4U7eY@oJCRV1=Wn3#2E@n&OJ=p;@CAOiSg(D*cHbI7`PB5)b$#yim=Zc;uk$TI=?%5?su2##<9{9mj&d=;v~KrRiI~ZZ0n|A zb@QSFYnc2?K1A(Xy-^a-obuvi?QieijJ@s!U2*fjg(=KdXAgeB`(76~Qad8?Q+#S5 zDT?UD8Onp~X14xoUl*{S_oZTWY57QXmLv~K^m-0B1_rYGbCs4paJ4%&7TCHxr+K@| zhWj(|{Gbv|{Kq4?@#5+3FST*IDTH<%4ytq5BTcieEr;>Q3e1D>Z0(CJryvJL6rY=vv_CknWH4DNjETDhPy|+s4t* zV06>4x~jYJj=uVFWB!|45}8#SA?ra$y8fA4zkOs3-tg6m%O@SMAXFWZv`;*|%YCYe zd^CnKq4n1Zzp+L3ktTK0bZ+eD8tGVF@0r>`@;gI?#gb3eIVYGNNV7+ti_rfOB>dx^ zM~uIWPeW$&$mqP-sZ_-)>i4zUg41uvEzWa$yBy-&@Ttq>t{b;&W6)zwf*DkwITsrI($Av^6X zqHFBf-$7?$b?-1-skex@Jwj|B{NkzMxwDro!s6fG5aV((9K2n7r48Bf23^K+)Y z1zbK7?VnWnR#aG9PlcbCKfp5i)lIRe>E3S}PF8a3ReY)+uVqwL%dy{+J;3VDmBh6P zt}2@)ueR#G6X6jWWa!gTofTsefVD)|E3@K6|+Dia>C+*5Or!>UsQP;qf?A75K*D2Stj5=4qxnX`eJW4!9z1l+-OntY zK(K*3o%}N)^88~jjK8^9U9XDcG{%bY(=WB%ZQF|MLm$yoIWkMXJACyx^9dd9W6Xn7 zsay}dvoz$aFaAi$9{!ELKwUdFv!r}5(!EdgrdHxH}p#yosF#INoS^Y{hA<8oi+ zc$o;kD8)**b_?+u8fw%>Tr;54-sRib;;psX$@wwQ|6cFZD@88j^-2>3`?A$GKa6fZ zR@Zu5%GR5FzEOs?LOGmT(&FkTtDYCUT+|#tC2}aI!#&+wb`xGIF{mxwHP#^TgoEZQ z+arIqZ|^wy90|#+-Z34)=oVmgCuO52W;J$e58oUw+i#8MdBD77nR%~(rPlk7pqWdl zx%BHzM~v@!5b^R{pSYytCubi)BdJ@%hgae@7I)V9hAu|85UabN#dbGK+Wlg;pY|Oe znSbh;N1W1l`y<+Mnh~FT@mZjP!RCRmkH;#>7ay3Ee)y6jI8!mCQ@jR&!YLpP5Y z_B>RC)$Okv{X}Q~;OTN^P|oo?kC#U5y9^gQyW=P9y|`{PP}I+{YGwqIM3bmq4c>Fr zCUO?X?qpQR?Y<97uUe9)zOP4P{C$MgE#DQ^EU~|^yr_WF8d>YWrGE(;Qi79F9el;`sl@@y(7h`p=KFKub_LIM8 z!*gYrUFBsT1#6$>(0yFx%me#$W8Yi#^SP0gCs)*tZRBg?-)t^xz^Qs5>{41U{Dzgi zPEkz08{_X|tnT#U;QBt!FtS^pM+P{5-S5RG{;nTiW=ourR`IIn;W0_W^tNog<`;P~ z45<(AiZMk#7yd-;IX!zi{m#&rgj|&y7~K-AZu&#D+6f{h{e|EBuPhmRG|K}0t)Kg9 zRX)Al*uQv7Ncaxx>MP^w^ntF-u>Bm`wCz`7`RGb?|}z~p>x|oI`}y;7uJGQ^>a>p4RnEN~>(l2{>#xN=_R>9- z)ZKo%XyU-Up&mxJ6sz0uX7s)OE4sJ0&Oh&c%B8;{N=V|fCtH_6MMjtEU`e;=vB>hm(f5zTW+cPnXa+@ZK#0 zdp}f()%_UU%x6JiZ5GLuWcSV*N9azIv{WhQvioS(>D)y8}M^1SwRt?)9V0FNkr z!h-cEP9BSOeq_>Rg-8aXwpmOZs<66L#UBE#TuL&i*!8In;3Qpmb3bBDscSj7kWQW6 z=c-8%zO|5xqQdz8{hyfBo`*l1cu2f|G>4(QOYD}y&A1ycvAp zz~$O2jq&#xRyVuQKj>-XVJnqEp0+p9eh2DR$!;dce0%PnA#nDSB|*?dnyWPX!?Y}t zPlgN;GP07#d7DczKS@iX*c&&I|J;WZqg#X3l|I~jE8mI$KbAJk-?c49qHS`Gc|d9X z?pW989a45iK?2hsii0^1Qd4Ge(tplaiM)=qyhQrT?@i1rJ?%|~049uXEmk+;LL_tT zJMH?Vkh_+uLcRm{ehyJrRjCA$TSZDb99@2&8n&59@!IucP_4xI4TG*Xti;4G&e5{A z=`2;4lAnKk8lzi>)n(3FvI~%HA`@?}^_$b&XVEM0zE|wCRpDWJ=FZcMrpxK+% zpgMj)v*|qi@H1Ixe{X!i$M#W5wZar4l+?}L`YM=Nt-t+_V<^mxlfjuRD zGZB3kOj&vcO-^ZBN-mi{?bT*=t!JToFv_RcZ_-|y7?mMxO02Udm`!oJ1Qc-_`|h%8QaJGcy(+3n9sq!hRmrfYs$bK6}x-Bg#t3fFtDfC)wS8 zFLs#`JY-G!_JgF3D7N&Xf>F#q!=bZ1I6u3%53eVvobiru;TICdvx#Oul}krwfQdsR zR=0(yFL3^~M!fR-2u>lB&p#fIOz-lePHH`-#hTXMdhvUL=g{agd0xSWXz$3Ts-$&# z`QTmi>_^r;ymY<%T0OA$^DnWw*3WYNO3vc|;t;vw%%lLk<{Alo=(pHSWO<3Kpw|_(&O_<`~?`dbb zx+LmSA~LHX9XM0z9p>V2qoHQ}OK7=<{P_4!Ki_iBQVF%+?=4GGMk9GR@(OTX9P5|G z{?4Wut2?2a5peAA<;L&v2hWrpHW$=CSi`PzT4J{Ja-+)8wZ1P74)we0j!TR-YE5{P z$;xOhKYt{ZdehF{fap}ynMe=p_ZP3Qy5Ea>Xz)o*ulkiW_s9#gcXyj96P&brUP{$)#^%PaMX?p#`gpGtRDolbX$G zRR619&ExTpc!v|SVT55`&Ngcw#~0v}uXfgX+wzi2L(b&y9b6icSC{g|xnxw9_@kZI z9EFXs$6G5_H_b9YpUKkr6?H5H?}7sXGjVphsLP-p<#P6bGgA^X;j1*7#5LRRZ*MOz z-WlFY*>;EbiX_L|({}Ywj2&M4vS?!bZNuu;7FG}ye!myfsN`~!_uy)a`@+rF^CzCu zhEPw%rd;D6IA4|VW=(Xi$gM->umrDbv*r0CzDb()a_z0zLLv+s0~p^YE>w{mC=quYVi{batUCC=~j(<^bZ#>e+%KCHu`J09B=q$TpJ3b$fLP#3@Pf)(+q z1d|r=55Zq27czzh7Z;{=E7o()-i}NY?ZO_%ud%vPpKfXt-H*#!=gzvTEOz$x3DOR+ zWfIDyz0B){-+Kqw4&qNpk?l2Ba>x75#yJ*aODN3nac>sI?)te}4qv&}C5*qFSl!2a zl!p!DInJkjW~usi`*Q7GxpOAE?jyYfrvmZn8yI9XqBe+{m49}YoiDFRE6}sxVJ^2^ zQLLJ+yi$_XaJHilquYhm)$ea!Y%2Hf9FFEVpP=(jUXQngKm6AIu{mnDGy25Vgl2x{ zW*3M1u6|z89dEc8rO519{d-32Y?=P_$}Bm-_fCxN8?5d}2Zk?wz4w?w zk@1;Z$n!U*-<}9kjztT0T}`(6N}(`+&q(kJ-`qjt>5kEpxo?!Bn}0>^vPi~zhW$R^ zEmoH^TbLF1gv8w)H6ChKat^rt1Ow&ry!I(6su+KUeqsIlv?n zBi!`r0wuk3g_UMq$BIitP53J5oKlzk50;VgNIdd}7H>=(-eGlV-WI3LWi@jCGMe+a zaX0LEqFy^wwNdHDhtep=PTYSNvI%nr35m z?Dbg>R+sq`Yu;O0!^9{a=_)1FE>oEc{s-C{&3Jm>cema$Z(`yxK6rI3{7m1p>$Umt zc-HKiJqnEq4aV20&rd!nd-w$#hhD61p#Qk~#Y5cR0$Q#Oa9`gwC(6A{v~aQReSqff zxc)hI#l}w4=2N=aMw7J{tuoYRniVf-&~e><$tWB(Z~D!U=Mg3jeOTSvD)AuquIJaP z2fj_5tZPm_)zy6ZG38;h*9AU94;ru8*BFFL9p^A!Fiy3Po6zOZwxRs=AOM%vHl(_p zWHz7i2}bulRyQribv3BVZ9Lv*GESj(AvG~CWj&&JR6d!+*Dam68z(reQ2y>}f_{#4 zeOk|=*Z#v}ohq00%rfFu-{PK=sQZA??Z@hRKH?pF8TOW^FRVu`;`Yj$BQ<6gOMZqQ zmsB}Z>va9akDROWP8T^89;c+}7RUSj=w9S3#^KtD^fD$)rqeD5ur<|G^j}HW4C>nzESyRjru?9VF6A3TuVu<$ zxA(}?%xSXozpM1u8kgVS()=<#y7fH%6gYqQRQ%eaq z3vmZQE)I$SS~^2gwtl5(`x__h%wHYH#&-~_TTos0#PI%V*62xXy@uSg2G@6$9sAP5 zP>uhNm4xGM2GhKmfAtGsf=)`54_{tga`ciR7<`yq8W!ixzIYzd>t%>1=AAlX11fz(>I@_q(41aev8K zkNMt20O>vXzlK431?W+-)?U$9rpUFrHy zHi6|R4){Y*+`)Igf&4@Ual5IdXkWjPSxnLjANnaIb4C22!=V(xj$`t8U$EDcqgdTN zem+?bNiHmxSl`UFpe&C)vAHgFq`Fu01WTkGUc=L)QnV`A04BuiU=XsgyW% zYUZ=pM+aig8v}XX*!f`$tD6yT6n?Vsi2eOH{k?>}r|ujiCyLbb7O%{^zW1EiSpLhd zQhQUI8%87FJ#3oJTv=18KX=bHwXrb%v$RF}hXVzTm^h4Mb;*nD>T-e}d3JJJ84r+) zv_4K;bhJsn!WMs0VuT@~@u78pOd&m2#f?Ty?cDLQ(!4Ti7N=|)^&FdWGY+nzK6eoyrl))f-f*_P{1VA?CHW{%7uylaBmDy|J}#_r=hhneeVGY% zy9*{5e4SU(S#l<$cCU%Xer`00)zxZy>Yh9qM_o!!uwbk=Al{~3aO9fk$wN*1TSwIx z#NXtU^M5^G`miaj>)e>tRPj{_GEdIr)Q4+UbQ)oD8-3R>arlVQ{a;?i=zhY85olOv zUKkUqab$E9E|PW-sFfp2`z>vCqfim%giji@^) zFKEdKKZ`3l*NFYS=M+{qf+>ruFvg{$uHmIcGw=DE1p4RcUQXG0Jl~_9@H0!6G>>`0 zbbfu;{ZHQoevvn>k<3d5_GP#%+Lk!S9=Q7|X%OS@XRPjfVktF>hRdr5CZ0c%nQh;= zC6%RUUN84f?%6|Kk0HK%;`-Q3pVw@H=kNd0z7$RHoOh@+JzcH(^9LG}^Vty+Nf_N} ztnPW52~w-~*KX{^uN`cht4N!#K7do4964#bdagid`6g-fQzPxE)ZF?!85iv@HHkwp zr-tcDNFwI-$#0TMm|IC=biZJAYx3(w_q-0=bDSafJGDl{ponJQ``H zA7@lo+EnKU@MtK!d%oZsQt0?za5Okx?`7Mo!{uXrX7w1|uUOp=0)gtSLD56+s~E03 zo#!(WG8lTgo>Bk3zROQtq$f@mpS6kw=iYGM!{zGESc9VzF}7>1KZwcV^KzX6U)G3| zV034&y4UpSMT)IEpKC^(u4qsdGpJeE;555rNk~8xlg^EshJawS7PCMN_fXN_L+#n@kw&=BNDk8Pa5ks zcjHYj@us{ot#aKbpSychtnnu9i6O^{LDPo|-4fB0nTBsB>@fb$VRc1QIh8ZqSw?kl zK6JQ6bhYQ+F@h^kGZ+W%iBJxQhI#l1zqgShV)zw-XM|2oMBy-B+XLpzSV*kGT8&+3plt4o{ zPOS2n*;F&X$cF3fx#3>H5#|ZWcgK{+%yl%5yIp-|yl;s#?OW)CWu;&O^H}C>E|DWg zc703~ zVpQs{j~~;^n@+qJ`efKYNNXzJO~^Vc!4ms?f<>(EE&39Htn>oSy!MoRRkqBh=-w-I zRFf_(>jVS@^5WB9{rNt2#yqQKzF_|IE=GaR1j%I-&z{XtJ`XRl*hL?=g8iMs5?1%q zCywHnp9azTbyWiJ*YK}Bje-yF<|^20DWHA#fWwJ$yaIQ5KMu`wQLp#0H)s`yC=3bb zH>j&v<`O+M=k5eyf7iB*)qP82u*`m|)<&G2!I(Z%=Zt-o&%?{cZ36z5{PF3b>&JF4I<|;@dwL9` zyNcEAsqeUe=fj=HkytZx?OHZpChm*TitkMaB4XY(Sk4yN0x2mE<8IrJQjO zm~ohpDlp+wyE^uL=$;^V6=4N`Y4zUVaokS=fd&b`_DbFuYNFkh$u)LCF{{H2Kkt~9 z(j)A3>IPOfo4{9WPOQbnkH${h@Xz!9aun%wjWG1e5`}GtZZyLh%9+uxC z!shgIxD_Msp5JX%`Xt}`>#O+V_5h5(Kd`!c$o44tCi|S=FnCQWeL6qGzUY2V=qh_cMiJzaQGf>aJCI z4oT2fOTPNV@F=VecW?Hms>dIk!|Nl|E@~A{J>8>q_nC$3QQE1{3euHxW;bS6xYiPN zsVrON>qcCh!m$_W6CdSlw$A0gQwhYDcRmFA~;Y zeswG%fa8c*HoY5_>5GtM%jxH=_hl;wou3a!mijB()w29xtBbtx(CCqC-b;dXve?_l zG5+FVb*0kqiC@~t>b3Wu+4JoDz6J_`2DMX!8LU@tWn8?hIZR(5eDvVO{Weyu_leV} z3mDl|@*H_B$fw+Ta(kSQL^UK}bn&seQQ2%lsh=`GylNr-*{b@quK4KtVd|Tssa*H3 zb@qI9;wrmA`m>K@ob9pc%2Jfc5}QsU~+)lfcAq^V=Gk z?`-UMVGV7JF8Uj#?L_cmnTzOMsB~SmrnqDNrgr}!=_yqvD&MO2LB@im3hJlcis?S= zxsz%-s<9>~_hycRJyeUZvB7wbA}oAfS1J?xJsJ8f#C9UMP$she>Fk}bQfl{C)?u|S zl&8!+A`d5K*c!}6VSG(Qwt6Vk<4bSu?QEJWhEf<^^j*<*A|PM5MU-(T zb=9mX14o@DDlB68q#`AWujQ^ndTTOG3Vnf&)=rPr(NCY%2&D(l%3bex>3FynCZ-?c$rFMtH#s1v^IaZg?An~-qT_Bw|JG1CxL;mJ<@ z$LW#|gzE?FB5NB%wK7@1iRx4ZxV~T&Qyu8=Eje7XIqRJ4q_vNwCstAz<1YnPH)fw@ z_tfbtn_1?*;Txu!?gPSGzViDNE>xG@e?YClXu{V_FOlXy z*ZkC(Qf!w0nNuA`cNbQ-olU7|VsDac_M*{K?v!_80T*S{3zUzL`bIr|Hq^X76%Vg* z7xBZGssW!9Q9ooBZdOG)XTRX+$ozc7>^sRZRqW^X=o)Z45tQ-2IM{V=#h9>5+uM=k z*3wAS19R~Rr%lPJ%2O)JE_she;a}Ozq>rqZFE+xv{~get(X|?M}DCq=cUYA;ph&QqdAm zhoG9xit@VTPJ(N@J{H`=W3A)C=u%^Ko!eeAhLFW~4r?rTSbR!cQ~EXajosl$F}`w; zoK(N9C~3nloS5m^$hOGd@R%#OUrY98jj;?}-9I{c0N=^5;}b@AH&&PHO9T_ud}aN; zwg`*K%j9>@rP7?LuxFtqJeZUbTx+A?+Bl4t^JV|tbMZe~5*%KWQQT6*|FZwit(f+Q z5{LTqu)kYDzn$Ao1pMJWtuoJj$Ojj*4-=_H*ed&vco$oK4Wd`KCz>}7P{(oUG0h5| zqC7kAuo8W9Pgl`zm7^+CRHo8PXESmuN70zw{yicsR#)gd&&c;X9l~c-PR<2o|F|$A z&s2Z9^8EVCMDe3G0n&`==ShuEQnH#%#`n=(DJd$-s?p!C@YRoTw{Of#Z)QF0{U#k& zmp|#W<#f%9Y)LheX<;AQ=rg~bUMxHF@ExaGv342nlA4O4qUE`}Gzu|($?vKi@N~PK zYkLB3S~YO2d9w8+1^>YKy9cWqzQE;MHFMc@vlTa@nJSo&&E)E)(UkBLhO*UY&lrW*c04DY1X1 zyDCMGsJUii5Rde8QbIaGgqPX-bh9gu@;a>)k6!F6(Gd;KO2S@OqwmzW69I7^2Y;x2 z`VYI4^F=k&eHu?%=%eCBiq+??l@VX+Vr$-Em*wGq1XFzKgD=wf?3k!g@{&R zy))~t@AIKCuszQ9Vs)dQbG7wfXytBHo|rk)A5^bAc!WN|sG5&&z;2J~v6YRo>vu_f z)vtEd_|D}NE#`H}1E@N+s$s7W%tS#@3Z9N_{p}I;Y{itmu4KbFW+SnE|NxDb}_7cKaE|`P^hN5AN_)e0jp#_tyOooqe{N;|BR7 zEx&jwiVCi`xx*KqO}qRtx~y1T8@|5YfNAGHbQB z#Y?i3vC?k-qjO}26rprJ_dA(Q(}4;G8xDUeVWsAA>bmcP-z-Bv*GY8}Qa#vT6YP-A ziSZZxrgS?IyllZe>35qm>(|`C(`HKwx6hJaeb)Dz6<8k^9WOY}Ks2JHann9LhPAdp zUQF&6;e{cGqMB2>yb%Xa;QaU#D)9j>(R~#9w#V1b(0Vbtzds(K_2p-! zc~CgXljK|I+H`yTqL^$af?+PwmBPK5Wx*>w$&OdUv-@`uO@w}Rb&6&i3_V6sGZGyHL>);VmnLw_~E2g z%IJ4@Kh3kIY`i+ZMC?ozc`&)5!G?b!`vprs)z6Vc;;Ng^cT>K&Ijt75G?PZZg1w*L zkJUZt9rmH{s>U73vLEHl-l?9oMU2HE28$e==@WNw;!4?*uksps{nUKYXCo?3CsUKz zYo~Wfhd@8`l-F7`--%G{{U$e7H}>Ql$)L69eTq8`8NqiosA&|!Upndg_#~_L`a8bL z6ZZ~O)LXhAz(w=0!>&-lfjzzO)XC(w$jt6Xq3RL_FPlMYJHF`LyqyS0yJ#Zc>eSFz z7hS7TeKaZyxPW!LL!{P$q6$zT2tTz-Vbae4!qUF7N+KH&?0qR*X`RN!;iQXZ~zv=VOOgay#^i zU$loacD`lTVN=_!`uIZF;u7^n2kl#h`rw>HxBUg?uPn9n6DuDLi^u4q-?DEff|+k2 zch0#NE8x4S-fdloJZBovs$O+IgJ|q*zT=PlPwH%IuMCpc3wqRJx;UfHODQj!1#96G zyY~M+&Xyv!mK1~0J&4tH6R6d%;9E0vzbDWt7k+ABpWRUF^xbo!31ur!+A9XbMW4B{ z4-xs2t~NYv&}}m;NKDdoo-c8|i4*VIZId>L?t!-V8#*U#CxU2^P>yG|ySN*NzFxPB zU-Zg9JG+q2>vilmU5t{qtMcfnNPRB{k`RXGiOoEza;uu(5)%tc;a1Ww1gEuZ)nl?S zy6CgN?L?5gE4?oMRdDHrO0$Mt3*oUB^268|baQ8(P6Vqg9_QriW3K*H{e{EKytSG~Gl5D$OF-UkR`btm&ks%=1#A25EtX3baDVpRNof%5z5lJuMSxo#a}dvWh`j0`9i z(H{OO_S*keRXhCv{tHW`&13~m4U;p6 z#O}Ui!nE(6wi>bO*R(i{t{7IAGPc#Z=a4C%V`Flb(&rJv(=ICh;Y2C-=S6G@>NRZHhl}jPKax&S%j{>_!V50U25ZSSkp zHTFIntKE0ZT=S>sGPh?Oj(1SMYUNvuzvvo!I}r@Y3rWqyZM}+KgzMMYQ(8KX9+~Py>+?RkUky>42j4rwd-%bSO zE9_7Boz~g>CzUSAB`S~dSAKb!v~azzg(v{&rc;-FzF(k_g>VIrHFBBxnueczAw2fAk zv7HE<+qHQ~M*BQ)HB4DvO5Mf39^-ZIye{Fufa*AtxP`-sUo0UBG)mdAxaY#wTXJ)g z1P}HdiCHr`X)CK1!EHZ-{k{<0D{m(PC+bR5Gs}$m8^@65hy zHs1JHSjI<?uk#a&HnGmA5b?QSJtQ;?|X9oYUh6GQUhgcqA!E#O=p%q zMA*-Kvprmh(UryOc52O@5fJiFa>02=AOGI8tokyM=TaSGNMx9@08!x!>i6Y>_Z)`{ zHYzfyvaH7Q!@ZN?$<&8=JPv;}XKKahqI^vSL!Q;lo={s#M8{{fa=7J=|h~E2N zX;M)&q-n8wN%gz8I^z5pjIKOZ*T`t)M*GV9JL!6xLGzuoakCv?#a5Hws_EA!+db*8 zIk}%;<+?Zb#X2GPRuY%CxD$JdV^Uo%3~b_Rv{i2E>VC)QDqwZf9;C_&I6W8+iK}ip zZD`QF??d!@Hpu{Y^P%=D*UVlAPAR^iFTf3O|6zRpZq@xs3n~Zy2raLy+@|U4l3&}y z+c3I{Slx^v`V{Y)0Aky~uzhlKF)aO(MpQ?WCI+S(GcU3BEEHDfcPaLkHV&~m&RkyV zJmrboDKKq1zaS=N{QKFvdckgtt`b&PK+H?-BmwnOK-(?xRdRwo z3}v+@Gy3o=xcKY-;-oKg`e9Aa@(re!eMPI%$o!m`UvuF6e1g$c#_EnF#>UPunH38A z@rO~1h?J+Expub0NwmK=%#C55MzcCy#I6N zVy1VyuhX$TU+Ko1y_<1!CTbNYK>tI>hTg|F4~M(1jg#n8{kBXLP{;VI zhSl|v!d*}Hc~)L*(|9VbE6)33gLy~7VbZE@+Zx&@n|d*${$p+3>bt{(0^lzoe?1_b zQ@rI?5cN~Dfh*qU$*U4~j4o;_m!9p5 z)homJtAW*hJsjneeJyRerRRi>)3VnRQ`F6a zbj>d+9Y5ByN9m1kpw1zZ=_<}(ftG#pH^uzF%lE{cSRZk{wyZS05w3ajPV6}D?F+({ zwDp1y9$?RJ=sSn)L@;wi7QW|8KhwQd3|~q7vWfOGJJ@uvoJ3=dj3(>tD0Rm-4wYTR z-dZ;&u2Ttf6fWqdEzLbFwCh`ppMD$Bxs;3X_c&H}L~ef1j3&Fr1k3S7lE$;s>zkLO z=w{_?LynEE`Fh*opKxF?pf;_3suCT}jw?WN#X({1dKSuWiR+o^o zaqv>lKzm}BUTJu}e2Zdkyn5u_!8Kf0iUXL8G{vb0xHJ@U9qgv;v9 z!QDmflf37px%WGat`1iBHT_k}1FS+HZ+=wkn7np?K2tlm@AImKGuvy=535N(?yxT( zp^f?EkyUqHu*%nyh)^qHw@}La)4^4*j^r6yy+`ND?fC(n^S2Yh?e32C=Zc9Ly=7)A z%Y1Yh4`hyLaSM&Ln2)T;f7LcH_?^v6!{m{b^Wj1v-oXoU`+l4VW_eREeC@EEzw-yt zZ|KUeLVT}gj|*Oo)hFY$Gn_gUv_?KJ2!lVhPL#n8536yi`NO|;;icm77a=w z{Vj)^lsM$^#(3YpU7)QE)^rFWb?U_E>S1*?-0a$I+iGk(-x0~a9Hp@5%cCsWtMRt$ zPOLW+|czr!IS@v4339AYP<9Tk- zXsb~21XA+s!RQ)bbtUIhX>Tn3=FZ8YP+m-VGDvl^i}{ku$flH-yXsIpod?e&0nsb> zX6%hFs^?lanFsx#*!(tx(tVHGGOZ0+bO^#4O6|4SbJ_mz>)UUn`%cAhvm zE_-os;7|(u?@R6E>_p&i1kiY~^Ky1{^~S*=;@TN6JLBTNb_CFPwz6^abcN-tAPx@c zf6@65^}}1_@3|)cmel`6`|)3UH0^l56M>xw{Bs1*+~n?Q=k4ui=XqW6f4{j2`G>y$ zhD-OrZ_0n?(0}g3&i3C3pjbJ1xw%Thl2T(QR{x1{fnvII5B8sk0ue^Ug| z-05lO<>u^Thx6EW=X2oyQ}_M<^jBT~(-rxw>_lKE0y`1d ziNH<-b|SD7ft?8KL|`WZI}zB4z)l2qBJdxIz|L=U|3iV?k=cpBP6T!$uoHou2<${) zCjvVW*onYS1a=~@6M>xw>_lKE0y`1diNH<-{;!V!ZvEC{*crDTLrx~^}GS$-qG1k$iUOi?kKyM2)mb~ubrE{0J{Xcm9wLRtD8MM+7<`r_vYV(*3tV# z(8st|Tc71_Z=>gO;G+VN6t>EsZQ4IMI5_A%AE*j?rt_YyJoJtZlt&0KY~`W%YoI(L zfC;TYLhr^v`ousE%7FCu8TL3hB(PreCkF@T@B1nKJkt>;4po4J-ur-7QAa$s^w7H% z&?-6Lxs`|Bi-1-sfFJ<*j^1g2{D5cV;#>t#LIFj3@EmQNYbXN}dUia@qXN#L3`nOS z5B{O&GUC8vCjX?nlx5~kzf^m!h z)E}3va`0?roQy4BT(|OAAP@P1_NUuc9_v;f(*66c57;kTBa#Aj0uq_*d2z9$F!28M z5d2dHl|;>A+P0jrjlojdOFr0zl(i z2oMIu0C7M9kOFuBUVsna2Lym=0F8e_0KKmsjd47H0Qdph8^98<0;~e_zyk0E_zKJb zpMWV~9GC!xfcHQ@&^T7aiLfuuK6`fh&MB-~w0y)_@J52j~L^fFW=MI0{GuYyf&s zBYLMIKOg|WBlmEQ0c*f_;2SUp%mTx}2rvM=1A2gb@Yff(4CDe20d$Ps2CW1j3d)8qkJ5+y`y~QGgF{0dNJ}0C&Ixum>D~vw$Pu1egG3z$rih zPz00!Wk4LXB>+J{2+)GOMPL;801QFiX^4{%zzk>ua)1oL4R8S?P-YB>hVmByFTfk{ z1XKYvKpjv4(EHvb0byVewtv8K9GCzm0ck)4*aUDv8xJ4`L}8m0mSg}qKmnk6^aN-G z0e*lezyf(}012=T+X+zaF5m-r1EG)?2809Gfe0WHxCbNyXwFA-yf0t`90VO6Koi#U zpnfbYlYoELxdD0GTK`{mQz)CgrG@kkp-CIkXS=`4|IwWP5z3)c1S*NFq(J_rGVfB?V`2m>e|jUh=u0uTqp z03ARPI0T?FM}WhC%+@x_Qvl=vG-t^HvH;3Q<3nwE$Zxc*51?|k06LCs07JlPYugf*7Qh+67(n|4jo;G%8gC{5$}`(qn!^&=w#%Y* zR2P*&>(;=wwgar&0rr3+fP8QQx`8U75RIfG6M%xB;#J z%17I1=>uE@E&!JSq!$DP0#|`+Krj#rgacu~bs!Rm25te!SF|1rpnOC;kOU+G3BX<8 z9&jH>0aAf9ARTxBp#Eh6nLsvB2owOwXA~n88x)Tc0QG$zzyhE?KL*MGR0eHV0L}m^ z_YSB9P+ZWyLi^?|@C+b)axj@G$>dH}_; z9cTqwfLFi^pb=;QUII-(Gk`QZfi|E6K=ob&UBI?JY9FI}y0q6i)0JV!W(Gs!UKQtDw zzHYB?`+}~c{#9(yzCr$P`@Y?$?R?Y*>IW)=*0;y#_BsyaqcN~u4)p`ABOg%=QGd3} zA{{>1-X538Co~?n?WjE3=V*JoJ*0!`q5h%kMr7NLD;gun9~1*@KHASHwrD@1`Y0Bt z{&pEO?*8368uQ4u9k=ba(3nMI6xq-^whZb&(noVb{MHi91quLKDglZBI{#tosY2ei zU)$}WJZu@%KGOf^e3Xa!hQ=$JQ>FkdSVwc1KcEZf!#46k4>*tVV2S)W0cZo|kca9X zhjny5+1^HVQN9l3p9Ijh0W2Bq;eU{#^Zzc%WKG4S&YV94AFE0Ix6d?0|M9V!G?YC6 zr{MX_O0_78MJaY7>aCnGSh9nqY2jye+v!7I>_p~}!v{IfV7UvH3z6ph=X&?QVJFIg zoIQ|(&O*CkSv$op>!oH%!HX*@BP1y#^7r153@r47#;hk;ueI>v$_R-{Aeui_USvYP=jUVttD5~ zb({nLs57}`(QTHE%l@8p_8)bYz=C|ke`HU0fjf>2c_8|yKj`igsZn3_c$}@urpk%> z^Ct%0F7D7@INvDK`LG1syTtit|G%9+EIzsq=_fIUYu(s2}^gghNiNPKc!RZ7Giggq3>jS$_U#mcB zpaquEtvYTQq~dit`6OULA%$4~YY)&E`8OWGPW{()P&@zL^6%B25&XH23rsIj>=@y1 zVFlk{zk%4FJAG`d!E)%Y<=;p2f3~Nnp-%7s#m#BYm1xhW`;ws@v=gAG|Hf*OPls6P%)`2MZh|q9FIr^8q#PQ8}30(6K=LS1m@^|I=xo2m zGpav=YCW?6?~m7iroKU_gXYn*k`~#*0<-a8K@%KA^q;+^LtewAD2c;K@^^%2mTis> zn~fSmovowM&ePM)Q_$|>(DbM9L817&U=almz&CNI!wT&jxsfp_#P^@RxtcNUUNhJQ!&SA(#9(<)>XClAKEe4jq zlNio7u%J4mZn8~ZP9|03;RZmgrGzAK#Nm{Q`qSh(_`27l;y%>bI_m%Zi2vuYgZJOY z&c8nzTVQnUhIY2k^{798Pxiau6hjS`Q=>I+zr4vW+UgI)fE6sXV98%x%@FCCf3;C30c@%zMNWJ1y#~;g|qvT&iXRAMsu8x03cuPR6`xBBeA3R(*XQEL5xf}l1zF9f> z{He376Gy2qsHq6;z-a~zUuvj;&W%j3Vn~NViu1t&qYYgj*jssd3!e9MRN(9i2u|1e z^2hRLpRz$6bkz5U^ZY()8cqrpkU}Fw94x4(rp(PxFG~JKbQuY-oa+Ua!5u>7^4Q!VY5B{gdOQmaV)%0KG-`@LWTb)c!h%F-!k zs>Y4bf2f@Y3;YZ0lan>2?>PG6AC_>)M*Wc^vl#s}K*;+K%fD~u-&^cJ3XOyIhVk^t zwt^3!Ch_+;J-=mX?TaM7D}K55kLAy<3)!+{y3;lLghikczqM22w=7bI`JIo(7}Wn* z;CO`3bijh*b}h(QL16YP@*1@x`ac>67XMFkUjijXk@P>X-mEYpDB!`NsGv2&eJIC> z$|a|Opsr|7cg;*gUvzcPfv70DUU;Ca!s?3m!TNcjqQWW)yDQ)=h@#@PD&n~+AFiwJ z_lwA^qpK^kntA`X?~lIes*H@t$jr!y$jGD61&0IYvJE{?c>dRm2Leax9s6so-;}?7 z)27Dx#G8~i`x~p78{2IEZQ_#UfRIM&4}pR+N~5vgSIbV^_l6x~0ioUoZ%H%VKmvEu zxbKdQ|Ec5Ggd-G!l}W^NkcV{xDq8Nm>fQ$ck=o@EP$NmaZtjk~W?r%LH!ihYT{fMs ztt%UFP3!kA{p64@TDBMggGica9Deu3@BHeOr;gow`2|#t(7io63f?~1IB)UP$RqE% z)bfB3&O?LgGI;_%AK*z3LBft`9m0GdG{73JA#or0PWAko{Ssi;ZZzwq#grArzk`%xQUG6P5}3^=mEqvn76z{R77CIFG6 zB$xvdxQ1*blWD>zx#jJbkDgcm@0Kml0sK#m6X2~={{S(->y%vYZtD*9ci#5ad>9fx; zK;TpKhfmS5tI$YKzc=fG!ylVNo}KKuHvl28X7tH3PMomEX!g8?5e^(#+zTDyo{$_| zIqlA^lis|W?VRYJy8s~%fA0zBHDr2xJ))&Er(F#Q)Ybf&w}(GE%@_pV-=6Jm2BZrh zFTD8jj!u(iR=5!V?7h6jPUJlRc}FAcOxoXCJq_+jn}4D{{e-rx0ffr=@bY(Zk4)G= z^EucbauhEF1cqk*wyqu9?l-hG`MszO1gq=@KuG&{+-v%gha6MCm>~oxTLwruAm#<1 zH)PNF@LoXrigGB1PI}vphqQF!ArAqE?6x&-_Ox?Py7*G2#&L@00HL-%^RljU2S5J5 ze-#`IK-awt2-WBK-ltCObkX}{OUMs_#D570as9*ABii47|Hs1_M}!uR6x4>zY`J>V zH~YLVaUci#1410U@Oi%n@(*wO5)iVDz5AC1cu$zV_kn~2=xeE~I)fVZ_M{6EtKWTO z1@T7IpyXm^b-otuaLt0Uejj$)K)y2BZP>(~z#*=$x&6^;znuRH%?c#7VSrFu-@Nq5 zXU5-f?+<`rDno5O77+4kK6|if(e#hz>|z{-m=@wI&`I|ke9EkYR$op&1++3v7))zU z-pn?Yz1er?_Wf5J!}?mxz)UNjizlqI#-1M>GH=bg6mUr5!JFDoJR2NPZ}&;8_iOw?z}Xi#om+l1bMn_;)BJ}#V(|6|AmpL6FMnj!+-p-}ZpJ!( z4Im`fUFyd^oNYIjX0E+3(d&y9Oy8WgoioSS3ycxYiuD&>Kce=5?#vs{&0?mRG2&L) z+ef_A{gTmNRxvg9$;*L5ysc^d+5Mwd#ApPQzXPf2D5(v)(OBGdZCk2oFJXTYW_^lG zN8f$Aj~_GctSco1qvQzSP|r0!wR7N}$B!Z3pL!c(LCsrnITy%s)HnwoE!ypjXTRR_ zmTh0Le~lI$h@Jz4Vx7|`ZyJC0ck4go`mpRY079*^{_1(H4{o`+u_dBkJhaR1KSn_I z`_qS8FWLL!zRWdy(F!?0FKq51fG?L2$Z!e6WnJpm!d0TQygrzofL-eGG#y|ns#KuAVu zEF3Gi{(Fye<~Mv;(*_V(&TO-(p8Dt4?cILZm21D0A!L5aY7&uL&Wx44cH8@#9(k8L$1X;Ir?<@&L8n;+kD?PyTL7@?8XP#2HZ0rFz>FeGl7 zjV8*u@3`q(r?lO%#l<-iV~Diagv#gd=(u5RJ3wgG25OankX)a#HX42D=-sXf~W`N zog@U)b7K}-=;;0D|Lu3jUP&@a79IH&`Wn;%X74nD0a*n+>cLBfZ#rb`t1pa_9H2g# ze5xs$j+s4%RbMf%^`2)lgligTY01cx4TDyq`n=xi)9UkXFeqMy-obi7nOY;MEv?#W z2HQCj1TqQ{ShI>}o~#(r=a|>Q0m(a zvP>k2XzL}=e(eD{_1%k(7`per#>f^$pDJn!9CbMXu_*UgTKx&X^XDzIN_qZaK~2?RZdw^DzJZ!`^#g^P{IA#%0$>&9$00 zb<9C+8&`t^>h0dc@9I8p!2z9EMp^p@$Q#Wl(FSTcXin<{NUxlisHyp5>%1bsE^&aj zK{_7eN9}E#F+_MmSH%`TvU=-!niUWZ^kG~=o;~j7ttU+DFqS2r=OqC?ELmFMB+YEC ziQgaYX?sh{>uauaM@bW?ktY8lx$fo}pG~G!I8sPx(duj@YC@B*Y4_G%Pp|!~GazKr zF@m234)xEpbHDu0PuE2#3QBQ*)Mvm@L2c;wYaZE9-oFkIvNC|o1BC3)9y9t(eQB@d zG-r}goRoif|=stqOxASvbUito=)L&?>342cESWT(uY)d0*DP zba~q^x*;}*G1nLV#Q73(=f)*X%VxbEho3kI^ZMSsidIPh=>wJ6r(%$L4Qwm8pkA0ciPNIUSh*C*c{IPEv>>bpTB^<~*P8CCIH)n@RZ%`vI?V82^ zxqjX`*Cx7Q#|=A!MSEAeDfg}rwcx!gZX2jay}xzJTiEjUIe4S~SvjEVx_|sI_hcTy zT+{CXA?@G3!=H{jsO3u((Il@EeqW1G!mrwI$k2-(YH{8DjKlGR!vUdon^iaJ$A%A1 zc$y*X1@r*~OEdGoI`OO-{U^4AUjRMX=A;W;K z8v|;zXTe-};0f1nTu}`O1*KpYVt|mZ-0HE3haIvskrz0y4P}@!r5jS%={o$XeXkh% z0j(WM>)Zews_C7x>hn#%o^_bOfyk?3La?U+UJbPlbjYQkMiR1O(IYMQzwYHSSq|Fm zCRxsqqwecnKH|FD0YPoZI^PWljo@Ps&fM_3DNR&UipY>2HIwyb7V_h+{|pdz`%&PK zkC~~O_vbYip3quSLpd8{IYYNTzw4Ir+ZO-=-e9@|{P?$!7sbqXXD$aWZb@mcF<6iOIkJw3p-!bCU6+g${Xg(Y*IZ+}1!Iicq~}rvpMB{+bUi z-mt!DW)cvnjZ3DYG9uqCSj zAzNQDWUaaV$|ky7|yG?@oDa-CYs~)E)(d zTJ(D10Xa<)5vW zyn%xXK!~@!Z&~!>5eq)OLqZ@`3W-O3)a9sqL0!}4)JNSqk?~>#f4lPX>z3~G2}Lky zETE==J;xD@|F;~}rZX`Ng|c6UPhS6I-AxorBRNn@2>M4|pXRiingezJG-s4FhuY5* zguGq#!Ue6iytECgiqt=(%12HVvd27#6@44kH1B5K?s{_7lF=1nSG0)z(x|r!6>WU3KG*L(ZEr1LcsFK~3KQqzxcn#s2a6 z|6YFHIOc%mdIun68)r`VV9Mu{k2#Scyz@#eRV^loc5Ac8tskA!=g|4GK9IzN0of1K z`uyjK!zS!`rLe&~%TY^}Li4Hh4(hYpdI!|Hf;YBvr#-c7(ou8ANUqV_6@XCdB>%X& z>!Qdr&jUiX1ln>aAf(?~z5T-yQ|5ND@0-`ohv@X53FZEu?jx3kd1n zcAFNS^vpdQzmgDey#NsM9F}jMvHWjWJxq~PwhMjB76C%N@b^h zoYFMnkE@wZDI&|sDHEcP7Up;j9|H-+vk^F^~|d`f*N_9XlwPzdQ0*)CEEJU zV{e%$T9ji#>hTjO@w{5G>on2Us~UGqerx0}v?5LI)=Q}^(bg-bi1AZ4_=oyCMqPED z+d66vo&gTYLHlbOyZ-w2OWRzW?o-8B*b#Yf&!M?{HcLovj9@^hty_I`!j4mKSS00| zcpDB#IUv88)^O#gHy%o{C*m4oTQRaA*Arzqw=LaoK31LmH=2~rO)e^D;<&a#Tx9dCOxpVHRK{;egAlLr}gtY&mBQL7o z{#Hwhwvt>!diR|!^jpP}u03{~*p2ix*#+Qq0fa`@uD#dSpZoX&kYCTfcKR2u zkKE$osC!N=AqpI=J_wX5?jN-rC}vYAM}dRhR`51ZhqK$%z=2{kf`j1ENN(qoXNq}n z_SZlE^yWtk?VTg&Q$C|#cUV6sr6fPv{-XAY;$;1%Yl04s;;S;nnDg>Wz;j4 z=1>ckDhjXcb~&&z>NZg8L^aoHO`-4{Sc|FjsJa|=TdV8y#o5A^Jltw)vhmU<-f(qd zb7C9n5v-oiDe41@p{|d*-PCb0MLE!XyDityZ;C#JT&vq!p|7D6d!H-jjr$+;p#fdc8Gm9cY<2f}!9IJ=YxG0_PY!t5$n83ZEP`Rkwk{nxRh> z{iF7XwVFa53sAHhBvIXNyG^Z`ys0B*3a+)|G*~OsHiN*La_mXbbI^(Eh>Rjqf<9Gq zt)`~HLI0>VQgBTv2C23`3V8$9>J=!(zCp;S8Yg%)iELxmw9<)sv+S7OcfWGT_WUkr zf5c;GNkEPBJtEQMMK5^Re5L2$iBB<3FIpY@1rXZ9^z)j5|JrCyj!6jgn|lAXqOH*e zini8zkmG7Zq<;EYEe>6^Z6&QU(Od>Nina#izr}%~oMuW@;P~OyB(=OLT1P!fn#r4* z1I5^ezE;Ftz(Mg!G4}Ve{qe7fm(x5LCtUiJRbc}y#otDDT6uT&$7dcWZ($(iK&1Fr zzJVimOb6~8{+@oF`I{w4i4^mW0?qO1| z;NA%CDX!eU^_VlGbz6=HPCqQZLwbY9DJjxBfO7zFrhIYGfYY1eJAp&1*w7R!0BH+I zpQ@P^AO3wFMGdJwptd{f^}~jWT_6XL9ybL#+;c=MG{kJ z3qkF$F1_6=Tn4#UxG;Xsit_K8f493kyZE|x)$vp%rM201=a8=toAY$evdk=2;m>}f z%SETvociN1gyKm)E*aGS#TJdNf1M=x_@9GYG9BEBh&y9?2VEJ%aH}qoHDg9YIy<{2 zk#4Z!DZy%`Xj&thPSwO~4S%+(+H9mIl8S_6bErk@%;;=`rnsqe3acIoGh#)m6Q&V~ z=Hls;6$Y2tDiffH6Rk!ro=cboFICZW5=R&)tuoh?F|8_5gUVS}74~kVu>nk`+iwkK zbzM3=+cHFU{##j{PgRL0fqu?8z!wR)zND~G?EPLcHIvBK##09Ev?@%o^D&udHlE43 zPlm`^WmhnYvqH{GZ9G?(ulCkVb_agy%@nmJ(H-*}x;5{9QIqkuP+0B6- z&D70F)a7y+>-fq_tW05}MYgFTl}XOBD$?27N;E*FL4OTMJ{B8twR1JOol+!Wpvor$ zTd43K(49P469>2~9BGV0wyj9Q$V1GHNG&RnIsr-B6t;IZJ{5ZBX`%AIU1P?1jt-C4x_;gn~lVwp7cz1_WbR=$p- z6pjlJJY|XdJm|Kc{-rW(GXpC2qk)rqQV2?6h9ni(^keWvLj}DN$>VqohPaukHZcUC zRcfHc3>w`U;zfB;Kv9|jn^C&lxQu|7`(n^GY8H46JN{7$3JDBWLtMte_4TMYsR-(E zuYN3&OJ}{6zdzmK?glil(h(T+s163Xx_lh2vt8n3+waV-c&a zB94m=BJmV%4KSlQna2CV!i69EY*ks1VdKT+?H3oVbj zRm{@WRAv&qHbs&Na7sZ0z3kaHMFGuzghY{b)8lzZDsa88Fgj#*fRAB@UNe&E7<9R< zziYDTq^9Y-*+AI)T2j*&lnDX_@91_}wJ1LMV#VR=YFKgdfQ<8u+J(2OqtJlqJfmGP zjSXp6>8+Da1up#<;$#3$N}@%@QQCcwb314iL_dn4O6knWhUC`}5LhEuP*AZ(N41oNF>RG@5N?;Hfm zo+e+GFbi2-0fMRqnfUcgZ+xUti}0c4t%WWA(&+(pUy8@U5czW6pOzo(C{Z=Jcs)}0kr_BfYg%IoxhDh%Adqq zCTy5uCqHqKigT%9xxGCqTvpezfs8-N)2Esa!r5%#;xA1|>9h@mo9~F@>nboKjU?D{ zpy)(0V&t+Bnw&xn&&fkV;0&Q7F-1m5M^i{ZZWJ1j%0?s1j}77nH#A3L&y{oB*o>KKf(PHVc(cH zmAzVT0!^WG2CgVCN@W~Hv1ZE3Bf#TfBxza};vC+jTpHJLz>U^ORZw;mZDa0!i%B*> zLq6?32~jst5Dy*#Qf);sc}PSfmMPz7oA7Bp?^Y@@+w{KYBH5hhJ)eO`TNBS(x|oop z?dAnTMQPAE$0r^Ldy?F1JtAtwoRXtr1y9lLfOI(AY?I?&&0E*+;KcZZJC8!jCu ziQ6ZvUS1jGfdfMP>*@JIOI{aA)uQujF+Z%$CnDKGXsIrQ1`8Z$psv*&J7wYo1mn#J z4wD%%2eglz9cyst%1B_)k3lz&g$kUP7a)3H**I{AFt_Z?SQI$d zl<&(4ioO&O4VPZGsX)Mefpx)+nI!qchLTr4u*;CXWQAA&G)y^pK+Sn(VqwEk-kC|& z5VvQ7{k|20LIz)gQ8YP5r#tn7WJQ_8|ug3>^R05VEiC z1QGkOBo7`^gAg6C#DiO?rYwgapgGSa`43(lfC8mS6{X7;(gxB1(=VjSjM`j(wgfLMP*z+FZeogCDRMl=yeY{FS!kjr102o}L`$rw$Tihz`6 zI7y}AlT$0|)ej0p_O?PnSX?o(6?@n(@O-wI>29c0W+{X{BAPI?Bxx;+_@miXvbo zU+O9XkzOP*|HuXa3U*{*8(Dws2k0_yUKerWH#sIEhdu)9uq(-7-QA8Y$P_a1(EYh4 zduNQ`vppZhuv=EidXYoHaXV!`0a=aZ#gwrtW3<|EM z^EqC=#5>>o5y?gC;9KOg*dQVu?R18B!JtHql)9N9Y3>UK+h8%+VfYexEEFUxY=pvY zC~SoxnS)b>ZA%>M!VQlIYt-e;xXw8Gv!XbE60}122&elbflEJNGTeJ{nUzCHaL%}4 z(|EV;z;$0RlEbyI(^^1vo*6UDNXi?5fhV89D>(#u)9UMdVEa-~cDRLiWC{4rGY2fi zVhmkehfNZhNQ$P|8oA;t?%bRp=SyLA2)&G2;oi;&yq*{iFG7kj-r;G{K}HREHxnqk zFKDUoC6L16h_iz7!C3gVmXZc0NSBn4OAK=lF@+=@0h;oOogKC(NI=wspqdtQGYJwB zqa;i0(MW{s>Zg(QRS4^t|yzAq-pIMGj2)gK zUbn5rlM6&VZ`|QwYSVAqK*FDdWhLn$)4kWi1ZpbeW+GY+26sW&z@hB8SX(0E35_8) zr)Wx~i@JeAKPUw|s!37tXs*uJ)R;Px>d6HPo;MU6uAStm5MatDwu)hXqrByxvG~4! z=oIOGk^drA=QP!IGcgGpqolB!xRaUjU?VYkrQ0@GM)=-vxG9a=l6fi0>l-ntqEvK4 zcwpHn5j31-Q6x8)5j3na+#w7nJlvj2&yT%8w_5y)At38xS_m%W zv3#m2+sVUJWPUVB_`Zc8=ah*Q`>Z^k!bUeAsR9B1Wex_0xF$&p*^?HVnlM53c-27i zym6e4cXe2GSR6}H2r>!xKBj3jUrrG8rSRC|3flmle3U?v^LYsJI}h-%_G1$Qy#i$W zk<~NnG2WBIm)%!Xl1RGm8lE^m$nh^%Da=6fHTS^aU$+r7Wfbn0A-9{$AU_cEo+c~> zTUb}b{z?n|f^BmeQiU0*4GS>Q(c$A9lOw)aAK3O|Ny6*l7pR^$cPKIYBEFr~t)>>_ z1F?d4Zd2}2k(|Q%uBJ)cOb#K!U>`Zm@prds@ONr>i15rR(D&3Zp+*8zY9Oi_zGqGF zQn*4*yNvi}8n?EBG*2l#WXIX$4IWF^ZB)P$A zUi2|>G6hZooe)z+sySq*0(z?oJf37IKK5jec{c6 zB`SRTR5vdR$SsIUR5p?9=4SJJ$_=MnOx>aA0)mipNexdtio!f*Zz(|azH$}0PdJik z@L8bFowvoOUV>Ap0Zp6$Z$Z)sE<#{e8S&uAqXU!y<>B8#~k4(L@xwcF$DY#?Mm zLN$fY4GUZt+@c@~1C?L^MyOl?w6oH-bUs+kXAA9n5d^kIHstqrP>_6rpG$i@Xz*rc z*JgP-q`~KJVTblrR;N{_z-P_v}^Ac>I2Y(Fns(%JG8|-fo zO(x?{Y%<_@v04&oVv=4#2g+!-OdQC3%R)tMHl5E@H_11g<;Eo`6z)jXdYHmH&|dL zkmt}lg) zn%J);Ozw9P4Fhp7d^W+NbR`MD%aXM6(Fc?Kpf#$=s{esL<3FjKYKGvm0w-k%#} z15!}{odM8`D_!6Vbowc&DnY{y_(91`FKl|}KgYvgiwogd49N;%>ri;XJJ&j_DwZ5fc~4Sgh&l<7R^)usrWBRbOJdrUn86#z;(ZX<=+~2o2LUFA!?l8-;7t zY$5b8Ld&l-{>6}XlqrV2SP{w9VKcA15YVs^=^We^Z&k^Qfpwx<;L%|V&ndGO2TAHp zW3HJ^<6Yh#=tCB)0_2nEetu)mTMM2HRTlM6J%ibS0G^)MxSqaelYkD_GJBi>{o4*67dy3y?sv6aD- zO(TUxc_E8MX*?(qwHSHCcA7urmyCtGqM1k~>PUG^2=^D1~qCL0v?fN($VeCA9(# zPuc&#^}I25*g*9PywFM@Qk=-Nc&I=VC!l{TU?|urqP%HcoGTasr33@qlB5)hTatNX zYNV(*GfF5<1a;XLXz&QdA07V+2{2ivE4i3n;X1{+d;$_ygRehDCR{>lX6cSa2U8S- z{Y=y_`Xd7VtPYbdw%ctejBFpG3GxXRUDE_^CQx->*xxQe@5-WFT$Edqua2U?n7|{S zgBrMm@<3kT*yV)durX&OVb-anuoV^A5D+%EW_WR1S>K}UE(lEFIXD8O$19c+L8LgH zIl=znP>mHNkAi3r1Y}FngC3a|#5@ViS_utYIFJOH!Za3&usSMSQqWUCxQ^`K*cmLN z4*R}CO?OasPcdF9C?h+#ebkls@fh0JYX~mttc&Gw2SQO0LK&9ZF zHj;%Z^ul?dL&BaIQlphL&j^@wnXQ*3HLi>l+K#||{cFbBuc(102!QxDV41w+MS7;Vxr`r{4kmBh7Fb)IEC zP%KX5-VU>C7~`G=L(nNq01Yg{g>^^3LL?{!q!PLCDQw{(DcbkP8bYHnHH)M!BSA~3 z97}R;bC#>Cnu25w5S35pFnnZzTbU0e@itfIOb&K9@Fl(!n81=Zz6nABMGgHBOq3gv zg9RvTK)RfQp!>qOVND&w9sn!`(QP~SBlT)%q=W}Up?8rJGdBeU+{i7Tq}}S`Nh6Q% zxui1`71l-50&;`bfK;w-n0^jo4&;K8U4}IsT!iS|77#?(3r7ikLfslJ0ZxqAhG3I) z5@=an$g74+cT)rKv9$pOhxf1?gucBVAP@{Nc=sQR>P%kf7u$+>dw8!d5=U-L(p{F| z%juS9;~IRbhC7-JwY|##icWqwOJ0LsNC*N`!pU1%24yZPm=dw^gf`E^OLiIo7x(4F zmO)Ji1mt$<^A#nM1{7GhelDsiXceVFFyywp!e-HpHD6AU^`(GlxcB1i6_D`0!jYG| z@@##J9e8xTg^nwKR?ze(@z@Vjld>+nQCogujdvG^;R(00-~bTXR_@2739nIuRU=LB zJ9)sl^NgORFN2XR@fWu6r(t6DRBKY?r0w#fTtB)W=Niy&SeHT0*SXxUfqir5QzNhW z?e_z|T{!dD*>4{CT2%+}J+Is3Z{T;vPRI4s2uBX<(l3al%?4Pl0-n}}C`i_>rf%Toj3jp2*?CtxUTG_oQr9HlnHWR-+ Q@LP`Gqw$NM|F8c2AHBQSHUIzs literal 0 HcmV?d00001 diff --git a/internal/check-for-non-releasable-actions/README.md b/internal/check-for-non-releasable-actions/README.md new file mode 100644 index 000000000..eca1d2071 --- /dev/null +++ b/internal/check-for-non-releasable-actions/README.md @@ -0,0 +1,15 @@ +# check-for-non-releasable-actions + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run main.ts +``` + +This project was created using `bun init` in bun v1.1.36. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/internal/check-for-non-releasable-actions/action.yml b/internal/check-for-non-releasable-actions/action.yml new file mode 100644 index 000000000..dd8aab9d0 --- /dev/null +++ b/internal/check-for-non-releasable-actions/action.yml @@ -0,0 +1,24 @@ +name: Check for actions and reusable workflows without a release +description: Check for actions and reusable workflows that don't have a release-please configuration. + +runs: + using: "composite" + steps: + - name: Install bun package manager + uses: oven-sh/setup-bun@4bc047ad259df6fc24a6c9b0f9a0cb08cf17fbe5 # v2.0.1 + with: + bun-version-file: actions/lint-pr-title/package.json + + - name: Install dependencies + shell: sh + working-directory: ${{ github.action_path }} + run: | + bun install --frozen-lockfile --production + + - name: Lint PR title + shell: sh + working-directory: ${{ github.action_path }} + env: + NODE_ENV: "production" + run: | + bun run --cwd ../.. internal/check-for-non-releasable-actions/index.ts diff --git a/internal/check-for-non-releasable-actions/eslint.config.mjs b/internal/check-for-non-releasable-actions/eslint.config.mjs new file mode 100644 index 000000000..1ead49f68 --- /dev/null +++ b/internal/check-for-non-releasable-actions/eslint.config.mjs @@ -0,0 +1,3 @@ +import config from "@grafana/eslint-config-shared-workflows"; + +export default config; diff --git a/internal/check-for-non-releasable-actions/filesystem.ts b/internal/check-for-non-releasable-actions/filesystem.ts new file mode 100644 index 000000000..d7314d48a --- /dev/null +++ b/internal/check-for-non-releasable-actions/filesystem.ts @@ -0,0 +1,35 @@ +import { readFile, readdir } from "fs/promises"; + +/** + * A representation of a directory entry, which can be either a file or a + * directory. This is a subset of the `fs.Dirent` interface containing just the + * parts we need. + */ +export interface DirectoryEntry { + name: string; + isDirectory: () => boolean; + isFile: () => boolean; +} + +/** + * Abstraction of the filesystem for reading directories and files. This is to + * allow for easier testing by providing an in-memory filesystem implementation. + */ +export interface FileSystem { + readDirectory: (path: string) => Promise; + readFile: (path: string) => Promise; +} + +/** + * Implementation of the filesystem using Node.js's built-in `fs` module, used + * in production. + */ +export class NodeFileSystem implements FileSystem { + async readDirectory(path: string): Promise { + return readdir(path, { withFileTypes: true }); + } + + async readFile(path: string): Promise { + return readFile(path, "utf-8"); + } +} diff --git a/internal/check-for-non-releasable-actions/index.ts b/internal/check-for-non-releasable-actions/index.ts new file mode 100644 index 000000000..8356ac25c --- /dev/null +++ b/internal/check-for-non-releasable-actions/index.ts @@ -0,0 +1,6 @@ +import { NodeFileSystem } from "./filesystem"; +import { main } from "./main"; +import config from "../../release-please-config.json" assert { type: "json" }; + +const fs = new NodeFileSystem(); +process.exit(await main(fs, config)); diff --git a/internal/check-for-non-releasable-actions/main.test.ts b/internal/check-for-non-releasable-actions/main.test.ts new file mode 100644 index 000000000..40578211f --- /dev/null +++ b/internal/check-for-non-releasable-actions/main.test.ts @@ -0,0 +1,176 @@ +import { describe, it, expect } from "bun:test"; +import { type DirectoryEntry, type FileSystem } from "./filesystem"; + +import { ReleaseConfigChecker } from "./main"; + +export type FileSystemStructure = { + [key: string]: string | FileSystemStructure; +}; + +/** + * An in-memory implementation of the filesystem for testing purposes. + */ +export class InMemoryFileSystem implements FileSystem { + constructor(private readonly structure: FileSystemStructure = {}) {} + + private getEntry(path: string): string | FileSystemStructure | undefined { + if (path === "" || path === ".") { + return this.structure; + } + + let current: FileSystemStructure | string = this.structure; + for (const part of path.split("/")) { + if (typeof current === "string" || !(part in current)) { + return undefined; + } + + current = current[part]; + } + + return current; + } + + readDirectory(path: string): Promise { + const node = this.getEntry(path); + + if (typeof node === "string" || node === undefined) { + throw new Error(`Directory not found: ${path}`); + } + + const res = Object.entries(node).map(([name, content]) => ({ + name, + isDirectory: () => typeof content === "object", + isFile: () => typeof content === "string", + })); + + return Promise.resolve(res); + } + + readFile(path: string): Promise { + const content = this.getEntry(path); + + if (typeof content !== "string") { + throw new Error(`File not found: ${path}`); + } + + return Promise.resolve(content); + } +} + +describe("processActionEntries", () => { + const checker = new ReleaseConfigChecker(new InMemoryFileSystem()); + + it.each<{ + name: string; + entries: { name: string; isDirectory: () => boolean }[]; + expected: Set; + }>([ + { + name: "filters and transforms directory entries", + entries: [ + { name: "action1", isDirectory: () => true }, + { name: "not-dir", isDirectory: () => false }, + { name: "action2", isDirectory: () => true }, + ], + expected: new Set(["actions/action1", "actions/action2"]), + }, + { + name: "handles empty entries", + entries: [], + expected: new Set(), + }, + ])("$name", ({ entries, expected }) => { + const result = checker.processActionEntries( + entries.map((entry) => ({ ...entry, isFile: () => false })), + ); + expect(result).toEqual(expected); + }); +}); + +describe("isWorkflowReusable", () => { + const checker = new ReleaseConfigChecker(new InMemoryFileSystem()); + + it.each([ + { + name: "identifies reusable workflow", + template: ` + on: + workflow_call: + jobs: + test: + runs-on: ubuntu-latest + steps: + - run: echo test + `, + expected: true, + }, + { + name: "identifies non-reusable workflow", + template: ` + on: + push: + jobs: + test: + runs-on: ubuntu-latest + steps: + - run: echo test + `, + expected: false, + }, + ])("$name", async ({ template, expected }) => { + const workflowTemplate = await checker.parse(template); + expect(checker.isWorkflowReusable(workflowTemplate)).toBe(expected); + }); +}); + +describe("ReleaseConfigChecker integration tests", () => { + it("finds missing configurations in a complete repository", async () => { + const fs = new InMemoryFileSystem({ + actions: { + "test-action": { + "action.yml": "name: Test Action", + }, + "configured-action": { + "action.yml": "name: Configured Action", + }, + }, + ".github": { + workflows: { + "reusable.yml": ` + on: + workflow_call: + jobs: + test: + runs-on: ubuntu-latest + steps: + - run: echo test + `, + "normal.yml": ` + on: + push: + jobs: + test: + runs-on: ubuntu-latest + steps: + - run: echo test + `, + }, + }, + }); + + const config = { + packages: { + "actions/configured-action": {}, + ".github/workflows/normal.yml": {}, + }, + }; + + const checker = new ReleaseConfigChecker(fs, config); + const missingConfigs = await checker.check(); + + expect(missingConfigs).toContain("actions/test-action"); + expect(missingConfigs).toContain(".github/workflows/reusable.yml"); + expect(missingConfigs).not.toContain("actions/configured-action"); + expect(missingConfigs).not.toContain(".github/workflows/normal.yml"); + }); +}); diff --git a/internal/check-for-non-releasable-actions/main.ts b/internal/check-for-non-releasable-actions/main.ts new file mode 100644 index 000000000..7a997c1a2 --- /dev/null +++ b/internal/check-for-non-releasable-actions/main.ts @@ -0,0 +1,199 @@ +import { join } from "path"; +import { z } from "zod"; +import { + convertWorkflowTemplate, + parseWorkflow, + type WorkflowTemplate, +} from "@actions/workflow-parser"; +import { error, info, debug as verbose } from "@actions/core"; +import type { FileSystem, DirectoryEntry } from "./filesystem"; + +/* + * Define the schema for validating release-please configuration + */ +const ReleasePleaseConfig = z.object({ + packages: z.record(z.string(), z.unknown()), +}); + +/** + * Check that all GitHub Actions and reusable workflows in a repository + * are properly configured for release in release-please-config.json + * + * @param fs The filesystem to use for reading files and directories + * @param config The parsed release-please configuration object + */ +export class ReleaseConfigChecker { + constructor( + private fs: FileSystem, + private config: unknown = {}, + ) {} + + /** + * Process directory entries to identify action packages + * + * @param entries Array of directory entries from the actions directory + * @returns A Set of package paths relative to the repository root + */ + processActionEntries(entries: DirectoryEntry[]): Set { + return new Set( + entries + .filter((entry) => entry.isDirectory()) + .map((entry) => join("actions", entry.name)), + ); + } + + /** + * Determine if a workflow template represents a reusable workflow + * + * @param workflowTemplate The parsed workflow template + * @returns true if the workflow has a workflow_call event trigger + */ + isWorkflowReusable(workflowTemplate: WorkflowTemplate): boolean { + return workflowTemplate.events.workflow_call !== undefined; + } + + /** + * Compare configured packages against discovered packages to find missing ones + * + * @param configuredPackages Set of packages configured in release-please-config.json + * @param discoveredPackages Set of packages found in the repository + * @returns Array of package paths that are missing from the configuration + */ + findMissingConfigurations( + configuredPackages: Set, + discoveredPackages: Set, + ): string[] { + return Array.from(discoveredPackages.difference(configuredPackages)); + } + + /** + * Parse a workflow file content into a WorkflowTemplate + * + * @param content The raw YAML content of the workflow file + * @returns Promise resolving to the parsed WorkflowTemplate + * @throws Error if parsing fails + */ + parse(content: string): Promise { + const { context, value } = parseWorkflow( + { name: "inline", content }, + { error, info, verbose }, + ); + + if (value === undefined) { + throw new Error("Failed to parse workflow"); + } + + return convertWorkflowTemplate(context, value); + } + + /** + * Scan the actions directory to find all action packages + * + * @returns Promise resolving to a Set of action package paths + */ + async getActionPackages(): Promise> { + verbose("Scanning actions directory for packages..."); + + const entries = await this.fs.readDirectory("actions"); + verbose(`Found ${entries.length.toString()} items in actions directory`); + + const packages = this.processActionEntries(entries); + info(`Found ${packages.size.toString()} action packages`); + + return packages; + } + + /** + * Scan the workflows directory to find all reusable workflows + * + * @returns Promise resolving to a Set of reusable workflow paths + */ + async getReusableWorkflows(): Promise> { + verbose("Scanning .github/workflows directory for reusable workflows..."); + const packages = new Set(); + + const files = await this.fs.readDirectory(join(".github", "workflows")); + verbose(`Found ${files.length.toString()} files in workflows directory`); + + for (const file of files) { + if (!file.isFile() || !/\.ya?ml$/.test(file.name)) { + verbose(`Skipping ${file.name} - not a YAML file`); + continue; + } + + const filePath = join(".github", "workflows", file.name); + const content = await this.fs.readFile(filePath); + + try { + const template = await this.parse(content); + if (this.isWorkflowReusable(template)) { + packages.add(filePath); + verbose(`Added reusable workflow: ${filePath}`); + } + } catch (e) { + error( + `Failed to parse workflow ${filePath}: ${e instanceof Error ? e.message : String(e)}`, + ); + throw e; + } + } + + info(`Found ${packages.size.toString()} reusable workflows`); + return packages; + } + + /** + * Find all missing configurations + * + * @returns Promise resolving to an array of paths missing from the configuration + * @throws Error if config is invalid or filesystem operations fail + */ + async check(): Promise { + verbose("Checking for missing configurations..."); + + const parsedConfig = ReleasePleaseConfig.parse(this.config); + const configuredPackages = new Set(Object.keys(parsedConfig.packages)); + verbose( + `Found ${configuredPackages.size.toString()} configured packages in release-please-config.json`, + ); + + const [actionPackages, reusableWorkflows] = await Promise.all([ + this.getActionPackages(), + this.getReusableWorkflows(), + ]); + + return this.findMissingConfigurations( + configuredPackages, + new Set([...actionPackages, ...reusableWorkflows]), + ); + } +} + +/** + * Run the checker and handle the result + * + * @param fs The filesystem to use for reading files and directories + * @param config The parsed release-please configuration object + * @returns Promise resolving to 0 if all packages are configured, 1 otherwise + */ +export async function main(fs: FileSystem, config: unknown): Promise { + try { + const checker = new ReleaseConfigChecker(fs, config); + const missingConfigs = await checker.check(); + + if (missingConfigs.length === 0) { + info("All items are releasable!"); + return 0; + } + + error( + `Found ${missingConfigs.length.toString()} items missing from release-please-config.json:\n` + + `${missingConfigs.join("\n")}\n` + + `Please add them to release-please-config.json!`, + ); + return 1; + } catch (e) { + error(`Fatal error: ${e instanceof Error ? e.message : String(e)}`); + return 1; + } +} diff --git a/internal/check-for-non-releasable-actions/package.json b/internal/check-for-non-releasable-actions/package.json new file mode 100644 index 000000000..f9404adff --- /dev/null +++ b/internal/check-for-non-releasable-actions/package.json @@ -0,0 +1,23 @@ +{ + "name": "check-for-non-releasable-actions", + "module": "index.ts", + "type": "module", + "scripts": { + "run": "bun run --cwd ../.. internal/check-for-non-releasable-actions/index.ts", + "typecheck": "tsc --noEmit", + "lint": "eslint .", + "test": "bun test" + }, + }, + "dependencies": { + "@actions/core": "^1.11.1", + "@actions/workflow-parser": "^0.3.13", + "zod": "3.23.8" + }, + "devDependencies": { + "@grafana/eslint-config-shared-workflows": "workspace:*", + "@types/bun": "1.1.14", + "typescript": "5.7.2" + }, + "packageManager": "bun@1.1.38" +} diff --git a/internal/eslint-config-shared-workflows/eslint.config.mjs b/internal/eslint-config-shared-workflows/eslint.config.mjs new file mode 100644 index 000000000..f09e1a363 --- /dev/null +++ b/internal/eslint-config-shared-workflows/eslint.config.mjs @@ -0,0 +1,43 @@ +import eslint from "@eslint/js"; +import eslintPluginJest from "eslint-plugin-jest"; +import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; +import eslintPluginPromise from "eslint-plugin-promise"; +import js from "@eslint/js"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + js.configs.recommended, + eslint.configs.recommended, + ...tseslint.configs.strictTypeChecked, + eslintPluginPrettierRecommended, + eslintPluginPromise.configs["flat/recommended"], + { + // Allow unused vars if they start with an underscore + rules: { + "@typescript-eslint/no-unused-vars": [ + "error", + { + varsIgnorePattern: "^_", + argsIgnorePattern: "^_", + }, + ], + }, + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: "../..", + }, + }, + }, + { + files: ["**/*.js", "**/*.mjs"], + ...tseslint.configs.disableTypeChecked, + }, + { + files: ["**/test/**/*.ts"], + ...eslintPluginJest.configs["flat/recommended"], + }, + { + ignores: ["**/coverage/", "**/dist/", "**/node_modules/"], + }, +); diff --git a/internal/eslint-config-shared-workflows/package.json b/internal/eslint-config-shared-workflows/package.json new file mode 100644 index 000000000..fc3c4bdf7 --- /dev/null +++ b/internal/eslint-config-shared-workflows/package.json @@ -0,0 +1,23 @@ +{ + "name": "@grafana/eslint-config-shared-workflows", + "version": "0.0.1", + "main": "eslint.config.mjs", + "license": "BSD-3-Clause", + "private": true, + "dependencies": { + "@eslint/js": "9.16.0", + "@types/eslint__js": "8.42.3", + "@typescript-eslint/eslint-plugin": "8.16.0", + "@typescript-eslint/parser": "8.16.0", + "eslint": "9.16.0", + "eslint-config-prettier": "9.1.0", + "eslint-config-standard": "17.1.0", + "eslint-plugin-import": "2.31.0", + "eslint-plugin-jest": "28.9.0", + "eslint-plugin-prettier": "5.2.1", + "eslint-plugin-promise": "7.2.1", + "prettier": "3.4.1", + "typescript": "5.7.2", + "typescript-eslint": "8.16.0" + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..995ad6ae7 --- /dev/null +++ b/package.json @@ -0,0 +1,9 @@ +{ + "name": "shared-workflows", + "version": "0.0.1", + "private": true, + "workspaces": [ + "internal/*", + "actions/lint-pr-title" + ] +} diff --git a/actions/lint-pr-title/tsconfig.json b/tsconfig.json similarity index 65% rename from actions/lint-pr-title/tsconfig.json rename to tsconfig.json index 6737d7e45..239e9426b 100644 --- a/actions/lint-pr-title/tsconfig.json +++ b/tsconfig.json @@ -5,17 +5,23 @@ "checkJs": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "module": "es2022", + "lib": ["esnext"], + "module": "preserve", "moduleResolution": "Bundler", "newLine": "lf", + "noEmit": true, + "noFallthroughCasesInSwitch": true, "noImplicitAny": true, + "noPropertyAccessFromIndexSignature": true, + "noUnusedLocals": true, "outDir": "./dist", "resolveJsonModule": true, "skipLibCheck": true, "sourceMap": true, "strict": true, "strictNullChecks": true, - "target": "es2022" + "target": "es2024", + "verbatimModuleSyntax": true }, "include": ["**/*.ts"] }