From 6ab69c520047f411edc8ed5e193cc0db0c8a23af Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sun, 8 Dec 2019 00:06:36 +0100 Subject: [PATCH 01/50] Fork, Cleanup, WeaponCalc --- package-lock.json | 6 +- package.json | 2 +- public/favicon.ico | Bin 1406 -> 0 bytes public/humans.txt | 17 -- public/icon.png | Bin 0 -> 7702 bytes public/index.html | 5 +- public/manifest.json | 22 +-- public/robots.txt | 3 - public/sitemap.xml | 1 - src/actions/cms.js | 38 ---- src/actions/highscores.js | 48 ----- src/components/AR/EPList.js | 38 ---- src/components/AR/EPListCalculator.js | 62 ------ src/components/AR/EPListTable.js | 55 ------ src/components/AR/FBTool.js | 49 ----- src/components/AR/FrameBreakCalculator.js | 153 --------------- src/components/AR/RankingInfo.js | 104 ---------- src/components/AR/WeaponCalc.js | 6 +- src/components/AR/WeaponCalc/index.js | 55 ++++-- src/components/About.js | 32 ---- src/components/Contact.js | 140 -------------- src/components/Footer.js | 20 +- src/components/Home.js | 30 +-- src/components/LoadSpinner.css | 4 +- src/components/Navi.js | 47 +---- src/components/TERA.js | 39 ---- src/components/TS3List.js | 56 ------ src/components/TS404Server.js | 44 ----- src/containers/AR/Highscores.js | 223 ---------------------- src/containers/App.js | 14 +- src/data/ao.js | 19 ++ src/data/dataset.js | 2 - src/img/techguy_t.jpg | Bin 3439 -> 0 bytes src/reducers/cms.js | 36 ---- src/reducers/highscores.js | 33 ---- src/reducers/index.js | 4 - src/routes.js | 59 +----- src/style/bulma.scss | 4 +- src/types/cms.js | 4 - src/types/highscores.js | 5 - src/utils/AR/names.js | 13 +- 41 files changed, 103 insertions(+), 1389 deletions(-) delete mode 100644 public/favicon.ico delete mode 100644 public/humans.txt create mode 100644 public/icon.png delete mode 100644 public/sitemap.xml delete mode 100644 src/actions/cms.js delete mode 100644 src/actions/highscores.js delete mode 100644 src/components/AR/EPList.js delete mode 100644 src/components/AR/EPListCalculator.js delete mode 100644 src/components/AR/EPListTable.js delete mode 100644 src/components/AR/FBTool.js delete mode 100644 src/components/AR/FrameBreakCalculator.js delete mode 100644 src/components/AR/RankingInfo.js delete mode 100644 src/components/About.js delete mode 100644 src/components/Contact.js delete mode 100644 src/components/TERA.js delete mode 100644 src/components/TS3List.js delete mode 100644 src/components/TS404Server.js delete mode 100644 src/containers/AR/Highscores.js delete mode 100644 src/data/dataset.js delete mode 100644 src/img/techguy_t.jpg delete mode 100644 src/reducers/cms.js delete mode 100644 src/reducers/highscores.js delete mode 100644 src/types/cms.js delete mode 100644 src/types/highscores.js diff --git a/package-lock.json b/package-lock.json index 73c9460..d780003 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3936,9 +3936,9 @@ "dev": true }, "bulma": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.6.0.tgz", - "integrity": "sha1-T1xd5YKBDRGqDPsfMK7Ip5LQ2Sw=" + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.8.0.tgz", + "integrity": "sha512-nhf3rGyiZh/VM7FrSJ/5KeLlfaFkXz0nYcXriynfPH4vVpnxnqyEwaNGdNCVzHyyCA3cHgkQAMpdF/SFbFGZfA==" }, "bytes": { "version": "3.0.0", diff --git a/package.json b/package.json index 2991615..b3a9ad2 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "aceonline-framebreak": "^1.1.0", "aceonline-stats": "^1.2.0", "body-parser": "^1.19.0", - "bulma": "0.6.0", + "bulma": "^0.8.0", "chart.js": "^2.8.0", "classnames": "^2.2.6", "compression": "^1.7.4", diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 301f521ca88ca7b8c76d6aca07ff6465b241853b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmeH_IZzXE7{wn-!euVbK+fGHn~)2`ohTs)NJ2;gAw&cL!;RteSdJv32xcrC#~GEe zvbM6&%F@Eh(t^s$#)8J7a4c9qz!~Z79N*5{-}nBr?<;l}$e~Lv$FXKbKsiko^3jo= zoP&J29}g!yH9xO&Ll~OGi$*v0ho(?x&||&72YYP+*cdH7Cx)Ri>Tnnugs`}TW-|v? zQ-yxc0t2zCSPqVOIGTh)F2!nJ5KlbKsAqH#!f|LyOE6<~;H|FT;T3ChSn$Hwt>ZH;V>EiLW_k%nka0gk+Qq+ zvDS-&u?Yy-EP4$F$P`lQN@?#do|&C+8d(Tt4|T)%5{m+oLh6TM(yE{;QGg?=iHFm3 z(5fr3X>nkn+73U%LaC6UTCatH&fTmY!tyj$IUAgG*1?$|lS%Nd&WpqBBZM4Q>uo08p?Re_%f}LguS*Qd@Y`ZUh zXztWk#Kwo#La`erDxJEX$6YoA{j# sPwK)2kH^!UN~OA;Yw6WkEFL3SiE(+Ue%sgT5*^9a+RF1=fBR8?0mKf!l>h($ diff --git a/public/humans.txt b/public/humans.txt deleted file mode 100644 index b36e54c..0000000 --- a/public/humans.txt +++ /dev/null @@ -1,17 +0,0 @@ -# humanstxt.org/ -# The humans responsible & technology colophon - -/* TEAM */ - Creator:Tobias Kronthaler - GitHub:@kronthto - From:Bavaria, Germany - -/* SITE */ - Last update:2018-04-09 - Language:English - Doctype:HTML5 - -/* TECHNOLOGY COLOPHON */ - React - https://github.com/kronthto/api.vi0lation.de - https://github.com/kronthto/vi0lation.de diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..59c52ea2e41cb45eba1a01c80676e3adecd764f8 GIT binary patch literal 7702 zcmX9@c|26z8-MOBn6VFo6k{)I6p<`bWXX~wiOPrg>e@$IIFYIaAQm0SMy5>w!RI=QPLv7#7#1ohn8x=t! z>WtBav z(Uk6-M{bK(Gy4NJkomhbGcf4LnV*{zA zG*Aks0u-3w_-tdh+^}l#_F`TquvdXSmnFwv)06RpzOn5r8PuY6xo^?_3;SVoXLE3{hnp>Ng_@8rI4~0m0 zK<1Lyzk$L`9GXO988C4n+FK;m>=!xR8+AwuN-G;r__*XQkjNrp170Hb6<%_<5h=4b zc+2S7ZR?Gdk+GT6f3C<66;?iec3uVSUk^)}qwh>o62EspHZ#KO#w1)!kY!ZO;5`FO z{9v*6`LF|*o!hhjlZC|w6Dryzs*7Gg$tao5e`AV&lR>SnA_XP6t(ka~{W}+X;1#FW zdLyBZr~>+*LN;C88ISZGQkvRNNzLB~3nVf_9|v2a6RES-EB*#-(F?%;`27+wDAojmM`Rw~smy5Th>XL7u1h zeY=6^F5m;-ZnrcMJOAN9V?im7!$+G!A}eVVLjGqgP}e1Rlo_=~?7bcpmCNoNwY~*x z9V0wrR+Q6i(si7bi}XF*s}_gW2`bj{7lYdZJ~N}wYQ=xj%;*8$1u6`|KqPYsNzS4` zxDR;WC4ig^TSfz+KO^dQnA_uQ1*iw?heV;FY>TYgTAS8-N{~C-he5b zaD@G1-oNURq`@d-1=JV7rfg!PMm?Cmbgda?6gG_asZGiP5rx!noJ62~IF zLJ+aRRfX}fM?`fE{)&gL6PmooR|HyrI=lD4o6VOJpFLsXu!tCYvDLDk!nd+M(_Az` zF^|-2*pI`s`J4TiPQ~V=C(JcRpag6lPC>#|bp3xXGyl3k=@LT6aZ-A>0poFRT9(+D z0OVd?J`ha&iKWU+{NnEDZc()3_&(BD&B{W|ADeHM5E!9yciL#^L>f9=5(`sb>Wi?H ztbt(uX4F-IxT%pcG2`s!Sw~b7odTBksDHu7$fA3`+K||UW3Vg(Bz8t&BXMeAL=<9F zVf0h6H%yf4e5H`+*-|Cb`z(L{cm$<~n|cCTXKj5#cm*kjl>8v!eAP!f#guP&qA=-8AxzZAA8W8eB&^ zG%$O?m^vbJ{$$|-3>~dHieR3?>54AKu}+OHt^%pTen($QjsS7vl&07p(Ov^9ekVuOmzxOu0yhz-3JotlWiuJ=_SYx zhy&fKtn20w7$_1@OXeIS4mk}X3e^kIv0dMT0~UnXr!aZVz^4OI8qOoLkCen=GV~jG z91g}bK1oB>H)GC20TRIS;qP?D#R5{rGQvJzGbhW$X5HQ06>wS`+wT%GrbzN1Hu#g? z0V~_Rn7bF}eh-$eH)0?DUmoIr@-%Gz)_}ue2GyYZQPJK3c~~r2`GQI2cwrhITZa_6 z@?a{$@uw1E^tuN^wDCo=Uut>gCqnty?KC)=nRfRe0uT}Sj)ZobgTAhHF;-d0Y^#O$ z>p_3R-lLj`QF3C;I2k7Io9B0?)K16UFRO!}%Xl_4H6zzLDL-W&%Ue=1hXKz5VRbf84sq}m{k#S;bPSH1f*prVEf`Zsn3 z7Oe;a!g~>`3J5$>fdl_X|2?_17pcd-Jym}M(<3&5R1Ds(D}Iq0uMLoj0R-)mn#MJs zCs)k~Vfi2WF4uG-FYUSd!}?0{f_Rw|`^w2qJ5K%EG3X_TMUaZV(Dapc;q^=FzqAd+ zJrnSNmH6Cza_}S-s{n|LfQ+H^gCD$*GHrA_>B&gvn4E;n@e&@U_OM@F1 zqw30cEICeCeAOEIWl%-Qc!&Sp!wm>T)+x?DItGQKx=MM17UrL;v>`oIe8;lx@%1ja zH^x_hl~h_~*@C|bw(!b0@ddf#2!2Vf4)$|5#$W~CMuusAam&H_uemSUGs-@wVwv}c z4c&SH6}zLGk{Ffa2;qEbW(p*xsb=omV|=Kl8t>=MSoPc7(*ZXGGlw&8;^;;nn!0U` zUtO(;?9$`zJY|x9I68N`K;QN%rN=hkw3Ot@7Wq`zS=yHGr~#`zckBQcr0?5<2_e)G z$2vkqBeY}GIT{|2FlI!VF zCVl^tzA!niy^zr$`NnoiLsU0CpS1O;og6M)dqjW0T_9cHDy9SvNzxM~$!)18UV0Ye zoOUeWEAkz}v8{wvo68G9e#lpDDaQ-zyQEf{%H9OZoH3sSYx|YQEi@CuR4onXDVbBb@S5s1=Gy;N4f-WU5_4CJzY8tf)OkT$a{kfZ! zdB=0vLk?IQf{~HAZ32v{j{=CY@q(2tTZ-;39lEfpqfDcqMRw1Jz2ehOZ-eSD1tRvP zwh~-lk7&~3RWjNZmxDjkMw>{rF8KSnhU;8i6FhnT{0y1#nGzfImvaP+-F?%4xkys( zzZIq$t3D!(*EaJM9?t!^J}}x$v<(s z7VCKYa#1sdOD>WFju>uz7_Ip@*u-U#-?w_+dzb&akB{2%Aqm|)+65f_Z+R2n*w;eB zc+CuLirWjSR~`i`S0J+Z>~Fa2(hsrWSmyl|9Q9A`r`e`3ZKBp1^451ZkmuFKFG8x* zRVZ{E-LE7LRIqePKx=%~@p@(R538ed2M)Z|LHq|(m2Hzm4XE@B+rLPV=pyEJQ>$~i z{5D@TkdvyCLB%z(6<-E1M^Ab3Ee?&ojy^S&(+TkJ-K8JS;|WV6-?o&QcIn`DIW|xj1FN}f#1Iw1>+`Ec~YjE|hB0a(G_Hu?H$HFdYLyS*L;j2xL{WoB#-#B}z z!fcbp=iD7cwnYU_cbv?=EIRc~Ii{T3*-ZU}ZKFR+3|4i!$ElOC9%AB(7_iz1^rUiA zPam6K1`>hiei-dS#{ejC5vP=W*c341O!>yd+_amr*)MGFnLr7MyGJ+|=i=W_KrdfjD8w15y+ zjFl^vJQE2N)bYcky}bRB>~?c6+>H0D%!FoHcoZfj@$c`FYrjsb?LlDZgU%s$!&qa$ zP!ju*RJ+9T3De&D8UVZVf4W|JJZqlzd8P@wt#d$kH;RXFYo2zo<~zBDO5Dbad=ax1 z1Q?RDWlJ`RS3Eh5{Wp~tc&xH{DdXBkfYRnq=Gb0xr)!?I1S0G%D<97QU%{_43$H)s z8QdWQ#5l-DMa8LMiUQ*eLep9Xek{yNu zF2CbqZW!L$?upgrHX1fUEe>l+!U;vQtK-naE9m=T(%@Mg1epBIVx4nybFoSkY?Z|j z8S&BTebGviF`>6N(wh!$Z?W*giYsr+c@1$MtTd> zBCmC+nKsD**x+XT`D z55d{2cfWOOeHNUDeoPVF$}eI2n3Gd|J~T@s(I;b+UtIs5x98(re}hkMhLrU+_mu6Y zKhn;sG|kxW4t=@`om);41LadHgnDg6s}?r=!#Yr#MisODYqxV*sX5@0xcFM}&>=lN z$08WvEaiaCn$!9f<7PcBMc}s2ZTudLNqBR;1D5Y!`?X9kpEY^E@l7?>BbC62j0@L7 zQeo@YJ?)cg7w(DPckP|9HX`^tAy%FJX&wFem!uN zU86n*7%=p@UgCgHi>&uq0-GM}%vpcG#?ST9@jf1=sPXGt#Z;QS!`8D^V!Wd;#^l1G zwSoLa;7@BKKN>$lK@a;JPm$oo#yH?OIhak>&gV8t8cl~jmZHb1J4!d*-JQiYvz2SOKivC_t3^{n3 z?VF>PnYh3MvSZn^f@^p4wnylxVRVIDby9@;9;9%K#^}TD-BiXIK^%$w+x6vI)8h<= z=D~Q)Gj|PH1Gq8G&pG~YEFO(l#1ziFl(%XLbLh4uvNLX8?MQssC}m_ddhko<9bt>; z5t7X}6I&{JSpzoA-ypGrcc>3aC3!gfGU&Auy|&7{a1W7F*x&*-0|N!o0n@4S7g{e( z4BkA(S;|+r+xF1(bd)+d`KJw$>G>c0Wx2Z$IpvFK1Uf%RoEzQq==;uEFb+{7D0s=v zTK7bj-uvaDhJ+xNNBOUUO~Ha8Zio6#RYYQ)s8%IWOne&a`N(@GYNc?c{-zZJb*m>$ z@wHu2Y~7ap3;%FW_o;h7_mUaTTE{BDHBx54PB-9MR{F5nZn zd-Z`MD{&Tch5eniZ(r@t4&_6hVP9l>RiRG=Yv(t4Ac1$99ta5J|A{}Z8mTH^hgCnpKPL=XR)=+vN}g6Q1rn1amt6*?-pBa z7rW$Y;bU#()NJ?Oc=+6M6tkXw&eQexO}&2$lR)!Nb%+^!j`vw=*n`fOUYmCc3wnCk z(&XT5+=x85&dx=nPHe|JCzYAk=F1BQvY(weqD+NIw@Xai(8G60X^BRh{XugH4I;)0 zIkcgYVyvtt*KGJ_OCX}4h(>Q{2$->GIz8+}FoA zwS=ah38j0Gsq(dUkun*7(N5*z>mlrQzWZXwq7U*M!-5n_+`~i;*5MSYZ}(D#Uo1FS zE~V?xaA69fv6zsLO~vy04ypzr;fAOFoEL1HVE0;jgJ6ZVHn z0a)c#dsJX8>Sx*I>h_!!8G(Mggy*mqF5j1iQa_pD+n0PKSC{^WDI$BgKPSs6Sf>Z2 zdOL%^ua6KA17j78`{;1xVKvza=}X31N?kmCO9?M=d<`x+L`)2_cR+0wk#+Bc48k~5 zdn~1+Rs(hgES*rFel$RZqcxR(xF^zK{}*IH3XbMy)M4hqy5uoVtpp76W3);ISGl%{ z81mE=;HNIq*DZza0Eqq;{-eJYi_v0$ki!9Mc^P3H(q z|0o!%#wn11Y3;WqH~K`hz|@6i6n^{O6&!NyfE(ZVAzXiYvVQTy4kE^3fhJEx6M%k~ zgkq!ImQT1N>nhLwO+}b>=Z@O>L3x-wb`C(d#ztn|`uZ^<$3V8|=BGhEIJ}ozwihOP z-OaoGfLTFMz!HaOFdwA8+f_Xicsl_q!W6{N((D7zjR^wqdG)PnjfnGP6oW^u++0`K zQ8w!qheI1F=(+-v?){(=a_y6~Z$IwAAx%KjbFErF3z_S``)A8`3ecOwTx6qgLa^Mn zC_8ke5YJTf>yHho-3Yz?WMF13=)V)4dn^ZI{=-dGYsY|-|8p;5hXZCafldK-`5m*= z32!v(|d(Q z(1*-FE3z^~#?tFn9HTXsgkA;bR>MO(P78+hvL%$xt2oQ{6 zm3eEb2>t_EZJs!mIz~hUVff$ri2~9WP8sT^ptY{tlyhF^l3uPtYXs!k6a6zyXS2jg z50Fv`@bjq9*UN!O@>^u|39!1UO>J=>+FnSp{RtFyyC;#JKw!IRA{;$Lw{-`EJ3(?8 z1>~sUT}+@S5ZP`T$n%e(DZ{_6Q!(OcoX{J9dW2Ch+zX6f8SvYdjo5Ry_z5!pI-Y}} zR@j*0)T+C>DY5nieKT*cPC=or!I0ppt~ zICfuaPnDhryn3yGUN>LuEvWDeue@>yliZGFpxdj@&p#i@SJ_xi?4>>6Bo4-TyPXjBSw8zghJE`p4_HWp>%iVdprVd6Hl(HjB|PJS})76+4_#yCT%$SJ0B6guH)Z&?r|);1b`(E_is*h*Mwp)wDyte(r;Mb+ed!2A@ZL0zjZ@=WM_YX+RCuL-@(CGa5Py^yaKomxK1d61 zs&vnpYQ8P|A#;Tfkzr0&uA;)?jK3c1R1`FR*NV;(B|)wV&iV<6U-bKQMVA${;T5&t zwa?z|9DH6Mn2`gALlv%xF`gs{R}<+a_%G*lF}f_bYE>;nNJlCvWGU7+CXgZdYN@fR z!;6b&cQ*A{J8*4)fv?|Ax6{Egp)_ArS+Se;3+edtIo1NYv1dfIHq*~CZp3@^;bg+D zt^1-G*Z1)DgQdXl-LKAi3XtrKJ(eoF<6lZqk?V-@N#B+Hv>j_8F@hRtHP2M>fT>q| zg(|r7{;%)9lks5}0dpJU#@WVsDJV5OZ6jj;3p=)yNNHgcL^m7ZAt#4*L(y#z+w{KU v#vQ;qlA*_icZUR_&``0bHIBwXc{H#*bufrpbhjI;hhV$i(XxCS - + - + @@ -18,7 +18,6 @@ -
{{SSR}}
diff --git a/public/manifest.json b/public/manifest.json index af7905a..1005fd9 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,24 +1,12 @@ { - "short_name": "Vi0", - "name": "Vi0lation", + "short_name": "CRT", + "name": "CR Tools", "icons": [ - { - "src": "https://cdn.vi0lation.de/img/app_icon.png", - "sizes": "144x144", - "type": "image/png" - }, - { - "src": "favicon.ico" - }, - { - "src": "https://cdn.vi0lation.de/img/viologo.png", - "sizes": "72x36", - "type": "image/png" - } + ], "start_url": "./", "display": "standalone", - "theme_color": "#4a4cff", + "theme_color": "#006488", "background_color": "#ffffff", - "description": "Vi0lation brigade website and AirRivals ranking" + "description": "ChromeRivals tools, statistics, tracking" } diff --git a/public/robots.txt b/public/robots.txt index e94ab33..9e60f97 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,5 +1,2 @@ User-agent: * Disallow: - -# TODO -# SITEMAP: https://www.vi0lation.de/sitemap.xml diff --git a/public/sitemap.xml b/public/sitemap.xml deleted file mode 100644 index 1333ed7..0000000 --- a/public/sitemap.xml +++ /dev/null @@ -1 +0,0 @@ -TODO diff --git a/src/actions/cms.js b/src/actions/cms.js deleted file mode 100644 index 3c74647..0000000 --- a/src/actions/cms.js +++ /dev/null @@ -1,38 +0,0 @@ -import { REQUEST, RECEIVE } from '../types/cms' -import { CALL_API } from '../middleware/api' -import { isCurrentlyFetching, getCurrentTS } from '../utils/api' - -const cmsTtl = 21600000 // 6h - -function fetchCms(page) { - return { - [CALL_API]: { - endpoint: 'cms/' + page, - types: [REQUEST, RECEIVE] - }, - page - } -} - -function shouldFetchCms(page, state) { - const cmsState = state.cms - - const pageRequest = cmsState.requests[page] - - if (!pageRequest) return true - - if (isCurrentlyFetching(pageRequest)) return false - - // Should we check the actual data field? - - const { receivedAt } = pageRequest - return receivedAt && receivedAt + cmsTtl <= getCurrentTS() -} - -export function fetchCmsIfNeeded(page) { - return (dispatch, getState) => { - if (shouldFetchCms(page, getState())) { - return dispatch(fetchCms(page)) - } - } -} diff --git a/src/actions/highscores.js b/src/actions/highscores.js deleted file mode 100644 index 95d2cb0..0000000 --- a/src/actions/highscores.js +++ /dev/null @@ -1,48 +0,0 @@ -import { REQUEST, RECEIVE, REQFAIL } from '../types/highscores' -import { CALL_API } from '../middleware/api' -import { isCurrentlyFetching } from '../utils/api' - -function fetchHighscore(region, date) { - return { - [CALL_API]: { - endpoint: 'ranking/highscore?date=' + date, - types: [REQUEST, RECEIVE, REQFAIL], - acceptableErrorCodes: [404] - }, - date, - region - } -} - -function shouldFetchHighscore(region, date, state) { - const regionData = state.highscores[region] - - if (!regionData) { - return true - } - - const highscore = regionData[date] - - if (!highscore) { - return true - } - - const highscoreData = highscore.data - if ( - highscoreData || - highscoreData === false || - isCurrentlyFetching(highscore) - ) { - return false - } - - return true -} - -export function fetchHighscoreIfNeeded(region, date) { - return (dispatch, getState) => { - if (shouldFetchHighscore(region, date, getState())) { - return dispatch(fetchHighscore(region, date)) - } - } -} diff --git a/src/components/AR/EPList.js b/src/components/AR/EPList.js deleted file mode 100644 index f6f2f00..0000000 --- a/src/components/AR/EPList.js +++ /dev/null @@ -1,38 +0,0 @@ -import React, { Component } from 'react' -import { Helmet } from 'react-helmet' - -import EPListTable from './EPListTable' -import EPListCalculator from './EPListCalculator' - -class EPList extends Component { - shouldComponentUpdate() { - return false - } - - render() { - return ( -
- - - AirRivals/AceOnline EP List - - -

