From 111c14de34ccee9938b4a1ee70587926df72276e Mon Sep 17 00:00:00 2001 From: Magnus Bellstrand Date: Fri, 27 Sep 2024 14:07:45 +0200 Subject: [PATCH] feat: generate pdf --- .github/workflows/release.yml | 34 ++++++ .gitignore | 1 + bun.lockb | Bin 0 -> 53864 bytes generate-pdf.ts | 43 ++++++++ package.json | 7 +- sets/dsk.html | 201 +++++++++++++++++++--------------- tsconfig.json | 27 +++++ 7 files changed, 222 insertions(+), 91 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100755 bun.lockb create mode 100644 generate-pdf.ts create mode 100644 tsconfig.json diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..ec91b80 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,34 @@ +name: Release +on: + release: + types: [published] + +permissions: + contents: write + +jobs: + release: + timeout-minutes: 5 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v2 + + - name: Install dependencies + run: bun install + + - name: Install Playwright Browsers + run: npx playwright install --with-deps chromium + + - name: Generate PDF's + run: bun generate + + - name: Upload PDF's + run: | + for file in ./storage/*.pdf; do + echo "$file" + gh release upload ${{github.event.release.tag_name}} "$file" + done + + env: + GITHUB_TOKEN: ${{ github.TOKEN }} diff --git a/.gitignore b/.gitignore index 66c2997..eff56ea 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules/ +storage/ diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..f24b41e1e821ad2e9cf61ef0bb27a94d88bf812d GIT binary patch literal 53864 zcmeEvc|26#|NqcPNS2fcN!g8k&z7u-QYuSiFqkkjGh|DYP$8{~7O5mH6iT!R38hsj zDJ6w0mG-E9uQTS>eJ@!)pYP-M$LG;`JYJo9?m5rrd7amJo#mc;M>D3Yg)-=BUR0VI zg%&356-wg;Aq56|2l!G0DJ0)udJvgO3RCChBoGMOmf2<7*@{IkRN($_P(o$${lj0S zOy#HT7T+F`+vpZD?ZIs*1R-rOB8>Z69LrAMN@ZXCj3&bsFM$y2%bo5RV%>SUy5Sp9aMUUpNNqc>^&jFU?IL2tphVu>{0E z6t7S}C>Mm3gdhO-k)EsA>9LSTI4$@G;k<+Ctei4Pqx!s1O>n&y&u3o$PSY1v>=BUYb00`wXm}F)sgTe@hG~%Js{3&!Qli@=NVe!bZ%S%EG zRe~KDOnPtx!Iw^9_(MH^w+qr6)lXrPk+}#VWIBTqN)N>F*FaCC52nX(^?Q+--l!gW zIAS9ZE&?7@iM=y%P@hR6gMJbLF|uC(#Hbx~@+y*7uusISNrU%OAx7;DrG-#Kko_Z= z6x2b5Y<*(DK@sj2#K`Z+j0l=Hx`2l+ zj|CJHn#~HRJ`34F{NKk(68k<@Hs2@LaqU(E;o@_Dy@v3ZA)9a`Rg?W}e z&H9_WTJ!W`d;8lSJ6@&sNP6T`kKMaI@#17-zgs@hi7RG)3*;yWk+Enx9;{Im*z3Ko z+sAeBW215lNttIe%6VkYxpM4zWc6u($UtD_H+#46# zh3v*Y$&+i%&pK^OT}RM zMJhAcw_m)aPE`E-Js!(-91AzxKPlxrmsjxVBcF!afy4jjmY=Ec;bCS zIk!domy+#tu7H;vW@(?*IJTvGTqD1)ymIL6x9Y>REo!bQa>d35Ji$iQuN*VVN_ngt zW`~xRb(xg!mybEuEut;;s!vqGCo@`w>qX_KXS($rhDT0zd>h*_{klEx_*43plx(jt zqHcnlBNCI{d;INpU(|cfn|$(da`hIz@!X_mQ!C!b2XMSyW%8O*9+;*ol<`V*N=t*E zc4~q7dHukUTGOWM7n3rJigH^c1@un7Po-_SQ5ErAr@ve{@rq~g-oM+$cSb^Ek3bw} znV*>VHI8#ibiqq!`@Sqo!|*#3r|y-T^!X{K$8hyu6%m&_za!5{g`23^zofw0?DF%0 ztuM_zr*XD=IQI62xLoSx+ViAGp*AIYf+**`@THCo_U?VP&%(8r#l)VKU0a)PQtIPm zB>jb7rg)NB)|*t9uHE4Zq|DqJohtj%mqC*{-Tke!xvOG?Ce4>@^k{o`OJ<8<ObZ&RNw%D`#$JaFS$8wPe zV@oUBry0L1KUF8F<4<(fbgCblcST9fX5h1%NS~HN#|dXS6_cV)sd;b03olQV8MEIp zOZ!FksUN)kk@xM6Z0MoLkrk}nSLf-t#Eh32Xq?Mw>2xE>t}^$Y{?o80`g7}gH8aJ- zL$o@#H*$_r5^GZ5Cy#nMK6i%*8QzM9Nc^hLsqhre*Hr}+#n z*Tol*=0|><%&}=Ib=swveVY!ewFQ>s`_@`(O}N~5P{Y1GAm`yyUNuK`dNqG^-B`s7 zcIt8Oqq_a-lZ3lu{yt6)UfUJ1f5jatOk4j|;AEqvAvT8j4)LjhVE5s2$bglDC5xaB zc$9`M)2Q)>0Au}M)c+CiW`IX^qkzSOso(#L>CXihT7ZYOfB;*qQR^Q9__^%%BO8vi zU$FX1;lhfIN7{0se?|~6JZkW4z{56#RrhG?pAC33z{56|)%MZa?*ssr0Dh!6tZA73 zW1wOaz+*dpEPuEd!_Nl15#V9l%?hJ!eT6gLDs^4-w{to|s#Bm09IBOW`b9t>X%cyqvG>Cx&h3>}C158;p?Jw_6+`WyhS z4tT8pM(RfxeiPtlv+GCo%8#USD1+gz10LBQ={?fAQ56_o9Xig2jYs!J+y3ou#(10I_{Q6FOcIGhp~ehc79 zP(MUyKhM%(I4sJ?@b>|T`VYF1fCRN+Bmu+Efrktmz$3lUz0tOR6X22mA}ngdXxm={ zcyqv`{zJNtR)1c2*g^GUSgc(@HDtib83JA#@Tf4-0lSaVLj|lH4e;3hVW{$d&%^LJ zfY)W~k8F=@IFf+j-vA!XKL~^Rf3*Fl0uQTb|AhFE4QGIiBw+PZ0k6l_AM7~dfZ?+M zkL(A>3;)snr48`20gu`a&%vX%pDaA=WBrG0kH+9g0;az^;AcVo2!s4*wEnvb@D_l_ za9E7^h6-5y&45SkM>seq7`6Xuz@dl+TYqG~kp`^(c)**n>qqxStA7>X(fWo)->}F#o|gaBBYc z5-aNfc+CG%VbljB2^c;B@Ywu65*$_r!=C{>vOm`D(avA*0gu){43F_*_53cz%BjMj z!RBA=-tRE@`&d~Yz@z;K%EQ)Be7WCUWB8qHJW8WE43@(Y1q@#UconE0OOFT)g|PDP z0k6)sAF6+(0mILP2@}Jk`4j7h;dn5-6X3D&i~4@F{hthY)c+XYaP?yOSovzeWB!M1 zKU)2Xa2Si>|C9CC0q|J+N4j@HZNT(T06aGSN2)s>U&pQ=;~TC0IbqSj`XAMg@t`_} z3RpQ!z-zL{53=7#+koMH0FV41&08bIBE2wt8sN1>i`wxus zXC*^iU}cj5kMF+ZU@07R`=!JQ1Y6J_wHvmgqu#&y0p6UA|DCS?b|2IKC>xLY z-$?C<;ky8@5A|byGur+$g!k`efJZtaEXIq{Lj|l{B;fy>`cDJi6zWIqN1UTwKi>i# z&A*uaM%#WhiNW~~;s2BN2Ls*$>PP*C*#s_!4OrPiz$5!%`VR|a7r^jcfHwy`N+TZ_ zDG!D>l>9Y+BI?oFj|O;8s2}05Js9E{E@1WF06bbhknRXSQVtA1RqEIN9o0En{apZW z#@2tNSX2*I|892uD2t;>;RWD(6>R*C)OJWW3{PX@G5tr{ z1`MAAc;x>h#i6=U!0@lwc$6M#+wpi)>0jsfqtOAYe*@r6K!3FUq584=a5-ea%3YQI zwf{kYk?Mfqxu*}V-zbghAE^y6{2ajlH~k-l!=t)KtA8Qjjd1=u+WF@-;H_}}Gurx- zWCrn|I?HyW#Ww;T%|EE^NU(hn;u|Vp_UE55cz%r1@F+HF``G~A2I@z48|mH?>4nvw z#m1wtj|8=0Bmu*J1^hgyAEhxHj0SHtb8!42%zuJU1H1#&KZac?77wQbrvDSbW9Jvx zz2UGZA1gaS_OJa9uVY3OFuXnBXMz4$+hI8yQNZw90B;C*-Yx7jicxwi2&#WOJG}#96i|%vccKIYd`yIN2J7x%jQZgK2r8e=zK>!w#`D-| ze2mH+W8X(HN*`y(C)oE+WET>Zt}nd^I2_T?>K&icuN`ghPVLA#N1#@t^tU&;0Xe{uvw>XkPj=|NM2{L6$-D z(0?}nd>8nRO+<+3{~`b%2VsyGPfgq}xlE-t&Gl&PV>|hjoZM|nB8Ts}`s>@q*J&(Y zaj^NSVrrCMf)O*54~u*+h=~oX5Z1X8y-g< zzSVMJ|3v%!o!1Nw1sXoI=iYx!XBHvuh3_Hx>Wsw2I6EMnu|WLf>`$a0YEV@ad-^?V zzTK*zGuy~1W@aig(ug|`MJJuUuX}E{wbxD4a%SRH>W&s#@7#{II1%nhr(m<%C##oP z;&`!j0&x?28Vc)0Og_sT(cav4{OAKqk6ML;4a+W1?{ZV{r)Pa!abH;CimQ-c)qquc z?}ZR!hq4nDjSMFv#h26TUgs(&cj0)^GZ+?#(Sa5-E)^66uRQt5`}8?qwV+fD?N&(% zf@Z0V&~xcyHCkB(myCJ)t*YkOYBsF<_>d#h@{5j5+A6~z@it0j+32@>n0?V2iv^;< z^!d#bO&`bIHG8^UZ9v;#%k4X^bHi7>&2Hp&sY?-h_~Oig5cj3e1VxOWwJNm4PBYKY zK2DW+c0FlBzw_PPu*o=Hv?ssM zu_cM-_fGly9XRpyYfvJ6flaB#yTZxgPCLv#Q&btj*SK-KJQyj&#PZ{5mb~8bcH@qm zh(96cE?#q8HbDGHhLEm;bwY1K_YQ|24{Ep%Yex2cFOEvhJNLBDw7Kfg{aT9pg_&I& zD}EksAxUQYZ0lzHP$O)%Z5yY{#A_GK=a3h-J*jS{}jyJogro<2!J?CVP+ z-FY|9SrisqJGJ3>`SHAYtqVMy?kw>7sIq3EW2DhizA3GB;`^p3bQCVkyg_UzST^yR z-mH0wVKW)E(-_}&+G;MEd@1IY{>yKN?@%;m^G?F?;-5c>E;b+YmbseWEm?Q))rLN|=QZkMg zy<5QokxM>hzw+_dX(d12E%-fjc=Q&IcA_NvEe zKm8+Zy7z7{OkRfOEKgZ8$-S!IUFu7UQ=6f?+}NjFq`Ht+vTV`u z-EGJp(q7H?bjyVFx^E8A&)!M5R9o{LkX6L-!exIu$cn4jm-o&Jbw>88!A>eyU<|$yL`k9=__CoJli3 zu5|2Pt5C?o~lvWsROf=D6pOnb$u`)$E>eUXe8ItRSPRDhZURQT$IFxVdAqwl0rUbm@)4@lN^43i`emJSEEaNL=9dsjU~z z=sfPbA;KUsHT>4kSzM(MKWWLEvGOwfVWk^2s&3bm^1hua)!_e*w0v2G&W`&VmRgcU zop8MHTJ&ci3ST(Fc-wDPDC#3*F05EOPceC${qDZLiieY18xC-+<@LY)zBJvUcwgAj z3NM)!*-M|jH>}t@_v8fiTj54`V)No~yy%Px3&ai=#<`+vK0&n)^Xr|YWy5W}Z=Ce6 z=IHa6HLhL%I;2ePz>-9{{O0f2E#EOpOoI*=G-?;@+qH=`8ejyEm=>r9c6M4 zmYy#fcj0Nm>nBX!PRFEON5`#mB-j*g=zNUhh1V=U15qLFkxItN*G#MY&wjMR3nil2 zRku%Gm^q_#`E#b*oq+=jrB{<(mWJ+|@J>HE#_QBH8G3c^N%;=)tq6S?HA`M2OF|5?zqLD#`C%V;+uI2G2{C-L`C5lOk13 zqR0MPze)I8>iJ^=`}7Rjos*usecG?qQF(0k)E(}h-SVb9AUB+M*uCt=c8YS+28R_J zCS07nwFt*M1JAqN?`&&oyp$=u`B>lwDKW2`)%m?C-Q^jY3%SOu47K(?_nlUEH%nu+ zd}{mN_eQgYCg$I-vC-Rk?Q~^a;`Wc$cz>9Q=QWNct=B!1Nts*Sbw?oNCg0oBU*;dz z=eOf*8_2NTQaWIwP1s6(Q8nke^-9O6cIHxK^MGhe@}dv8qWy7gTWi;|XexAQEj-oazKZI{dnYu?k{<^~0hWm$JJn-nYG zm7ZRlDf?i$*^Q}ValCMx{4)@JbWH-koU7Nq@@1p>aW3OMCq!ancNrTC78~1B$ib~Q zFV1@?5w~R9oe3A8NuHdsZicy0UqMLd&8a)p_D-)ql8*i+0JiUw|H%q|R`5apoX2A? zw;ty`A(cXvxB9c!FY=mL)W=a|U>i7R+%#XuO*ht-3eFlUXx6$}zC0;#ezA}a#c*x$ z0@9I1;ZrW+cop!x?@k_eSLzhsr71DlDS&#x^Io2W{&Ov>xOuznixUziPEbC&`EiKJ zF!iSm52Luh4YB>flf8Yb*ATQruXY?JXI0-Ud)xTls=kZSaMg6J zkD+ikM}F~(rBu$N5({v=%6MM);PQZS0k4Y(Z5Nw0s#OXmEWP_SS>e>A$T?Q8X}8~A zGw95iHc>3z)q~?z!SkNDbb)&(hxEJ$Att9D zF3b+ixk%69kmWqGXrt6q`*J;^qu##L+xj!^#cr7I^0A@e&btX~L)v8t2j@3`cITn* zD#r1W@Vra%yk)m$gc8;mSyffMb)S_|el^{aYwvbJWv!dlw|aM#RkZvt_A53$$lvqy zNNV*7uUm^c?6P^6Jh%1!=z3aVK8{xv&l^h9DciA}6m{NaS41$;w|4zh&iJ^;H)-Zl zoBF2Jow@8N_~B^KYRXCH+JnmtWpBvuuDMh|5&LjL{MO#WxUXjtalGh#1r~@>B`Q~6 zDd#0;?en(`%t@ShME6s6jHJ4tN3w-zE`RBEhYa!ttK`Dypym+1C%MuA6_-9<6EWag zx<D_fofuE{!{X@KTJTq;}>fLn(>t z>#nW-&L4QrwPne{wg#)ayU^d>z~%?^{s#-hgPFoc2WGB&Q)Bip@p&lod;2lfQpVzT zpM}#%Qyw)%L@v+io}t+JVs7%92d^(XEO9EbzBrTC{UXWY<_RN{1>6=mUhF**;wD;; zG5fH;-{f@Bt22BvH0JF%5R-nPwPH{AQDLsQLcSn9K7k_>R&3U_KfEvc!>#j@`}I`` zsV{|vS1s&rc{xw6EfmMAgDH!6CvL4=UVQAxjky~=+}3A)eq}nt;AMx>Nn1_d@lUv{ znB;*f*ZD4?;|rQz=&K*wnmkYFx!1Qan~Jtz@AdVU*YO;|@#^AvxAj+3V@$o4oOLrw z=6!$5AWRB2s`|(Laz$zN8l5+`i(TiNsZitcAU}T3l&xCL)pOT!h1V@ro?H@|xO+P9 zzRNgXJv{Hab5}dQ@2%0#l}my*P66U+C!98HNZ8i)y_B>5{-@}q$i{xtJ^jeH+h# zdt(ixcMmunnJ=mwY4tjO3b_R2P2VaIG@AOyL{e&kTODf_>-p zEj?DTV$xyfOwXOW`rA#tG!G^$)Vg#_u_~veqSD}O=d|?Jo=IbOw{*?Z`+l-(&8ggV z8#tsEYk6{dSun?(x{K2n-qrpL#HI=>S>1H$ge{E|WMpUf>)H5eq*fok+5W~v$wnsR zE$@1lRsHm*(tBpV9lJ-0x>O+Y&6#xi(UjOz&CN$=j}w=}@uK&VSRh{Cn=^ZzPTwgm z!*-9Qaa-4GB+V&uyFQ_#zSwxihs!y%w!AT#6+EZ6Ul*M=**3${-^;e?!{eiiLzf!g zpJ>{6@GXuPzRmaeB66ZbM&zyUNej~Mmb|+3V!uRK zt(IIzOU02J4s+kk7}q~tSU4wwXRpcDntcM}zEo?*dGj^8uRj{0xNu4l-|Ai!CjMLl zdk@Rvy=v*#S7+1Dx1phTYcJ0u>Nq3QDdF0;A9Wu}(j`w;no;#kI5o$uHFZtOR$sZ@ zQv|wd_q?|GD0Ft)q^ZhcITv>me&dGI2kSan0Jwc369qc&&#W_Z$PC=`|kaCyz;7-A+DW3BisNIf^e0TPpO^7RAUGphA`iO^` zy=SkybL;n`INsTK-Z{44B&U>QX49su4-I$mJ)aikW4W^Ian14T*_xNv-f_J?^Gc!B z_(*zYun0!Lo?ao;v ziT(2m-yU1eEmCYZ=j9Ela!s4JMW6VL3+crEa}hC5eX|8a2sqMGi_@{wLkpK|7Kte$my_Y~vBI|jyX zoVPosIAq&YS$DoAB{r9Y9LEwX=C`yYEPZRym-ghmDDNv+EPk#RmU!N=Z%ya(x-5@d zI#I&m%APG^M76HH^XzzbDsIWU=-q6QRCzQYv+LYMrPlFRQ<^CmcfOU+zDZc7t&=M{ zHEh{zo5MI>D?IO2`*9Zc>aU%6UQXr7)M{OuyjAi{-l0c@iUkgtnito3@AchoT-l{D zu4RXf6Z5~M;COBDyjNeC zB~{sV&S|^asmgrx*1_WdH>F;C`kDORH=8CcpPsDxgIs4Bo^yG8Myc0x%}+Zo7$ky>fBcrkL;CGRg+t=iG^e`n~rID&8A4XI7-YT>6gLu3>hQ zXzZvGzcS{;<2e_Vcjj@8Nt%Y!7kw{+1!9u&W(f_?KCl z9;w%knH`g4b;Q)aGvU)z<2xtJUJ+vg96GG5&m1_j2pzbxrpOMN8e=_ZmoksN{)SvMhI5ui&Qp$1cbp(cwB0 z<*!;M~1Arl!Yn`a0ry$r*ae^;-psyy{5A1`B~~&3Cg^&MEjHPcCrL$o+rxBE%WyA@V; zgeMX``14=vdm%(m9BAyHuX6Y5p|iEZ4uMZ6y?zpze^vR>^Mh{)=fYalZN6PLr{SsWp8_h(luJ8qH|}5R!_yBS3BYLm3HmmGyU?uG^6Qh@bwdq6m%=c z$BA=n7L|9ta;4(FL!QdXt9p-q+ zczz0OUG%9*@Tutv74JZteV5>QyB!mr+a2Jml;~GR_Rgi@v|Y0x{FjAhgf9oaf{F zPucSGUSBrUey%?tq3M0Ac3_@K_rBCujVl5|&ovcfTPN6_VJv)lQq1;FV@5>2QP*6J zO?!Q(;CP)eQizF{sAGhBqjt1UEM2lr=J_I1((P+Wd{g%AZs>VE(M35f%>HDRiHcLT z>U);m(fhWQ@@4$?P3BMYYsb1xc2Z{s_NFHsnbH_0I~M&-FXm*RhzYVgdNI;Fs7{kS|`B93<%o>$hsC!ATIO4fCnzW&Bb zBcbRD{$<2m$&9!C<1UTeS`=>PyhUp9WB+@Efm^bMU(zkynVW)?Rn<7X)1;Ri6%oOo zue;-UYsWUmzP@3*W6pz3GODf}{ij+w`J)9h>TK*Jv#!^L_odSxKRs`%K&nh*CRdkc ze3@(-&;MF_)|Zux1&rvrmFIE#df<7zE+35wO;pJj^HL=_>+8yso&-sJJQ1lbAogNa zLYtYS_R54@l%?%3q%*E$2}^XWP-lEh;V|D)&E*m!;j^ z`8;-AaYDXU_r=#M)_rq5lfI9cb~)mK_CR!NE&e&c2hXddFk##(g_ZV=`kE_Gzn1xK zI`L!k-DgLvH?*r8h%C6h(~`cgDUqw!(%!dUIrWp-Im*0*aKDa_kebGIdTP<@IB@z> z@VtF|iCk#~N-N3a+g*>8RV~TN^T+w?Q3jTo-`-gilH>Qp+yD8wIpM{J#-B2;b9B{F zj(zRByeNme@1Qbw^_TpKI9^{o@6xbUE<1KOCPpX3ZfX~8oGF*+lKk>4*Ex4z;q4_v zD>VU^mZ?`=L?msE)D|piKU?x~?UC{7AKuv>j5*cZC~b^?Zt=tO9vAkQk(SQsa{B&` zm@bd|+;<`$JEX5XepSMK|HJ#Wo1{cn}oY5sKbQ&cde&pJ2Xp_}A zi=%IA!@&eP!)$B6@*Uo5^!aAmH+9-^cA(;UEl)>$H&`EX*E~cg;$Y*pJ;JpEQCcqU z0WDV$!zrt+#JnK(eSFYb1I^7^90__cYjDWFk1HP$e3jdG_qc# z#yWVp=n1?VZ-?Uz!1HDueH6cJ%k)U6bKL_;6Xj~GO7@m~mTuE56*a9?^YOlP-|3UO z^y|fAPM$Y;EtJ;#{TA)3O_4*CiZSnY?Jnn%T{zxAJa1lF>;@QPRFoZ=%M=O0S+#RCJg|v3V9-_n~+0wo-4|4(`{@=E6H(%sRS5>p;kr zc^r4gtMVJhUGkfxC;VleF^-pp=Y3nQo_Tcdz4%s>ZTbA>4`yBzvpc+BYk#x-i^Yj+ z124&mac(?pxmZ!+l2!f|dUuH7m8#tvuE+$0JmDO3cHvDT{`;L^Jg+LnCtt0DU%?_y zZoV$>TA96<99&OK6ivufJXRL9R`6U)ovuzpawlg-2WgYZy){Ow8KvXJrKOl>Kl9>4ACT(m>O@u&XdRb7dn7GW^9be|&Q2wyH za$C5z-?cQpz_9HfH+->O!d36$JZY~g&JHW_y!yRORkfRQUVrp>@uA;Wd7ZU;YR?Dm z<90q*4#{Uc7~4C=%4hNRj@LU<4^@(Fm87+<2^H)sXduv38a};0RWOeS$4kfa9;#k+ ze#69jE!#u_Dh=}_4Qf~3<~p=>T&aDNcpu^X>bJ3+$G;uXx=ZoY3@YQ6iW~D|*1R)z zKb9m+^qzTO;ToNI94`aU8)@)b>;6)2!${*f4Yh=MT;Dhk?pWHy`(+wsK@>%%Nhe)* zS@7qNVh67)j#1p8oo-hUE! zL-D*7Z52jTTm6To0WL~@iMOm{HISB znC;q7H0Ajw&6gLn)jI}sj^0kw;Jwgna?<6Hc#aWKn*aV8Y`>1a!CQsrZ5JQ2dd+^d zvrQZZO=~He51$IEn0EVhagKUjo`g?n8|n3V$thALT%RSKckliD+-=_G-Cv*B>o!vA zv-W816m6M<`))8C&)fMju&qqb^;UL4=+O_PghgtSd2_8c#V)opu3nKF-`U+8>=60@ zK7|TZUm&%%V{N9nm99zHk6k8{y^<=dxz$y0_Km>v`dk(wcNrcs+FSQ5JM3zi;pMl* zr)Rk=-7cK`)cW(R6OT0(D(=#CduTDg?m>;1gU;#KG@I3(b`eX7T2EePG*~Ui@kZi# zc{*ZxlOvAyUXyFRdLU(5q-3Ymi!l=1LXO>=9xjnyzh_#`9Gh!D&KuNd2ZXB5P0(8L z<#amVCYLe$pNKJ2wZ_lD@nXMkK=edHtF$d)Uyh7(`L}Ybm8bf5_&M|>awReXy+6Nb zeRKcor|Xihea@bacpS+0z%QtB&!_jtv}PDsyjM;O{7hAI!JmUifXtFyr)mO+TF8ytM(UE*& zz_ZSU_~(n&cwXDnnS_V@UH11jB~|%;HzvKX)r`@c$~U!skHYb}n!?H_3Ldx1Cc4dv zDU1=?(8)38&`X=iW{#3n_FT zGs)X4IxVJBq-Ar&lRAr>Qrn8+1Xxixo=-lVFOXUT6)`Pdf4Y&O_DAg9PHJJ)N? z@hnOA2}?Z|c~}r{wOwA^&ODahvPWLWYV)eOTfqWbeMtD{p*TG6q{}-G?wyUtbf9C zHTotUkv7$(Wx`{v&W9?l-%&J&mb@2d-*tH2Nt9&iIj3%}ELe~_v9M1qZds{He~0?# z85#{b?{?R}%H*jL4zGE|$fI3o{~S^3XD7#>@3wNw%jv}pPKIJ7~3nY4k{`HzKA_g$Htqy$p`{OvZ^Exsmwk5YRv z)ApI)gfCa$C9lNsuE+E8**uOnq0i2pS8>yI$B({?kH(AXCXE++_;&IaNr%YO19^8m z>|{=~S8cr)#j!az zYPL0uqg3zf)~+~mevSE8Z`;0JoWAe^?`I$$NqXL~Oyz0vnM|9tyHYYTeeHb|riO8t zm|kA<_L|)OfVaIWOON*yid{=7Ffm-7x!ZQ>o{ZU=1NDZ>1FGL-eZ{}u-0+hX#>Kp6 zqW(2gbk&`w*QU3tzc6@El`Fqi?^9HE`j43I?E;_4Vhi@0?vpW#eI|G-`>uQJFj5x;`H5!=gmLr{rdFbitK08ZB;*5?uxuoC-+F=##dS2d7XWeo5sIu znn;_ln;KEL_nVe7WpmK+Bn#f`>abT?adG$07#&xT$MJ5$^S;jBwOB=Y8t=CowQaA~ zHtGi$D-Fc03)SvAuxZxDwvL@XjY<|qp4<8N(G8~y*Tmf~Y}EKDeLmlwR=jT2!&Sbq zINoGDukh+0^R+jt4;+4B>%_f?`+DTE6KPFb49a$siXOLiEMIy#%j&FgaE7hgSkA+? z-J47^W5ix2@qIQsl5|G9M0YLTA5!qVr)n$P8>pV9q1EBavpK8N=9ex!)nKZ(k>XEI z7RhL49;(p2#aLr}gA4MV9z$^<0^C-SpXqFy=A6+*8wEF4*BvKU3{O{4SRWu4QUT(Wkdg|McvV z-6Y>vk%w@+oAJC)?%v+|&Ekw%=M85~Wf`MG0b_kQHVYkoQf78zb6U-#t*)PzJmyGr z_Y5oNpFHWrHld&o7w>yGUk;t4lr(2%gT@x%{kH(y3c_R%UicXx{69IWEAX2_8~~L= z=Qjela_Ao5SpRoO7sPy!2hpGKUswRy6#M^&V#W^s|1JLo-5=;53;fSp0F4>!|C$M~fP$Mb9zADn%(&Rv@A1&AyeZ0mF-+v4Slw1pf-rez_1OzP23D?-)+(X~)qB3JZ zu)mjwzPm;Dh#=VCq(k4#qI+B*)gUOK?_JS7_`Hiy41xmsRu$dj2H6RM0{YGr-5Upz z4uS&uMil9RbVI*4LD%RzOjIXo4)(WUkZDjJe3M7O{;tawxJG>AL9oBcvXy<0AL3dN zq~|vFy$KMPfuOJ*1YzO(Kf)Xk6n221dx9VqAgF$%JGv(Xf_}G+$|K#;y#jVW38D%h z@EV0`X_`QH4AC(NhuU!k1nGushHQjvf^2~5L~TTELTx}gqdJjJNC#n%i69~%lR(h7 zj-nt_K*T`AK~SHfK7`K!mGffRtCK05<~Y=@eX4RR3V5XfPW z9FQX*xgf|MsQtS@c7q_Bq3=-9H>0SJHiDr3L*Kk6fW(8ug2aKK-#4J&BB0+5pl|$F zfh+}a20_0mM&Dzi-@c;Xsd|EVfp~)ifCPaAgXn1vLJFG z@*p)J=Ri=up9Lua(F8&Lp9pdsBoAaQ2>N}1FNhxq6(k(Q2V_3T0+4wi_8{gUb3m*? z=7QLPsDO|_6hV|gE`w-+B!NVLM1m-TYyde5f_!}uh#p8SNGZq)ki8&TAaoE02>R_& zD2N4!ErLdum`6KElA_xb_7!Xbnq#x?5SP*3QFc73` z2ne!24Fu_F3WD@N_VNNDgSdgXfH;95n<3jEomD}Q&5(VNohE}!0zv+d{8#`4`8f{= z8VB4UV?oA)@PY7x@PnW+fbOAkLhKl&g+V5Q%mhI`fc#wy1o{6|5K(q|3dG{^aE;1O2ayIrzJ+{D9z+oY;bwy%pELtO?M3yVzD0IIeP#rL z>}3d|4PpR-$|GM?2T=pj06`e!-^kBVIV})l5E~H0f%G#2K{_Bj=7&~rZ3$ulg38%} z%mZ-%K|Z?(1o;Z`V^k;dm!%+!L6(3xgSdjAF}MuG17tafCkO?^2gDnM3gQofjS=J{ zs4oIRfM00{?K1riB@@>hc_ zV++bl0zvg7-$eeW0Lb)Q8$psmHiM*qq=KNn z-L(_`fgo{gFy=LK)6{hj)rUn`_vc)%@z+Hdd^Wajtl|Yb^|<%rI0tcqo;)6Mq9PRL zS@tyRkK^#rQdL)l4nboAVe)-)Jq~&HALZom&`{OZgDhkn7$LD+%zwNpo7ME1lY^Z> z@MTcKC^ROcByFwe`rf1`L=H_=Eks7pB0jsmew<|_Ik zVaCJ%E5{jfkOtC5e2Y(pxV}R5XsIF}^!6tQB0JxF9;ZHU^0Eh<9NMZHta`ltg9E5O zWV&DZM)#?vYNaeT9aZR5?_e5@;>{$4b4jd8eWN7E$)TmHtBO1u{bgPWsAq}s@jb*2 z`7G2@xD5gOK29xiww~ekJ{rmatsyrCFfaqes;nH>-y=Vb2XatTK{@pILHQsjM5}Xq zGqYPQbL)ZnD;e~b4n~WeZ=NVr!bHY_m>MNUhxdx3pwhlI;cUu3=$=r zNhiCn&eL&;883shW+_0}$+k{Wr_{VR;f0r3Y#N9z3vysaiq&%HIN>a(Vgfm6&_Y1J z;YSwj3aZL8sm`OuutP;9XeQnNd9|Ji#bf7tC9w=nDXHuuTzm+z36({tm zCM$_K67BUKSI3R(370vAg>sV32jpE$?91UHlsTFc2K#qvE)T=&G1s~))gLZoZImkLO-iah7DgGG1Xsd$z{Q6Zu z)-25d*@XI8EH>~_EkXo16q-LaceUo}#rF2296hj)1|dR2pJh0UK90T@7n$XdqXQMe zWC`C%hoZS@ihMk|Axm=skd%2gqnt%9+hkSjvYYT_W9E61KkR-g8VKn}72u#vb1ZN2zz_sqy(K^Mr;8^ruxgWuQy z>Infhq??0UMYdR7r3kPg?}eOy#XyI{&f(u%3OVP14f&|o%9+Myd;!$o9yjP31Kn_4dvVx?O#f^vvOFY-iyqj=xS4aY-=O({V$$) z4>^bp>hTVyBiA8_il4v7W4Vrlm7|Y5#E0S)iYA2Abp-8a;&s)KqYX|4!(=S?pxp{< zGP~5aEti5En5qz)0OX)P4O_S~S=Y3!p2fzRDWoAs5OPEVA`ZV)$Zlk@X(FwEQxCK> z9586+>ytdW*8Hr~HozcHgnEKlI>U~;sOnyE<7OL{bzu7aEgRIcijCnW+O951HGW8^%V1VI?2sDHXl z%J<91oa+V+)Cb3@B;+7JDCMzom>pVL#?lRH(j+LbbGE3trpOf=8*l=f2K0ie`e=HN z-Eq)!u$EBZ3FPjfHjPC+T+kl22BYp%XsH(HhWdw8X0UI+cuO6yLBAn?`@P-5$aJ*r zAP7Ev&t@<#ma~i5TU$1NIbzt)vp{g zz}Dc2Ff0F?t(92y!!8%P4b+P*%59Al&^w763v!Tydal;A>H5W_%pzbz(=wW`-?#YANNDU4h~q>yU=6u{89$nkgZ7O7T({ZFHeeV`dT<0GmA2(ZRm5{0#Ktlx z0nSdCp$rP++0=^n@c|rf2X#Z;`Y(1v)`9up_jdDQThxB{MZM>|$tQocG>Dy}Z%N7a z8YAk4a#+h8Aslj0pN{RAe%+pT{3({LS)NFtkbJ3h22*fzL}Idgk3Z6ywO~MderHiC z&7VT2G8sY{uSBP`H24i_fSfTL1~wYot4v-~$^+9>M`D8n03h8SCs%Lb8_!Kb7}lix zuf5HhUT@?|RJijB)Y0$5cMgKYTVLkWz`QSI62)*!|k)@$Gs{R3gLmQNT zu_$Ymft-K0C>p2#W>MC3{V!f+E<9+-f7$@nIhHHlnK(F3r*XD=IQI6UbsMedpur@O z!99h`rCzQ*PkI#4yaSG)2TwPUgZgx-V}reWU+v(Ii`5Mgkb~x(+LY)CqMY}_Q7;Vk zoL2;s!T{}aYjmpYOJ4?|J?!9aJ(Lzg4S^Xp)un59xB@A2u(x4o6J||fv*nwV`ZyU$ zBR1Fyfm{9F<5K~HeCG?lOz|YMtT&t-YuR_mj0l=Huud*nctYmbLpf*dQLq^;6^42ipy#@{qkOKn? z);Vn|gS3hf2xmWU4nMNk{;-wB#_Aw1I@uc;p6w!Ixrex_rw~G9gu^xCOT_6)sM})0y*p*mmxe_A~q#8 zn}N@6B7H0jtAE}@4h;O*BO7`sa%2VAd1JdL4mcV>IoYRv@b*XEw}Tus=)gJ?AV&~# zrpk=j@0g_xJ0UD*1{`CcnOuKvU9V=QIP^BM0kX~tMlcPX3fooY-qU{?_5^a+`$Sd1 zp#B+XoXctHbOWts;2@};zq1hs+2G;q_fLBNx*KG%kzq@NtYcZ}?OiYbjt=!8yFoqv zWCqDMknFdu*}s(E`4Ozam<@j0r|SP4KiC{XghzJNo)vCtt{3hSVNZ?*2~_jD)eNj7 z2pD9yCC_@bPgtq$_%*-%zMg-M5|}Ai{qy^|>Yu9&U|3%Dn^gwA{`1Px6^1)aHG?;5+P1#XsA_@+z?C zH^86~%)9qlQ#|)`Ef$6~g8y~Yv)15$&4J19-?YX?mX6GzZu!2o)>;!T!>C6C3$1{^ zA3wi8_4xhy!SA1{tv~}oXlah@y7&Up{7BZwVr@5;Kn|Km3+H-T`Ru0ufE=V8EN3?$ z2hCOYCm7I#C)wGutixKF0;xe%CWTHIPq}PKbB{=Y9OUuv%=G&wmVb^P@G91Poi<}o zw~v!KHch2Yy9B+Bo~FP&zkg;Lbv?lLpX~5EKsRBqLCn5Qht=8wOV~aNZ2#P;vNx(j z>^i|}Oz3n1ubQJey_!FoWjB_sEo2969o6kupCsG`=SXO-(u7TH5hpPe2*c`V1%*bzrIUkP=dlJbXCi6 z=yn=8a1oPErTLjiYy3LS)c<*$nZ{}hT!J)s)Tzq! zi~LoB1kZz%A-J$f1(>i)66>T4(F}q6TMd6z1l5Vt#s?ap=0&B!-xnEz5pM>d!zW2- zcGf}~{pBtkW5J2;Uv7m`y%;1q#T&M64ECui$sei@rbm#-Aykqtyd3r-dk0Wp+l5Xq z;b4yf^LJzfDKOa2k3vWKkwWOf;StoJpim~+E07XI^`-~2rv8v%Iup*v;H;JohoT{* zpkN=WFO>pMhx9NCi3(KVgO_N9qk6Nh=_K~!76aZ$Q<$pM;7~G&wKmd8Lz;tit_OBt z#U$9m!SOb-0Qds9A88fUhv`3HwdWqH#sb4Rv)GXIF*12mm;x_ zJcmJ}1`jrk-TJ`<2{t8zU5Hve*x(`D;#VPH`IR8Cw)4YifSn^F<=IEd&~DWELw7yv zWEw!MnAKL6%dMi52b(a2xzCgE|calmTY;B6W?XsB8GSD~Lo2mx~}%=yEZ6ukxj6pC0~ zr;o}ryum}5$jn1e%J|6&NbpIh942LhVQT+5?E(7dH5e1QG3Y^|`B7;Um=%BJk$uP^ zu+sjzF*x#v=(N8V{YzEsc>@i5mZi*omWCb)3JIpc5<-GWo(XjhQO8g)sP7+C;O(%7 z8OAuQeIcM(G0VgBhCu`|pm-32H5s!O#35Av*-#SOq<^ss`yMdq3_BsOLba}9z<5MQ z2}nh+P+wmPJ(Nie3}yO~^hsgxQI!vwIg}6o>}ufpc@0w%>~;|&dp|UIu>CUue=vG* zpG1SX_!nwem-u_pztqWg33S9goDI=wI$%)*mO`6PP&L?V1+1wgGJ^phk`2)Te<=qn ze@R1k55JzGLv{e7h&9%SbErY=IdLSRAquyU75>rGAZQ289XFH_Tu(JcE6i z!Bihu09lVQLl_ue42bc`k@Y(J#S&n#(?6C*!`b1l$|Ce%v}g6i&%XZ6(=ztT0?^nc ztM1|UP3W}}U{LhSdPCR<=c)k1rC1gkZXWyT@d%4~KMOhBoX>u~WT^@p|6sII3_pjl zUJn9>6~mxGi{a2d`Pa<~>!5iU#IMZ?dfhTKJDQ3?9oCG@dbv4Fd2|GYOa&3N7d9rt zlxGcim{0(NT>=ihH5pp3pM8NU``ItZzQeVMH8~ER3IGYx+12lHY8cV}j z9Y6L^J;V7X>oqG>!irh@hT-f>4~OFPaMmttxK{k-um{2Lhd-=`YL2=1=foRIF|}R&!NHpuX%IZZ5xKc@Dr)SS`66hIH}VZa}pzV)?rV-kCbFd zc0l%WH?gFM6iHL3pR{$h-1HRPC5%^S_5FNTGaN|ix*q%Ypwe-3J$4J_$&j;jf^(^0 z+Jqn&wC!*rSu;L@5o&Q9C+F`$or^e5TBHWKe1{Pj-jJenf=8*Kfy8QMc;=7n49ZwgQ+VE|A!*I1j z=W+ODnz88!yOvTl(4%UMQoanc9JI_gv*`)XO$$m2R%9n$v6A9$=~%px#^ zZO9l5g)9~@e!|*;k;kA1Uqj*22@a(K?v_rg%Pj(pE~mC5+}ef$JFXsRh_&{C&sr{E zphcN+f1%7}jPld zIX@;{`hltetPSDYjxcH)m^J=&B4@8aor@~F>p^uKPIa&1a=Lu!sy+?}E@HpKFxhZ* z>;s=zP$zcH7eBsu8YYAjXASu_rr5yn3wn5ho&m^tL@Ms&5 zBfXTQm`1GSW?*d)yT0( { + window.addEventListener('DOMContentLoaded', () => { + const html = document.querySelector("html") as HTMLHtmlElement + html.innerHTML = html?.innerHTML.replace("/style.css", `file:///${dir}/style.css`).replaceAll("/images/", `file:///${dir}/images/`) + }); + }, dir); + + const files = (await readdir("./sets")).filter((f) => f !== "template.html") + + for(const file of files) { + page.goto(`file:///${dir}/sets/${file}`) + await page.waitForLoadState() + // console.info("waitForLoadState") + await page.waitForSelector("page") + // console.log("waitForSelector") + await page.waitForLoadState("domcontentloaded") + await page.waitForLoadState("networkidle") + + const title = (await page.title()).replaceAll(":", " ") + + await page.pdf({ + path: `./storage/${title}.pdf`, + printBackground: false, + scale: 1, + width: "21cm", + height: "29.7cm" + }) + console.info(`Generated "${title}.pdf" PDF`) + } + await page.close() + + process.exit(0) +} + +void generate() diff --git a/package.json b/package.json index a8fe71d..95c121a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,8 @@ { "scripts": { + "generate": "bun ./generate-pdf.ts", "dev:mkm": "browser-sync start --server --no-inject-changes --files './' --startPath '/sets/mkm.html'", - "dev:lotr": "browser-sync start --server --no-inject-changes --files './' --startPath '/sets/lotr.html'", + "dev:ltr": "browser-sync start --server --no-inject-changes --files './' --startPath '/sets/ltr.html'", "dev:vow": "browser-sync start --server --no-inject-changes --files './' --startPath '/sets/vow.html'", "dev:otj": "browser-sync start --server --no-inject-changes --files './' --startPath '/sets/otj.html'", "dev:mh3": "browser-sync start --server --no-inject-changes --files './' --startPath '/sets/mh3.html'", @@ -11,6 +12,10 @@ "dev:dsk": "browser-sync start --server --no-inject-changes --files './' --startPath '/sets/dsk.html'" }, "devDependencies": { + "@types/bun": "^1.1.10", "browser-sync": "^3.0.2" + }, + "dependencies": { + "playwright": "^1.47.2" } } diff --git a/sets/dsk.html b/sets/dsk.html index 0608403..98e2879 100644 --- a/sets/dsk.html +++ b/sets/dsk.html @@ -1,114 +1,135 @@ + + - - - - - - - - - Archetypes - - - -
Duskmourn: House of Horrors
-

Archetypes

-
-
-

Eerie Midrange

- Gremlin Tamer - Search the House! Play lots of enchantments and unlock Rooms to power up your creatures and get around all the horrifying blockers your opponent might throw your way. -
- -
-

Eerie Control

- Fear of Infinity - Live out your worst nightmares and share them with your opponent, unlocking Rooms and playing enchantments to kill off their creatures and seize control of the game. -
- -
-

Sacrifice

- Sawblade Skinripper - Want to slash through opposing creatures and your opponent with ease? Pay the price for strength by sacrificing your own creatures and old Rooms. -
- -
-

Delirium Midrange

- Wildfire Wickerfolk - Fill your deck with artifact and enchantment creatures (along with other card types), and attack early and often. Once you get four different card types into your graveyard, your cards power up. Then go for the jugular! -
- -
-

Survival

- Shrewd Storyteller - Utilize all of Duskmourn's tricks to power up your creatures and help them smash their way to safety. Find other ways to tap them and hide until the danger's past. -
-
-
-
-

Reanimator

- Shroudstomper - All hail Valgavoth! Slow your opponent down while you get enormous monsters into your graveyard and then perform the rituals to return them to life. -
- -
-

Rooms

- Intruding Soulrager - The House never ends! Trap your opponent going in circles as you unlock Rooms to build up control of more and more territory, then unleash the ghosts held within for a frightening finish. -
- -
-

Graveyard

- Broodspinner - Prioritize getting a wide variety of card types, then gum up the board as you fill your graveyard with them. Once you've got at least four, grind your opponent to dust by recycling what you've thrown away. -
- -
-

Power Aggro

- Arabella, Abandoned Doll - Fill your deck with Toys, Clowns, and other creatures that have 2 or less power and start attacking! Smash your opponents swiftly by clearing out their blockers and buffing your little creatures. -
- -
-

Manifest Dread

- Oblivious Bookworm - Something's lurking in the shadows. Manifest face-down creatures and get them into combat, then surprise your opponent with their true forms to outsize the competition. -
-
+ + + + + + + Duskmourn: House of Horrors [Draft] + -

Mechanics

+ + +
Duskmourn: House of Horrors
+ +

Archetypes

+
+
+

Eerie Midrange

+ Gremlin Tamer + Search the House! Play lots of enchantments and unlock Rooms to power up your creatures and get + around all the horrifying blockers your opponent might throw your way. +
+ +
+

Eerie Control

+ Fear of Infinity + Live out your worst nightmares and share them with your opponent, unlocking Rooms and playing + enchantments to kill off their creatures and seize control of the game. +
+ +
+

Sacrifice

+ Sawblade Skinripper + Want to slash through opposing creatures and your opponent with ease? Pay the price for strength + by sacrificing your own creatures and old Rooms. +
+ +
+

Delirium Midrange

+ Wildfire Wickerfolk + Fill your deck with artifact and enchantment creatures (along with other card types), and attack + early and often. Once you get four different card types into your graveyard, your cards power up. + Then go for the jugular! +
+ +
+

Survival

+ Shrewd Storyteller + Utilize all of Duskmourn's tricks to power up your creatures and help them smash their way to + safety. Find other ways to tap them and hide until the danger's past. +
+
+
+
+

Reanimator

+ Shroudstomper + All hail Valgavoth! Slow your opponent down while you get enormous monsters into your graveyard + and then perform the rituals to return them to life. +
+ +
+

Rooms

+ Intruding Soulrager + The House never ends! Trap your opponent going in circles as you unlock Rooms to build up control + of more and more territory, then unleash the ghosts held within for a frightening finish. +
+ +
+

Graveyard

+ Broodspinner + Prioritize getting a wide variety of card types, then gum up the board as you fill your graveyard + with them. Once you've got at least four, grind your opponent to dust by recycling what you've + thrown away. +
+ +
+

Power Aggro

+ Arabella, Abandoned Doll + Fill your deck with Toys, Clowns, and other creatures that have 2 or less power and start + attacking! Smash your opponents swiftly by clearing out their blockers and buffing your little + creatures. +
+ +
+

Manifest Dread

+ Oblivious Bookworm + Something's lurking in the shadows. Manifest face-down creatures and get them into combat, then + surprise your opponent with their true forms to outsize the competition. +
+
+ +

Mechanics

Rooms

- Enchantment - Room (You may cast either half. That door unlocks on the battlefield. As a sorcery, you may pay the mana cost of a locked door to unlock it.) + Enchantment - Room (You may cast either half. That door unlocks on the battlefield. As a sorcery, + you may pay the mana cost of a locked door to unlock it.)

Umbra Armor

- Former: "Totem Armor". Umbra armor appears on Aura cards. If a - creature enchanted by an Aura with umbra armor would be destroyed, - instead that Aura is destroyed and all damage dealt to the creature + Former: "Totem Armor". Umbra armor appears on Aura cards. If a creature enchanted by an Aura with + umbra armor would be destroyed, instead that Aura is destroyed and all damage dealt to the creature is removed.

Impending

- Impending [X] — (If you cast this spell for its impending cost, it enters with [X] time counters and isn't a creature until the last is removed. At the beginning of your end step, remove a time counter from it.) + Impending [X] — (If you cast this spell for its impending cost, it enters with [X] time counters + and isn't a creature until the last is removed. At the beginning of your end step, remove a time + counter from it.)

Manifest Dread

- (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) + (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 + creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a + creature card.)

Survival

- Survival — At the beginning of your second main phase, if [CARNDAME] is tapped, you gain 2 life. + Survival — At the beginning of your second main phase, if [CARNDAME] is tapped, you gain 2 + life.
-
+

Eerie

- Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, put a +1/+1 counter on target creature. + Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, put a + +1/+1 counter on target creature.
- - - - \ No newline at end of file + + + + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c6e65e0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags + "noUnusedLocals": true, + "noUnusedParameters": true, + "noPropertyAccessFromIndexSignature": true, + }, +}