From 8fcbb3ebba73b46ed825ff1098efdc5a620e1151 Mon Sep 17 00:00:00 2001 From: Arnaud Gissinger Date: Wed, 15 Nov 2023 14:36:51 +0100 Subject: [PATCH] feat: :rocket: First version --- README.md | 67 ++++++++++++++++++++++++++++-- bin/index.mjs | 3 ++ bun.lockb | Bin 242105 -> 245613 bytes package.json | 99 ++++++++++++++++++++++++--------------------- src/args.ts | 30 ++++++++++++++ src/index.ts | 66 +++++++++++++++++++++++++++++- src/utils.ts | 21 ++++++++++ test/index.test.ts | 2 + tsconfig.json | 3 +- 9 files changed, 241 insertions(+), 50 deletions(-) create mode 100755 bin/index.mjs create mode 100644 src/args.ts create mode 100644 src/utils.ts diff --git a/README.md b/README.md index 287e74f..572dd16 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,69 @@ -# starter-ts +# sb-datasource-to-i18n-json -> Note: Replace `starter-ts`, `_description_`, `"keywords": []` and `mathix420` globally to use this template. +> Export i18n JSON from Storyblok dimensioned datasources. -Inpired from https://github.com/ryansonshine/typescript-npm-package-template and https://github.com/antfu/starter-ts +Useful for utilizing existing i18n integrations on a frontend framework instead of fetching from the Storyblok API. + +Designed for a [nuxt-i18n](https://i18n.nuxtjs.org/) use case, but it's framework-agnostic. + +As I have set up Vercel deployment webhooks on my Storyblok instance, every time the datasource is updated and saved, a new deployment will be performed, reflecting the changes. + + +## Usage guide + +### Install + +```bash +# npm +npm i -D sb-datasource-to-i18n-json +# bun +bun i -D sb-datasource-to-i18n-json +# pnpm +pnpm i -D sb-datasource-to-i18n-json +# yarn +yarn add -D sb-datasource-to-i18n-json +``` + +### Run + +```bash +npx sb-i18n --help +# OR +bunx sb-i18n --help +``` + +### Integrate + +In your `package.json`: +```json +{ + "scripts": { + // To trigger on every npm i (usefull for CI jobs) + "prepare": "sb-i18n -r eu -t TO_REPLACE -d DATASOURCE_NAME -l fr", + // OR + "sync-i18n": "sb-i18n -r eu -t TO_REPLACE -d DATASOURCE_NAME -l fr", + } +} +``` + +Then run +```bash +npm i +# OR +npm run sync-i18n +``` + +## Requirements + +For this script to work, you need to setup a datasource following these rules: + +- Do not create a dimension for the default language. +- Create a dimension for each language you want a translation: + - For the name of the dimension put everything you want (ex: `German`). + - For the value of the dimension, you need to respect the value your put in your i18n config (ex: `de`). +- Remember the Slug/ID when creating a datasource (or see it in settings) as it correspond to the `-d, --datasource ` parameter. + +## Dev guide To install dependencies: diff --git a/bin/index.mjs b/bin/index.mjs new file mode 100755 index 0000000..d946e0d --- /dev/null +++ b/bin/index.mjs @@ -0,0 +1,3 @@ +#! /usr/bin/env node +"use strict"; +import "../dist/index.js"; diff --git a/bun.lockb b/bun.lockb index 51a561d4d6fa49e62a88b1b02262145565cae178..449918b85143b2d72ce2f2d6fb9a9fc455136fa2 100755 GIT binary patch delta 52322 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 delta 50654 zcmeFad4P^(`~QF6H#c)*Y>|<@t)&6-sf>{$9bIRb>7#^HS^ug zlFxima&csXFS-_*T4eI5I-^UTF8o`y;#T<=3b&|sF8N<&x7G|#_$2+;273y5bfqpC zR4upjD4(r3UrKpAc{fOwMovx49GgY@ItC@AN5xK%)pxFbhFXfjS1s(w!{`;zpGFo( zp2e;V@)%O}CTERKOiN5k9-Wq&lS(~5`8}RME*a59oB}hDp(=n>#aXFiCnTmNdnSz^ z8!>v~gfTOVdORiJFCYWRNvUI|szaZk%ie@|JYmS>%*=_I5y?~9Vx*3oBwun&>V%|- zoJpP=F5iVh)+^rHxyj^~!(enuV%m5r{2g5lr6guWj7duz`*$5&#K=@}R&x5i$(bI{ zi}YR{o0^!GmYS9AneBRNifi{Ol`20oIWZ}MQMnz@%{zgAs*rIQDVIIr%FmbwO~n96 z6>NsAi5x-x?a0Kk9#3WDH^}nHdv0^=??hsf_c6Stu0PTp(8S3TJf8iGR-SG}$4Yr} zJ$b>Nx2KdkasX=;m=uwjoRl*CSqVKked4&(wA4{ID?0h#Bju4i z*M1j9YA`r;qZ2ceQi&S6ojjEmld~perlu!)Cg3L3pG`S=Bsdk_>0n9qG-cw%@ex_s zNsWBg#X?ncYgKbR_ytn+pK|3JNKN_ENQF#lR$^vm;#5!Sgp}mW)a1rsKv+Zi9mJ98Y}*5Us%s63v-TZ*acUWz!lsq^?`=6NE7R_;{5B~OjqOy;Z|>;WFQ6997p@x}kv4JcG;|I7 zY$u05iBzkT5=T$WPWE`X&tzp!%uEiWJuQvwoG}sOvY3NUAr!J-bapZ_le06Y(hxTo zZb(VVi@G}9z3$r0L@$YbmMfDdV3j&y?CS20-DRZweHT)8-TZW zRYGdy_AMD{-`ceXgZK8}JwJGFFVoklD0pYgq(XHdIAw=gJ0tGS$W-yoevT)zCXODT zMGqh9??#?R#dVT=P5gJR-N(pWRd~6JQ$dLV?i~(YkvJKtk@P{z&WqF?@m~X-2>X#K z)6@-eBdd`c6N?8qu8u=j{vB@qY3wyMWrjGOE7HbeH7r&o_ZGTh=NF_rcA0@`WjulsqQ#?BGpbYq^dj7#%bp$ zQvG-isqyc2`O&EnsT0Ob^lWzX*D-FDTTka@w-8yDIm(+%LLE;+%29VB70X?b>cAKV zuK|rtPm0J&NlkABFTEZ&8T z6Oca5K24;m8c$1j4X_DP9hf|Na%z$_r^Ic!bztP%#LUqtQ?cAlR~4H*Vw|D2N7}B) z;!v8MnfT-+rw8M*IMk-5B`;(z;2SSZ_R@Jf~wE1x0d(_=_={W+wDrfp&rJ^diZvCm3N%+kF-c+2M8&35SVyi2}1 zo}QdJHn}N*KG_*4uCsTVQ|QICPn9L1=opijm7PIFnaMd>I-C!k;xt@|#^m#{NbSr% z*M1)jXp*@%IW;m64t{xusYF3C^FC()laT88`_mlHj=$dtilOkgYoD4pVYFP~(d|{Y z#IWg3PkUgXj+LL`G+Y>|idwmRJ)}JIB^7HKT%utu@3)avkm*cG4df)Y{_ND`%#@t0 z@l@~m8Yn80v(i#?C*bzuvz!V#&2}10OTKr4I@AhX6<2U&4P-_1q~zpD5vf_8mnbKX z{P#}%&>W}S)8xx@OOSPtvyqCeX-G{C^N>3#F)hmzyw?ZkDEMJVA956&!4Ex?xFe2E z%%=4;4jtK^6Z4$>aa1Tzjh^o`%&9pukp&dIrG!1`4nyFs$AC838Tm3k8Eai6wQyfoZ){J`sw0_XTNYjKRI~u85#ER79+G!)owL~Dv8#uEYlGv#_cl89 z>_=)b?m*_M;scwU4vb69PNj@zH5p~#^N^L0Up(e4lIYD&1t-xpB|XWf(|L*G?1=UB zc-)z~U`(ZuuaW*j2jq#gi4(>q^Ev)obPe?624+A(Q5KD80*RIC$XXQ*mZea<=Dnw?qH^>358KM|xqmGb3lVI^|zO%Axkg zPt8l8a0U>z$C2qs4d5+gF;726KtfX*Jn-MO*YWr_NR2R&e92IxX7C^l$UcdW>DoT+ zb1!#+0V&1SSNZ+h`<_fG_pUGGoiAoK>3RFzXP%6$u-^ORXJI2tgsiKR*Qnu~$}5Nl84n7}o(9%w%6a(GOjgWu!nVrzT4#)hE8q7<^TUPNnZ z7rQ*)&T55H)UKml5vRt&)}972zK4ofQv>kG8)7L7NK>b zH1>^S{Fl*Msb{{1Ay$6l_`t9br{hlcZnVKx#PhAa0c%{7cwdizm5-Pgur4-<54;xe zcv?`EQ*j7^rJ?!kiu+2lhrEcCMq=}U*U(hPtL_GFplMuaxT7%>=F}%`D%zcP-sMIy zzSoOe;mzU$0p?b{_gfhoVhf|h+HK4srM3%Mdz!@fUM^vUH)obYt#Qrc1MQi9<=G?h zJsfIXgnS)RJ}hE4T!;`;!?sDFC0aW)znwP~tu0z{>+*qEZ%He>1-)P`Xh;FuA{$K; zA7an-4``$8PW5Fc=mGDs_AH9^mbS*l#QT0MZRN+r2S$`}ns>as0&T3dGbS!@i_~2d zp<6kz-m+GHY`p(wS&yfm^)!4<**}6* z2YY1eNomA|Elth&+pTe};{(;$^3`Y|E2>FMU^tpgXl80`2#PanYV!)(zvDNO?M?l$ zXTtYXn02vDy#E4ZZ@Z}$?1Cyvu(yl}Ohc37or&6urZ$}TD|3fatuyE`Xd}pTBI^}2 zmBVs>Y+;nvRz#DyKrDNBD`>hL6XVOQWQ}VVA9xN@wR)|LW--2Nm8|>*@qreVgB56{ zPC-+=IP3N!SHl~Ot_(L2757*fxSXpu32c4(S!$HUoZ z{r=QmMRP|&3&m8;}eIi%#E!d8Zf4MB0HU!m~@ntZ@+f+w5Mm@_#V!6Y>K!E0Ua6dQu#EFHQ0 zDq0t(K@9sx6m-}!G$#@-PmB#gQ6M^dYpqBg1EZC&q8^P6X&iK=hMtJl&fWnwkaC== zE}cYEOGF*Zt5Fjt3Y=k2L({OGt?g;F5q~xn9_2(UmMp{(X#7{h?PEho{W^%HIBBz2gUnRqpfj+;sYCqf+V{#xxNh3^=B9T zL(#bJHHZr=C8ag!?0K)EIek+ZPmIUYo;+?`Ozb!`d6D(=)}TvuI4PO@6m?Z<>Z-exKi$S4rh62 z&O$#(swX_tLZlVJd5R`(-$YCYG!4$#$fu#Xdmnq|E;QB0vgZc-m8-FYdc_2)b_lkm zmItD#$Icz=5ww5L-chtpCKS@ibo`9DHyW_>p*E>N;tu)ZkHr(L?~9_yRcOvS@p^%)qBCSN&`yur;Ql3B^0 zqA?5Z?WZ2gQiJ0_#K4o$G~JFHR-&mZ^p;R4)!$i(PB(|3$$hMV7BK;XroP}>EKj2~ za>}s+3f&bPf?V4cjoH%elfKMHQ(v49HpkI)SaSBZ8UvhQvo(Jj8s|ffa0f~KyH{7x zoXJt`O$R!sY5PR#UxzkS3n6fwl+&u#WXC}sPcPajZM*m}G-B7?H7}vzSmG+<{@9Sg zPBG`yKL?G;*M>k-$I&!o=W|`kugoO|Unq>`Kpn#B0)-%U5{U>`$@n}ec*4(&jb zpII$*;R>1>Eox<~j|~~_jKgvIYBWu&a}T>U+{&L4AGmWw(8nsh5DjfRF^ihMj2O)YZb=oTA-qSe4TwpmQTJ2JSC<;Tuwnn2D6oN;H5v@TBLb_uB- zI){=UT+MNAqeN$9_IbcJD$%-lU%Y<}WH)=@S4nBAof}5mQH~SstuinbO?l2(Uq(~Q z&g^XFhx6((d^y%TT=F2G7vi^=u#^2FGTBYrANjE&XRJ1QI2mk))@<4q}D7nHSFwW z`_N+TE=DzpEi6O(^J9F9l|M7yzb*xL+TJ-yO4H(;#wu|XQ~i!V#-nLs?Sc6ZqxH1+ z=FoA@t<;|Iz*sberLzfbKx>0$pI!r>plRHW@9!8NT=;vkV?$iUnZsw%n%IWKP~Z|; z4>Y>L1{?@nQ9#?Dg#!L`r*7wF-yTh)#}`yL6;0JS)Ah2O=S0Bo zXpy$1?i39s@ZB>sKKih2O+nMh(1ynZ_M)jhXUSYZQw!9>?YR0xXO%cwKQzUWGZTyd zoky^|geH$TpB-+ZY0jKIqur!ndkU**Xxb$>ywS54&@^=Ct;D||tG-~wcCyH4GwTjV(Ir+@5Qd1%q(m9*E+S7>qo=eGv2A@>IN z8U?{nG=+ zr71km(RtICKE=vk93NN@A!BFy-bdp+r0AOx6R0=U89dW|PizQ^MoZ*3jPXB**4EPJ z^503_=~Tc6mxO6@vu-o9NpbIEe$}V%(ORN8t6|xFP8nz2oJVs)UWeSq_dES9Vc$My zqV=TQZT2nl7+ONG7JsejEF7KJ{ryQb*Ez&LmsGs{G4BW|&b^8+hEjWm(|gCGU_eqY)6x&bBDT!CKuQtj!vb57KI(bN^k*B9J8XNlIG7qrwmPePN!9LqImD(4)yK6Wj&JYoWs<~z=DA|@S8 z{dab}ZD?8_+#q=rfFi$fKPQ;#Kj;*51~Umw&9SNB;jL)#wx+Ipg{E@s1UhsXR{nZC2BGMuZ%oxkXzD3bMc>Li>}afvW-B zJ`lDbxU{u?a~4?nkXs=&1AKPoz)YFF19Xi zjt`7q!Vg8+1@;Vx^)9i4_cEONOeJ_EYH5MvnlE>$6}}}ta1^p1CUl*L3DK67za`#( zuchrbVo;oaE2&s3f=^@@NohWbXr`j>BhFN?jWhmvX!4?cLkt{2)AonP%DsiA&DJjG z@3qX1PCnhtCDjd{_&5+7f}*K&9N2Vu(1GJf$$`${a}AoJfeGf8^C4OXyA01c{FRM; z`{&* ztb@>6*m>F|7oaIXoryVu=B!JtQva&p$kF_5(Ku=*wGJUMkRp!jK68!Ga9!=y&Yt5O z>ZYLGkEOlM`L3+C@^{Av8m|eitEeq80pHr-19)iz(KHBFHQE}q5r1k$9(DT0QhFfP z`>1uXSG<2AT(mYq|J$UR+K%w7bKL5TC>~9nb!vR%KeXue1zPj1T5sj=jrW~eZ(ZCQ zAE>k;c)w6j#-pWB3wsi)rPM~})Ws)U9vpm%7Ec}vfYWuAP0lkZdw=oeZnDNb74Lgx zla-Gs{g`#}DZW4Qn6vpi#q-emQ{2%mqjf@aeA{lbQ?i_`s|!!QDmkegI8tgNBC3_^+T1 zwLLp&Yw&21!LEG{t(9#>RQW4yqXsLzL!7^_ozh3exug_Z+z(gA1TLb6dQulh%Dxa(mT<**oM0M{EVj6&PO#qO4r*Nba@nKj%2hJ*3Oo3fz_m(GSuKZ zx6`_KDBfRj7u~lXM)cohje9;mum(bFi%pLebHdKn;w-T{xURGX_uOrbdm%nB7gFwV zHl4T7w7i{JD*1%t7&dsmHHp%LEN99@0pRNM$pgCUB+OD<7(VUyleQ1Ar$^Sl@ z{aqM;*}YoHoLvGFNvSTH;o<5AGzAzd3@=?p(_Y|oDEdi9b3!TyO|3e4Pok;od?Qxn z(Bx0s2fhYRSr=b!l^g1@zbmZo(d#F9Jw-tipsS!Pgx(Bz0hQR-|BY1n7$8Zo+4aQf zXFF6O!C_yLGH45YpgkxIIs;t=rSiMltRqzqKC-WZQhawH`vg1Jk>Y!L8ah4cI~0bP>PS?#uDJG12=q^^QewG6dcM`~CjfaEBbFDTXBB%pF* z-F#%OofM&h)xcUH^wna(FvK6+P(c1*Q0hfhtryTV^q`LpK%S*~`zpG37!E>&T^mz(fJC8cc z-%B?q}O zda#@ES5mGV;pR)K;*lz7oqwZR85GYbX~@y~V)@^!m#a~YmG)n~Jl1uoa`j)x+a<6-PGRozWRC0x@7nCL7A9M5dL&Y+A+?899 z>fkn!|0PA`^F?vB+qK(+6u;MN4SlPa*JBNTt3s~4_bjYN_`GZIf~>eC#lPh0edl#vzfOKxu$6bSyt~}++({6!+QWbs(udI(;yN_KvNxAwQ zQXB0BSN|5N4t($GKOy<=`Ps|LQsRnBTt%wqzafhu3sXw@ewF?ksr({tzNC^Nd=Vc& zh9Jv`bfr3|cf@p+&vgx|AXT8MoAEzMnN;VCI$FmqSJy4~S5jH^-TZ=5?d3LbGyX~{ ztD&1OsRo-MMK$G%Drkn(2;)S$QX_1OUIRJO<^M+J{)d4ICbE{yvlT-u!T{}r7 z2fDhX@&~!Pq#7FH@< znXZ+j{4vGVB^5FEBh{_xE-xv4hN~BpvY+MhlG>Uca`ghTson4bH$zetE_8KC>5E*s z7#XnEzE_XAV5f4eBxSY6)g`5`b>*WjFR5WYhSYE$cX>&z#GOc$+vW0-vVY3e3&>o% z0=;_}iowfBt)Mqu!-7&P=v{aTsOPODfrxFXG!H z)xl08wHGO&x$TZr13g@s;23x$#rJgezmu5QF{C)E3>pB%O2MZ~sJ5;SGz0ct)Lbmr z|BX}yF+j4wVJV@D!(nTM~>7OIs;v{)cR9G23>(JNsYLh6t03&e0L!G1fWaO z_K+)kiR6+L-&+coq&j3jWkU7?R`VmJ^?~M}hfV)HY$6J{{-=jein{ec0kgrC89yTd1{(0E+&%-7?eA2z?LA9bo%FEll{=?pNCBfiGmNG{(0DhLpuEbf7oQTyp(NK z`60o&b}7`#`60nu$U6MPAZzQlp;nzA6TJN7+K+>*!QX{ir_hR8H7*abLcR~R=3GwT z7djkAJAfAbQ-Zg+HS?!IR>}{d)_Js0E9&P#R@jfB*0P@yyrryjXh+dHUrF$mv6fsJ zWKFpoYF$OU&1!#jkX8SuP;2wm1b%ig>; zEA~pLwGXY5<-In@x`38^Ex}vG+Jm;@YN%EIdV;r_m3V!S)$Ny1>j+v6tIThMtZQgF zza@BUS%=ZK{>u1%Pw>{UGJa=#*BBpKJ*&najPE+*`y;{Iz&eh004@4Pg14bH^9JMl zjq#yHSW!0_-|vj?W`eh|bq?()TIX8{-Y9FyEyni;<3nq6AVHh9tJ-3&E;A9_pE*M}Z^E7a_h9%sCT&@Z4T7ea4i_Mk6Y;SDwA3!}F+ ziG{s`OgAsY5fSZ889&4|5jlQuLa&a_UTS|WT>a6=!<|0=aQ&Lh16%uVZ8Q7k_~)-C zpT76ooVVWV`^M_b>Nn;cyz=XsO+Pj-mi^VGc?sV~H=6vBm9ukr?-MU|ezNs_UzxQ& zZ}35Y>vLkYgj3qbfoA%>W~p%AgfAohtEW(B?< zWG+Y#Er~wd3@M4hisBH5MBHNnr69VMfJiR|k!YR~aZN;((h#FfYH5hAp%BMJB%6w5 zAO@F&m|g~Ata)8TNGXVjvJk0eYFUT_B0d%|-ZZ!kBBeCMg4-a{%?BdF%0RR!2Qksi zF9&f{#CIYxOv~~RQ_4cDEf0}pz7bLXHi%xgL*$s1w?mu}aYMvp)4c-3ymAmbD?m&& z*G0sZhZr6Pai7^125~_|Xhn$WW=KVd6}Lki5|L{HcR+Nj0FizN#7y&yh-)IMRDzgo zQY%4h4TCr)Vvea;8Delni0PFf=9eMJ-je2*>fRn+%e1cnQNJn{n`>aP%v=_6 zM#O-c5XNk%2{Er4gufQVO4GL%L~M2Hc)AvKtTx`-5ErUrkz5;#wPufq6*VBr*MV4P z66-*8s|j&L#0FEQF2pqvIdvg6nZqKs)`F;04`Q>)s0T5)HpD3rTTG4m5FvFS=G2GS zW{!(EAR@W}#C9{Y0Ypk&i1Q+Lny7GyuzC>7!Xb8>b0Ut4=-d!uk6F?XVoH68t0JB> z?HfVVZve5m5yU=oS;QF;10o>yn+*{V^THwgkr2=Cgd2BLf%#HS`P4x(Eu#1RqaOqtdY*F@yBhWNr97O}M@ zM4dJe=S@Z%h{3HOPKo&1)QE=&iG!FE5AlsTF5-ZQ=(Z4-%*?hBDXk&Si}=n&wSx$2 z1F@_f#1H12h@&Dpw}-fFmT*fmQ{o}6iul>I?*LK1EyU&y5LeA*5obgU=;%%G{pv9r zJ9-D2dF^2QonWqeOutSrvF%~@iTT}Qe4Sw~h)M1YbHiiyidoSCrhFHeTOKp23rx3; zFh^j#UQ?zkO%pMUd zdO?)$3sKD^_J!!y8{&wF8m3G?h-)Hp`a#q(hed4d15u|xL>-gSA7b#G5T``cGd1pl z2f?L=A)p>kqMPAVgzxPQ+0Wod-cgnI(fD zrrZT_RYWt>elSG+0T7!9Lqwa)BF=~yFa#pTY#0JDZycAc%b;;*56~ z#03$_!yww2Jt9^NhA4kGL|c=1H$=A~5JyC`H)V!HToaKq9HOH+EMn_Wh&m%6I-86U z5QB$7oD$L1)VK#C9kun_Oyog>VDiI=V1jMpLh(6|= zh@&DpkAmoHmW+a!au38+5&cd3(Gc}VLTnxlF~D3FaYn>|B#1#~LlR%+B|`XW~ z$q=!lAohtEX1rq{E{I4T12Np}5wT)4MES80_n5@75Z#g>j)+J!Wl|uniO5NT7;O%V z*qRJcClw;uWTZk29s_Yo#8^{f97M=ih&kgRQq6G@2Sh}VhZt{Wj)zD|fjBQB-9)89 zgr!0(OM{qb&WSiGqH{V#hFOvhF=ZUYRS{XH{RD{m;~_RrfXFeIMVt{aU?Rk1vtc5{ zyfg^^B#5b|?<9!WbclT-?layDhzlZ;Ga#m$Jt9_2fGD2{k!un&A-YY3I3i-EDU$_p zO+-!>#B6g|#MVg=b+RGmn2cf-2|2~M7rtf_au~Q)SiCAsC_d{F|k$gYITC+#Qim4Fgr$ekWiPIsv zO@lZhVuL9&1LB&9oEZ?C%wZ8*?}Mn53$fW`Mx1@_nKx^l z*!@z0Q~MTEBadoBrqj-xJlff2j*B=TB6=pob~AG(M9K_^^CEVds96wUxe&`{LF_i? zL>v{-c{aozvt%~Jlst&55WSw%cVyhF@T>{NR!-cOUG$|mQ=wk%A!|;5-MY{C3+J|V zniv?fwE5KV=;1@+BBqtec<wwD|$* z-B+;Q#y1<>*(_?(`_FZ~95H8j>oK3S7<}7-xkEqPIjqOKyBF6^uWv>iO87`@v=EAV(Y&k z>O2T>#AG}OF?cS-DG{%k8V^B)%!8Qo5X9@|xQGKHq92BM)69GrB4s|rc@f7<)B=dG z2O*X%fOyB86LC~T=YQywCcZf>HG{mzY7-h96Pr$@i65dYqi zwPl~am{9A?qnFy)45i1r!l(!&0HHj8Px5W@gM4U5a9)Y+fBIgl^FU(;PTbDr8Sq5?5WGsUiycFV; zh_6kJv{-c_qYU zvt%X2l;sdtMf_~quY#y=AU3apxN0toI3r@fYK~REddTiVDycwdrxh&$0hyjnYq$}tf zcJ5X9w^t|CY`f#P@HU&8@2N57SkZNHXTMxK{j*NhF84jLf8V)LM=#v|;4`(htnVZr{i`E`T6`y?~QMn)cW!8d%nN^;Aa=VPcPbWQ9b>@ zelW-@7VO=p8^*nNb;H$@6MVfBV3T(@ex;-msq2dKG@-+kW==awjyL!6oxdy4XkK6eDhneMXZ~Rh~QCVe+FPrQA^8F`^ls<4{gLg&EMZdgs z^_MMrNFD56CF9+SH!nPfH@~Zfd#jisB35jMIJ6a_nh9)!==QibG`Huc-z*#P@!R>c zKCE>tx8L?xAAWh}>Xv86el~k~*EdU5-TBF;$&Y;a$I`+X?{1iyk$&}1uf!K7kH5Qa z^*IA?r4(N}f3x<7r7xsLi;q*@BUmNL<8=QJ8_QTU2Z{1zLx7}EI zS@Bl2t{)0J_*KR4o2;GPBI(fBj)9_A4}YRUc@+dmO*KaIyR8D|Zj7 zefNolO+4fG{93g|r>S`l&wR4Y9W6h7_5NnV2E4Z6?MEN*26B&W*wVGbz!Am2EcsFR zwKea}8GNx}>f*dN3UsfQNzG@}TeskbWBEi`or3*6{9vCar;O}5@O;$6l@dpv{P?T% zlxCaKo|`x7;lLi``)^(~eP8W#vii_{rB<~qd3%S<1E)$%+|lm+$jN_v=5O$6^7URX zolE+3z1hG2%6sp;`9{(ct3r<~@A}IxStYw3`mFu!=7#Ex*uk_lFjIFhfCJkYz{esQ zng%-|Qt}}d?1YFgABYIs4$)>8L}N357sOE!--(DaEq6mq*#WV3H$*e@jfna?A$mOl z5p7mJ0dYpe4G}S>`yPmSyC8P%foN&2i-_F~F?=sXoY}S);)00KCn4IHAx}cAcmm>( zh_)v16hyZ@5a~}rv^UR)xF({?K8TJcbsxmmy%5JlbT$>Ah8X-L#Pp{jx|-KTgggZi zu^*zlnYth1fQXMpB$x&VAX4^0EI0ts%X}ar>}iNL&p`As^Phn@D&jj4eND@Q5L5O; ztUU1ZqGrazW~7lN)gvYRCy7C2b3>DY&`^VOau=o4?_%o z9%A}o2p&+12zdb_;w2tcR}U{7s+)0X55LxrLs5nO8K=E*g+haWcT6u%hl+c_XWIt< z+SZmZcmw~lO^;4WqY{4EJ3skaLUaZ5;t$@!`}5xLRxea+S3T#KkRPbGf5K^RF|Uf4 zx8C-K_{TQnw|%SnjyCDH|6r2&;9a(xytlorWmqiuw~-#bWO z_;-*>^24)iD|uQ)Ib+lK0}?y1#9D_bE)r^TV^n_Ful>{oPwE`1cH&^wKc96sovu zi1SO<)vE~;CuPe+WqCWgxGEWI*KG}R{?@=wq}`4EqCA#L%sB6@>mM@Ho!sK~ z5Y|HVaF`^+xGpB;T#R2l6Sx2r;tC1?-bbX+U+g1f9lWP zYdOW{jZ#PWiQx&R`FLNO+?%(YOI$g!bhIxjg)6A5#H~U$WxwktUFva{)8Rqo^z+g0 zyIh#d>E}Gk!6{$2ah27*Q{U3$%Jo!o4b>>?$i6DOoZcp|-}yua->K8j)#DWV(tCBP zSZ4+O)VQu{E~lTlgoE?3jG<0rWFBj+qJ`>N#@)=f6}4cOW)rydt! zh^k08GD&r~n9J!Vq|T_rp>hS6UeJ@BemL+pmkW38Zi72*zq?98KP#oe<-muo3mdsy zdAPH1DjxyIf7=7&T)W1uT?Kf(DkGOSaXB^`&)qH;<#H9_?D<3FHg(B6Q1+A7+~_Sp z{_9URc&-3l(QcmHeAQ;0w*+NZ1^nW2ZQQa|(XYE)TR06)({a@0+BsaVr#i$dF4^8S ztbzWF%XM(Mn&{hHuA|G>kqW(7wy?o-PN_Liyp7HnRIn? zNyUL)Jw*O(&gY3JpJ9mjYa>L7m z?evDJl5If?mrDu0&DajIy<2#kYuFyHi)%RE3f$TAongWw~58(t1lsL6+@u-DLx(Aj@&N9;7wz z3NpPbtIi|<&AYhCF4vQ^-cHI@;7x(#zx~RI8dl&1U##s-S}$Db(o43gun$lp3cUMW z?oQHbMBH?j>q}boDHvzCTtCvm7wQOp=Z*3HkoUQb8z?_U{3JC?HUJ}+ohG_l!Q521HU2-Vt>*T8E^IUEi=~ZwF z#`!LHH|e#ih3i3=8&3LBmwU+NM!>Ci%RcOK_rUFvo#uamOO7OMNb6eYa*3qXFk_PetT#P%9n28M_j|PaOYia znaicX1>b#N?sBPc`V|K4km@}DJ>$R-xDLpb5UOT8DCE|+%H`5D{=zO9eBnAB!&^Yt z8rN_FX{~@xU@aW~?O$J`Iqw42xptFC>lHO!>s`AH(&2DgEgN0COwyX(9`gStm&}4t zRBLHG=5pDj71iQ4yIc-w71kC&VXp!wox z-@b$Gzzd4d?XKZ8()QdScevbrN@J&B-05=nla~7xWV_(_@0kvQkA9zkD1xp#qJE#k zNaWLQS+$+3ph_gM-zD=%FU3&T0hgOe`Vp6V#^q+gsWS?)gDy9lbT!h7lV_3q_dEc8 zcFP`e?dHH~I+)g6&+{(%F9^AHB6z{&=DM7w=0%sAM>_aoto8@hJs-SJLSB>0#XSi0 zpjzH|+2tN0{j|%yVsrT5VaWY1dBinb0QZc`z3Orc;SRdoYj8}rXAzJW)*Hfee2EtgwL`bsK=<)ULQX^~z;%^Ky~aGJYEfFfNTc+a(4MtV7RvOnc= z%So$Y*$3a-&(j@=>+DqX{AAz2+-sD%4t@i_gFnCxa1+=^d{&AV_&_0080eUP0-OZz zfm1-oe7*O(9~=PBfP>&!@EkYMc3-kv1oKO_#Z&(FP`zgK( zxn)V}xZj(q?gXbXI|DudI^BN+J^`PCbKn(l1U!wc?s3~lUqoI4I_2yA_R~z{88CwM zJzyl*P5u*L4;X|#81S-vuIDZioj_aA4zvLZi5D@9Asq`^fu^7tXdy}7YUCu40rU$I zZUGNzAJ|P=+sPiV7ib&N4xt@EJHT^5EBtvKs(zx}&)^EU3Vs2nE>+rbX732X#f2U>VqXj)iWNLmM4{n`(wYvpN0W`i7{-8LRH0O6n^ zXapibW1zR3Jb~9{~LxgD2tkg3hG7fUclDhy$%b4!9Sb#^wz80K5;*QT}uA z1^5!22Va4&b*TD{g!ZF%z)7|k?Q7b{j)K>LHq#RDI=zyu~z!a+mO2t;gJ1<$;-?7ibGwfM7$l=|~-*539kB)F53G z$mU9c4(0|6ouF57Wa^C92k4WqKIf$XKe$e(^pR{eSP%4xXb*A`(5Ie4=sFpX21CG5 zFaUI;&JLgxhyiM2B^}Ub1lrEET@&o3GJhm9*eU6G==Xz{+y>QXG15BM>nx~71f{ou z#Xud|4Ri$8iCbk}2SNMqNRI&3wEp#*;I@K9P!tpa9?%`p1E@1y=xsMphsxBcf*pK- z&dmp}kf)BQF`bSjgLUsCt&^}0z6ZcF;2_wc`B!BIxeTaK4JxV)u8>Y3PYnt>s4D+O z&=mc7G)*-GMEr#5l|E;PwA4NQ~|v- z=`x@;s0nTZm9;07BT)%d0JnqkpdttZcYrFO8mJ1YgBqX~sOQQ$$hx3D&@o7zZv-Mh zXQ1PZjy0WtrcKi+JsLEpefxAMLhD++)BH+muH~+_K$U79v%pLsPfZ8+gZsb? zkOv+F^T5BrTreLf_#Ore!E*2jSOOLUeNRTN*A!c-bt#EuUC0GMigSFskunX)2 zo52F`7}yBbfl)w#>jfLYdZ1BjP@6zL*b26Q$H6wR18fIRXjHp_GBw9CP(%B`Q{YLk z7wiH1!9j2UJOi`@S0Oc89b(iG9cbLF2W61pYFfEyTH0O!G%;0tgL$bE6(Q&0qa0#1YX!71<_I04=T zZ-aM$0`)jJ2~_@La29+7J^*Jxgy#Q4C0r=|8TcG%^k0LoKs23e27>ODOXa!GkQz+` zpb=>>>iBn{7U>$`8`A2yI$RySD$s#MQ zRaAy_Q4pN#LZsaa?X#qA>j9t-HKD*y8J)B=b;Xb+k)`dtTqmOhN-1Rk8P35#^YP(>Mm!b%*Nm>S<0lB;` zx?HI_*1T$kNUBo`xE(+qQBjlUBn`f#OChLGhps!U!`z{$P^Qt_ZhW!o0LHE0Q9K|E*!#Ki%5R#U=stxni6$jFzLcTUM#rDsA26b1^1Of=mS9w&A)o2sMjVk z0R3(tHxC2aOhzE@0jZ=lVjl=Ls?h~Ut`4aqYDjges28LGLMMN`aueCz3bG&Cf)hBTt)>>T3lE;9Q&3y1bW+ z$zTd_gTtNzbu0@6gR@|VbkE2mPhJ$HZ$dr^_JWOICRhcprMiLiA`o24^ELmY$e0KD z0GJKWE}d4pU5)__%D zHCU%!uLX~S#TY$~+ygXoRavR78yFk!xCu!NKOfao_qz8G~ z<^~&6h8oprXD8SU&22Je7(!3ppoI0H_C_rPiJKA1pb z>VT%=lq)qQAAnE5=inUBV3qz7i2p?MuTg8+^aUFIx8M@^23!O`0=Z2M$dyXVWAco= zvK(FBQ2x(Ajc97FfnR~#t{~OGegoHmczv|Wy+z^%_#ONKZh`A+3>VQ>jE+A84zA4RFDwsU@iAPQh{tR<%(_&jf0c2v!yh zv=<9hs87UdTv1+|bS+S@gKAj$>a6NgXVnpL`ea=jy%n-0hy^jA9%u?$dmC zcIXQ9AV(19+CTRbtgI^rT|j5h2?Xy8$`_~SxuHP8(-Uaf>G`f?du()v?27CHYLV_w zUO#Xr=nH;<8;BeXoO{P`T!8W25W_$+P%vq?8%{b2i~u9SJs`-9A}!a7O9XRCk4B15 z(c?0%>c9I;@nya`-pVFwnXjU^u1P>tiYKccx2=rFj*h6mpjO=w?}%oR%_5uAxXE4S zE8nt7WD|SkRK#e^2W|Hbh=@IpQH#hZzBZMX`?|$7iR46}V|8iDEGv}p-lV5y-%o8#n?^Q?jIlpl)gWg}$ME;3 zhaQ~j^Nxs$BBu#=JM*0Jg;mxKCk%^2X7;Zom#!L#MN8X&&C~pdMGNhV4X~(p`MxPH zK7D0{>QL=X>^+6~&hwv6@Mdp}&Lbz`j|}{ST^z*s%%t#`P^%*A(|z#_)6=f7)@4VDZ`Q4D z_r<>}O7xk<3JFJ0?awmG=GUN3m$;bpH$%-_Vb$h0P3Ee&^P8BhCB7q?(;R#IkuL{^Z8v zTK?oWZ^<&6sdJ&vvOE2+^~1Rjp^?Uz*3&LZwyy5g6l*Qxn%L!^QL{QVl}U)FqvW#z=OdZ_8iTm9p0+h0DrGL%*oW^67WmoD-sUWwqHWV2JXrntBytq%L4XX?!ruRNllgcqGiU z*yL;CZDLk$@>TK?OAlx%le}m1)Dj2y;;$mkVVKHPUFM(g^fHk zseef7~cH*#k!083!#^1oxD`&`NOw%7WPI(viY$SPpE7rJm%}^d$pu_ zjyfvmRdp=q&1nVFTWh>v{#vs>c&S<>qozL1;$3hXz5a`EZEYu%K^U~wY>AYIz6BR4Qc}L4U5i9|E}v;ZBzXxrsxAKwEaBaFZE^L&6A6zQC0Q+e`8I0#i-jKT?70oYP48{=ghgdX*}6J;jT+8L9#zg8-=;Y`Pqc>x zKTCC-aJQ4V2REK=TI2d*yRR%hKAVM`cV$tlku%=yH3o0|ZO$#-CESVT9#l1->Dr5h zTz;uU^@_!3)oF@_dzXldaK;%jzhlu)H*IV~j@!d75hjhYf3bPG&h$JSY1YdkKhoLo zX5>Fn-iS1hVp+LFW2Zk4J@sY&-f|iI zwy9uU?(O)``zybE!HJXe7EilaWW@Zdg|KuZYh+XN(hgsE?Nl}z?FGTNZz4Vo z`|0fa-UsYDV>s`4b~ZDmclyTo+!33_JL%Qn=4QuE8cJ+#Ufs#?$FpB*8Y;a%t;wLN z%^MYVb_Q5~3v>4sEc>=Fk-LZ|_mrfUT9-=?4!(Vixw#9w9x*0tH_Z)-F?qYmcb(yL z1AO@tw9Y$cAskIR@q$9dJ+7AfvxjQ}Or=H=*f;MZ`{?@4pezjs>fwq)B*quh~0AI5J z!3JA3^G1goyKk9F36Q)ZrP3Gn;2NZ#ed{FzhCJPrl`QuZBQ9+be4 zpL2B4epHp!xdi{(7pkf-{6FkT* z4O{($txy$(9Sx7ZIA>#xRxA)YGBB0qK>>gedp)RH0c2T|27fI8hx}vPkEzvOJkK?u z2WhCGz1&lScMD-^Sclm-=cJa4mYe*i(f8RhwSt~B43XD`w)~8pFLco&noIlf^*>g& z^YP25zNsq}GQ`fV7%G64Yo}|!$0V+N0SJzHIArMrqP#oV{{m@Xrla_&DbTuHYm>8G zDfyRwRi&mv8+!dKnwV?YickEwyU*DPLxSVqZdKfsvd%$L({424JhVG9UGx>byHUsg z;>Y3LC^sDjGqs!M>R+VQwel}8c2&{U5M(1w>A~=XK9BYsx%+lS;*#?o==FX#>az!a zRYAX>#147&|#ic><-S11fw$eug3~o zQ~#erlIqWBwpJBZ?ee4n8hCWadGRl8w#0R{qY-SPs1ZW;g1Nw6l!SLfcrPvJWz}g~ z{+Hn+3PIBe77w-PF8t?SVHFw$FqFVy>+ob2=2;B!_n&K;plT7*2uD=)8lmF-GXoON z=Hv;}KLE>qJ8|5kaRDQPf`ZD&%=BIAf=*JW=Hjif>yuezmT>7_Gj(&-q!(d@PwVr( zr+N*2aG0X@i7Ljry*0C3xheLJwbe-ugd9W>G{~^Yp*hdl z2RV;Qh^Nn|kKOl0+&W>p1HYi92+LREvxQA)FC_*D4P+!;IkJCm# zYQG<8I zNF5pXGu+mPJ{kWcNU9wAk$b-(Q+P-i4K;i;{eKy-_156;vp7xg2?1P_*G8=LA+N)b zUxsFybr`JcL38V2q@*W4l*|ftL%ku|9t+3YeX!(*RhO}c zbY-0-{i%n4{h(YuDB>t6CJdqUqo9a*cIGIIpxIE_<(_odb$woqDWE9J>-Iw_D+dZ5 zm;)|*52e5yRM5vHxc>LN^UcE(mqhvUxQ!cmoTx-I-UcL_^B6SP=*@>dX%;;C#3;E7;?O@G#&wwHm}`b>j@e_geV?yWW}+=sLpqLu zn+lBN#Qov4>6jQ}_-FI0=XJEWt#Sd`cqDbpg(X}csri9LUNhT?O+K#)nzGdVYlakB zQns>%7RoL?VXDceMQ!rQ6LrYpSJ6fmDtf_UL-EMAdPStyJ30`j;<0ba=dyQ^WfJ|I z4_bQFEpt&>MFS$mK{u*@0*+t7PaS}Vy(sDO=a`LmIzwRD;5G82*QcQxY0HL-Wme%X zew4_x%4V{=ADudZ8C)Oi#_=&Q<=5XLJGeiWM~2{6#zYG%dJR1qxV3=Wy6fCerri%4 zr{X&DL`(C!GTa!ZhzpbV){^@1R?ZX7vUqedOvRR*BSuAsw>_CVvZ7=c1i$m6@A9A= z&8HpcY#w}CFA@{|$l??{Q1{R=U(&Es&`*J^WX+pqx^+3>;0JQjxIP+7vA{6=a~7kT zG|r1Hjv>m>6IgmDGSZ0CD7Q5m^b*=(I>~^n^Nj-T4EWY$N7tg((QkS--T1h$6ldSW zQXBF<3(J&}o1s_L7P@-1vEJ3I$vSO)*u=T~VXswxt&w=4{9*2D{dj zE19j97q||v@x%(a;q=sKDrGPY?YhT`Din%(hSLD&JX3kam4dkyuC-AKsSU%RY1FY0 zwSkyQ-xXrZy5DH!{%6gSBt{8AhiWL^n)%Me2A+er4<(6PZ&IrYs5K6uZ zaju7u#TC%nixWqE9Hwj?V>z{HTxE;5j*lC24r;4YIvu;*@^C%Sl1Jk*orW>4Cm<{U z5m@8n6(6Jw-3bU;^$x-c4@|yVQ>jg6@68;YWH^!g8v+1P0}$h_LSq7V)#q{@Wg;tl z_H-%)b;E=i8jV;}2e0wPx9S7Jk&NhZNYClybq$)-xp|jD+1yCo3;3e}b4p3UvOJ5g|0d_5`V3H?dI~w) z)V)cXkjsUDX!)`x8NHUQe+267v}WSd zaH{q@s;9w#V0*89XmO>B^O83Mg0Dy5V&lUp=6C1;uC||_A>s6tpWKh$#B)wKjo|0v zaEimzxJ&Le=~;)Ty~g*eE42a7DR$RtIa_gcSl^-|ZhGVu%)W4Xc@ug%0bJHogRec4 z11&wX0MQy_cW@!6IfewJSB4mH?n=v=wmm~s2-Vs@m=k{+_3eyX7;ZG2qn$`v$5pvK zP13m+k^#eI4yD{eitPdj_PA-gAGb4e>A~`Hut99s=onl8z#FxXw~K3-T@y!!`w*y8 z2M{ja2b!u73uBUDArF# zXf?INdXKE%=8c-E%A$5`z6+?|9b_u=NIG=~CyW%@=q@POMAE>!z_gCiFef&zKWbCl zC|m_`-@toyUq~5%H0)id>3V5g$Ni_$zCbYm|7^p-6enKwo@i0IU$oZl-;Ab?_rQO5 zV6eaw+~Xo9=b@Ei3{|tB8GH{XTS~(#Z(m-ZHQ>g&YqqcNv5y`G0$28)gTv_pQ@32C z?Kb!0Q*}L$ALvG^_|RLe|(K40CN;ko_N!q-?8M>Pj>Ch6xhI z{{e~WEYZr`2}|e*FxfBE8z>|kn_}!xxP-@! z4V^}Vcd`P~GrQEy7AwVg2Ww@$lZT+9`%6Kl2^-x%G?IthBjAKblQFc9j=LcUn zz*Ami0VX>ID?I;5Ev{6nmhvs%j!Tt1CrZb~nh0M?XK)3lGhf=Jk?fB*HzALQ2x)1! ztYeyIyt}Qxv*?O5Xv!nsixmz>rC#(ce285%=8;^RP{Bi}?CcNJ>=Ax9({5yZrzYTw z8&H^3|6%6o{3acQsr+EZgs{S2uq-~`!!+f@2;70{D_gOGjl(w9yLjkyO4lcESMsoe z3(_!gVg8Jz3))OlSE%n&v~-s*2s3)}NYrfd06=UTWpAK)mW@N%5bxV4_ObA;`+S9_ zom{I=JFR^*{wDM$Q-OhAJQlS@_DZsT0%gFiJ)ej%q5seQRBJ6YXSL-JG8J-`uG-tH zv}$*8YIgRxMvf6ufljcW3W=K5D|knTTKW-B0&)xmQrf;>_@YKRoKeSSlw;Ii-1Ggq{58ZO!G9~#E zkE^*iHgj|`iB2T{r^3dwY>kwy`O=Mza-WLU?R2I}hhcXtRh@4QQaoQl1D}Z&m2^rU z(t>9gJ>;#XjA!uGyQ?Yx84TpfYO4AiA*p1wX1aY2y2btU;D@p0Og(TseAr%Vs3RbZ zW7lZsx8lHu>su_yxxqHqUQKslSg8yBm_$FxUf=me{@a!1Yv?=RiY;qs!*lGWedT3i zNCiecV2n6cGOB1za98%{XJR?bRA1m#WU%hZNd}TTX^85@NB# zpy&^Gx_7WJZ2^1W|FHj-7m(J#e+CWx^4@|k?^TGjAF1#KIF(WhDS^=zBsd;j+O@g5 zZ@+bk*j0x8ytSI?U`imoG8A(et4_@}VWr&P9Cq+GB7;B@kvO2b$+kB8;cxMWz7oB}&l@QB6{I@2 zK`Zmy-b{$x7;mLttALaI4J2NR9fq6ueu?94+Tt0PJ10(!QF&EK>WLB`(cFCvjxsk= zgA&j@yivojj`OJ+^lfm?Te(ker2Zv{yX!uoH6_5fvXRd4^Y5RUeeb5!F_tnqmszaT zdO>CA9Woh;x6YF>eUo+;YX_{|wCw00U-0ClS->Hzu%^ZVkZ2mkhKCd+#z}L(;|sxDTd<%v=%++@0R>}b`Pm2FG zl88+v=W?KJzKzE6Q-0oPu-T?beAenhj#oelkMw1(7`cs(mjf3Q0l`|Eaedr3F%4HQ zeyg=itZ>8Xvf$)ktI31)+cJokvyBqXpnx){!$>viR%S52{wd^d29`7=+`pz!5s-!U zyG@mV7eaNun3sZDmRAOZCc!~1u!G_sV#`792j#Vswx5hw#qr^12Cw zqsDaaWSA5%Q6*5dSIHIUkTvJpxoHw5x)v4pc3JvlQouBIyrD15dmD*9vZQnM>bXv97z9A}%NwhJe-^9)vEWP1w z%v7?~Kqu>xsC{3K3$|mJ6)#e(KU#ip^}Fj|NcaJ-lAd`z3ix9b-dXL^qxN2ni zte2V=8g5f~BU)8KX;?jA!k2ad{v&<;#(w2L+Aoj_Dk!g0w^vc7SW-}e(vYerDHUm- zL9tH_ZJ^)_k=Ch}jg?4+KH8-iD9TzfS5VWZF8xrks79u>lzOS=ZIxR6Or262eygli z=;{Yb1FAMdsY!oEDif(uE2UBD{3s>ABF*)~AH(95Ej96(oZWim5;Yv5H0J%xD0#C| z!#v2r&LQ}l0KXtRB#L(yDRP6-6nM!Slzz0qS@ETM8I2 fo0K5@aBGwDhYB0NU8zQuwkRnOD}9Tyt>*s#Dcdig diff --git a/package.json b/package.json index 1f6732c..820dc41 100644 --- a/package.json +++ b/package.json @@ -1,75 +1,57 @@ { - "name": "@mathix420/starter-ts", - "type": "module", - "private": false, + "name": "sb-datasource-to-i18n-json", "version": "0.0.1", - "description": "_description_", "author": "Arnaud Gissinger ", - "license": "MIT", - "homepage": "https://github.com/mathix420/starter-ts#readme", "repository": { "type": "git", - "url": "git+https://github.com/mathix420/starter-ts.git" - }, - "bugs": "https://github.com/mathix420/starter-ts/issues", - "keywords": [], - "sideEffects": false, - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.mjs", - "require": "./dist/index.cjs" - } - }, - "scripts": { - "build": "bun build src/index.ts --outdir dist/ --sourcemap=external --target=node --splitting", - "lint": "eslint ./src/", - "lintfix": "eslint ./src/ --fix", - "prepare": "husky install", - "semantic-release": "semantic-release", - "test:watch": "bun test --watch", - "test": "bun test --coverage", - "typecheck": "tsc --noEmit" + "url": "git+https://github.com/mathix420/sb-datasource-to-i18n-json.git" }, - "typesVersions": { - "*": { - "*": [ - "./dist/*", - "./dist/index.d.ts" - ] + "config": { + "commitizen": { + "path": "./node_modules/@ryansonshine/cz-conventional-changelog" } }, - "files": [ - "dist" - ], - "main": "./dist/index.mjs", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "main": "./dist/index.js", + "module": "./dist/index.js", "devDependencies": { "@ryansonshine/commitizen": "^4.2.8", "@ryansonshine/cz-conventional-changelog": "^3.3.4", - "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", "bun-types": "latest", "conventional-changelog-conventionalcommits": "^7.0.2", "eslint": "^8.53.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.1", "husky": "^8.0.3", - "prettier": "^3.0.3", + "prettier": "^3.1.0", "semantic-release": "^22.0.7" }, "peerDependencies": { "typescript": "^5.0.0" }, - "config": { - "commitizen": { - "path": "./node_modules/@ryansonshine/cz-conventional-changelog" + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" } }, + "bin": { + "sb-i18n": "./bin/index.mjs" + }, + "bugs": "https://github.com/mathix420/sb-datasource-to-i18n-json/issues", + "description": "Export i18n JSON from Storyblok dimensioned datasources", + "files": [ + "bin", + "dist" + ], + "homepage": "https://github.com/mathix420/sb-datasource-to-i18n-json#readme", + "keywords": [], + "license": "MIT", "lint-staged": { "*.ts": "eslint --cache --cache-location .eslintcache --fix" }, + "private": false, "release": { "branches": [ "master" @@ -114,5 +96,32 @@ "@semantic-release/npm", "@semantic-release/github" ] + }, + "scripts": { + "build": "bun build src/index.ts --outdir dist/ --sourcemap=external --target=node --splitting", + "lint": "eslint ./src/", + "lintfix": "eslint ./src/ --fix", + "prepare": "husky install", + "semantic-release": "semantic-release", + "test:watch": "bun test --watch", + "test": "bun test --coverage", + "typecheck": "tsc --noEmit" + }, + "sideEffects": false, + "type": "module", + "types": "./dist/index.d.ts", + "typesVersions": { + "*": { + "*": [ + "./dist/*", + "./dist/index.d.ts" + ] + } + }, + "dependencies": { + "@storyblok/js": "^2.3.0", + "chalk": "^5.3.0", + "commander": "^11.1.0", + "isomorphic-fetch": "^3.0.0" } } \ No newline at end of file diff --git a/src/args.ts b/src/args.ts new file mode 100644 index 0000000..5b3dc06 --- /dev/null +++ b/src/args.ts @@ -0,0 +1,30 @@ +import { version, description } from "../package.json"; +import { env, argv } from "node:process"; +import { errorExit } from "./utils"; +import { program } from "commander"; + +program + .name("sb-i18n") + .description(description) + .version(version) + .option( + "-t, --token ", + "storyblok access token", + env.SB_ACCESS_TOKEN, + ) + .option("-r, --region ", "storyblok region", env.SB_REGION) + .option("-d, --datasource ", "slug of the target datasource") + .option("-l, --default-lang ", "lang of the default dimension") + .option("-o, --outfile ", "filename of the JSON output", "i18n.json") + .option("--spacing ", "JSON format spacing", parseInt, 4) + .option("-s, --silent", "verbose setting", false); + +program.parse(argv); +const options = program.opts(); + +if (!options.token) errorExit("Missing --token or $SB_ACCESS_TOKEN"); +if (!options.region) errorExit("Missing --region or $SB_REGION"); +if (!options.datasource) errorExit("Missing --datasource"); +if (!options.defaultLang) errorExit("Missing --default-lang"); + +export { options }; diff --git a/src/index.ts b/src/index.ts index 2a5e4b8..214cc1c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,65 @@ -console.log("Hello via Bun!"); +import { storyblokInit, apiPlugin } from "@storyblok/js"; +import { errorExit, logger } from "./utils"; +import { writeFileSync } from "node:fs"; +import { options } from "./args"; + +// Init logger with options +const l = logger.bind(null, options); + +// Init Storyblok API +const { storyblokApi } = storyblokInit({ + apiOptions: { region: options.region }, + accessToken: options.token, + use: [apiPlugin], +}); + +// Handle Storyblok API init error +if (!storyblokApi) errorExit("Failed to init API."); + +// List datasource's dimensions +const { + data: { datasource }, +} = await storyblokApi.get(`cdn/datasources/${options.datasource}`, { + version: "draft", +}); + +// Extract all languages/dimensions +const langs = datasource.dimensions.map((x) => x.entry_value); + +// Log found languages +const foundLangs = [options.defaultLang, ...langs].join(", "); +l(`Discovered ${langs.length + 1} langs: ${foundLangs}.`); + +// Create i18n JSON dict +const result: Record> = { + [options.defaultLang]: {}, + ...Object.fromEntries(langs.map((x) => [x, {}])), +}; + +// Fill the dict with translations +for (const lang of langs) { + l(`Fetching "${lang}" entries.`); + + const { + data: { datasource_entries }, + } = await storyblokApi.get("cdn/datasource_entries", { + version: "draft", + datasource: options.datasource, + dimension: lang, + }); + + for (const entry of datasource_entries) { + // Instead of doing a different api call to get default lang, + // it will get filled alongside the first dimension + if (!(entry.name in result[options.defaultLang])) { + result[options.defaultLang][entry.name] = entry.value; + } + result[lang][entry.name] = entry.dimension_value; + } +} + +// Save the JSON output +writeFileSync( + options.outfile, + JSON.stringify(result, undefined, options.spacing), +); diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..4d27f29 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,21 @@ +import type { OptionValues } from "commander"; +import chalk, { ColorName } from "chalk"; +import { exit } from "node:process"; + +export function errorExit(message: string, code: number = 1) { + logger({}, message, "red", "error"); + return exit(code); +} + +export function logger( + options: OptionValues, + message: string, + color: ColorName = "blueBright", + level: "log" | "info" | "warn" | "error" = "info", +) { + if (options.silent) return; + console[level]( + chalk.grey(level.toUpperCase() + ":"), + chalk[color](message), + ); +} diff --git a/test/index.test.ts b/test/index.test.ts index 59e4d12..29162cd 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -1,6 +1,8 @@ import { describe, it, expect } from "bun:test"; // import { one, two } from "../src"; +// TODO: + describe("should", () => { it("1", () => { expect(1).toBe(1); diff --git a/tsconfig.json b/tsconfig.json index 4a8f5a3..673cfda 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,8 @@ "moduleDetection": "force", "allowImportingTsExtensions": true, "noEmit": true, - "composite": true, + // "composite": true, + "resolveJsonModule": true, "strict": true, "downlevelIteration": true, "skipLibCheck": true,