EP List

- -
-

EP to Level Calculator

- -
- -
- -
-
- ) - } -} - -export default EPList diff --git a/src/components/AR/EPListCalculator.js b/src/components/AR/EPListCalculator.js deleted file mode 100644 index 939ea87..0000000 --- a/src/components/AR/EPListCalculator.js +++ /dev/null @@ -1,62 +0,0 @@ -import React, { Component } from 'react' -import { calcProgessBarByEp } from '../../utils/AR/ep' - -class EPListCalculator extends Component { - constructor(props) { - super(props) - this.state = { ep: null } - } - - shouldComponentUpdate(prevProps, prevState) { - if (this.state.ep !== prevState.ep) { - return true - } - - return false - } - - calculate(e) { - e.preventDefault() - this.setState({ ep: Number(this.refs.ep.value) }) - } - - ep2LevelResult() { - let { ep } = this.state - - if (!ep) { - return null - } - - return {calcProgessBarByEp(ep)} - } - - render() { - return ( -
-
- -
-
- - {this.ep2LevelResult()} - -
-
- ) - } -} - -export default EPListCalculator diff --git a/src/components/AR/EPListTable.js b/src/components/AR/EPListTable.js deleted file mode 100644 index 253696a..0000000 --- a/src/components/AR/EPListTable.js +++ /dev/null @@ -1,55 +0,0 @@ -import React, { Component } from 'react' -import NumTD from './NumTD' - -import level2ep from '../../data/level2ep' - -const TableLegend = () => ( - - Level - - Needed EP - - - From previous - - -) - -class EPListTable extends Component { - shouldComponentUpdate() { - return false - } - - render() { - return ( - - - - - - {Object.keys(level2ep).map(level => { - let levelEp = level2ep[level] - let previousEp = level2ep[level - 1] - - return ( - - - - - - ) - })} - - - - -
{level}
- ) - } -} - -export default EPListTable diff --git a/src/components/AR/FBTool.js b/src/components/AR/FBTool.js deleted file mode 100644 index 43bc3c0..0000000 --- a/src/components/AR/FBTool.js +++ /dev/null @@ -1,49 +0,0 @@ -import React, { Component } from 'react' -import { Helmet } from 'react-helmet' - -import FrameBreakCalculator from './FrameBreakCalculator' - -class FBTool extends Component { - shouldComponentUpdate() { - return false - } - - render() { - return ( -
- - - AirRivals/AceOnline FrameBreak Tool - - -

FrameBreak Tool

- -
- Standard weapons in AceOnline / AirRivals / SCO (Space Cowboy Online) - only profit from very specific values of enchanted reattack (so called - "breakpoints") due to time quantization.
- The following tool can be used to calculate the optimal re-attack - enchants to use those breakpoints: -
- - - -

- - source on GitHub - -

-
- ) - } -} - -export default FBTool diff --git a/src/components/AR/FrameBreakCalculator.js b/src/components/AR/FrameBreakCalculator.js deleted file mode 100644 index f2c3a3a..0000000 --- a/src/components/AR/FrameBreakCalculator.js +++ /dev/null @@ -1,153 +0,0 @@ -import React, { Component } from 'react' -import NumTD from './NumTD' -import calcFbs from 'aceonline-framebreak' - -const TableLegend = () => ( - - - Rea Enchant - - - Bullets per second - - -) - -class FrameBreakCalculator extends Component { - constructor(props) { - super(props) - this.state = { baseRea: null, firingMode: null } - } - - shouldComponentUpdate(prevProps, prevState) { - if (this.state.baseRea !== prevState.baseRea) { - return true - } - if (this.state.firingMode !== prevState.firingMode) { - return true - } - if (this.state.fps !== prevState.fps) { - return true - } - - return false - } - - calculate(e) { - e.preventDefault() - this.setState({ - baseRea: Number(this.refs.rea.value), - firingMode: Number(this.refs.mode.value), - fps: Number(this.refs.fps.value) - }) - } - - render() { - const { baseRea, firingMode, fps } = this.state - const legend = - let data - if (baseRea && firingMode) { - data = calcFbs(baseRea, firingMode, fps || undefined) - } - - // TODO: Auslagern von generischen Form Stuff - return ( -
-
e.preventDefault()} className="margin-bot"> -
-
- -
-
-
-

- -

-
-
-
-
-
- -
-
-
-

- -

-
-
-
-
-
- -
-
-
-

- -

-
-
-
-
- - {legend} - - {data && - data.map(function(row) { - return ( - - - - - ) - })} - -
-
- ) - } -} - -export default FrameBreakCalculator diff --git a/src/components/AR/RankingInfo.js b/src/components/AR/RankingInfo.js deleted file mode 100644 index 125f1ca..0000000 --- a/src/components/AR/RankingInfo.js +++ /dev/null @@ -1,104 +0,0 @@ -import React, { Component } from 'react' -import { Helmet } from 'react-helmet' -import Link from 'react-router-dom/Link' -import { highscoresUrl } from '../../routes' - -class RankingInfo extends Component { - shouldComponentUpdate() { - return false - } - - render() { - return ( - // TODO: Hero Teaser zu den eigentlichen Seiten -
- - - AR Ranking - - -

AR Ranking

- -
-
- -
-
-

Highscores

-

The ladder for any given day

-
-
- -
-
- -
-

Motivation

-

- AirRivals, the EU Version of Masangsofts Aceonline (former{' '} - SCO), published the - highscores once a day and only of the current day. It was not - possible to view previous days. -

-

- Therefore, in 2012 I wrote a program that saves the data once a day, - and this website to make it publicly accessible, aswell as - performing deeper analysis on the data (progress/day, - Nation-balance). -

-
- -
-

Dataset

-

- The first day data was recorded is the 2012-07-27, since then up to - the 2016-08-24 - the day AR.de closed its gates - 1163 days are - recorded. Unfortunately, mostly in the beginning, some days are - missing, because the import wasn't stable. Since the 2014-01-05 - every day is on record. -

-
- -
-

Methodology

-

- AR.de published 5 tables every day: level, fame, brigade_total, - brigade_monthly, pvp (duels). These were copied without - modification/normalization into the same schema. All processing for - views is done using complex joins on these tables. -

-
- -
-

Data

-

- If you want to dig into the records yourself you are encouraged to! - All historical data is directly available: -

-

- - Download the MySQL Dump - -

-

- Use the API as this website does (CORS is enabled):{' '} - - api.vi0lation.de - -

-
-
- ) - } -} - -export default RankingInfo diff --git a/src/components/AR/WeaponCalc.js b/src/components/AR/WeaponCalc.js index 15a7b3c..ccc7bcd 100644 --- a/src/components/AR/WeaponCalc.js +++ b/src/components/AR/WeaponCalc.js @@ -14,12 +14,12 @@ class WeaponCalc extends Component { - AirRivals/AceOnline WeaponCalc + ChromeRivals WeaponCalc -

Ace WeaponCalc

+

CR WeaponCalc

diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index a020610..1413f76 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -6,14 +6,20 @@ import { unitKinds, standardWeapons, advWeapons, - ITEMKIND_SKILL_ATTACK + ITEMKIND_SKILL_ATTACK, + ITEMKIND_DEFENSE, + COMPARE_ITEMKIND } from '../../../data/ao' import LoadBlock from '../../LoadBlock' import WeaponPreview from './WeaponPreview' +const eqKinds = [ITEMKIND_DEFENSE].concat(standardWeapons, advWeapons) +const isEquip = item => eqKinds.indexOf(item.kind) !== -1 + class WeaponCalcTool extends Component { gearItemDb = [] gearSkillDb = [] + itemFixDb = [] selectedItem prefix suffix @@ -35,9 +41,7 @@ class WeaponCalcTool extends Component { filterItemDbs(itemdb, gear) { let itemDbGear = itemdb.filter(item => item.ReqUnitKind & unitKinds[gear]) - this.gearItemDb = itemDbGear.filter( - item => [].concat(standardWeapons, advWeapons).indexOf(item.kind) !== -1 - ) + this.gearItemDb = itemDbGear.filter(isEquip) this.gearSkillDb = itemDbGear.filter( item => item.kind === ITEMKIND_SKILL_ATTACK ) @@ -49,16 +53,15 @@ class WeaponCalcTool extends Component { ).then(allItems => { let reducedItemDb = Object.values(allItems) .filter(item => { - const { kind, ReqMinLevel } = item + const { kind, ReqMinLevel, name } = item if (kind === ITEMKIND_SKILL_ATTACK) { return true } - if ( - ReqMinLevel > 103 && - ReqMinLevel < 109 && - (advWeapons.indexOf(kind) !== -1 || - standardWeapons.indexOf(kind) !== -1) - ) { + if (name.charAt(0) !== '\\') { + return false + } + // noinspection RedundantIfStatementJS + if (ReqMinLevel > 103 && ReqMinLevel <= 115 && isEquip(item)) { return true } return false @@ -71,7 +74,11 @@ class WeaponCalcTool extends Component { config.apibase + 'chromerivals/omi?category=rareitems' ).then(allFixes => { let fixDb = Object.values(allFixes) - .filter(fix => fix.probability !== 0) + .filter( + fix => + fix.probability !== 0 && + ['m', 'c', 'r', 'l', 'y'].indexOf(fix.name.charAt(1)) !== -1 + ) .sort((a, b) => a.probability - b.probability) this.setState({ fixDb }) }) @@ -100,7 +107,7 @@ class WeaponCalcTool extends Component { value={def || ''} > - {this.state.fixDb + {this.itemFixDb .filter(fix => { if (prefix) { return fix.id < 5000 @@ -124,15 +131,29 @@ class WeaponCalcTool extends Component { return } - // TODO: Filter fixlist by itemkind - const { gear, selWeap, itemprefix, itemsuffix, fixDb } = this.state + + // When selected item changes, recalculate fix db to unset no longer matching selections + let prevItemKind + if (this.selectedItem) { + prevItemKind = this.selectedItem.kind + } + // eslint-disable-next-line this.selectedItem = this.gearItemDb.find(item => item.id == selWeap) + + if (!this.selectedItem) { + this.itemFixDb = [] + } else if (this.selectedItem.kind !== prevItemKind) { + this.itemFixDb = fixDb.filter(fix => { + return COMPARE_ITEMKIND(fix.ReqItemKind, this.selectedItem.kind) + }) + } + // eslint-disable-next-line - this.prefix = fixDb.find(fix => fix.id == itemprefix) + this.prefix = this.itemFixDb.find(fix => fix.id == itemprefix) // eslint-disable-next-line - this.suffix = fixDb.find(fix => fix.id == itemsuffix) + this.suffix = this.itemFixDb.find(fix => fix.id == itemsuffix) return (
diff --git a/src/components/About.js b/src/components/About.js deleted file mode 100644 index b02b524..0000000 --- a/src/components/About.js +++ /dev/null @@ -1,32 +0,0 @@ -import React, { PureComponent } from 'react' -import { connect } from 'react-redux' -import { Helmet } from 'react-helmet' -import MarkdownViewer from './MarkdownViewer' - -class About extends PureComponent { - render() { - const { content } = this.props - - return ( -
- - - About - - - -
- ) - } -} - -const mapStateToProps = state => { - return { - content: state.cms.contents.about - } -} - -export default connect(mapStateToProps)(About) diff --git a/src/components/Contact.js b/src/components/Contact.js deleted file mode 100644 index 6b681df..0000000 --- a/src/components/Contact.js +++ /dev/null @@ -1,140 +0,0 @@ -import React, { Component } from 'react' -import { Helmet } from 'react-helmet' - -import tobiasImg from '../img/techguy_t.jpg' - -const SrcLinkFE = () => { - return ( - - Frontend - - ) -} - -const SrcLinkBE = () => { - return ( - - API-Backend - - ) -} - -const TS3Ref = () => { - return ( - - Address:{' '} - - vi0lation.de - - - ) -} - -class Contact extends Component { - shouldComponentUpdate() { - return false - } - - render() { - return ( -
- - - Contact - - -

Contact

- -
-

Tech guy

- -
-
-
-
-
- Tobias -
-
-
-

Tobias

-

- - IGN - : DrDelay -

-
-
-
-

- Discord: DrDelay#1337 -

-

- - 📧 - {' '} - - info@vi0lation.de - {' '} - ( - PGP - ) -

-
-
-
-
- -
-

TeamSpeak

-

- -

-
- -
-

Site Source-Code

-
    -
  • - -
  • -
  • - -
  • -
-
-
- ) - } -} - -export default Contact -export { SrcLinkFE, SrcLinkBE, TS3Ref } diff --git a/src/components/Footer.js b/src/components/Footer.js index 4893e9c..ba30dfc 100644 --- a/src/components/Footer.js +++ b/src/components/Footer.js @@ -1,5 +1,4 @@ import React, { Component } from 'react' -import Link from 'react-router-dom/Link' class Footer extends Component { shouldComponentUpdate() { @@ -10,24 +9,7 @@ class Footer extends Component { return ( ) diff --git a/src/components/Home.js b/src/components/Home.js index 4a25e12..66b2f01 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -9,37 +9,15 @@ class Home extends Component { render() { return (
-

Vi0

+

ChromeRivals Tools

- +
-

AirRivals/AceOnline

-

Tools & Stats

-
-
- -
- -
- -
-
-

TeamSpeak 3

-

Listing of the TS3 Servers

-
-
- -
- -
- -
-
-

TERA

-

Gameplay / services / stats

+

WeaponCalc

+

Item/gear stats

diff --git a/src/components/LoadSpinner.css b/src/components/LoadSpinner.css index 40bf90f..221d783 100644 --- a/src/components/LoadSpinner.css +++ b/src/components/LoadSpinner.css @@ -10,8 +10,8 @@ height: 46px; margin: 1px; border-radius: 50%; - border: 5px solid #df691a; - border-color: #df691a transparent #df691a transparent; + border: 5px solid #006488; + border-color: #006488 transparent #006488 transparent; animation: lds-dual-ring 1.2s linear infinite; } @keyframes lds-dual-ring { diff --git a/src/components/Navi.js b/src/components/Navi.js index c97f292..e9a490c 100644 --- a/src/components/Navi.js +++ b/src/components/Navi.js @@ -2,17 +2,7 @@ import React, { Component } from 'react' import withRouter from 'react-router/withRouter' import NavLink from './NavLink' -import classNames from 'classnames' - -import { highscoresUrl, crTopKillsIntervalUrl } from '../routes' - -const NavTab = props => { - return ( -
- {props.children} -
- ) -} +import { crTopKillsIntervalUrl } from '../routes' const responsiveExpandedClass = 'is-active' const mainNav = 'mainNav' @@ -45,7 +35,7 @@ class Navi extends Component {
- Vi0 + CRT
- - - AR/AO - -
- FrameBreak Tool - StatCalc - EP List - Prokyon/DE Highscores - - ChromeRivals Ranking - - - ChromeRivals Fame chart - - - ChromeRivals Online-players - -
-
- - - TeamSpeak 3 - - - - - TERA - - + + WeaponCalc +
diff --git a/src/components/TERA.js b/src/components/TERA.js deleted file mode 100644 index 1b518a3..0000000 --- a/src/components/TERA.js +++ /dev/null @@ -1,39 +0,0 @@ -import React, { Component } from 'react' -import { Helmet } from 'react-helmet' - -class TERA extends Component { - shouldComponentUpdate() { - return false - } - - render() { - return ( -
- - - TERA - - -

TERA

- -
-

DPS Meter Server

- An instance of{' '} - - tera-dpsmeter-server - {' '} - is deployed at{' '} - tera-dps.vi0lation.de. -
-
- ) - } -} - -export default TERA diff --git a/src/components/TS3List.js b/src/components/TS3List.js deleted file mode 100644 index 7d5a3f3..0000000 --- a/src/components/TS3List.js +++ /dev/null @@ -1,56 +0,0 @@ -import React, { Component } from 'react' -import { Helmet } from 'react-helmet' - -const TSRef = props => { - let { url, port } = props.server - - return ( -
  • - - {url} - {' '} - (Port: {port}) -
  • - ) -} - -class TS3List extends Component { - static tsServers = [ - { url: 'vi0lation.de', port: 9987 }, - { url: 'aces.vi0lation.de', port: 9994 }, - { url: 'benson.vi0lation.de', port: 9991 }, - { url: 'epic.vi0lation.de', port: 9993 }, - { url: 'hon.vi0lation.de', port: 9990 }, - { url: 'topgun.vi0lation.de', port: 9988 }, - { url: 'um.vi0lation.de', port: 9989 }, - { url: 'unity.vi0lation.de', port: 9992 } - ] - - shouldComponentUpdate() { - return false - } - - render() { - return ( -
    - - - TeamSpeak 3 Server - - -

    TeamSpeak 3 Server

    - -
      - {this.constructor.tsServers.map(server => ( - - ))} -
    -
    - ) - } -} - -export default TS3List diff --git a/src/components/TS404Server.js b/src/components/TS404Server.js deleted file mode 100644 index a381ed2..0000000 --- a/src/components/TS404Server.js +++ /dev/null @@ -1,44 +0,0 @@ -import React, { Component } from 'react' -import { Helmet } from 'react-helmet' -import Link from 'react-router-dom/Link' - -class TS404Server extends Component { - shouldComponentUpdate() { - return false - } - - render() { - return ( -
    - - - TS3 404-Server - - -

    TS3 404-Server

    - -

    - Getting routed to the 404-Server instead of your intended destination - can generally mean two things: -

    -
      -
    • - There was a temporary with the TSDNS service. Trying to connect - again a bit later will most likely work. -
    • -
    • - You entered an address that is not or no longer mapped to a server -
    • -
    -

    - Refer to the list of available TS3 Servers. -

    -
    - ) - } -} - -export default TS404Server diff --git a/src/containers/AR/Highscores.js b/src/containers/AR/Highscores.js deleted file mode 100644 index 629ab2f..0000000 --- a/src/containers/AR/Highscores.js +++ /dev/null @@ -1,223 +0,0 @@ -import React, { Component } from 'react' -import { Helmet } from 'react-helmet' -import { connect } from 'react-redux' -import PropTypes from 'prop-types' -import Flatpickr from 'react-flatpickr' -import 'flatpickr/dist/themes/material_blue.css' -import dateformat from 'date-fns/format' -import NumTD from '../../components/AR/NumTD' -import { minDate, maxDate } from '../../data/dataset' -import { calcProgessBarByEp } from '../../utils/AR/ep' -import { fetchHighscoreIfNeeded } from '../../actions/highscores' -import { highscoresUrl } from '../../routes' -import withRouter from 'react-router/withRouter' -import { isNode } from '../../utils/env' - -const region = 'de' - -class Ranking extends Component { - // TODO: shouldUpdate - - bootstrap() { - if (isNode) { - return this.queryCurrentDate() - } - } - - componentDidMount() { - this.queryCurrentDate() - } - - componentDidUpdate(prevProps) { - if (this.props.date !== prevProps.date) { - this.queryCurrentDate() - } - } - - queryCurrentDate() { - const { dispatch, date } = this.props - return this.constructor.queryForDate(dispatch, date) - } - - static queryForDate(dispatch, date) { - let hsPromise = dispatch(fetchHighscoreIfNeeded(region, date)) - - return hsPromise - } - - dateSelected(v) { - let dateSelected = dateformat(v[0], 'YYYY-MM-DD') - const { date, history } = this.props - - if (date === dateSelected) { - return - } - - history.push(highscoresUrl + '/' + dateSelected) - } - - tableInfo() { - return ( - - - # - - Name - Gear - Level - Fame - - W - - - L - - - P - - Brigade - Nation - - ) - } - - renderLoadingIndicator() { - const { data } = this.props - if (data || data === false) { - return null - } - return ... - } - - renderForm() { - const { date } = this.props - - return ( - // TODO: Auslagern von generischen Form Stuff -
    e.preventDefault()} className="margin-bot"> -
    -
    - -
    -
    -
    -

    - -

    -
    -
    -
    {this.renderLoadingIndicator()}
    -
    -
    -
    -
    - ) - } - - render() { - const { data, date } = this.props - const is404 = data === false - - if (is404 && this.context.router.staticContext) - this.context.router.staticContext.statusCode = 404 - - return ( -
    - - - {`AirRivals.de ${date} Player Highscores`} - - -

    AirRivals.de Highscores

    -

    {date}

    - - {this.renderForm()} - - {is404 ? ( -
    - No data available for the selected date -
    - ) : ( - this.renderTable(data) - )} -
    - ) - } - - renderTable(data) { - return ( -
    - - {this.tableInfo()} - - {data && - data.map(function(row, idx) { - return ( - - - - - - - - - - - - - ) - })} - - {this.tableInfo()} -
    {idx + 1}{row.name}{row.gear}{calcProgessBarByEp(row.data.ep, row.data.level)}{row.brigade}{row.nation}
    -
    - ) - } -} - -Ranking.propTypes = { - // TODO -} - -Ranking.contextTypes = { - router: PropTypes.shape({ - staticContext: PropTypes.object - }).isRequired -} - -const mapStateToProps = (state, ownProps) => { - const regionData = state.highscores[region] - const { date } = ownProps.match.params - - let data = null - if (regionData) { - const dateData = regionData[date] - if (dateData) { - data = dateData.data - } - } - - return { - date, - data - } -} - -export default withRouter(connect(mapStateToProps)(Ranking)) diff --git a/src/containers/App.js b/src/containers/App.js index b0f3cca..7c40467 100644 --- a/src/containers/App.js +++ b/src/containers/App.js @@ -10,32 +10,26 @@ import Footer from '../components/Footer' import { isNode } from '../utils/env' -import { fetchCmsIfNeeded } from '../actions/cms' - const defaultMeta = () => { return ( - + ) } -export const queryData = dispatch => { - return dispatch(fetchCmsIfNeeded('all')) -} - class App extends Component { bootstrap() { if (isNode) { - return queryData(this.props.dispatch) + // return queryData(this.props.dispatch) } } componentDidMount() { - queryData(this.props.dispatch) + // queryData(this.props.dispatch) } render() { diff --git a/src/data/ao.js b/src/data/ao.js index b84c133..3185b24 100644 --- a/src/data/ao.js +++ b/src/data/ao.js @@ -8,4 +8,23 @@ export const unitKinds = { export const standardWeapons = [0, 1, 2, 3, 4, 5, 6, 7] export const advWeapons = [8, 9, 10, 11, 12, 13, 14, 15] +const ITEMKIND_PRIMARY_WEAPON = 44 export const ITEMKIND_SKILL_ATTACK = 50 +const ITEMKIND_SECONDARY_WEAPON = 48 +export const ITEMKIND_DEFENSE = 16 + +export const IS_PRIMARY_WEAPON = kind => standardWeapons.indexOf(kind) !== -1 +export const IS_SECONDARY_WEAPON = kind => advWeapons.indexOf(kind) !== -1 + +export const COMPARE_ITEMKIND = (_REQ_ITEM_KIND, _TARGET_KIND_VAR) => { + switch (_REQ_ITEM_KIND) { + case ITEMKIND_PRIMARY_WEAPON: + return IS_PRIMARY_WEAPON(_TARGET_KIND_VAR) + case ITEMKIND_SECONDARY_WEAPON: + return IS_SECONDARY_WEAPON(_TARGET_KIND_VAR) + case ITEMKIND_DEFENSE: + return _TARGET_KIND_VAR === ITEMKIND_DEFENSE + default: + throw new Error('Unexpected _REQ_ITEM_KIND') + } +} diff --git a/src/data/dataset.js b/src/data/dataset.js deleted file mode 100644 index 85da710..0000000 --- a/src/data/dataset.js +++ /dev/null @@ -1,2 +0,0 @@ -export const minDate = '2012-01-01' -export const maxDate = '2016-08-24' diff --git a/src/img/techguy_t.jpg b/src/img/techguy_t.jpg deleted file mode 100644 index 0bee3acaf153364283d4f82eb1ccc078c8861bdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3439 zcmb7`X*AUT+sD7Nm>F9cMlr@dWJ~s?O;b#k$k?}#b!^4BqePLY7~9y_EM;iy3?q_| z5EaJ0B-usClJw)RU-x~^|LOhyJp7#VKG%6&*Mrx=@WB+orH|Lc10WCpfDRvUFa|sX z5HJ`V#)5#u;jF9(HVzag2Rl0lKR3@&lptDINDz&|h+ySUh=|FFV=z+c(sBxlDk>_% zCp6D#D4ms8R#5`6va)ipbMSF;@+pa8M3w&EIcNcp2p|*)g@D8WFcJhof)3gM%;AhI zpg*JjUs%8pC=3pO5C@|G;_pY!a|XlLr6aAJz`GwyJ#Nj3<{9#WaB40GQ_m=C7x_N4 zx~0A8rYHTuRH68bY|FjJcWSvqypZ{6!m*}d=I5W>N%EWBkOL9x`~91})bP6!7MmqY zVO37h3E_JT@y3k#XbqJBZC!7}u$g>T_sA4c9Zrj^;hsohQJJ|Z_s0c|t&xppo@)10 z+_t)AXD^)X22|8=uqUh6tk-(tNRyP;B{+O+(`pj7c{A>6aU3e+-0Ow;<^5_g_w-o` zudkR=Oq^Gu@sI4Rfg^L5RYNl(sy&S*Esb3 zfWQzK@GlB5*CC=s36oa-MfBJAqbna7>Cd*%>T7GMTE_-yGoouwZLX>@c-0s85=D7g zs?9^xXqpPy>X5(1hrR#Z41uzM0TArpV#uH31mtuXe}}^YP$Y{ejGIRh zCq{syt}9)1@(bg|Dw~iJ@+vQhKcKYq{_kEvS^)b6V;gpy=MS5ziiqsbX>shYY}d8> zTO_Qw#JPE^r%e1LubEg4!Mo^^<|#=>l&!K%izE zIfV1leU*MLJp^oco#5%#H+zZkPF6 z?n!|Z62sTF7u;w{Qk!jRp2Y*P&00{<-4kfSv~7;0fX zyq)P|+k}_SL-<-@_R!MdRw^lej1D*6J+1Y)6$2m4eXpP)x7%|yv8S|247_KBllT*- z^RdRqH}be&g1=(#l#Si|2f|i zL%Y~$;KMy?JHpKmW^r60Bk2ymwfhIB4Qyqf<(O-T@}Z|!m0l;Gwx@Ttyc^DF8oXuE zHL*k(6A#pFH?*-Ewo`x`Cx8B^l|eyCUCaufD?NFPQ?EO%WwpMHC4H`!S{Lx~qIdab z#m7BZhVnJ#YsdFZuN~Vzyh)E^dGNG=@+a)r)6qFe{j;cNx^1u?55=YElF?S7R48%d zg$VF~(@08c5U5NX~xd&6+8vyZxr(4&vHgn#W(w@%aRvn*TToyPN^%g&TzjZA8%(zS7*gL2mhmN>9zU8 z5(;%K6KpgzcqCV5{zgn8Zqs#`*@F^E7c>hoyf<1Wkwh!rE48R&R}Pc=hH`nZoRPjF zf~VN#&YIQku`wC1ZLGhBobUV+?fB(ur|NOc^157naHF^1_9Qpk3c=IT?Y6v2O?nQZ z%`?}BjHD3#$Qtu^`I*q|&gWkZtQejvZhdrq12tu|Ps+Ks*P4YXuFholT29Z5VrK3m zYT*?jzBcc@p!MOM{9CL7$hJ!N&MkCR9plk}%6D<0U0NzgkM>Beo#7lMtV^+#o@mma z4}`4J)oS`i^v+gXL4v$vhXr4sEBcLVVl;xKEk?mV3H?Vd6w^;SwYO_h5L<{A|3t1u zhOo{a)Bc`hodM(2^~F%*+zydXwf+YH)?wF;%)`@wA6c(u%2A!J<|eLAEXtkYPntrm zmKqOFT;>xSSHAszn%Y}FORjql?01X^f6LJEEyTjpUrC(nv1?U1eiRj+!2A+V<|1kW ziNogO&r^lAuy^$9?F{O?&4#K3ROxdX^4FRg0GWjXy9ylu5<|nE&iqB$ClX+j)j0Xh z=)_`OJLRb!_INbm_b|lSlo$tXtlZM{P}!xxPtYnpMp?VWZpa24flw7spfVmFdj^iu zTX~8a{U-|18;{u|49dBleXL)5Cfss+u)iXQJ(gS${1j_Gkw*#4SeiNROc~1>=z8IT z=Wi-}{v^G@rN8VL^>L>>$|XC(lTEZKMRD}h)$Q;5{xF&v``b&IBJ0qJ$e8@^$`wBH&%&bvVw~x%shgng$8pP z8+0+j@VU-yK2qqU%soE0WE(Z#hmKK?B3z!NMcy>wk}(v`E~p_lbnjRj%w1 zVEgItoW1^okFPj-}1q$Zt<0DgLBISgYF041Ax^3VZCd zZH_$vHW&q0&~AAj!goA2-v7LsV0w|y#eCCBGX1<|_?AJ*jTtA|u>GyB{clEc||q=Hw$XX+FdcKkIaZEHpLiXgmiYbQd4i{E#P z`St9gIo8HiPW`gTjYtE{F<$aGuT5jW^=m1XYU%BsA+9!Am_-s}(Zn^uX8yOnyfdU_ zOSSdwL_<;7eJE+V{@0D*?+&LQRhDX|Cd%WmGtBQdZWQW>%W~aZHPY%W7LjR6q@PjB z;_`}^n(4P8sVBc~E|2c3?DaMg9JdQN0BVMyc6QOF4s%nBT3vwpZ}T?~g#<$5L*1iZ?Jut6p8Cmsf+-gUhj5QD;>JlvTS4Meh~aSb_;P@8Ft7pDGA?C7y~eav7v3 z1Y#`e=Y3kX`jeAov-kD8Pe1+COuHX$I=P`s$gCZZ81;953VVGhLy|}Ud>9Y}3i)F~ zhXH{B2o%Y!D9Qrk;t|6UlrARx^*GR>`uyzN5~0TU&f6R9NN=eLVYJ;Uy!lHFgI%mQ zm)ycwA5@$PHwChJGfmeU0;e4etO?Mzwcr+VvW8_V`RlHs`c%6kJVCvq zD>k2KA!+aDuJS2!$c@OiN#o@6U2>2ND$~F2L=U}kH>K^^DZI_QP~1O{g%{K7&_#g` z&B;d#!?cerc*0-~?y~fABiC&R+S_xwK|P$qsaCXP9f#WS5BRE7$QCNnSo;tQ_74^i z^pE5JrSh*NBB9(oqAXluiZ}vF>92$SfwI~Eb4TK(``SR7uqzSY(`mS{^2whLG2$q&2MiQ}cpBp|e^ zJH~38w0b4q3bqu-)|d6EP_{KXxefpgV diff --git a/src/reducers/cms.js b/src/reducers/cms.js deleted file mode 100644 index 21d6923..0000000 --- a/src/reducers/cms.js +++ /dev/null @@ -1,36 +0,0 @@ -import { REQUEST, RECEIVE } from '../types/cms' -import { getCurrentTS } from '../utils/api' - -const initialState = { - requests: {}, - contents: {} -} - -export default function reducer(state = initialState, action) { - switch (action.type) { - case REQUEST: - return Object.assign({}, state, { - requests: Object.assign({}, state.requests, { - [action.page]: Object.assign({}, state.requests[action.page], { - isFetching: getCurrentTS() - }) - }) - }) - - case RECEIVE: - let { response, receivedAt } = action - - return Object.assign({}, state, { - requests: Object.assign({}, state.requests, { - [action.page]: Object.assign({}, state.requests[action.page], { - isFetching: false, - receivedAt - }) - }), - contents: Object.assign({}, state.contents, response) - }) - - default: - return state - } -} diff --git a/src/reducers/highscores.js b/src/reducers/highscores.js deleted file mode 100644 index 8338604..0000000 --- a/src/reducers/highscores.js +++ /dev/null @@ -1,33 +0,0 @@ -import { REQUEST, RECEIVE } from '../types/highscores' -import { getCurrentTS } from '../utils/api' - -const initialState = { - de: {} -} - -export default function reducer(state = initialState, action) { - let { region, date } = action - let regionData = Object.assign({}, state[region]) - switch (action.type) { - case REQUEST: - return Object.assign({}, state, { - [region]: Object.assign(regionData, { - [date]: { - isFetching: getCurrentTS() - } - }) - }) - case RECEIVE: - const { response } = action - return Object.assign({}, state, { - [region]: Object.assign(regionData, { - [date]: { - isFetching: false, - data: response.date ? false : response // object with date key -> an error occured - } - }) - }) - default: - return state - } -} diff --git a/src/reducers/index.js b/src/reducers/index.js index e2627c4..a75dfc7 100644 --- a/src/reducers/index.js +++ b/src/reducers/index.js @@ -1,11 +1,7 @@ import { combineReducers } from 'redux' -import highscores from './highscores' -import cms from './cms' import cr from './cr' export default combineReducers({ - highscores, - cms, cr }) diff --git a/src/routes.js b/src/routes.js index be816ef..830735f 100644 --- a/src/routes.js +++ b/src/routes.js @@ -1,24 +1,13 @@ import React from 'react' -import Redirect from 'react-router/Redirect' import Home from './components/Home' -import TS3List from './components/TS3List' -import TERA from './components/TERA' -import TS404Server from './components/TS404Server' -import About from './components/About' -import Contact from './components/Contact' - -import RankingInfo from './components/AR/RankingInfo' import NoMatch from './components/NoMatch' -import { maxDate } from './data/dataset' - import lazyImport from './utils/lazyImportHack' import { asyncComponent } from 'react-async-component' import LoadBlock from './components/LoadBlock' -export const highscoresUrl = '/ranking/de/highscores' export const crTopKillsIntervalUrl = '/ranking/chromerivals/topkillsinterval' const LoadingComponent = () => @@ -37,57 +26,13 @@ const routes = [ component: Home }, { - path: '/ts3', - component: TS3List - }, - { - path: '/tera', - component: TERA - }, - { - path: '/404server', - component: TS404Server - }, - { - path: '/about', - component: About - }, - { - path: '/contact', - component: Contact - }, - { - path: '/ranking', - exact: true, - component: RankingInfo - }, - { - path: '/ranking/eplist', - component: makeAsync(() => lazyImport(import('./components/AR/EPList'))) - }, - { - path: '/ranking/fbtool', - component: makeAsync(() => lazyImport(import('./components/AR/FBTool'))) - }, - { - path: '/ranking/statcalc', + path: '/statcalc', component: makeAsync(() => lazyImport(import('./components/AR/StatCalc'))) }, - /* { - path: '/ranking/weaponcalc', + path: '/weaponcalc', component: makeAsync(() => lazyImport(import('./components/AR/WeaponCalc'))) }, - */ - { - path: highscoresUrl, - exact: true, - component: () => - }, - { - path: highscoresUrl + '/:date(\\d{4}-\\d{2}-\\d{2})', - component: makeAsync(() => lazyImport(import('./containers/AR/Highscores'))) - }, { path: crTopKillsIntervalUrl, component: makeAsync(() => diff --git a/src/style/bulma.scss b/src/style/bulma.scss index d2d8187..892662b 100644 --- a/src/style/bulma.scss +++ b/src/style/bulma.scss @@ -7,9 +7,9 @@ $family-sans-serif: 'Roboto', sans-serif; $family-primary: $family-sans-serif; -$background-color: #2b3e50; +$background-color: #080325; -$primary: #df691a; +$primary: #006488; $viowhite: #ebebeb; diff --git a/src/types/cms.js b/src/types/cms.js deleted file mode 100644 index caf9421..0000000 --- a/src/types/cms.js +++ /dev/null @@ -1,4 +0,0 @@ -const prefix = 'CMS/' - -export const REQUEST = prefix + 'REQUEST' -export const RECEIVE = prefix + 'RECEIVE' diff --git a/src/types/highscores.js b/src/types/highscores.js deleted file mode 100644 index 0cb2a02..0000000 --- a/src/types/highscores.js +++ /dev/null @@ -1,5 +0,0 @@ -const prefix = 'HIGHSCORES/' - -export const REQUEST = prefix + 'REQUEST' -export const RECEIVE = prefix + 'RECEIVE' -export const REQFAIL = prefix + 'REQFAIL' diff --git a/src/utils/AR/names.js b/src/utils/AR/names.js index 7667f74..7d4c32c 100644 --- a/src/utils/AR/names.js +++ b/src/utils/AR/names.js @@ -3,7 +3,18 @@ import React from 'react' const colorMap = { e: '#F5B930', c: '#00FFFF', - m: '#ff00ff' + m: '#ff00ff', + a: '#bbbbff', + h: '#ff8811', + k: '#aa4400', + u: '#aa33ff', + v: '#007300', + b: '#2255ff', + d: '#777777', + y: '#ffff00', + l: '#00aaff', + g: '#00ff00', + r: '#ff0000' } function specialNames(name) { From 66fb7742b9612e21033e24f3b867d33ae5cc2b9f Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sun, 8 Dec 2019 00:10:33 +0100 Subject: [PATCH 02/50] Update deps --- package-lock.json | 1224 ++++++++++++++++++++++++++++++++------------- package.json | 18 +- 2 files changed, 888 insertions(+), 354 deletions(-) diff --git a/package-lock.json b/package-lock.json index d780003..71907bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,19 +13,19 @@ } }, "@babel/core": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.2.tgz", - "integrity": "sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.5.tgz", + "integrity": "sha512-M42+ScN4+1S9iB6f+TL7QBpoQETxbclx+KNoKJABghnKYE+fMzSGqst0BZJc8CpI625bwPwYgUyRvxZ+0mZzpw==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.2", - "@babel/helpers": "^7.6.2", - "@babel/parser": "^7.6.2", - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.2", - "@babel/types": "^7.6.0", - "convert-source-map": "^1.1.0", + "@babel/generator": "^7.7.4", + "@babel/helpers": "^7.7.4", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", "json5": "^2.1.0", "lodash": "^4.17.13", @@ -44,75 +44,95 @@ } }, "@babel/generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz", - "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", "dev": true, "requires": { - "@babel/types": "^7.6.0", + "@babel/types": "^7.7.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.4" } }, "@babel/helpers": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz", - "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz", + "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==", "dev": true, "requires": { - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.2", - "@babel/types": "^7.6.0" + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/parser": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz", - "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==", "dev": true }, "@babel/template": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", - "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.0" + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/traverse": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz", - "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.2", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.2", - "@babel/types": "^7.6.0", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -120,11 +140,14 @@ "to-fast-properties": "^2.0.0" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } } } }, @@ -132,6 +155,7 @@ "version": "7.3.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.0.tgz", "integrity": "sha512-dZTwMvTgWfhmibq4V9X+LMf6Bgl7zAodRn9PvcPdhlzFMbvUutx74dbEv7Atz3ToeEpevYEJtAwfxq/bDCzHWg==", + "dev": true, "requires": { "@babel/types": "^7.3.0", "jsesc": "^2.5.1", @@ -144,6 +168,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -152,6 +177,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.1.0", "@babel/types": "^7.0.0" @@ -171,6 +197,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.4.4", "@babel/traverse": "^7.4.4", @@ -181,6 +208,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "dev": true, "requires": { "@babel/types": "^7.4.4", "jsesc": "^2.5.1", @@ -193,6 +221,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, "requires": { "@babel/types": "^7.4.4" } @@ -200,12 +229,14 @@ "@babel/parser": { "version": "7.4.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==" + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "dev": true }, "@babel/traverse": { "version": "7.4.5", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/generator": "^7.4.4", @@ -222,6 +253,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.11", @@ -314,6 +346,30 @@ } } }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz", + "integrity": "sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A==", + "requires": { + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + }, + "dependencies": { + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + } + } + }, "@babel/helper-define-map": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz", @@ -342,6 +398,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, "requires": { "@babel/traverse": "^7.1.0", "@babel/types": "^7.0.0" @@ -351,6 +408,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.0.0", "@babel/template": "^7.1.0", @@ -361,6 +419,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -369,6 +428,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "dev": true, "requires": { "@babel/types": "^7.4.4" }, @@ -377,6 +437,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.11", @@ -398,6 +459,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -406,6 +468,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz", "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==", + "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-simple-access": "^7.1.0", @@ -419,6 +482,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, "requires": { "@babel/types": "^7.4.4" } @@ -426,12 +490,14 @@ "@babel/parser": { "version": "7.4.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==" + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "dev": true }, "@babel/template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.4.4", @@ -442,6 +508,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.11", @@ -454,6 +521,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -475,6 +543,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", "@babel/helper-wrap-function": "^7.1.0", @@ -557,6 +626,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, "requires": { "@babel/template": "^7.1.0", "@babel/types": "^7.0.0" @@ -566,6 +636,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -574,6 +645,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", "@babel/template": "^7.1.0", @@ -674,12 +746,14 @@ "@babel/parser": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.1.tgz", - "integrity": "sha512-ATz6yX/L8LEnC3dtLQnIx4ydcPxhLcoy9Vl6re00zb2w5lG6itY6Vhnr1KFRPq/FHNsgl/gh2mjNN20f9iJTTA==" + "integrity": "sha512-ATz6yX/L8LEnC3dtLQnIx4ydcPxhLcoy9Vl6re00zb2w5lG6itY6Vhnr1KFRPq/FHNsgl/gh2mjNN20f9iJTTA==", + "dev": true }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/helper-remap-async-to-generator": "^7.1.0", @@ -687,108 +761,141 @@ } }, "@babel/plugin-proposal-class-properties": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", - "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz", + "integrity": "sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-create-class-features-plugin": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, "@babel/generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz", - "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", "requires": { - "@babel/types": "^7.6.0", + "@babel/types": "^7.7.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz", - "integrity": "sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz", + "integrity": "sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA==", "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-member-expression-to-functions": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4" + "@babel/helper-replace-supers": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "requires": { + "@babel/types": "^7.7.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz", + "integrity": "sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==", + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz", + "integrity": "sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==", "requires": { - "@babel/types": "^7.5.5" + "@babel/types": "^7.7.4" } }, "@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz", + "integrity": "sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/helper-member-expression-to-functions": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.4" } }, "@babel/parser": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz", - "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==" + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==" + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } }, "@babel/traverse": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz", - "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.2", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.2", - "@babel/types": "^7.6.0", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + } } }, "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" } } }, @@ -804,18 +911,19 @@ } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", - "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz", + "integrity": "sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0" + "@babel/plugin-syntax-dynamic-import": "^7.7.4" } }, "@babel/plugin-proposal-json-strings": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-json-strings": "^7.2.0" @@ -835,6 +943,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" @@ -855,6 +964,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -869,9 +979,9 @@ } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz", + "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -889,6 +999,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -906,6 +1017,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -914,6 +1026,15 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz", + "integrity": "sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -931,6 +1052,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -950,6 +1072,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -1054,6 +1177,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -1091,6 +1215,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -1110,6 +1235,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -1118,6 +1244,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -1127,6 +1254,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -1135,6 +1263,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -1174,6 +1303,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, "requires": { "@babel/helper-module-transforms": "^7.1.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -1192,6 +1322,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -1210,6 +1341,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "dev": true, "requires": { "@babel/helper-call-delegate": "^7.4.4", "@babel/helper-get-function-arity": "^7.0.0", @@ -1220,6 +1352,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -1278,6 +1411,7 @@ "version": "7.4.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "dev": true, "requires": { "regenerator-transform": "^0.14.0" } @@ -1286,6 +1420,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -1306,6 +1441,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -1323,6 +1459,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/helper-regex": "^7.0.0" @@ -1332,6 +1469,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -1341,6 +1479,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -1367,288 +1506,632 @@ } }, "@babel/preset-env": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.2.tgz", - "integrity": "sha512-Ru7+mfzy9M1/YTEtlDS8CD45jd22ngb9tXnn64DvQK3ooyqSw9K4K9DUWmYknTTVk4TqygL9dqCrZgm1HMea/Q==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.5.tgz", + "integrity": "sha512-wDPbiaZdGzsJuTWlpLHJxmwslwHGLZ8F5v69zX3oAWeTOFWdy4OJHoTKg26oAnFg052v+/LAPY5os9KB0LrOEA==", "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.6.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.6.2", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.5.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.6.2", - "@babel/plugin-transform-classes": "^7.5.5", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.6.0", - "@babel/plugin-transform-dotall-regex": "^7.6.2", - "@babel/plugin-transform-duplicate-keys": "^7.5.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.6.0", - "@babel/plugin-transform-modules-systemjs": "^7.5.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.2", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.5.5", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.6.2", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.6.2", - "@babel/types": "^7.6.0", + "@babel/plugin-proposal-async-generator-functions": "^7.7.4", + "@babel/plugin-proposal-dynamic-import": "^7.7.4", + "@babel/plugin-proposal-json-strings": "^7.7.4", + "@babel/plugin-proposal-object-rest-spread": "^7.7.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.4", + "@babel/plugin-syntax-async-generators": "^7.7.4", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/plugin-syntax-json-strings": "^7.7.4", + "@babel/plugin-syntax-object-rest-spread": "^7.7.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", + "@babel/plugin-syntax-top-level-await": "^7.7.4", + "@babel/plugin-transform-arrow-functions": "^7.7.4", + "@babel/plugin-transform-async-to-generator": "^7.7.4", + "@babel/plugin-transform-block-scoped-functions": "^7.7.4", + "@babel/plugin-transform-block-scoping": "^7.7.4", + "@babel/plugin-transform-classes": "^7.7.4", + "@babel/plugin-transform-computed-properties": "^7.7.4", + "@babel/plugin-transform-destructuring": "^7.7.4", + "@babel/plugin-transform-dotall-regex": "^7.7.4", + "@babel/plugin-transform-duplicate-keys": "^7.7.4", + "@babel/plugin-transform-exponentiation-operator": "^7.7.4", + "@babel/plugin-transform-for-of": "^7.7.4", + "@babel/plugin-transform-function-name": "^7.7.4", + "@babel/plugin-transform-literals": "^7.7.4", + "@babel/plugin-transform-member-expression-literals": "^7.7.4", + "@babel/plugin-transform-modules-amd": "^7.7.5", + "@babel/plugin-transform-modules-commonjs": "^7.7.5", + "@babel/plugin-transform-modules-systemjs": "^7.7.4", + "@babel/plugin-transform-modules-umd": "^7.7.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", + "@babel/plugin-transform-new-target": "^7.7.4", + "@babel/plugin-transform-object-super": "^7.7.4", + "@babel/plugin-transform-parameters": "^7.7.4", + "@babel/plugin-transform-property-literals": "^7.7.4", + "@babel/plugin-transform-regenerator": "^7.7.5", + "@babel/plugin-transform-reserved-words": "^7.7.4", + "@babel/plugin-transform-shorthand-properties": "^7.7.4", + "@babel/plugin-transform-spread": "^7.7.4", + "@babel/plugin-transform-sticky-regex": "^7.7.4", + "@babel/plugin-transform-template-literals": "^7.7.4", + "@babel/plugin-transform-typeof-symbol": "^7.7.4", + "@babel/plugin-transform-unicode-regex": "^7.7.4", + "@babel/types": "^7.7.4", "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", + "core-js-compat": "^3.4.7", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", "semver": "^5.5.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, "@babel/generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz", - "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", "requires": { - "@babel/types": "^7.6.0", + "@babel/types": "^7.7.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, + "@babel/helper-annotate-as-pure": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz", + "integrity": "sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==", + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz", + "integrity": "sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-call-delegate": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz", + "integrity": "sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==", + "requires": { + "@babel/helper-hoist-variables": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, "@babel/helper-define-map": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", - "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz", + "integrity": "sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==", "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.5.5", + "@babel/helper-function-name": "^7.7.4", + "@babel/types": "^7.7.4", "lodash": "^4.17.13" } }, + "@babel/helper-explode-assignable-expression": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz", + "integrity": "sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg==", + "requires": { + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz", + "integrity": "sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==", + "requires": { + "@babel/types": "^7.7.4" + } + }, "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz", + "integrity": "sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==", + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", + "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==", "requires": { - "@babel/types": "^7.5.5" + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz", + "integrity": "sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw==", + "requires": { + "@babel/helper-module-imports": "^7.7.4", + "@babel/helper-simple-access": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz", + "integrity": "sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==", + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz", + "integrity": "sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-wrap-function": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz", + "integrity": "sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/helper-member-expression-to-functions": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz", + "integrity": "sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==", + "requires": { + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz", + "integrity": "sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg==", + "requires": { + "@babel/helper-function-name": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/parser": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz", - "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==" + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz", + "integrity": "sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.7.4", + "@babel/plugin-syntax-async-generators": "^7.7.4" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz", + "integrity": "sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.7.4" + } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", - "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/plugin-syntax-object-rest-spread": "^7.7.4" } }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", - "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz", + "integrity": "sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz", + "integrity": "sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz", + "integrity": "sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz", + "integrity": "sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz", + "integrity": "sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz", + "integrity": "sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", - "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz", + "integrity": "sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg==", "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" + "@babel/helper-remap-async-to-generator": "^7.7.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz", + "integrity": "sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz", - "integrity": "sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz", + "integrity": "sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", - "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz", + "integrity": "sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-define-map": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/helper-replace-supers": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", "globals": "^11.1.0" } }, + "@babel/plugin-transform-computed-properties": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz", + "integrity": "sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-destructuring": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", - "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz", + "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz", - "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz", + "integrity": "sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" + "@babel/helper-create-regexp-features-plugin": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", - "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz", + "integrity": "sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz", + "integrity": "sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz", + "integrity": "sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz", + "integrity": "sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==", + "requires": { + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz", + "integrity": "sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz", + "integrity": "sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", - "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz", + "integrity": "sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ==", "requires": { - "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-module-transforms": "^7.7.5", "@babel/helper-plugin-utils": "^7.0.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", - "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz", + "integrity": "sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q==", "requires": { - "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-module-transforms": "^7.7.5", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-simple-access": "^7.7.4", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", - "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz", + "integrity": "sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw==", "requires": { - "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-hoist-variables": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, + "@babel/plugin-transform-modules-umd": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz", + "integrity": "sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw==", + "requires": { + "@babel/helper-module-transforms": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz", - "integrity": "sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz", + "integrity": "sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.7.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz", + "integrity": "sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg==", "requires": { - "regexpu-core": "^4.6.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-object-super": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", - "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz", + "integrity": "sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5" + "@babel/helper-replace-supers": "^7.7.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz", + "integrity": "sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw==", + "requires": { + "@babel/helper-call-delegate": "^7.7.4", + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz", + "integrity": "sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz", + "integrity": "sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw==", + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz", + "integrity": "sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz", + "integrity": "sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", - "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz", + "integrity": "sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz", - "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", + "@babel/plugin-transform-sticky-regex": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz", + "integrity": "sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz", + "integrity": "sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz", + "integrity": "sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz", + "integrity": "sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/traverse": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz", - "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.2", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.2", - "@babel/types": "^7.6.0", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + } } }, "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -1663,22 +2146,55 @@ "object.assign": "^4.1.0" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "caniuse-lite": { + "version": "1.0.30001015", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001015.tgz", + "integrity": "sha512-/xL2AbW/XWHNu1gnIrO8UitBGoFthcsDgU9VLK1/dpsoxbaD5LscHozKze05R6WLsBvLhqv78dAPozMFQBYLbQ==" }, - "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "core-js-compat": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.7.tgz", + "integrity": "sha512-57+mgz/P/xsGdjwQYkwtBZR3LuISaxD1dEwVDtbk8xJMqAmwqaxLOvnNT7kdJ7jYE/NjNptyzXi+IQFMi/2fCw==", "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" + "browserslist": "^4.8.0", + "semver": "^6.3.0" + }, + "dependencies": { + "browserslist": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.2.tgz", + "integrity": "sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==", + "requires": { + "caniuse-lite": "^1.0.30001015", + "electron-to-chromium": "^1.3.322", + "node-releases": "^1.1.42" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "electron-to-chromium": { + "version": "1.3.322", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", + "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==" + }, + "node-releases": { + "version": "1.1.42", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.42.tgz", + "integrity": "sha512-OQ/ESmUqGawI2PRX+XIRao44qWYBBfN54ImQYdWVTQqUckuejOg76ysSqDBK8NG3zwySRVnX36JwDQ6x+9GxzA==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } } } @@ -1707,23 +2223,33 @@ } }, "@babel/register": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.6.2.tgz", - "integrity": "sha512-xgZk2LRZvt6i2SAUWxc7ellk4+OYRgS3Zpsnr13nMS1Qo25w21Uu8o6vTOAqNaxiqrnv30KTYzh9YWY2k21CeQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.7.4.tgz", + "integrity": "sha512-/fmONZqL6ZMl9KJUYajetCrID6m0xmL4odX7v+Xvoxcv0DdbP/oO0TWIeLUCHqczQ6L6njDMqmqHFy2cp3FFsA==", "dev": true, "requires": { "find-cache-dir": "^2.0.0", "lodash": "^4.17.13", - "mkdirp": "^0.5.1", + "make-dir": "^2.1.0", "pirates": "^4.0.0", - "source-map-support": "^0.5.9" + "source-map-support": "^0.5.16" }, "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } } } }, @@ -1739,6 +2265,7 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.2.2", @@ -1749,6 +2276,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/generator": "^7.2.2", @@ -1765,6 +2293,7 @@ "version": "7.3.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.0.tgz", "integrity": "sha512-QkFPw68QqWU1/RVPyBe8SO7lXbPfjtqAxRYQKpFpaB8yMq7X2qAqfwK5LKoQufEkSmO5NQ70O6Kc3Afk03RwXw==", + "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.10", @@ -3349,6 +3878,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/preset-env": { "version": "7.4.3", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.3.tgz", @@ -4108,28 +4646,21 @@ "dev": true }, "chart.js": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.8.0.tgz", - "integrity": "sha512-Di3wUL4BFvqI5FB5K26aQ+hvWh8wnP9A3DWGvXHVkO13D3DSnaSsdZx29cXlEsYKVkn1E2az+ZYFS4t0zi8x0w==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.3.tgz", + "integrity": "sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==", "requires": { "chartjs-color": "^2.1.0", "moment": "^2.10.2" } }, "chartjs-color": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.3.0.tgz", - "integrity": "sha512-hEvVheqczsoHD+fZ+tfPUE+1+RbV6b+eksp2LwAhwRTVXEjCSEavvk+Hg3H6SZfGlPh/UfmWKGIvZbtobOEm3g==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", "requires": { "chartjs-color-string": "^0.6.0", - "color-convert": "^0.5.3" - }, - "dependencies": { - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" - } + "color-convert": "^1.9.3" } }, "chartjs-color-string": { @@ -5151,6 +5682,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.3.tgz", "integrity": "sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA==", + "dev": true, "requires": { "browserslist": "^4.6.0", "core-js-pure": "3.1.3", @@ -5160,14 +5692,16 @@ "semver": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==" + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true } } }, "core-js-pure": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.3.tgz", - "integrity": "sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA==" + "integrity": "sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA==", + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -7605,9 +8139,9 @@ "dev": true }, "handlebars": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.2.tgz", - "integrity": "sha512-cIv17+GhL8pHHnRJzGu2wwcthL5sb8uDKBHvZ2Dtu5s1YNt0ljbzKbamnc+gr69y7bzwQiBdr5+hOpRd5pnOdg==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -7817,9 +8351,9 @@ } }, "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw==", "requires": { "react-is": "^16.7.0" } @@ -13515,14 +14049,13 @@ } }, "react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", - "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", + "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "prop-types": "^15.6.2" } }, "react-app-polyfill": { @@ -13717,14 +14250,14 @@ } }, "react-dom": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", - "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", + "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "scheduler": "^0.18.0" } }, "react-error-overlay": { @@ -13759,9 +14292,9 @@ } }, "react-is": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.7.0.tgz", - "integrity": "sha512-Z0VRQdF4NPDoI0tsXVMLkJLiwEBa+RP66g0xDHxgxysxSoCUccSten4RTF/UFvZF1dZvZ9Zu1sx+MDXwcOR34g==" + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" }, "react-lifecycles-compat": { "version": "3.0.4", @@ -13769,12 +14302,12 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-redux": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.1.1.tgz", - "integrity": "sha512-LE7Ned+cv5qe7tMV5BPYkGQ5Lpg8gzgItK07c67yHvJ8t0iaD9kPFPAli/mYkiyJYrs2pJgExR2ZgsGqlrOApg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.1.2.tgz", + "integrity": "sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q==", "requires": { "@babel/runtime": "^7.1.2", - "hoist-non-react-statics": "^3.1.0", + "hoist-non-react-statics": "^3.3.0", "invariant": "^2.2.4", "loose-envify": "^1.1.0", "prop-types": "^15.6.1", @@ -14625,9 +15158,9 @@ } }, "scheduler": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", - "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", + "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -15786,7 +16319,8 @@ "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true }, "trough": { "version": "1.0.4", diff --git a/package.json b/package.json index b3a9ad2..0ca6eb2 100644 --- a/package.json +++ b/package.json @@ -3,22 +3,22 @@ "version": "0.1.0", "private": true, "devDependencies": { - "@babel/core": "^7.6.2", - "@babel/register": "^7.6.2", + "@babel/core": "^7.7.5", + "@babel/register": "^7.7.4", "husky": "^0.14.3", "lint-staged": "^6.1.1", "prettier": "1.7.4", "react-scripts": "3.0.1" }, "dependencies": { - "@babel/plugin-proposal-class-properties": "^7.5.5", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/preset-env": "^7.6.2", + "@babel/plugin-proposal-class-properties": "^7.7.4", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/preset-env": "^7.7.5", "aceonline-framebreak": "^1.1.0", "aceonline-stats": "^1.2.0", "body-parser": "^1.19.0", "bulma": "^0.8.0", - "chart.js": "^2.8.0", + "chart.js": "^2.9.3", "classnames": "^2.2.6", "compression": "^1.7.4", "cross-env": "^5.2.1", @@ -36,14 +36,14 @@ "marked": "^0.7.0", "morgan": "^1.9.1", "prop-types": "^15.7.2", - "react": "^16.8.6", + "react": "^16.12.0", "react-async-bootstrapper": "^2.1.1", "react-async-component": "^2.0.0", "react-chartjs-2": "^2.8.0", - "react-dom": "^16.8.6", + "react-dom": "^16.12.0", "react-flatpickr": "^3.9.1", "react-helmet": "^5.2.1", - "react-redux": "^5.1.1", + "react-redux": "^5.1.2", "react-router-config": "^1.0.0-beta.4", "react-router-dom": "^4.3.1", "redux": "^3.7.2", From 14891d50628af4e75da7c2576c49e88f6a152a81 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sun, 8 Dec 2019 00:52:40 +0100 Subject: [PATCH 03/50] Fix favicon SSR --- server/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/app.js b/server/app.js index 2d71c46..1b5386c 100644 --- a/server/app.js +++ b/server/app.js @@ -20,7 +20,7 @@ const { indexhtmlDirect } = require('./indexhtml') const app = express() // Server favicon before to not show up in logs -app.use(favicon(path.join(__dirname, '../build', 'favicon.ico'))) +app.use(favicon(path.join(__dirname, '../build', 'icon.png'))) // Setup logger app.use(morgan('combined')) From 7685b8dbc75d3f46e024ac9fb3e2d13e9d98b690 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sun, 8 Dec 2019 16:09:37 +0100 Subject: [PATCH 04/50] WeaponCalc: Progress on Des param / stat gathering --- src/components/AR/WeaponCalc/WeaponPreview.js | 85 ++++++++++++++++--- src/components/AR/WeaponCalc/index.js | 12 ++- src/data/ao.js | 31 +++++++ 3 files changed, 113 insertions(+), 15 deletions(-) diff --git a/src/components/AR/WeaponCalc/WeaponPreview.js b/src/components/AR/WeaponCalc/WeaponPreview.js index 0f3c3f3..865ba1b 100644 --- a/src/components/AR/WeaponCalc/WeaponPreview.js +++ b/src/components/AR/WeaponCalc/WeaponPreview.js @@ -1,9 +1,16 @@ import React from 'react' import { colorName } from '../../../utils/AR/names' +import { + baseValuesToDesKeyMap, + desKeyByDesNum, + IS_PRIMARY_WEAPON, + IS_SECONDARY_WEAPON, + ITEMKIND_DEFENSE +} from '../../../data/ao' const WeaponPreview = props => { const { item, prefix, suffix } = props - let stats = visualizeStats(item) + let stats = mergeStats(collectStats(item)) return (
    @@ -17,7 +24,7 @@ const WeaponPreview = props => {
      {Object.keys(stats).map(attr => ( -
    • {`${attr}: ${stats[attr]}`}
    • +
    • {`${attr}: ${JSON.stringify(stats[attr])}`}
    • ))}
    @@ -26,17 +33,71 @@ const WeaponPreview = props => { ) } -const visualizeStats = item => { - let stats = { - 'Attack Power': item.AbilityMin + ' ~ ' + item.AbilityMax, - Accuracy: item.HitRate, - Pierce: item.FractionResistance, - Range: item.Range, - 'Reattack Time': item.ReAttacktime / 1000, - // TODO: Speed - Weight: item.Weight +const determinePrefix = item => { + if (IS_PRIMARY_WEAPON(item.kind)) { + return 'STD' } - return stats + if (IS_SECONDARY_WEAPON(item.kind)) { + return 'ADV' + } + if (item.kind === ITEMKIND_DEFENSE) { + return null + } + throw Error('Unexpected itemkind') +} + +const collectStats = item => { + let values = {} + + let desKeyPrefix = determinePrefix(item) + + Object.keys(baseValuesToDesKeyMap).forEach(prop => { + if (item[prop]) { + let desKey = baseValuesToDesKeyMap[prop] + if (desKey.charAt(0) === '_') { + if (!desKeyPrefix) { + throw Error('Not a weapon item') + } + desKey = desKeyPrefix + desKey + } + values[desKey] = item[prop] + } + }) + Object.keys(item.DesParameters).forEach(desNum => { + desNum = Number(desNum) + let desKey = desKeyByDesNum(desNum) + if (!desKey) { + console.warn(`DesNum ${desNum} not mapped`) + return + } + + if (!(desKey in values)) { + values[desKey] = 0 + } + + values[desKey] += item.DesParameters[desNum] + }) + + // TODO: Speed, Weight + + return { + base: values, + fixes: {}, // TODO + enchants: {} // TODO + } +} + +const mergeStats = stats => { + let res = {} + Object.keys(stats).forEach(key => { + Object.keys(stats[key]).forEach(desKey => { + if (!(desKey in res)) { + res[desKey] = {} + } + res[desKey][key] = stats[key][desKey] + }) + }) + return res } export default WeaponPreview diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index 1413f76..b393507 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -8,7 +8,8 @@ import { advWeapons, ITEMKIND_SKILL_ATTACK, ITEMKIND_DEFENSE, - COMPARE_ITEMKIND + COMPARE_ITEMKIND, + ITEMKIND_SKILL_DEFENSE } from '../../../data/ao' import LoadBlock from '../../LoadBlock' import WeaponPreview from './WeaponPreview' @@ -43,7 +44,9 @@ class WeaponCalcTool extends Component { let itemDbGear = itemdb.filter(item => item.ReqUnitKind & unitKinds[gear]) this.gearItemDb = itemDbGear.filter(isEquip) this.gearSkillDb = itemDbGear.filter( - item => item.kind === ITEMKIND_SKILL_ATTACK + item => + item.kind === ITEMKIND_SKILL_ATTACK || + item.kind === ITEMKIND_SKILL_DEFENSE ) } @@ -54,7 +57,10 @@ class WeaponCalcTool extends Component { let reducedItemDb = Object.values(allItems) .filter(item => { const { kind, ReqMinLevel, name } = item - if (kind === ITEMKIND_SKILL_ATTACK) { + if ( + kind === ITEMKIND_SKILL_ATTACK || + kind === ITEMKIND_SKILL_DEFENSE + ) { return true } if (name.charAt(0) !== '\\') { diff --git a/src/data/ao.js b/src/data/ao.js index 3185b24..194b760 100644 --- a/src/data/ao.js +++ b/src/data/ao.js @@ -10,6 +10,7 @@ export const advWeapons = [8, 9, 10, 11, 12, 13, 14, 15] const ITEMKIND_PRIMARY_WEAPON = 44 export const ITEMKIND_SKILL_ATTACK = 50 +export const ITEMKIND_SKILL_DEFENSE = 51 const ITEMKIND_SECONDARY_WEAPON = 48 export const ITEMKIND_DEFENSE = 16 @@ -28,3 +29,33 @@ export const COMPARE_ITEMKIND = (_REQ_ITEM_KIND, _TARGET_KIND_VAR) => { throw new Error('Unexpected _REQ_ITEM_KIND') } } + +export const DES_MAP = { + STD_MIN: 18, + STD_MAX: 71, + STD_PROB: 20, + ADV_MIN: 19, + ADV_MAX: 72, + ADV_PROB: 21, + STD_EVA: 24, + ADV_EVA: 25, + STD_DEF: 22, + ADV_DEF: 23, + HP: 13, + DP: 89, + STD_PIERCE: 184, + ADV_PIERCE: 185 +} + +export const desKeyByDesNum = desNum => { + let foundPair = Object.entries(DES_MAP).find(pair => pair[1] === desNum) + return foundPair ? foundPair[0] : false +} + +export const baseValuesToDesKeyMap = { + AbilityMin: `_MIN`, + AbilityMax: `_MAX`, + HitRate: '_PROB', + FractionResistance: '_PIERCE', + ReAttacktime: '_RA' +} From 1f7bbe3bccb2a84865ae8efcc6791e695e544fb1 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sun, 8 Dec 2019 16:19:55 +0100 Subject: [PATCH 05/50] WeaponCalc: Display fix values --- src/components/AR/WeaponCalc/WeaponPreview.js | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/components/AR/WeaponCalc/WeaponPreview.js b/src/components/AR/WeaponCalc/WeaponPreview.js index 865ba1b..c55e188 100644 --- a/src/components/AR/WeaponCalc/WeaponPreview.js +++ b/src/components/AR/WeaponCalc/WeaponPreview.js @@ -10,7 +10,7 @@ import { const WeaponPreview = props => { const { item, prefix, suffix } = props - let stats = mergeStats(collectStats(item)) + let stats = mergeStats(collectStats(item, prefix, suffix)) return (
    @@ -46,7 +46,7 @@ const determinePrefix = item => { throw Error('Unexpected itemkind') } -const collectStats = item => { +const collectStats = (item, prefix, suffix) => { let values = {} let desKeyPrefix = determinePrefix(item) @@ -82,11 +82,36 @@ const collectStats = item => { return { base: values, - fixes: {}, // TODO + fixes: getFixesStats([prefix, suffix].filter(Boolean)), enchants: {} // TODO } } +const getFixesStats = fixes => { + let res = {} + console.log(fixes) + fixes.forEach(fix => { + for (let i = 1; i <= 9; i++) { + let desNum = fix[`DesParameter${i}`] + if (!desNum) { + continue + } + + let desKey = desKeyByDesNum(desNum) + if (!desKey) { + continue + } + + if (!(desKey in res)) { + res[desKey] = 0 + } + + res[desKey] += fix[`ParameterValue${i}`] + } + }) + return res +} + const mergeStats = stats => { let res = {} Object.keys(stats).forEach(key => { From 8d00fe97eecf037e8c0df455bb0cedbfe4e25003 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Mon, 9 Dec 2019 20:27:15 +0100 Subject: [PATCH 06/50] :tada: WeaponCalc enchants --- src/components/AR/WeaponCalc/WeaponPreview.js | 31 ++++- src/components/AR/WeaponCalc/index.js | 125 ++++++++++++++++-- src/data/ao.js | 6 +- 3 files changed, 147 insertions(+), 15 deletions(-) diff --git a/src/components/AR/WeaponCalc/WeaponPreview.js b/src/components/AR/WeaponCalc/WeaponPreview.js index c55e188..9ed1c70 100644 --- a/src/components/AR/WeaponCalc/WeaponPreview.js +++ b/src/components/AR/WeaponCalc/WeaponPreview.js @@ -9,8 +9,8 @@ import { } from '../../../data/ao' const WeaponPreview = props => { - const { item, prefix, suffix } = props - let stats = mergeStats(collectStats(item, prefix, suffix)) + const { item, prefix, suffix, enchants } = props + let stats = mergeStats(collectStats(item, prefix, suffix, enchants)) return (
    @@ -46,7 +46,7 @@ const determinePrefix = item => { throw Error('Unexpected itemkind') } -const collectStats = (item, prefix, suffix) => { +const collectStats = (item, prefix, suffix, enchants) => { let values = {} let desKeyPrefix = determinePrefix(item) @@ -83,13 +83,12 @@ const collectStats = (item, prefix, suffix) => { return { base: values, fixes: getFixesStats([prefix, suffix].filter(Boolean)), - enchants: {} // TODO + enchants: getEnchantsStats(enchants) } } const getFixesStats = fixes => { let res = {} - console.log(fixes) fixes.forEach(fix => { for (let i = 1; i <= 9; i++) { let desNum = fix[`DesParameter${i}`] @@ -99,6 +98,7 @@ const getFixesStats = fixes => { let desKey = desKeyByDesNum(desNum) if (!desKey) { + console.warn(`DesNum ${desNum} not mapped`) continue } @@ -112,6 +112,27 @@ const getFixesStats = fixes => { return res } +const getEnchantsStats = enchants => { + let values = {} + enchants.forEach(enchInfo => { + Object.keys(enchInfo.card.DesParameters).forEach(desNum => { + desNum = Number(desNum) + let desKey = desKeyByDesNum(desNum) + if (!desKey) { + console.warn(`DesNum ${desNum} not mapped`) + return + } + + if (!(desKey in values)) { + values[desKey] = 0 + } + + values[desKey] += enchInfo.card.DesParameters[desNum] * enchInfo.count + }) + }) + return values +} + const mergeStats = stats => { let res = {} Object.keys(stats).forEach(key => { diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index b393507..0b3ece3 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -9,7 +9,8 @@ import { ITEMKIND_SKILL_ATTACK, ITEMKIND_DEFENSE, COMPARE_ITEMKIND, - ITEMKIND_SKILL_DEFENSE + ITEMKIND_SKILL_DEFENSE, + ITEMKIND_ENCHANT } from '../../../data/ao' import LoadBlock from '../../LoadBlock' import WeaponPreview from './WeaponPreview' @@ -17,19 +18,26 @@ import WeaponPreview from './WeaponPreview' const eqKinds = [ITEMKIND_DEFENSE].concat(standardWeapons, advWeapons) const isEquip = item => eqKinds.indexOf(item.kind) !== -1 +const bannedEnchantNames = ['Swift ', '%]', 'E10', 'FFA'] +const isBannedEnchant = item => + bannedEnchantNames.some(bannedName => item.name.includes(bannedName)) + class WeaponCalcTool extends Component { gearItemDb = [] gearSkillDb = [] itemFixDb = [] + enchantItemDb = [] selectedItem prefix suffix + enchants constructor(props) { super(props) let initState = { - gear: 'B' + gear: 'B', + ench: {} } let hash = this.props.location.hash.substr(1) @@ -59,7 +67,8 @@ class WeaponCalcTool extends Component { const { kind, ReqMinLevel, name } = item if ( kind === ITEMKIND_SKILL_ATTACK || - kind === ITEMKIND_SKILL_DEFENSE + kind === ITEMKIND_SKILL_DEFENSE || + kind === ITEMKIND_ENCHANT ) { return true } @@ -74,6 +83,9 @@ class WeaponCalcTool extends Component { }) .sort((a, b) => b.ReqMinLevel - a.ReqMinLevel) this.filterItemDbs(reducedItemDb, this.state.gear) + this.enchantItemDb = reducedItemDb.filter( + item => item.kind === ITEMKIND_ENCHANT && !isBannedEnchant(item) + ) this.setState({ itemdb: reducedItemDb }) }) callApi( @@ -132,6 +144,36 @@ class WeaponCalcTool extends Component { ) } + enchantAddCallback() { + let selected = this.refs.addench.value + if (selected in this.state.ench) { + return + } + let newEnches = Object.assign({}, this.state.ench) + newEnches[selected] = 0 + this.setState({ ench: newEnches }) + } + + enchantSetNumCallback(e) { + let count = e.target.value + let countNum = Number(count) + let cardNum = e.target.name + + let newEnches = Object.assign({}, this.state.ench) + + if (countNum > 0) { + newEnches[cardNum] = countNum + } else { + if (count === '') { + newEnches[cardNum] = '' + } else { + delete newEnches[cardNum] + } + } + + this.setState({ ench: newEnches }) + } + render() { if (!this.state.itemdb || !this.state.fixDb) { return @@ -161,6 +203,13 @@ class WeaponCalcTool extends Component { // eslint-disable-next-line this.suffix = this.itemFixDb.find(fix => fix.id == itemsuffix) + this.enchants = Object.keys(this.state.ench).map(cardId => { + return { + card: this.enchantItemDb.find(item => item.id === Number(cardId)), + count: Number(this.state.ench[cardId]) + } + }) + return (
    @@ -232,11 +281,71 @@ class WeaponCalcTool extends Component {
    {this.selectedItem && ( - +
    +
    + +
    + +
    +
    + {this.enchants.map(cardInfo => ( +
    + + +
    + ))} +
    +
    +
    + +
    +
    )}
    ) diff --git a/src/data/ao.js b/src/data/ao.js index 194b760..6719859 100644 --- a/src/data/ao.js +++ b/src/data/ao.js @@ -8,11 +8,13 @@ export const unitKinds = { export const standardWeapons = [0, 1, 2, 3, 4, 5, 6, 7] export const advWeapons = [8, 9, 10, 11, 12, 13, 14, 15] -const ITEMKIND_PRIMARY_WEAPON = 44 export const ITEMKIND_SKILL_ATTACK = 50 export const ITEMKIND_SKILL_DEFENSE = 51 -const ITEMKIND_SECONDARY_WEAPON = 48 export const ITEMKIND_DEFENSE = 16 +export const ITEMKIND_ENCHANT = 21 + +const ITEMKIND_PRIMARY_WEAPON = 44 +const ITEMKIND_SECONDARY_WEAPON = 48 export const IS_PRIMARY_WEAPON = kind => standardWeapons.indexOf(kind) !== -1 export const IS_SECONDARY_WEAPON = kind => advWeapons.indexOf(kind) !== -1 From d1e89a3bfd1be609fc062a1722abc451de2fe384 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Mon, 9 Dec 2019 20:59:25 +0100 Subject: [PATCH 07/50] :sparkles: Add WeaponCalc Enchant dropdown card filtering ReqItemKind --- src/components/AR/WeaponCalc/index.js | 7 ++++++- src/data/ao.js | 12 +++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index 0b3ece3..8196073 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -299,7 +299,12 @@ class WeaponCalcTool extends Component { {this.enchantItemDb .filter(card => { - return true // TODO + return ( + COMPARE_ITEMKIND( + card.ReqItemKind, + this.selectedItem.kind + ) || console.log(card.name, card.ReqItemKind) + ) }) .map(item => { return ( diff --git a/src/data/ao.js b/src/data/ao.js index 6719859..b126cfd 100644 --- a/src/data/ao.js +++ b/src/data/ao.js @@ -8,6 +8,7 @@ export const unitKinds = { export const standardWeapons = [0, 1, 2, 3, 4, 5, 6, 7] export const advWeapons = [8, 9, 10, 11, 12, 13, 14, 15] +const ITEMKIND_ALL_ITEM = 40 export const ITEMKIND_SKILL_ATTACK = 50 export const ITEMKIND_SKILL_DEFENSE = 51 export const ITEMKIND_DEFENSE = 16 @@ -20,15 +21,20 @@ export const IS_PRIMARY_WEAPON = kind => standardWeapons.indexOf(kind) !== -1 export const IS_SECONDARY_WEAPON = kind => advWeapons.indexOf(kind) !== -1 export const COMPARE_ITEMKIND = (_REQ_ITEM_KIND, _TARGET_KIND_VAR) => { + if (_REQ_ITEM_KIND === ITEMKIND_ALL_ITEM) { + return true + } + if (_TARGET_KIND_VAR === _REQ_ITEM_KIND) { + return true + } switch (_REQ_ITEM_KIND) { case ITEMKIND_PRIMARY_WEAPON: return IS_PRIMARY_WEAPON(_TARGET_KIND_VAR) case ITEMKIND_SECONDARY_WEAPON: return IS_SECONDARY_WEAPON(_TARGET_KIND_VAR) - case ITEMKIND_DEFENSE: - return _TARGET_KIND_VAR === ITEMKIND_DEFENSE default: - throw new Error('Unexpected _REQ_ITEM_KIND') + //throw new Error('Unexpected _REQ_ITEM_KIND '+_REQ_ITEM_KIND) + return false } } From 606cb07ae36d9e0c206a6e5b6a4fa4f78b92dcca Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Mon, 16 Dec 2019 11:41:14 +0100 Subject: [PATCH 08/50] :zap: Slightly shorten state keys to reduce fragment size --- src/components/AR/WeaponCalc/index.js | 29 ++++++++++++--------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index 8196073..d1798fa 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -179,7 +179,7 @@ class WeaponCalcTool extends Component { return } - const { gear, selWeap, itemprefix, itemsuffix, fixDb } = this.state + const { gear, sWp, iPrf, iSuf, fixDb } = this.state // When selected item changes, recalculate fix db to unset no longer matching selections let prevItemKind @@ -188,7 +188,7 @@ class WeaponCalcTool extends Component { } // eslint-disable-next-line - this.selectedItem = this.gearItemDb.find(item => item.id == selWeap) + this.selectedItem = this.gearItemDb.find(item => item.id == sWp) if (!this.selectedItem) { this.itemFixDb = [] @@ -199,9 +199,9 @@ class WeaponCalcTool extends Component { } // eslint-disable-next-line - this.prefix = this.itemFixDb.find(fix => fix.id == itemprefix) + this.prefix = this.itemFixDb.find(fix => fix.id == iPrf) // eslint-disable-next-line - this.suffix = this.itemFixDb.find(fix => fix.id == itemsuffix) + this.suffix = this.itemFixDb.find(fix => fix.id == iSuf) this.enchants = Object.keys(this.state.ench).map(cardId => { return { @@ -243,9 +243,8 @@ class WeaponCalcTool extends Component { this.setState({ sWp: this.refs.weapsel.value })} + onChange={() => + this.setState({ + sWp: this.refs.weapsel.value, + ench: this.cleanseEnchants( + this.gearItemDb.find( + item => item.id === Number(this.refs.weapsel.value) + ), + gear + ) + })} value={sWp || ''} > @@ -297,12 +337,9 @@ class WeaponCalcTool extends Component { > {this.enchantItemDb - .filter(card => { - return COMPARE_ITEMKIND( - card.ReqItemKind, - this.selectedItem.kind - ) - }) + .filter(card => + enchantCardMatches(card, this.selectedItem, gear) + ) .map(item => { return (
    -
    -
    - {this.selectedItem && (
    @@ -386,6 +383,8 @@ class WeaponCalcTool extends Component {
    )} +
    + TODO: Stats, Buffs/Items/Skills
    ) } From 5d087e888ead4b4481659a30690101637bbd2953 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Mon, 23 Dec 2019 15:11:25 +0100 Subject: [PATCH 11/50] Improve weapon stat display; Show Item level in dropdown --- src/components/AR/WeaponCalc/WeaponPreview.js | 2 +- src/components/AR/WeaponCalc/index.js | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/AR/WeaponCalc/WeaponPreview.js b/src/components/AR/WeaponCalc/WeaponPreview.js index 3e2f00c..9225e6d 100644 --- a/src/components/AR/WeaponCalc/WeaponPreview.js +++ b/src/components/AR/WeaponCalc/WeaponPreview.js @@ -85,7 +85,7 @@ const DisplayStat = props => { {value.enchants ? colorName(`\\e[${PlusMinusNumber(value.enchants)}]\\e`) : null}{' '} - {total !== null && ` = ${total}`} + {total !== null && (value.fixes || value.enchants) && ` = ${total}`} ) } diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index 3157c20..5cba5a2 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -289,7 +289,7 @@ class WeaponCalcTool extends Component { {this.gearItemDb.map(item => { return ( ) })} @@ -384,7 +384,9 @@ class WeaponCalcTool extends Component {
    )}
    - TODO: Stats, Buffs/Items/Skills + TODO: Buffs/Items/Skills +
    + TODO: Total, vs.
    ) } From 3f7655265936f059b0af7d417faad0562e465a30 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Mon, 23 Dec 2019 22:05:19 +0100 Subject: [PATCH 12/50] :sparkles: Add Stat-Values to total Item-results --- src/components/AR/WeaponCalc/TotalResult.js | 89 +++++++++++++++ src/components/AR/WeaponCalc/WeaponPreview.js | 106 ++++++++++-------- src/components/AR/WeaponCalc/index.js | 57 +++++++++- 3 files changed, 204 insertions(+), 48 deletions(-) create mode 100644 src/components/AR/WeaponCalc/TotalResult.js diff --git a/src/components/AR/WeaponCalc/TotalResult.js b/src/components/AR/WeaponCalc/TotalResult.js new file mode 100644 index 0000000..f0bbf9c --- /dev/null +++ b/src/components/AR/WeaponCalc/TotalResult.js @@ -0,0 +1,89 @@ +import React from 'react' +import aostats from 'aceonline-stats' +import { ITEMKIND_DEFENSE } from '../../../data/ao' +import { determinePrefix, PlusMinusNumber } from './WeaponPreview' +import { colorName } from '../../../utils/AR/names' + +// skill/other green +// todo: vs other gears + +const WEAPON_ATTRS = ['_MIN', '_MAX', '_PROB', '_PIERCE'] + +const ARMOR_ATTRS = ['HP', 'DP', 'STD_DEF', 'ADV_DEF', 'STD_EVA', 'ADV_EVA'] + +const TotalResult = props => { + const { item, weaponStats, gearStatPoints } = props + + const weaponElseArmor = item.kind !== ITEMKIND_DEFENSE + const attrPrefix = determinePrefix(item) + + let gearStatBonus = {} + if (weaponElseArmor && gearStatPoints.Atk) { + gearStatBonus[attrPrefix + '_PROB'] = aostats.prob(gearStatPoints.Atk) + gearStatBonus[attrPrefix + '_PIERCE'] = Math.floor( + aostats.pierce(gearStatPoints.Atk) + ) + let mm = aostats.dmgInc(gearStatPoints.Atk) + gearStatBonus[attrPrefix + '_MIN'] = mm + gearStatBonus[attrPrefix + '_MAX'] = mm + } else { + if (gearStatPoints.Eva) { + let eva = aostats.evasion(gearStatPoints.Eva) + gearStatBonus['STD_EVA'] = eva + gearStatBonus['ADV_EVA'] = eva + } + if (gearStatPoints.Def) { + let def = aostats.defense(gearStatPoints.Def) + gearStatBonus['STD_DEF'] = def + gearStatBonus['ADV_DEF'] = def + } + } + + return ( +
      + {(weaponElseArmor ? WEAPON_ATTRS : ARMOR_ATTRS).map(attr => { + if (attr.charAt(0) === '_') { + if (!attrPrefix) { + throw Error('Not a weapon item') + } + attr = attrPrefix + attr + } + return ( + + ) + })} +
    + ) +} + +const DisplayStat = props => { + const { attr, value, statBonus } = props + + if (typeof value === 'undefined') { + return null + } + + let totalBonuses = (value.bonuses || 0) + (statBonus || 0) + let total + + if (value.additiv) { + total = value.base + totalBonuses + } else { + total = value.base * (1 + totalBonuses) + } + + return ( +
  • + {attr}:{' '} + {statBonus ? colorName(`\\d[${PlusMinusNumber(statBonus)}]\\d`) : null} ={' '} + {total} +
  • + ) +} + +export default TotalResult diff --git a/src/components/AR/WeaponCalc/WeaponPreview.js b/src/components/AR/WeaponCalc/WeaponPreview.js index 9225e6d..d84a78e 100644 --- a/src/components/AR/WeaponCalc/WeaponPreview.js +++ b/src/components/AR/WeaponCalc/WeaponPreview.js @@ -8,9 +8,63 @@ import { ITEMKIND_DEFENSE } from '../../../data/ao' -const WeaponPreview = props => { - const { item, prefix, suffix, enchants } = props +export const prepareStats = (item, prefix, suffix, enchants) => { let stats = mergeStats(collectStats(item, prefix, suffix, enchants)) + let displayStats = {} + + Object.keys(stats).forEach(attr => { + let value = Object.assign({}, stats[attr]) + + if (!(value.base || value.enchants || value.fixes)) { + return + } + + let baseIsPercentPoints = true + let upgradesArePercentPoints = true + let factorBaseBy = 1 + let calcTotal = true + + if (attr.includes('_RA')) { + factorBaseBy = 1000 + baseIsPercentPoints = false + } + if (attr.includes('_MIN') || attr.includes('_MAX')) { + calcTotal = false + baseIsPercentPoints = false + } + if (attr === 'HP' || attr === 'DP') { + baseIsPercentPoints = false + upgradesArePercentPoints = false + } + if (attr.includes('WEIGHT')) { + baseIsPercentPoints = false + } + + let base = (Number(value.base) || 0) / factorBaseBy + + let bonuses = (value.enchants || 0) + (value.fixes || null) + value.additiv = !upgradesArePercentPoints || baseIsPercentPoints + if (calcTotal) { + if (value.additiv) { + value.total = base + bonuses + } else { + // Weight/MM/RA + value.total = base * (1 + bonuses) + } + } + + value.base = base + value.bonuses = bonuses + + displayStats[attr] = value + }) + + return displayStats +} + +const WeaponPreview = props => { + const { item, prefix, suffix, enchants, stats } = props + return (
    @@ -38,59 +92,23 @@ const WeaponPreview = props => { const DisplayStat = props => { const { attr, value } = props - if (!(value.base || value.enchants || value.fixes)) { - return null - } - - let baseIsPercentPoints = true - let upgradesArePercentPoints = true - let factorBaseBy = 1 - let calcTotal = true - - if (attr.includes('_RA')) { - factorBaseBy = 1000 - baseIsPercentPoints = false - } - if (attr.includes('_MIN') || attr.includes('_MAX')) { - calcTotal = false - baseIsPercentPoints = false - } - if (attr === 'HP' || attr === 'DP') { - baseIsPercentPoints = false - upgradesArePercentPoints = false - } - if (attr.includes('WEIGHT')) { - baseIsPercentPoints = false - } - - let base = (Number(value.base) || 0) / factorBaseBy - - let total = null - if (calcTotal) { - let bonuses = (value.enchants || 0) + (value.fixes || null) - if (!upgradesArePercentPoints || baseIsPercentPoints) { - total = base + bonuses - } else { - // Weight/MM/RA - total = base * (1 + bonuses) - } - } - return (
  • - {attr}: {base || null}{' '} + {attr}: {value.base || null}{' '} {value.fixes ? colorName(`\\g[${PlusMinusNumber(value.fixes)}]\\g`) : null}{' '} {value.enchants ? colorName(`\\e[${PlusMinusNumber(value.enchants)}]\\e`) : null}{' '} - {total !== null && (value.fixes || value.enchants) && ` = ${total}`} + {'total' in value && + (value.fixes || value.enchants) && + ` = ${value.total}`}
  • ) } -const PlusMinusNumber = num => { +export const PlusMinusNumber = num => { num = Number(num) if (num <= 0) { return num @@ -98,7 +116,7 @@ const PlusMinusNumber = num => { return '+' + num } -const determinePrefix = item => { +export const determinePrefix = item => { if (IS_PRIMARY_WEAPON(item.kind)) { return 'STD' } diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index 5cba5a2..8875e10 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -14,7 +14,8 @@ import { DES_ENCHANT_INITIALIZE } from '../../../data/ao' import LoadBlock from '../../LoadBlock' -import WeaponPreview from './WeaponPreview' +import WeaponPreview, { prepareStats } from './WeaponPreview' +import TotalResult from './TotalResult' const eqKinds = [ITEMKIND_DEFENSE].concat(standardWeapons, advWeapons) const isEquip = item => eqKinds.indexOf(item.kind) !== -1 @@ -27,6 +28,12 @@ const isBannedEnchant = item => DES_ENCHANT_INITIALIZE in item.DesParameters ) +const stats = [ + { id: 'Atk', label: 'Attack' }, + { id: 'Def', label: 'Defense' }, + { id: 'Eva', label: 'Evasion' } +] + // noinspection JSBitwiseOperatorUsage const enchantCardMatches = (card, item, gear) => COMPARE_ITEMKIND(card.ReqItemKind, item.kind) && @@ -45,9 +52,13 @@ class WeaponCalcTool extends Component { constructor(props) { super(props) + let defaultStat = {} + stats.forEach(stat => (defaultStat[stat.id] = 0)) + let initState = { gear: 'B', - ench: {} + ench: {}, + stat: defaultStat } let hash = this.props.location.hash.substr(1) @@ -238,6 +249,10 @@ class WeaponCalcTool extends Component { } }) + const weaponStats = this.selectedItem + ? prepareStats(this.selectedItem, this.prefix, this.suffix, this.enchants) + : undefined + return (
    @@ -379,14 +394,48 @@ class WeaponCalcTool extends Component { prefix={this.prefix} suffix={this.suffix} enchants={this.enchants} + stats={weaponStats} />
    )}
    - TODO: Buffs/Items/Skills + +
    + {stats.map(stat => { + const id = 'stat' + stat.id + return ( +
    + + + this.setState({ + stat: Object.assign({}, this.state.stat, { + [stat.id]: Number(e.target.value) + }) + })} + /> +
    + ) + })} +
    + TODO: Buffs/Items/Skills/armorbonus/..
    - TODO: Total, vs. + {this.selectedItem && ( + + )}
    ) } From f76a08c947669cfad7d58b0c7863246f704ce919 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Wed, 25 Dec 2019 00:40:36 +0100 Subject: [PATCH 13/50] :tada: WeaponCalc skills --- src/components/AR/WeaponCalc/TotalResult.js | 37 +++++++++++++++--- src/components/AR/WeaponCalc/index.js | 42 +++++++++++++++++++-- 2 files changed, 69 insertions(+), 10 deletions(-) diff --git a/src/components/AR/WeaponCalc/TotalResult.js b/src/components/AR/WeaponCalc/TotalResult.js index f0bbf9c..c24660b 100644 --- a/src/components/AR/WeaponCalc/TotalResult.js +++ b/src/components/AR/WeaponCalc/TotalResult.js @@ -1,6 +1,6 @@ import React from 'react' import aostats from 'aceonline-stats' -import { ITEMKIND_DEFENSE } from '../../../data/ao' +import { desKeyByDesNum, ITEMKIND_DEFENSE } from '../../../data/ao' import { determinePrefix, PlusMinusNumber } from './WeaponPreview' import { colorName } from '../../../utils/AR/names' @@ -12,7 +12,7 @@ const WEAPON_ATTRS = ['_MIN', '_MAX', '_PROB', '_PIERCE'] const ARMOR_ATTRS = ['HP', 'DP', 'STD_DEF', 'ADV_DEF', 'STD_EVA', 'ADV_EVA'] const TotalResult = props => { - const { item, weaponStats, gearStatPoints } = props + const { item, weaponStats, gearStatPoints, skills } = props const weaponElseArmor = item.kind !== ITEMKIND_DEFENSE const attrPrefix = determinePrefix(item) @@ -39,6 +39,25 @@ const TotalResult = props => { } } + let skillsBonus = {} + skills.forEach(skill => { + Object.keys(skill.DesParameters).forEach(desNum => { + // TODO: Duplicated code 4x + desNum = Number(desNum) + let desKey = desKeyByDesNum(desNum) + if (!desKey) { + console.warn(`DesNum ${desNum} not mapped`) + return + } + + if (!(desKey in skillsBonus)) { + skillsBonus[desKey] = 0 + } + + skillsBonus[desKey] += skill.DesParameters[desNum] + }) + }) + return (
      {(weaponElseArmor ? WEAPON_ATTRS : ARMOR_ATTRS).map(attr => { @@ -54,6 +73,7 @@ const TotalResult = props => { attr={attr} value={weaponStats[attr]} statBonus={gearStatBonus[attr]} + skillBonus={skillsBonus[attr]} /> ) })} @@ -62,13 +82,13 @@ const TotalResult = props => { } const DisplayStat = props => { - const { attr, value, statBonus } = props + const { attr, value, statBonus, skillBonus } = props if (typeof value === 'undefined') { return null } - let totalBonuses = (value.bonuses || 0) + (statBonus || 0) + let totalBonuses = (value.bonuses || 0) + (statBonus || 0) + (skillBonus || 0) let total if (value.additiv) { @@ -80,8 +100,13 @@ const DisplayStat = props => { return (
    • {attr}:{' '} - {statBonus ? colorName(`\\d[${PlusMinusNumber(statBonus)}]\\d`) : null} ={' '} - {total} + {statBonus + ? colorName(`\\d[${PlusMinusNumber(statBonus)}]\\d`) + : null}{' '} + {skillBonus + ? colorName(`\\g[${PlusMinusNumber(skillBonus)}]\\g`) + : null}{' '} + = {total}
    • ) } diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index 8875e10..671e88a 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -16,6 +16,7 @@ import { import LoadBlock from '../../LoadBlock' import WeaponPreview, { prepareStats } from './WeaponPreview' import TotalResult from './TotalResult' +import { colorName } from '../../../utils/AR/names' const eqKinds = [ITEMKIND_DEFENSE].concat(standardWeapons, advWeapons) const isEquip = item => eqKinds.indexOf(item.kind) !== -1 @@ -58,7 +59,8 @@ class WeaponCalcTool extends Component { let initState = { gear: 'B', ench: {}, - stat: defaultStat + stat: defaultStat, + sk: [] } let hash = this.props.location.hash.substr(1) @@ -75,8 +77,9 @@ class WeaponCalcTool extends Component { this.gearItemDb = itemDbGear.filter(isEquip) this.gearSkillDb = itemDbGear.filter( item => - item.kind === ITEMKIND_SKILL_ATTACK || - item.kind === ITEMKIND_SKILL_DEFENSE + (item.kind === ITEMKIND_SKILL_ATTACK || + item.kind === ITEMKIND_SKILL_DEFENSE) && + item.name.indexOf('\\c') === 0 ) } @@ -427,18 +430,49 @@ class WeaponCalcTool extends Component { ) })}
    - TODO: Buffs/Items/Skills/armorbonus/.. +
    + {this.gearSkillDb.map(skill => ( + this.handleSkillClick(skill)} + > + {colorName(skill.name)} + + ))} +
    + todo: unset skills on gear change; Ragings for every gear TODO: + Buffs/Items/Skills/armorbonus/..
    {this.selectedItem && ( + this.gearSkillDb.find(skill => skill.id === skillId) + )} /> )}
    ) } + + handleSkillClick(skill) { + let skillState = this.state.sk + + if (skillState.indexOf(skill.id) === -1) { + skillState.push(skill.id) + } else { + skillState = skillState.filter(skillId => skillId !== skill.id) + } + + this.setState({ sk: skillState }) + } } export default withRouter(WeaponCalcTool) From b49eb89d9d32d4e4378f06c278e463ac6890b0f1 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Wed, 25 Dec 2019 17:07:01 +0100 Subject: [PATCH 14/50] :recycle: Refactor DesParam to DesKey loops --- src/components/AR/WeaponCalc/TotalResult.js | 27 ++--- src/components/AR/WeaponCalc/WeaponPreview.js | 105 ++++++++++-------- 2 files changed, 64 insertions(+), 68 deletions(-) diff --git a/src/components/AR/WeaponCalc/TotalResult.js b/src/components/AR/WeaponCalc/TotalResult.js index c24660b..992dc77 100644 --- a/src/components/AR/WeaponCalc/TotalResult.js +++ b/src/components/AR/WeaponCalc/TotalResult.js @@ -1,7 +1,11 @@ import React from 'react' import aostats from 'aceonline-stats' -import { desKeyByDesNum, ITEMKIND_DEFENSE } from '../../../data/ao' -import { determinePrefix, PlusMinusNumber } from './WeaponPreview' +import { ITEMKIND_DEFENSE } from '../../../data/ao' +import { + determinePrefix, + getMergedDesBoni, + PlusMinusNumber +} from './WeaponPreview' import { colorName } from '../../../utils/AR/names' // skill/other green @@ -39,24 +43,7 @@ const TotalResult = props => { } } - let skillsBonus = {} - skills.forEach(skill => { - Object.keys(skill.DesParameters).forEach(desNum => { - // TODO: Duplicated code 4x - desNum = Number(desNum) - let desKey = desKeyByDesNum(desNum) - if (!desKey) { - console.warn(`DesNum ${desNum} not mapped`) - return - } - - if (!(desKey in skillsBonus)) { - skillsBonus[desKey] = 0 - } - - skillsBonus[desKey] += skill.DesParameters[desNum] - }) - }) + let skillsBonus = getMergedDesBoni(skills) return (
      diff --git a/src/components/AR/WeaponCalc/WeaponPreview.js b/src/components/AR/WeaponCalc/WeaponPreview.js index d84a78e..3b17b97 100644 --- a/src/components/AR/WeaponCalc/WeaponPreview.js +++ b/src/components/AR/WeaponCalc/WeaponPreview.js @@ -153,20 +153,7 @@ const collectStats = (item, prefix, suffix, enchants) => { values[desKey] = item[prop] } }) - Object.keys(item.DesParameters).forEach(desNum => { - desNum = Number(desNum) - let desKey = desKeyByDesNum(desNum) - if (!desKey) { - console.warn(`DesNum ${desNum} not mapped`) - return - } - - if (!(desKey in values)) { - values[desKey] = 0 - } - - values[desKey] += item.DesParameters[desNum] - }) + values = mergeAndSum(values, getBonusValuesFromDesParams(item.DesParameters)) // TODO: Speed @@ -177,51 +164,73 @@ const collectStats = (item, prefix, suffix, enchants) => { } } -const getFixesStats = fixes => { - let res = {} - fixes.forEach(fix => { - for (let i = 1; i <= 9; i++) { - let desNum = fix[`DesParameter${i}`] - if (!desNum) { - continue - } - - let desKey = desKeyByDesNum(desNum) - if (!desKey) { - console.warn(`DesNum ${desNum} not mapped`) - continue - } +const transformDesAttrsToArray = item => { + let desResult = {} + for (let i = 1; i <= 9; i++) { + let desNum = item[`DesParameter${i}`] + if (!desNum) { + continue + } + desResult[desNum] = item[`ParameterValue${i}`] + } + return desResult +} - if (!(desKey in res)) { - res[desKey] = 0 - } +const getFixesStats = fixes => + getMergedDesBoni( + fixes.map(fix => { + fix.DesParameters = transformDesAttrsToArray(fix) + return fix + }) + ) - res[desKey] += fix[`ParameterValue${i}`] +export const mergeAndSum = (o1, o2) => { + // is there a core-func for this? + Object.keys(o2).forEach(key => { + if (key in o1) { + o1[key] += o2[key] + } else { + o1[key] = o2[key] } }) - return res + return o1 } - -const getEnchantsStats = enchants => { +export const getBonusValuesFromDesParams = desParameters => { let values = {} - enchants.forEach(enchInfo => { - Object.keys(enchInfo.card.DesParameters).forEach(desNum => { - desNum = Number(desNum) - let desKey = desKeyByDesNum(desNum) - if (!desKey) { - console.warn(`DesNum ${desNum} not mapped`) - return - } + Object.keys(desParameters).forEach(desNum => { + desNum = Number(desNum) + let desKey = desKeyByDesNum(desNum) + if (!desKey) { + console.warn(`DesNum ${desNum} not mapped`) + return + } - if (!(desKey in values)) { - values[desKey] = 0 - } + if (!(desKey in values)) { + values[desKey] = 0 + } - values[desKey] += enchInfo.card.DesParameters[desNum] * enchInfo.count - }) + values[desKey] += desParameters[desNum] }) return values } +export const getMergedDesBoni = thingsWithDesParams => + thingsWithDesParams.reduce( + (acc, cur) => + mergeAndSum(acc, getBonusValuesFromDesParams(cur.DesParameters)), + {} + ) + +const getEnchantsStats = enchants => + enchants.reduce((acc, currentEnchantInfo) => { + let enchantBonusValues = getBonusValuesFromDesParams( + currentEnchantInfo.card.DesParameters + ) + Object.keys(enchantBonusValues).forEach(key => { + enchantBonusValues[key] = + enchantBonusValues[key] * currentEnchantInfo.count + }) + return mergeAndSum(acc, enchantBonusValues) + }, {}) const mergeStats = stats => { let res = {} From 5c778491dde09d7dca976144ab3b1c9e707fa049 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Wed, 25 Dec 2019 17:09:23 +0100 Subject: [PATCH 15/50] Reset skills on gear change --- src/components/AR/WeaponCalc/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index 671e88a..b69288f 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -272,7 +272,8 @@ class WeaponCalcTool extends Component { this.filterItemDbs(this.state.itemdb, gearEach) this.setState({ gear: gearEach, - ench: this.cleanseEnchants(this.selectedItem, gearEach) + ench: this.cleanseEnchants(this.selectedItem, gearEach), + sk: [] }) }} > @@ -445,8 +446,7 @@ class WeaponCalcTool extends Component { ))}
    - todo: unset skills on gear change; Ragings for every gear TODO: - Buffs/Items/Skills/armorbonus/.. + todo: Ragings for every gear TODO: Buffs/Items/armorbonus/..
    {this.selectedItem && ( Date: Wed, 25 Dec 2019 17:45:29 +0100 Subject: [PATCH 16/50] :bug: `&&` condition showed numeric zero if it eval'd to that --- src/components/AR/WeaponCalc/WeaponPreview.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/AR/WeaponCalc/WeaponPreview.js b/src/components/AR/WeaponCalc/WeaponPreview.js index 3b17b97..980f487 100644 --- a/src/components/AR/WeaponCalc/WeaponPreview.js +++ b/src/components/AR/WeaponCalc/WeaponPreview.js @@ -101,9 +101,9 @@ const DisplayStat = props => { {value.enchants ? colorName(`\\e[${PlusMinusNumber(value.enchants)}]\\e`) : null}{' '} - {'total' in value && - (value.fixes || value.enchants) && - ` = ${value.total}`} + {'total' in value && (value.fixes || value.enchants) + ? ` = ${value.total}` + : null} ) } From a47272ccc644c294f5aaec017e077b106c4ea6c2 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Wed, 25 Dec 2019 17:56:31 +0100 Subject: [PATCH 17/50] :sparkles: Calc/Display stats not included on the item (Eva-Up with Defarmor) --- src/components/AR/WeaponCalc/TotalResult.js | 9 +++-- src/components/AR/WeaponCalc/WeaponPreview.js | 33 ++++++++++++------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/components/AR/WeaponCalc/TotalResult.js b/src/components/AR/WeaponCalc/TotalResult.js index 992dc77..29b1ea9 100644 --- a/src/components/AR/WeaponCalc/TotalResult.js +++ b/src/components/AR/WeaponCalc/TotalResult.js @@ -4,6 +4,7 @@ import { ITEMKIND_DEFENSE } from '../../../data/ao' import { determinePrefix, getMergedDesBoni, + isAttrAdditiv, PlusMinusNumber } from './WeaponPreview' import { colorName } from '../../../utils/AR/names' @@ -69,10 +70,14 @@ const TotalResult = props => { } const DisplayStat = props => { - const { attr, value, statBonus, skillBonus } = props + const { attr, statBonus, skillBonus } = props + let value = props.value if (typeof value === 'undefined') { - return null + value = { + additiv: isAttrAdditiv(attr), + base: 0 + } } let totalBonuses = (value.bonuses || 0) + (statBonus || 0) + (skillBonus || 0) diff --git a/src/components/AR/WeaponCalc/WeaponPreview.js b/src/components/AR/WeaponCalc/WeaponPreview.js index 980f487..4896fd2 100644 --- a/src/components/AR/WeaponCalc/WeaponPreview.js +++ b/src/components/AR/WeaponCalc/WeaponPreview.js @@ -19,31 +19,20 @@ export const prepareStats = (item, prefix, suffix, enchants) => { return } - let baseIsPercentPoints = true - let upgradesArePercentPoints = true let factorBaseBy = 1 let calcTotal = true if (attr.includes('_RA')) { factorBaseBy = 1000 - baseIsPercentPoints = false } if (attr.includes('_MIN') || attr.includes('_MAX')) { calcTotal = false - baseIsPercentPoints = false - } - if (attr === 'HP' || attr === 'DP') { - baseIsPercentPoints = false - upgradesArePercentPoints = false - } - if (attr.includes('WEIGHT')) { - baseIsPercentPoints = false } let base = (Number(value.base) || 0) / factorBaseBy let bonuses = (value.enchants || 0) + (value.fixes || null) - value.additiv = !upgradesArePercentPoints || baseIsPercentPoints + value.additiv = isAttrAdditiv(attr) if (calcTotal) { if (value.additiv) { value.total = base + bonuses @@ -61,6 +50,26 @@ export const prepareStats = (item, prefix, suffix, enchants) => { return displayStats } +export const isAttrAdditiv = attr => { + let baseIsPercentPoints = true + let upgradesArePercentPoints = true + + if (attr.includes('_RA')) { + baseIsPercentPoints = false + } + if (attr.includes('_MIN') || attr.includes('_MAX')) { + baseIsPercentPoints = false + } + if (attr === 'HP' || attr === 'DP') { + baseIsPercentPoints = false + upgradesArePercentPoints = false + } + if (attr.includes('WEIGHT')) { + baseIsPercentPoints = false + } + + return !upgradesArePercentPoints || baseIsPercentPoints +} const WeaponPreview = props => { const { item, prefix, suffix, enchants, stats } = props From e9037b1683800bb61e514f2e51b8fed4c6069abf Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Wed, 25 Dec 2019 18:43:55 +0100 Subject: [PATCH 18/50] :sparkles: Show Raging buffs for every gear --- src/components/AR/WeaponCalc/index.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index b69288f..c732b22 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -73,7 +73,11 @@ class WeaponCalcTool extends Component { filterItemDbs(itemdb, gear) { // noinspection JSBitwiseOperatorUsage - let itemDbGear = itemdb.filter(item => item.ReqUnitKind & unitKinds[gear]) + let itemDbGear = itemdb.filter( + item => + item.ReqUnitKind & unitKinds[gear] || + (item.kind >= 50 && item.SkillTargetType === 2 && item.Range) + ) // Matches Gear or is a skill that applies to form (Type&Range) (Ragings) this.gearItemDb = itemDbGear.filter(isEquip) this.gearSkillDb = itemDbGear.filter( item => @@ -446,7 +450,7 @@ class WeaponCalcTool extends Component { ))}
    - todo: Ragings for every gear TODO: Buffs/Items/armorbonus/.. + TODO: Buffs/Items/armorbonus/..
    {this.selectedItem && ( Date: Wed, 25 Dec 2019 18:44:37 +0100 Subject: [PATCH 19/50] :bug: Prevent colorName regex from matching over a string with multiple different colors --- src/utils/AR/names.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/utils/AR/names.js b/src/utils/AR/names.js index 7d4c32c..a5b1743 100644 --- a/src/utils/AR/names.js +++ b/src/utils/AR/names.js @@ -31,8 +31,9 @@ function specialNames(name) { } export function colorName(name) { - let regex = name.match(/^\\([a-z])(.+)\\[a-z]$/) - if (!regex) { + let regex = name.match(/^\\([a-z])(.+)\\([a-z])$/) + if (!regex || regex[1] !== regex[3]) { + // opening/closing color differ? return specialNames(name) } let color = colorMap[regex[1]] From 60127bc884d5e345acef50ec0ce8d1d916f11c64 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Thu, 26 Dec 2019 21:21:05 +0100 Subject: [PATCH 20/50] :sparkles: Add Charms --- src/components/AR/WeaponCalc/TotalResult.js | 8 +++- src/components/AR/WeaponCalc/index.js | 44 ++++++++++++++++++++- src/data/ao.js | 1 + 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/components/AR/WeaponCalc/TotalResult.js b/src/components/AR/WeaponCalc/TotalResult.js index 29b1ea9..d6edc5d 100644 --- a/src/components/AR/WeaponCalc/TotalResult.js +++ b/src/components/AR/WeaponCalc/TotalResult.js @@ -17,7 +17,7 @@ const WEAPON_ATTRS = ['_MIN', '_MAX', '_PROB', '_PIERCE'] const ARMOR_ATTRS = ['HP', 'DP', 'STD_DEF', 'ADV_DEF', 'STD_EVA', 'ADV_EVA'] const TotalResult = props => { - const { item, weaponStats, gearStatPoints, skills } = props + const { item, weaponStats, gearStatPoints, skills, charm } = props const weaponElseArmor = item.kind !== ITEMKIND_DEFENSE const attrPrefix = determinePrefix(item) @@ -44,7 +44,11 @@ const TotalResult = props => { } } - let skillsBonus = getMergedDesBoni(skills) + let greenAdditives = [].concat(skills) + if (charm) { + greenAdditives.push(charm) + } + let skillsBonus = getMergedDesBoni(greenAdditives) return (
      diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index c732b22..e2f9e03 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -11,7 +11,8 @@ import { COMPARE_ITEMKIND, ITEMKIND_SKILL_DEFENSE, ITEMKIND_ENCHANT, - DES_ENCHANT_INITIALIZE + DES_ENCHANT_INITIALIZE, + ITEMKIND_ACCESSORY_TIMELIMIT } from '../../../data/ao' import LoadBlock from '../../LoadBlock' import WeaponPreview, { prepareStats } from './WeaponPreview' @@ -29,6 +30,10 @@ const isBannedEnchant = item => DES_ENCHANT_INITIALIZE in item.DesParameters ) +const bannedCharmDes = [162, 159, 160, 129, 130, 158, 157] // 161 (Blue Saph) would also remove Hax-Charm +const isBannedCharm = item => + bannedCharmDes.some(bannedDesNum => bannedDesNum in item.DesParameters) + const stats = [ { id: 'Atk', label: 'Attack' }, { id: 'Def', label: 'Defense' }, @@ -45,6 +50,7 @@ class WeaponCalcTool extends Component { gearSkillDb = [] itemFixDb = [] enchantItemDb = [] + charmDb = [] selectedItem prefix suffix @@ -97,7 +103,8 @@ class WeaponCalcTool extends Component { if ( kind === ITEMKIND_SKILL_ATTACK || kind === ITEMKIND_SKILL_DEFENSE || - kind === ITEMKIND_ENCHANT + kind === ITEMKIND_ENCHANT || + kind === ITEMKIND_ACCESSORY_TIMELIMIT ) { return true } @@ -115,6 +122,14 @@ class WeaponCalcTool extends Component { this.enchantItemDb = reducedItemDb.filter( item => item.kind === ITEMKIND_ENCHANT && !isBannedEnchant(item) ) + this.charmDb = reducedItemDb.filter( + item => + item.kind === ITEMKIND_ACCESSORY_TIMELIMIT && + item.Time === 18000000 && + item.name.indexOf('(5H)') !== -1 && + !isBannedCharm(item) && + item.name.indexOf('Holy') === -1 + ) this.setState({ itemdb: reducedItemDb }) }) callApi( @@ -450,6 +465,20 @@ class WeaponCalcTool extends Component { ))} +
      + {this.charmDb.map(charmItem => ( + this.handleCharmClick(charmItem)} + > + {colorName(charmItem.name)} + + ))} +
      TODO: Buffs/Items/armorbonus/..
      {this.selectedItem && ( @@ -460,12 +489,23 @@ class WeaponCalcTool extends Component { skills={this.state.sk.map(skillId => this.gearSkillDb.find(skill => skill.id === skillId) )} + charm={this.charmDb.find( + charmItem => charmItem.id === this.state.ch + )} /> )} ) } + handleCharmClick(charm) { + if (this.state.ch === charm.id) { + this.setState({ ch: null }) + } else { + this.setState({ ch: charm.id }) + } + } + handleSkillClick(skill) { let skillState = this.state.sk diff --git a/src/data/ao.js b/src/data/ao.js index 69e5404..a272196 100644 --- a/src/data/ao.js +++ b/src/data/ao.js @@ -9,6 +9,7 @@ export const standardWeapons = [0, 1, 2, 3, 4, 5, 6, 7] export const advWeapons = [8, 9, 10, 11, 12, 13, 14, 15] const ITEMKIND_ALL_ITEM = 40 +export const ITEMKIND_ACCESSORY_TIMELIMIT = 32 export const ITEMKIND_SKILL_ATTACK = 50 export const ITEMKIND_SKILL_DEFENSE = 51 export const ITEMKIND_DEFENSE = 16 From a431cdec2654cb570b9a01602f8edc15d6f3cbd9 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sat, 28 Dec 2019 21:05:53 +0100 Subject: [PATCH 21/50] :sparkles: Add Armorfix selection when building weaps --- src/components/AR/WeaponCalc/TotalResult.js | 9 +- src/components/AR/WeaponCalc/WeaponPreview.js | 16 +-- src/components/AR/WeaponCalc/index.js | 102 +++++++++++++++--- 3 files changed, 104 insertions(+), 23 deletions(-) diff --git a/src/components/AR/WeaponCalc/TotalResult.js b/src/components/AR/WeaponCalc/TotalResult.js index d6edc5d..5301b37 100644 --- a/src/components/AR/WeaponCalc/TotalResult.js +++ b/src/components/AR/WeaponCalc/TotalResult.js @@ -17,7 +17,7 @@ const WEAPON_ATTRS = ['_MIN', '_MAX', '_PROB', '_PIERCE'] const ARMOR_ATTRS = ['HP', 'DP', 'STD_DEF', 'ADV_DEF', 'STD_EVA', 'ADV_EVA'] const TotalResult = props => { - const { item, weaponStats, gearStatPoints, skills, charm } = props + const { item, weaponStats, gearStatPoints, skills, charm, armorBonus } = props const weaponElseArmor = item.kind !== ITEMKIND_DEFENSE const attrPrefix = determinePrefix(item) @@ -48,6 +48,11 @@ const TotalResult = props => { if (charm) { greenAdditives.push(charm) } + armorBonus.forEach(armorFix => { + if (armorFix) { + greenAdditives.push(armorFix) + } + }) let skillsBonus = getMergedDesBoni(greenAdditives) return ( @@ -99,7 +104,7 @@ const DisplayStat = props => { {statBonus ? colorName(`\\d[${PlusMinusNumber(statBonus)}]\\d`) : null}{' '} - {skillBonus + {typeof skillBonus !== 'undefined' ? colorName(`\\g[${PlusMinusNumber(skillBonus)}]\\g`) : null}{' '} = {total} diff --git a/src/components/AR/WeaponCalc/WeaponPreview.js b/src/components/AR/WeaponCalc/WeaponPreview.js index 4896fd2..010ad34 100644 --- a/src/components/AR/WeaponCalc/WeaponPreview.js +++ b/src/components/AR/WeaponCalc/WeaponPreview.js @@ -119,7 +119,7 @@ const DisplayStat = props => { export const PlusMinusNumber = num => { num = Number(num) - if (num <= 0) { + if (num < 0) { return num } return '+' + num @@ -185,13 +185,13 @@ const transformDesAttrsToArray = item => { return desResult } -const getFixesStats = fixes => - getMergedDesBoni( - fixes.map(fix => { - fix.DesParameters = transformDesAttrsToArray(fix) - return fix - }) - ) +export const addDesParamsArrayToFixes = fixes => + fixes.map(fix => { + fix.DesParameters = transformDesAttrsToArray(fix) + return fix + }) + +const getFixesStats = fixes => getMergedDesBoni(addDesParamsArrayToFixes(fixes)) export const mergeAndSum = (o1, o2) => { // is there a core-func for this? diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index e2f9e03..07a19ef 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -15,7 +15,10 @@ import { ITEMKIND_ACCESSORY_TIMELIMIT } from '../../../data/ao' import LoadBlock from '../../LoadBlock' -import WeaponPreview, { prepareStats } from './WeaponPreview' +import WeaponPreview, { + addDesParamsArrayToFixes, + prepareStats +} from './WeaponPreview' import TotalResult from './TotalResult' import { colorName } from '../../../utils/AR/names' @@ -49,6 +52,7 @@ class WeaponCalcTool extends Component { gearItemDb = [] gearSkillDb = [] itemFixDb = [] + armorFixDb = [] enchantItemDb = [] charmDb = [] selectedItem @@ -142,6 +146,11 @@ class WeaponCalcTool extends Component { ['m', 'c', 'r', 'l', 'y'].indexOf(fix.name.charAt(1)) !== -1 ) .sort((a, b) => a.probability - b.probability) + this.armorFixDb = addDesParamsArrayToFixes( + fixDb.filter(fix => { + return COMPARE_ITEMKIND(fix.ReqItemKind, ITEMKIND_DEFENSE) + }) + ) this.setState({ fixDb }) }) } @@ -159,7 +168,7 @@ class WeaponCalcTool extends Component { return obj } - renderFixSelect(saveAs, prefix) { + renderFixSelect(saveAs, prefix, fixDb) { const def = this.state[saveAs] return ( - this.setState({ + onChange={() => { + let newItem = this.gearItemDb.find( + item => item.id === Number(this.refs.weapsel.value) + ) + let stateUpdate = { sWp: this.refs.weapsel.value, - ench: this.cleanseEnchants( - this.gearItemDb.find( - item => item.id === Number(this.refs.weapsel.value) - ), - gear - ) - })} + ench: this.cleanseEnchants(newItem, gear) + } + + if (newItem && this.selectedItem) { + // oof + if (COMPARE_ITEMKIND(ITEMKIND_DEFENSE, newItem.kind)) { + // Switched to armor + //console.log(this.state, "toArmor"); + if (this.state.aPrf) { + stateUpdate['iPrf'] = this.state.aPrf + } + if (this.state.aSuf) { + stateUpdate['iSuf'] = this.state.aSuf + } + stateUpdate['aPrf'] = null + stateUpdate['aSuf'] = null + } else { + if ( + COMPARE_ITEMKIND( + ITEMKIND_DEFENSE, + this.selectedItem.kind + ) + ) { + // switched from armor to weapon + // console.log(this.state, "toWeap"); + if (this.state.iPrf) { + stateUpdate['aPrf'] = this.state.iPrf + } + if (this.state.iSuf) { + stateUpdate['aSuf'] = this.state.iSuf + } + stateUpdate['iPrf'] = null + stateUpdate['iSuf'] = null + } + } + } + + this.setState(stateUpdate) + }} value={sWp || ''} > @@ -354,6 +402,27 @@ class WeaponCalcTool extends Component { + {!isArmor && ( +
      +
      + +
      + {this.renderFixSelect('aPrf', true, this.armorFixDb)} +
      +
      + +
      + +
      + {this.renderFixSelect('aSuf', false, this.armorFixDb)} +
      +
      +
      + )} {this.selectedItem && (
      @@ -479,7 +548,7 @@ class WeaponCalcTool extends Component { ))}
      - TODO: Buffs/Items/armorbonus/.. + TODO: Buff-Items/?
      {this.selectedItem && ( charmItem.id === this.state.ch )} + armorBonus={ + isArmor + ? [] + : [this.state.aPrf, this.state.aSuf].map(fixId => + this.armorFixDb.find(fix => fix.id === Number(fixId)) + ) + } /> )}
      From 54132d17032353f36ce87c9d1d5e4ebeecdba72e Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sun, 29 Dec 2019 19:57:48 +0100 Subject: [PATCH 22/50] :recycle: Charm list as select --- src/components/AR/WeaponCalc/index.js | 55 +++++++++++++++++++-------- 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index 07a19ef..6cfe02d 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -426,6 +426,8 @@ class WeaponCalcTool extends Component { {this.selectedItem && (
      + Armor Bonus [select all armors with extras und übernahme bei + wechsel] @@ -519,6 +521,7 @@ class WeaponCalcTool extends Component { ) })}
      +
      {this.gearSkillDb.map(skill => (
      - {this.charmDb.map(charmItem => ( + {['Rapier', 'Turkey', 'Leadbuff', '?'].map(buff => ( this.handleCharmClick(charmItem)} + className={'tag' + (false ? ' is-success' : '')} + key={buff} > - {colorName(charmItem.name)} + {colorName(buff)} ))}
      - TODO: Buff-Items/? +
      +
      + +
      + +
      +
      +
      + TODO: Buff-Items/Armor base pierce/Engine/PET? dps vs. (firerate per s + // per volley)
      {this.selectedItem && ( Date: Sun, 29 Dec 2019 20:28:33 +0100 Subject: [PATCH 23/50] :tada: Armor Base Bonus & some concepts --- src/components/AR/WeaponCalc/TotalResult.js | 5 ++ src/components/AR/WeaponCalc/index.js | 69 ++++++++++++++++++--- 2 files changed, 67 insertions(+), 7 deletions(-) diff --git a/src/components/AR/WeaponCalc/TotalResult.js b/src/components/AR/WeaponCalc/TotalResult.js index 5301b37..90e8c7c 100644 --- a/src/components/AR/WeaponCalc/TotalResult.js +++ b/src/components/AR/WeaponCalc/TotalResult.js @@ -55,6 +55,11 @@ const TotalResult = props => { }) let skillsBonus = getMergedDesBoni(greenAdditives) + // TODO: Show firemode + // TODO: ao-framebrake to calc bps ONLY for x1 stds + + // if std/adv p s p v in min/max stats + return (
        {(weaponElseArmor ? WEAPON_ATTRS : ARMOR_ATTRS).map(attr => { diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index 6cfe02d..6774641 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -37,6 +37,19 @@ const bannedCharmDes = [162, 159, 160, 129, 130, 158, 157] // 161 (Blue Saph) wo const isBannedCharm = item => bannedCharmDes.some(bannedDesNum => bannedDesNum in item.DesParameters) +const hasNonArmorDesParams = item => { + let desParams = Object.assign({}, item.DesParameters) + + delete desParams[13] + delete desParams[89] + delete desParams[22] + delete desParams[23] + delete desParams[24] + delete desParams[25] + + return Object.keys(desParams).length > 0 +} + const stats = [ { id: 'Atk', label: 'Attack' }, { id: 'Def', label: 'Defense' }, @@ -50,6 +63,7 @@ const enchantCardMatches = (card, item, gear) => class WeaponCalcTool extends Component { gearItemDb = [] + gearArmorsWithBonus = [] gearSkillDb = [] itemFixDb = [] armorFixDb = [] @@ -89,6 +103,9 @@ class WeaponCalcTool extends Component { (item.kind >= 50 && item.SkillTargetType === 2 && item.Range) ) // Matches Gear or is a skill that applies to form (Type&Range) (Ragings) this.gearItemDb = itemDbGear.filter(isEquip) + this.gearArmorsWithBonus = this.gearItemDb.filter( + item => item.kind === ITEMKIND_DEFENSE && hasNonArmorDesParams(item) + ) this.gearSkillDb = itemDbGear.filter( item => (item.kind === ITEMKIND_SKILL_ATTACK || @@ -426,8 +443,41 @@ class WeaponCalcTool extends Component { {this.selectedItem && (
        - Armor Bonus [select all armors with extras und übernahme bei - wechsel] + {!isArmor && ( + + + TODO: Übernahme bei Wechsel +
        + +
        +
        + )} + @@ -578,8 +628,7 @@ class WeaponCalcTool extends Component {
      - TODO: Buff-Items/Armor base pierce/Engine/PET? dps vs. (firerate per s - // per volley) + TODO: Buff-Items / ? / dps vs. (firerate per s / per volley)
      {this.selectedItem && ( - this.armorFixDb.find(fix => fix.id === Number(fixId)) - ) + : [this.state.aPrf, this.state.aSuf] + .map(fixId => + this.armorFixDb.find(fix => fix.id === Number(fixId)) + ) + .concat([ + this.gearArmorsWithBonus.find( + item => item.id === this.state.arm + ) + ]) } /> )} From 8d2275b74d045711999b769d5517c1b75faadf07 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sun, 29 Dec 2019 21:04:25 +0100 Subject: [PATCH 24/50] :sparkles: Add Buffitems --- src/components/AR/WeaponCalc/index.js | 51 +++++++++++++++++++++------ src/data/ao.js | 1 + 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index 6774641..12f5b7e 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -12,7 +12,8 @@ import { ITEMKIND_SKILL_DEFENSE, ITEMKIND_ENCHANT, DES_ENCHANT_INITIALIZE, - ITEMKIND_ACCESSORY_TIMELIMIT + ITEMKIND_ACCESSORY_TIMELIMIT, + ITEMKIND_CARD } from '../../../data/ao' import LoadBlock from '../../LoadBlock' import WeaponPreview, { @@ -37,6 +38,8 @@ const bannedCharmDes = [162, 159, 160, 129, 130, 158, 157] // 161 (Blue Saph) wo const isBannedCharm = item => bannedCharmDes.some(bannedDesNum => bannedDesNum in item.DesParameters) +const BUFF_CARD_ITEMS = [7026601, 7026571, 7020641, 7020651, 7001100] + const hasNonArmorDesParams = item => { let desParams = Object.assign({}, item.DesParameters) @@ -68,6 +71,7 @@ class WeaponCalcTool extends Component { itemFixDb = [] armorFixDb = [] enchantItemDb = [] + buffItemDb = [] charmDb = [] selectedItem prefix @@ -84,7 +88,8 @@ class WeaponCalcTool extends Component { gear: 'B', ench: {}, stat: defaultStat, - sk: [] + sk: [], + bc: [] } let hash = this.props.location.hash.substr(1) @@ -125,7 +130,8 @@ class WeaponCalcTool extends Component { kind === ITEMKIND_SKILL_ATTACK || kind === ITEMKIND_SKILL_DEFENSE || kind === ITEMKIND_ENCHANT || - kind === ITEMKIND_ACCESSORY_TIMELIMIT + kind === ITEMKIND_ACCESSORY_TIMELIMIT || + kind === ITEMKIND_CARD ) { return true } @@ -143,6 +149,9 @@ class WeaponCalcTool extends Component { this.enchantItemDb = reducedItemDb.filter( item => item.kind === ITEMKIND_ENCHANT && !isBannedEnchant(item) ) + this.buffItemDb = reducedItemDb.filter( + item => BUFF_CARD_ITEMS.indexOf(item.id) !== -1 + ) this.charmDb = reducedItemDb.filter( item => item.kind === ITEMKIND_ACCESSORY_TIMELIMIT && @@ -588,13 +597,17 @@ class WeaponCalcTool extends Component { ))}
      - {['Rapier', 'Turkey', 'Leadbuff', '?'].map(buff => ( + {this.buffItemDb.map(buff => ( this.handleBuffcardClick(buff)} > - {colorName(buff)} + {colorName(buff.name)} ))}
      @@ -635,9 +648,15 @@ class WeaponCalcTool extends Component { item={this.selectedItem} weaponStats={weaponStats} gearStatPoints={this.state.stat} - skills={this.state.sk.map(skillId => - this.gearSkillDb.find(skill => skill.id === skillId) - )} + skills={this.state.sk + .map(skillId => + this.gearSkillDb.find(skill => skill.id === skillId) + ) + .concat( + this.state.bc.map(buffId => + this.buffItemDb.find(skill => skill.id === buffId) + ) + )} charm={this.charmDb.find( charmItem => charmItem.id === this.state.ch )} @@ -671,6 +690,18 @@ class WeaponCalcTool extends Component { this.setState({ sk: skillState }) } + + handleBuffcardClick(skill) { + let buffCardState = this.state.bc + + if (buffCardState.indexOf(skill.id) === -1) { + buffCardState.push(skill.id) + } else { + buffCardState = buffCardState.filter(skillId => skillId !== skill.id) + } + + this.setState({ bc: buffCardState }) + } } export default withRouter(WeaponCalcTool) diff --git a/src/data/ao.js b/src/data/ao.js index a272196..9d02199 100644 --- a/src/data/ao.js +++ b/src/data/ao.js @@ -13,6 +13,7 @@ export const ITEMKIND_ACCESSORY_TIMELIMIT = 32 export const ITEMKIND_SKILL_ATTACK = 50 export const ITEMKIND_SKILL_DEFENSE = 51 export const ITEMKIND_DEFENSE = 16 +export const ITEMKIND_CARD = 20 export const ITEMKIND_ENCHANT = 21 export const DES_ENCHANT_INITIALIZE = 105 From a930a3626859eff66c855299a5171a6186ccfb0a Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Fri, 3 Jan 2020 21:08:45 +0100 Subject: [PATCH 25/50] CR Styling --- src/index.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/index.css b/src/index.css index 49936c4..d0bbda6 100644 --- a/src/index.css +++ b/src/index.css @@ -20,3 +20,7 @@ body { img.profile { border-radius: 10%; } + +.button.is-info { + background-color: #006488; +} From 295ea5be9673c41c8f69b447dd4fe14b1f3c0e38 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Fri, 3 Jan 2020 21:08:57 +0100 Subject: [PATCH 26/50] :wheelchair: Higher contract colors --- src/utils/AR/names.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/AR/names.js b/src/utils/AR/names.js index de34bdc..cf27318 100644 --- a/src/utils/AR/names.js +++ b/src/utils/AR/names.js @@ -4,14 +4,14 @@ const colorMap = { e: '#F4AE0B', c: '#00CCCC', m: '#ff00ff', - a: '#bbbbff', + a: '#A8A8FF', h: '#ff8811', k: '#aa4400', u: '#aa33ff', v: '#007300', b: '#2255ff', d: '#777777', - y: '#ffff00', + y: '#C2C200', l: '#00aaff', g: '#00ff00', r: '#ff0000' From abdb8bda35436a2e3b1d4422ab6a56a46268e2ca Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Fri, 3 Jan 2020 21:09:27 +0100 Subject: [PATCH 27/50] :sparkles: Add KillsBetween to CR Version --- src/components/Home.js | 11 +++++++++++ src/components/Navi.js | 3 +++ src/containers/ChromeRivals/KillsInInterval.js | 18 +----------------- src/containers/ChromeRivals/OnlineCount.js | 3 --- src/containers/ChromeRivals/PlayerFameChart.js | 3 --- src/routes.js | 2 +- 6 files changed, 16 insertions(+), 24 deletions(-) diff --git a/src/components/Home.js b/src/components/Home.js index 66b2f01..38d22e4 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -1,5 +1,6 @@ import React, { Component } from 'react' import Link from 'react-router-dom/Link' +import { crTopKillsIntervalUrl } from '../routes' class Home extends Component { shouldComponentUpdate() { @@ -12,6 +13,16 @@ class Home extends Component {

      ChromeRivals Tools

      +
      + +
      +
      +

      Fame Ranking

      +

      Date comparison

      +
      +
      + +
      diff --git a/src/components/Navi.js b/src/components/Navi.js index e9a490c..83812eb 100644 --- a/src/components/Navi.js +++ b/src/components/Navi.js @@ -55,6 +55,9 @@ class Navi extends Component { style={{ paddingBottom: 0 }} >
      + + Ranking + WeaponCalc diff --git a/src/containers/ChromeRivals/KillsInInterval.js b/src/containers/ChromeRivals/KillsInInterval.js index e4d7801..078de3e 100644 --- a/src/containers/ChromeRivals/KillsInInterval.js +++ b/src/containers/ChromeRivals/KillsInInterval.js @@ -19,20 +19,6 @@ import { } from '../../components/ChromeRivals/PlayerFameChart' import AsyncLineChart from '../../components/AsyncLineChart' -export const CRDisclaimer = () => ( - - Server:{' '} - - ChromeRivals - . Stats displayed here are based on leaderboard data kindly provided by - their staff / API. - -) - const StatTag = props => (
      @@ -256,7 +242,7 @@ class KillsInInterval extends Component { {`ChromeRivals: Fame between`} -

      ChromeRivals: Fame between

      +

      CR Fame between

      {this.renderForm()} @@ -267,8 +253,6 @@ class KillsInInterval extends Component { ) : ( this.renderTable(result) )} - -
      ) } diff --git a/src/containers/ChromeRivals/OnlineCount.js b/src/containers/ChromeRivals/OnlineCount.js index f6239fa..ad8918e 100644 --- a/src/containers/ChromeRivals/OnlineCount.js +++ b/src/containers/ChromeRivals/OnlineCount.js @@ -1,7 +1,6 @@ import React, { Component } from 'react' import { Helmet } from 'react-helmet' import OnlineCountChart from '../../components/ChromeRivals/OnlineCountChart' -import { CRDisclaimer } from './KillsInInterval' import debounce from 'lodash.debounce' class OnlineCount extends Component { @@ -61,8 +60,6 @@ class OnlineCount extends Component { {this.renderForm()} {backdays > 0 && } - -
      ) } diff --git a/src/containers/ChromeRivals/PlayerFameChart.js b/src/containers/ChromeRivals/PlayerFameChart.js index 7ce4587..dadafbd 100644 --- a/src/containers/ChromeRivals/PlayerFameChart.js +++ b/src/containers/ChromeRivals/PlayerFameChart.js @@ -3,7 +3,6 @@ import { Helmet } from 'react-helmet' import debounce from 'lodash.debounce' import withRouter from 'react-router/withRouter' import PlayerFameChartChart from '../../components/ChromeRivals/PlayerFameChart' -import { CRDisclaimer } from './KillsInInterval' import { parse, stringify } from 'querystring' class PlayerFameChart extends Component { @@ -119,8 +118,6 @@ class PlayerFameChart extends Component { brigade={brigade} /> )} - -
      ) } diff --git a/src/routes.js b/src/routes.js index 830735f..d2ce8f6 100644 --- a/src/routes.js +++ b/src/routes.js @@ -8,7 +8,7 @@ import lazyImport from './utils/lazyImportHack' import { asyncComponent } from 'react-async-component' import LoadBlock from './components/LoadBlock' -export const crTopKillsIntervalUrl = '/ranking/chromerivals/topkillsinterval' +export const crTopKillsIntervalUrl = '/killsBetween' const LoadingComponent = () => From ab8c1b32b84622c4cf6488c6f07bf7a278315812 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sat, 4 Jan 2020 15:47:45 +0100 Subject: [PATCH 28/50] :zap: Fragment hash building improvements --- src/components/AR/WeaponCalc/index.js | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/components/AR/WeaponCalc/index.js b/src/components/AR/WeaponCalc/index.js index 12f5b7e..518d13a 100644 --- a/src/components/AR/WeaponCalc/index.js +++ b/src/components/AR/WeaponCalc/index.js @@ -182,8 +182,11 @@ class WeaponCalcTool extends Component { } componentDidUpdate(prevProps, prevState) { + const serializedState = this.serializeState() this.props.history.replace({ - hash: btoa(JSON.stringify(this.serializeState())) + hash: Object.keys(serializedState).length + ? btoa(JSON.stringify(this.serializeState())) + : null }) } @@ -191,6 +194,22 @@ class WeaponCalcTool extends Component { let obj = Object.assign({}, this.state) delete obj.itemdb delete obj.fixDb + + Object.keys(obj).forEach(stateKey => { + const stateKeyVal = obj[stateKey] + if ( + !stateKeyVal || + (Array.isArray(stateKeyVal) && stateKeyVal.length === 0) || + (typeof stateKeyVal === 'object' && + Object.values(stateKeyVal).filter(Boolean).length === 0) + ) { + delete obj[stateKey] + } + }) + if (Object.keys(obj).length === 1 && 'gear' in obj) { + delete obj.gear + } + return obj } @@ -358,6 +377,9 @@ class WeaponCalcTool extends Component { sWp: this.refs.weapsel.value, ench: this.cleanseEnchants(newItem, gear) } + if (stateUpdate.sWp && !isNaN(stateUpdate.sWp)) { + stateUpdate.sWp = Number(stateUpdate.sWp) + } if (newItem && this.selectedItem) { // oof @@ -641,7 +663,7 @@ class WeaponCalcTool extends Component {
      - TODO: Buff-Items / ? / dps vs. (firerate per s / per volley) + TODO: ? / dps vs. (firerate per s / per volley)
      {this.selectedItem && ( Date: Sat, 4 Jan 2020 15:58:26 +0100 Subject: [PATCH 29/50] :zap: add preconnect to API --- public/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/public/index.html b/public/index.html index 1e7d647..598ae26 100644 --- a/public/index.html +++ b/public/index.html @@ -14,6 +14,7 @@ + {{HELMET_HEAD}} - From c6ea69d5dbba42749c158d84a76de27263c87c5f Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sun, 19 Jan 2020 01:49:31 +0100 Subject: [PATCH 41/50] Fix SSR / new version bust --- server/app.js | 2 +- src/utils/pushUtils.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/app.js b/server/app.js index 1b5386c..42ec67a 100644 --- a/server/app.js +++ b/server/app.js @@ -20,7 +20,7 @@ const { indexhtmlDirect } = require('./indexhtml') const app = express() // Server favicon before to not show up in logs -app.use(favicon(path.join(__dirname, '../build', 'icon.png'))) +//app.use(favicon(path.join(__dirname, '../build', 'icon.png'))) // Setup logger app.use(morgan('combined')) diff --git a/src/utils/pushUtils.js b/src/utils/pushUtils.js index 232c9b8..f61a46a 100644 --- a/src/utils/pushUtils.js +++ b/src/utils/pushUtils.js @@ -114,7 +114,7 @@ export function push_subscribe(stateCallback) { // means we failed to subscribe and the user will need // to manually change the notification permission to // subscribe to push messages - console.warn('Notifications are denied by the user :(') + console.warn('Notifications are denied by the user :((') stateCallback('incompatible') } else { // A problem occurred with the subscription; common reasons From 1e2a03807a40b0e4494a8a69dd16f14293ee8e7d Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Wed, 29 Jan 2020 22:36:01 +0100 Subject: [PATCH 42/50] :sparkles: Expected DPS vs Def/Eva --- src/components/AR/WeaponCalc/TotalResult.js | 110 +++++++++++++++----- 1 file changed, 84 insertions(+), 26 deletions(-) diff --git a/src/components/AR/WeaponCalc/TotalResult.js b/src/components/AR/WeaponCalc/TotalResult.js index 1e09857..9a773af 100644 --- a/src/components/AR/WeaponCalc/TotalResult.js +++ b/src/components/AR/WeaponCalc/TotalResult.js @@ -16,6 +16,29 @@ const WEAPON_ATTRS = ['_MIN', '_MAX', '_PROB', '_PIERCE', '_SHOTS', '_MULTI'] const ARMOR_ATTRS = ['HP', 'DP', 'STD_DEF', 'ADV_DEF', 'STD_EVA', 'ADV_EVA'] +const dmgPerSecond = (min, max, weaponStats, totalValues) => { + const fbRes = aofb( + weaponStats.STD_RA.base, + totalValues.STD_SHOTS.total, + 60, + weaponStats.STD_RA.bonuses * -100 + 1 + ) + const bps = fbRes[fbRes.length - 1].bps * totalValues.STD_MULTI.total + return { + min: bps * min, + max: bps * max, + bp: fbRes[fbRes.length - 1].rea + } +} +const dmgPerVolley = (min, max, totalValues) => { + let missilesPerVolley = + totalValues['ADV_SHOTS'].total * totalValues['ADV_MULTI'].total + return { + min: min * missilesPerVolley, + max: max * missilesPerVolley + } +} + class TotalResult extends Component { constructor(props) { super(props) @@ -77,18 +100,29 @@ class TotalResult extends Component { let stdDps = null if (attrPrefix === 'STD') { - const fbRes = aofb( - weaponStats.STD_RA.base, - totalValues.STD_SHOTS.total, - 60, - weaponStats.STD_RA.bonuses * -100 + 1 + const stdDpsData = dmgPerSecond( + totalValues['STD_MIN'].total, + totalValues['STD_MAX'].total, + weaponStats, + totalValues ) - const bps = fbRes[fbRes.length - 1].bps * totalValues.STD_MULTI.total stdDps = (
    • - DPS @60fps:{' '} - {(bps * totalValues.STD_MIN.total).toFixed(3)} ~{' '} - {(bps * totalValues.STD_MAX.total).toFixed(3)} + DPS @60fps:{' '} + {stdDpsData.min.toFixed(3)} ~ {stdDpsData.max.toFixed(3)} +
    • + ) + } + let advDps = null + if (attrPrefix === 'ADV') { + const advDpsData = dmgPerVolley( + totalValues['ADV_MIN'].total, + totalValues['ADV_MAX'].total, + totalValues + ) + advDps = ( +
    • + DMG/Volley: {advDpsData.min.toFixed(3)} ~ {advDpsData.max.toFixed(3)}
    • ) } @@ -100,20 +134,7 @@ class TotalResult extends Component { ))} {stdDps} - {attrPrefix === 'ADV' ? ( -
    • - DMG/Volley:{' '} - {(totalValues['ADV_MIN'].total * - totalValues['ADV_SHOTS'].total * - totalValues['ADV_MULTI'].total - ).toFixed(3)}{' '} - ~{' '} - {(totalValues['ADV_MAX'].total * - totalValues['ADV_SHOTS'].total * - totalValues['ADV_MULTI'].total - ).toFixed(3)} -
    • - ) : null} + {advDps}
    {weaponElseArmor ? ( @@ -143,14 +164,14 @@ class TotalResult extends Component { ) })} - {this.valuesVs(totalValues, attrPrefix)} + {this.valuesVs(totalValues, attrPrefix, weaponStats)} ) : null} ) } - valuesVs(totalValues, attrPrefix) { + valuesVs(totalValues, attrPrefix, weaponStats) { if (!Object.values(this.state).some(Boolean)) { return null } @@ -187,7 +208,42 @@ class TotalResult extends Component { trueMax = Math.max(1, trueMax * trueFraction) } - // TODO: Per S / Per Volley to func with MM params + let defEvaReducedMin = trueMin + let defEvaReducedMax = trueMax + if (typeof hitRate !== 'undefined') { + let evaTrueFraction = hitRate / 100 + defEvaReducedMin *= evaTrueFraction + defEvaReducedMax *= evaTrueFraction + } + let stdDpsTrue = null + let advDpsTrue = null + if (attrPrefix === 'STD') { + const stdDpsData = dmgPerSecond( + defEvaReducedMin, + defEvaReducedMax, + weaponStats, + totalValues + ) + stdDpsTrue = ( +
  • + Expected Avg. True DPS: {stdDpsData.min.toFixed(3)} ~{' '} + {stdDpsData.max.toFixed(3)} +
  • + ) + } + if (attrPrefix === 'ADV') { + const advDpsData = dmgPerVolley( + defEvaReducedMin, + defEvaReducedMax, + totalValues + ) + advDpsTrue = ( +
  • + Expected Avg. True DMG/Volley: {advDpsData.min.toFixed(3)} ~{' '} + {advDpsData.max.toFixed(3)} +
  • + ) + } return (
      @@ -200,6 +256,8 @@ class TotalResult extends Component {
    • True MM / Hit: {trueMin.toFixed(6)} ~ {trueMax.toFixed(6)}
    • + {stdDpsTrue} + {advDpsTrue}
    ) } // refactor to class vars From 58dfb86dc083aa4205f0deb4bcab9e6974693338 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sun, 9 Feb 2020 16:20:53 +0100 Subject: [PATCH 43/50] :sparkles: 4K highlight midname --- src/utils/AR/names.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/AR/names.js b/src/utils/AR/names.js index cf27318..b58acaf 100644 --- a/src/utils/AR/names.js +++ b/src/utils/AR/names.js @@ -18,7 +18,7 @@ const colorMap = { } function specialNames(name) { - let regex = name.match(/^(.+)4K$/) + let regex = name.match(/^(.*)4K(.*)$/) if (!regex) { return name } @@ -26,6 +26,7 @@ function specialNames(name) { {regex[1]} 4K + {regex[2]} ) } From d388851f97fcfc9d1d7f7cef058dbb554e68f242 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sun, 9 Feb 2020 16:54:11 +0100 Subject: [PATCH 44/50] :sparkles: Preselect last hour on load --- .../ChromeRivals/KillsInInterval.js | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/containers/ChromeRivals/KillsInInterval.js b/src/containers/ChromeRivals/KillsInInterval.js index 4a14cac..a50987f 100644 --- a/src/containers/ChromeRivals/KillsInInterval.js +++ b/src/containers/ChromeRivals/KillsInInterval.js @@ -51,10 +51,54 @@ class KillsInInterval extends Component { } componentDidMount() { + // We already have all the dates from last visit persisted, but immediately fetch all and show loading. Causes a useless render of the select fields this.queryAvailableDates() this.queryData() } + componentDidUpdate(prevProps) { + if ( + prevProps.isFetchingDates && + !this.props.isFetchingDates && + this.props.rankingDates + ) { + this.preselectOnLoad() + } + } + + preselectOnLoad() { + const currentQs = this.getQueryParams() + if (currentQs.from || currentQs.to) { + return + } + let latestDate = this.props.rankingDates[0] + let to = latestDate[0] + latestDate[1] + + let latestDateDate = new Date(latestDate[0] + latestDate[1]) + let from + let fromDefault = this.props.rankingDates.find( + date => diffMins(latestDateDate, new Date(date[0] + date[1])) > 59 + ) + if (fromDefault) { + from = fromDefault[0] + fromDefault[1] + } + + let qs = {} + if (from) { + qs.from = from + } + if (to) { + qs.to = to + } + this.props.history.replace({ + search: stringify(qs) + }) + this.queryData({ + from, + to + }) + } + queryAvailableDates() { this.props.dispatch(fetchDatesIfNeeded()) } From 99ed3203ff653330a3847b7e434c953398cee43e Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Mon, 24 Feb 2020 22:29:16 +0100 Subject: [PATCH 45/50] Make app installable --- public/manifest.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/public/manifest.json b/public/manifest.json index 1005fd9..7cf3164 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -2,7 +2,11 @@ "short_name": "CRT", "name": "CR Tools", "icons": [ - + { + "src": "img/logo.png", + "sizes": "512x512", + "type": "image/png" + } ], "start_url": "./", "display": "standalone", From d01374f2d9c1449dd0ce66abb83456f19801a3d7 Mon Sep 17 00:00:00 2001 From: Tobias Kronthaler Date: Sun, 1 Mar 2020 12:40:44 +0100 Subject: [PATCH 46/50] :tada: Big rebuild & updates to utilize new cr-api --- package-lock.json | 91 +++++++- package.json | 6 +- public/index.html | 2 + .../ChromeRivals/OnlineCountChart.js | 8 +- src/config.js | 3 +- .../ChromeRivals/KillsInInterval.js | 217 ++++++------------ src/reducers/cr.js | 56 +---- 7 files changed, 174 insertions(+), 209 deletions(-) diff --git a/package-lock.json b/package-lock.json index 71907bc..87446ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4131,6 +4131,18 @@ "tweetnacl": "^0.14.3" } }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -4671,6 +4683,12 @@ "color-name": "^1.0.0" } }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, "chokidar": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", @@ -6131,9 +6149,14 @@ } }, "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.10.0.tgz", + "integrity": "sha512-EhfEKevYGWhWlZbNeplfhIU/+N+x0iCIx7VzKlXma2EdQyznVlZhCptXUY+BegNpPW2kjdx15Rvq503YcXXrcA==" + }, + "date-fns-tz": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.0.10.tgz", + "integrity": "sha512-cHQAz0/9uDABaUNDM80Mj1FL4ODlxs1xEY4b0DQuAooO2UdNKvDkNbV8ogLnxLbv02Ru1HXFcot0pVvDRBgptg==" }, "date-now": { "version": "0.1.4", @@ -6520,6 +6543,12 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, "electron-to-chromium": { "version": "1.3.154", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.154.tgz", @@ -8358,6 +8387,12 @@ "react-is": "^16.7.0" } }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", @@ -11299,6 +11334,12 @@ "supports-color": "^2.0.0" } }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -12316,6 +12357,12 @@ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, "opn": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", @@ -16328,6 +16375,12 @@ "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==", "dev": true }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, "ts-pnp": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.2.tgz", @@ -16904,6 +16957,38 @@ "webpack-sources": "^1.3.0" } }, + "webpack-bundle-analyzer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.0.tgz", + "integrity": "sha512-orUfvVYEfBMDXgEKAKVvab5iQ2wXneIEorGNsyuOyVYpjYrI7CUOhhXNDd3huMwQ3vNNWWlGP+hzflMFYNzi2g==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-walk": "^6.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, "webpack-dev-middleware": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", diff --git a/package.json b/package.json index 0ca6eb2..cc5a8ff 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "husky": "^0.14.3", "lint-staged": "^6.1.1", "prettier": "1.7.4", - "react-scripts": "3.0.1" + "react-scripts": "3.0.1", + "webpack-bundle-analyzer": "^3.6.0" }, "dependencies": { "@babel/plugin-proposal-class-properties": "^7.7.4", @@ -22,7 +23,8 @@ "classnames": "^2.2.6", "compression": "^1.7.4", "cross-env": "^5.2.1", - "date-fns": "^1.30.1", + "date-fns": "^2.10.0", + "date-fns-tz": "^1.0.10", "es6-promise": "^4.2.8", "express": "^4.17.1", "fetch-everywhere": "^1.0.5", diff --git a/public/index.html b/public/index.html index 5ef2dc1..f1acf7e 100644 --- a/public/index.html +++ b/public/index.html @@ -14,6 +14,8 @@ + + {{HELMET_HEAD}}