From 80e312d551a31eca4197822da5a6d8e10732df31 Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Sun, 21 Nov 2021 11:37:12 +0800 Subject: [PATCH 01/15] initial commit --- assets/font/Christmas.otf | Bin 0 -> 57204 bytes assets/images/xmas.svg | 26245 ++++++++++++++++++++++++++++++++++++ index.html | 2 +- package-lock.json | 2400 +++- script.js | 227 +- styles.css | 41 +- 6 files changed, 28700 insertions(+), 215 deletions(-) create mode 100644 assets/font/Christmas.otf create mode 100644 assets/images/xmas.svg diff --git a/assets/font/Christmas.otf b/assets/font/Christmas.otf new file mode 100644 index 0000000000000000000000000000000000000000..8d93a40cf79bf4ff51b67133386d7eed9fba4432 GIT binary patch literal 57204 zcmbq*2YeJqviGdwXhsOouwbveBZ0{_(HH|3Ac6stb524T<(yZ$+Pt%QSG&?G=PYuL zHpbwHalkeXU>oBc?tJGKZ*1$U9trHb=ezITd+cv&dOB2BS66rcySl}ijT_exfrOm! zCL$IsSrYcdtllJo7`KcdPCmYL?V1gJz3T!9;*qTcLGD|+Vbj75W7p>q#OSjG;bmO2 zVaoLB^y)7OLNt{ih`mwCk!hbKZy!YvgQ6k*czjG`G`nQkE0FdoJTv1V!td{)C6M0- zzDLI=XXQ;-ego-49)bK#i7^=|i&saa5Jd28f(Xb(Rd(!DUr!B()e+u z@NFds`g&SwW>#Mg!C{%gtHRFGlyE9*fTi%?}WEE$VLz!b=A!j-rX_oPh$Iq zk4p6>;oF<=!m;oV%6OA~!wK=Ix=&(%4IPy#aOzL%r|kp*asVZ~MQ=duz9KKLvt9=H zHuk?oAAubI^~WL*9yf#_7T%BBupumrh#-jDzFsv@*94H^Ye>T~6QUzt4e$!XVIovi z@Sy(X@Gay3$`Z>5!d`?w5kC<2Cgv0O<@JF)Jp=K+#30ame_205LcBi^_J@Z2G!P~U zRwn@a2K_g1(`FtSkOGtbl9tispGkl*I2>TOtzW4K! zM7W>-Kzsm%7Y&3dVyj=tK$s?G_`N$24kTvy(*xl_UU&TG4}^n=8PubTQq%G?65`^s z!p28U2%A22`n0fp`C%LL)8bQ8Q}8>cBWzOGhU~2Pgs=@637M&B@sX3m79=Hw38gZ_ zGGa1gGIC;~CohVJNdnXR zJm-Y{`|@)H+5UZ=%}`$gNIh-x)TvV+WEG^DbYB(_85S9ql@S>olN_0m z7?v9Q|I^05SJuBz{U`N5IdcY9|DP*3J}WD2&Xg&+xw(_G`uhi7F_Tkbvi^0-vY4c# z)W^fpl42q=W5S|RQ?eqXvci&M!uG|)re?&1MW*CKY;tl;MpOcHRCZ>};c`C+k; zGZSb=SZqd242}(3DPd{%dp9j3b$<+SeLO5BHDwZf#U^9{x?XSuinrIVg4m3IlDJ>~7?AaM zN&i{SIl$@vQa>(#UvK}N&+o061WN;M^Y1O_mw)p>Y{Gz!r-44E3cvpixBp(|Ki6cK z(0^f|$1v#C3_k>9C$?Iyvah23gK_SYpgG z3iO3XHjc$D_@k`P3Kp3U<+C9L&m4(@e8~dGn1Pny8j}Y~V!7gkyqMSTt;BMy{Rge4 z0Z*(WTzkKs@woVN{Uw2PQBZS=kduNkxZPM&cy{>T^!JoM$TsCq<|jO(-Jc()K(A5% zr*R4W9yaV>{{*}EbDNF;ZDPGAfbJ#_Xa`%-|EA6Vn=%;E1I`p4(Wn8G{0K�PRP? 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⋙)=*GigYRN~ct7lxo_pvEoujLx{mZ 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 PMH%8E0m@+%fO6>{omSMY literal 0 HcmV?d00001 diff --git a/assets/images/xmas.svg b/assets/images/xmas.svg new file mode 100644 index 0000000..748cb16 --- /dev/null +++ b/assets/images/xmas.svg @@ -0,0 +1,26245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/index.html b/index.html index 25a06fd..208588a 100644 --- a/index.html +++ b/index.html @@ -6,7 +6,7 @@ -

SWE101! 🚀

+

❄️☃️ (Match Card Game) 🌲❄️

diff --git a/package-lock.json b/package-lock.json index 4e29994..1e355ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,35 +1,1969 @@ { - "name": "match-game-swe1", + "name": "match-game-bootcamp", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "match-game-bootcamp", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "eslint": "^7.6.0", + "eslint-config-airbnb-base": "^14.2.0", + "eslint-plugin-import": "^2.22.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", + "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", + "eslint-plugin-import": "^2.21.2" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-module-utils/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-import": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", + "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.3", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.entries": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.3.tgz", + "integrity": "sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.1.tgz", + "integrity": "sha512-6CiMNDrzv0ZR916u2T+iRunnD60uWmNn8SkdB44/6stVORUg0aAkWO7PkOhpCmjmW8f2I/G/xnowD66fxGyQJg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -40,13 +1974,62 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true } } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "@types/json5": { @@ -56,21 +2039,22 @@ "dev": true }, "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} }, "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -86,18 +2070,18 @@ "dev": true }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "argparse": { @@ -131,9 +2115,9 @@ } }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "balanced-match": { @@ -168,31 +2152,6 @@ "supports-color": "^7.1.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -211,18 +2170,18 @@ } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "concat-map": { @@ -288,9 +2247,9 @@ } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "enquirer": { @@ -342,34 +2301,38 @@ } }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "eslint": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.6.0.tgz", - "integrity": "sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", - "espree": "^7.2.0", - "esquery": "^1.2.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -377,7 +2340,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -386,9 +2349,17 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^5.2.3", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, "eslint-config-airbnb-base": { @@ -505,12 +2476,12 @@ } }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -530,13 +2501,13 @@ "dev": true }, "espree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", - "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { - "acorn": "^7.3.1", - "acorn-jsx": "^5.2.0", + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" } }, @@ -547,29 +2518,37 @@ "dev": true }, "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "estraverse": { @@ -603,12 +2582,12 @@ "dev": true }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "find-up": { @@ -621,20 +2600,19 @@ } }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, "fs.realpath": { @@ -656,9 +2634,9 @@ "dev": true }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -670,21 +2648,21 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } }, "graceful-fs": { @@ -715,9 +2693,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "ignore": { @@ -783,15 +2761,15 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -902,10 +2880,16 @@ "path-exists": "^3.0.0" } }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, "minimatch": { @@ -923,15 +2907,6 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1095,9 +3070,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-type": { @@ -1169,6 +3144,12 @@ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -1185,9 +3166,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -1215,14 +3196,14 @@ "dev": true }, "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, "spdx-correct": { @@ -1264,31 +3245,14 @@ "dev": true }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "string.prototype.trimend": { @@ -1312,12 +3276,12 @@ } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -1342,15 +3306,36 @@ } }, "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.3.tgz", + "integrity": "sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==", "dev": true, "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.1.tgz", + "integrity": "sha512-6CiMNDrzv0ZR916u2T+iRunnD60uWmNn8SkdB44/6stVORUg0aAkWO7PkOhpCmjmW8f2I/G/xnowD66fxGyQJg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } } }, "text-table": { @@ -1381,15 +3366,15 @@ } }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -1431,15 +3416,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } } } } diff --git a/script.js b/script.js index e2d0297..ff525dc 100644 --- a/script.js +++ b/script.js @@ -1 +1,226 @@ -// Please implement exercise logic here +/* ############## +## GLOBAL VARIABLES ## +############## */ +// boardSize has to be an even number +const boardSize = 4; +const board = []; +let firstCard = null; +let firstCardElement; +let deck; +let square; +let squareDeco; + +/* ############## +## HELPER FUNCTION ## +############## */ +const makeDeck = () => { + let newDeck = []; + + // Initialise an array of the 4 suit in our deck. We will loop over this array. + const suit = [ + { suitsShape: "hearts", suitsSymbol: "♥️", suitsColour: "red" }, + { suitsShape: "diamond", suitsSymbol: "♦️", suitsColour: "red" }, + { suitsShape: "clubs", suitsSymbol: "♣️", suitsColour: "black" }, + { suitsShape: "spades", suitsSymbol: "♠️", suitsColour: "black" }, + ]; + + // Loop over the suit array + for (let value of suit) { + // Store the current suit in a variable + let currentSuit = value.suitsShape; + let currentSymbol = value.suitsSymbol; + let currentColour = value.suitsColour; + + // Loop from 1 to 13 to create all cards for a given suit + // Notice rankCounter starts at 1 and not 0, and ends at 13 and not 12. + // This is an example of a loop without an array. + for (let rankCounter = 1; rankCounter <= 13; rankCounter++) { + // By default, the card name is the same as rankCounter + let cardName = rankCounter; + let displayName = rankCounter; + + // If rank is 1, 11, 12, or 13, set cardName to the ace or face card's name, set cardValue to 10 (for jack, queen, king) or 11 (for ace) + if (rankCounter == 1) { + cardName = "ace"; + displayName = "A"; + } else if (rankCounter == 11) { + cardName = "jack"; + displayName = "J"; + } else if (rankCounter == 12) { + cardName = "queen"; + displayName = "Q"; + } else if (rankCounter == 13) { + cardName = "king"; + displayName = "K"; + } + + // Create a new card with the current name, suit, and rank + const card = { + suitSymbol: currentSymbol, + suit: currentSuit, + name: cardName, + display: displayName, + colour: currentColour, + rank: rankCounter, + }; + + // Add the new card to the deck + newDeck.push(card); + newDeck.push(card); + } + } + // Return the completed card deck + return newDeck; +}; + +// Get a random index ranging from 0 (inclusive) to max (exclusive). +const getRandomIndex = (max) => Math.floor(Math.random() * max); + +// Shuffle an array of cards +const shuffleCards = (cards) => { + // Loop over the card deck array once + for (let currentIndex = 0; currentIndex < cards.length; currentIndex += 1) { + // Select a random index in the deck + const randomIndex = getRandomIndex(cards.length); + // Select the card that corresponds to randomIndex + const randomCard = cards[randomIndex]; + // Select the card that corresponds to currentIndex + const currentCard = cards[currentIndex]; + // Swap positions of randomCard and currentCard in the deck + cards[currentIndex] = randomCard; + cards[randomIndex] = currentCard; + } + // Return the shuffled deck + return cards; +}; + +//for cardBack design and flip if not matched +const cardBackDeco = () => { + squareDeco = document.createElement("img"); + squareDeco.classList.add("card-deco"); + squareDeco.src = "assets/images/xmas.svg"; +}; + +/* ############## +## GAME PLAY LOGIC ## +############## */ +const squareClick = (cardElement, column, row) => { + console.log(cardElement); + + console.log("FIRST CARD DOM ELEMENT", firstCard); + + console.log("BOARD CLICKED CARD", board[column][row]); + + const clickedCard = board[column][row]; + + // the user already clicked on this square + if (cardElement.innerText !== "") { + return; + } + + // first turn + if (firstCard === null) { + console.log("first turn"); + firstCard = clickedCard; + // turn this card over + cardElement.innerText = `${firstCard.name} \n\ ${firstCard.suitSymbol}`; + + // hold onto this for later when it may not match + firstCardElement = cardElement; + + // second turn + } else { + console.log("second turn"); + if ( + clickedCard.name === firstCard.name && + clickedCard.suit === firstCard.suit + ) { + console.log("match"); + + // turn this card over + cardElement.innerText = `${clickedCard.name} \n\ ${clickedCard.suitSymbol}`; + } else { + console.log("NOT a match"); + + // turn this card back over with card back deco + firstCardElement.innerText = ""; + cardBackDeco(); + firstCardElement.appendChild(squareDeco); + + } + + // reset the first card + firstCard = null; + } +}; + +/* ############## +## GAME INITIALISATION LOGIC ## +############## */ +// create all the board elements that will go on the screen +// return the built board +const buildBoardElements = (board) => { + // create the element that everything will go inside of + const boardElement = document.createElement("div"); + + // give it a class for CSS purposes + boardElement.classList.add("board"); + + // use the board data structure we passed in to create the correct size board + for (let i = 0; i < board.length; i += 1) { + // make a var for just this row of cards + const row = board[i]; + + // make an element for this row of cards + const rowElement = document.createElement("div"); + rowElement.classList.add("row"); + + // make all the squares for this row + for (let j = 0; j < row.length; j += 1) { + // create the square element + square = document.createElement("div"); + + // set a class for CSS purposes + square.classList.add("square"); + + // set the click event + // eslint-disable-next-line + square.addEventListener("click", (event) => { + // we will want to pass in the card element so + // that we can change how it looks on screen, i.e., + // "turn the card over" + squareClick(event.currentTarget, i, j); + }); + + cardBackDeco(); + square.appendChild(squareDeco); + + rowElement.appendChild(square); + } + boardElement.appendChild(rowElement); + } + + return boardElement; +}; + +const initGame = () => { + // create this special deck by getting the doubled cards and + // making a smaller array that is ( boardSize squared ) number of cards + let doubleDeck = makeDeck(); + let deckSubset = doubleDeck.slice(0, boardSize * boardSize); + deck = shuffleCards(deckSubset); // array cannot be reassigned thats why the global variable is still empty + + // deal the cards out to the board data structure to get pairs of each cards + for (let i = 0; i < boardSize; i += 1) { + board.push([]); + for (let j = 0; j < boardSize; j += 1) { + board[i].push(deck.pop()); + } + } + + const boardEl = buildBoardElements(board); + + document.body.appendChild(boardEl); +}; + +initGame(); diff --git a/styles.css b/styles.css index 04e7110..0f5071e 100644 --- a/styles.css +++ b/styles.css @@ -1,3 +1,42 @@ +@font-face { + font-family: "Christmas"; + src: url("assets/font/Christmas.otf") format("opentype"); +} + +html { + min-height: 100vh; +} + body { - background-color: pink; + text-align: center; + font-family: "Christmas"; + margin: 0; + background: radial-gradient(#eef1f3, #ccf1f8); +} + +h1 { + color: #2f8d55; +} +.square { + position: relative; + padding: 10px; + margin: 10px; + background-color: white; + display: inline-block; + height: 100px; + width: 75px; + vertical-align: top; + font-size: 200%; + box-shadow: 0px 0px 8px 3px #30aac1; + border-radius: 8px; +} + +.card-deco { + position: absolute; + height: 125%; + width: 125%; + margin: -20px; + display: flex; + justify-content: center; + align-items: center; } From 6d441185e31e35fbf2de4f657ffbafdda247318a Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Sun, 21 Nov 2021 12:07:46 +0800 Subject: [PATCH 02/15] base setTimeout --- script.js | 36 +++++++++++++++++++++++++++--------- styles.css | 5 +++++ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/script.js b/script.js index ff525dc..cd27e19 100644 --- a/script.js +++ b/script.js @@ -4,6 +4,7 @@ // boardSize has to be an even number const boardSize = 4; const board = []; +const gameInfo = document.createElement("div"); let firstCard = null; let firstCardElement; let deck; @@ -101,6 +102,11 @@ const cardBackDeco = () => { squareDeco.src = "assets/images/xmas.svg"; }; +//for game info text +const output = (message) => { + gameInfo.innerText = message; +}; + /* ############## ## GAME PLAY LOGIC ## ############## */ @@ -120,6 +126,7 @@ const squareClick = (cardElement, column, row) => { // first turn if (firstCard === null) { + output("Find another card to match"); console.log("first turn"); firstCard = clickedCard; // turn this card over @@ -135,22 +142,29 @@ const squareClick = (cardElement, column, row) => { clickedCard.name === firstCard.name && clickedCard.suit === firstCard.suit ) { - console.log("match"); + output("Matched!"); // turn this card over cardElement.innerText = `${clickedCard.name} \n\ ${clickedCard.suitSymbol}`; } else { - console.log("NOT a match"); - - // turn this card back over with card back deco - firstCardElement.innerText = ""; - cardBackDeco(); - firstCardElement.appendChild(squareDeco); + output("NOT a match"); + // turn this card over for 3 seconds + cardElement.innerText = `${clickedCard.name} \n\ ${clickedCard.suitSymbol}`; + setTimeout( () => { + // turn this card back over with card back deco + firstCardElement.innerText = ""; + cardBackDeco(); + firstCardElement.appendChild(squareDeco); + cardElement.innerText = ""; + cardBackDeco(); + cardElement.appendChild(squareDeco); + // reset the first card + firstCard = null; + } + ,1500); } - // reset the first card - firstCard = null; } }; @@ -204,6 +218,10 @@ const buildBoardElements = (board) => { }; const initGame = () => { + // fill game info div with starting instructions + gameInfo.classList.add("game-info"); + gameInfo.innerText = "Let's play"; + document.body.appendChild(gameInfo); // create this special deck by getting the doubled cards and // making a smaller array that is ( boardSize squared ) number of cards let doubleDeck = makeDeck(); diff --git a/styles.css b/styles.css index 0f5071e..82936c4 100644 --- a/styles.css +++ b/styles.css @@ -17,6 +17,11 @@ body { h1 { color: #2f8d55; } +.game-info { + margin: 10px; + font-size: 150%; +} + .square { position: relative; padding: 10px; From ab31a9fb7b25096500235f89500b61036da05cb2 Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Sun, 21 Nov 2021 12:16:08 +0800 Subject: [PATCH 03/15] match message for 1.5 seconds --- script.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/script.js b/script.js index cd27e19..5ed9208 100644 --- a/script.js +++ b/script.js @@ -142,14 +142,22 @@ const squareClick = (cardElement, column, row) => { clickedCard.name === firstCard.name && clickedCard.suit === firstCard.suit ) { + //show message for 1.5 seconds output("Matched!"); + setTimeout (() => { + output("Find cards to match"); + },1500) // turn this card over cardElement.innerText = `${clickedCard.name} \n\ ${clickedCard.suitSymbol}`; } else { - output("NOT a match"); + //show message for 1.5 seconds + output("Not a match"); + setTimeout (() => { + output("Find cards to match"); + },1500) - // turn this card over for 3 seconds + // turn this card over for 1.5 seconds cardElement.innerText = `${clickedCard.name} \n\ ${clickedCard.suitSymbol}`; setTimeout( () => { // turn this card back over with card back deco From 97a8123091e3af18a9e279edb0422d3d07d78c71 Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Sun, 21 Nov 2021 13:38:16 +0800 Subject: [PATCH 04/15] prevent click events while setTimeOut --- assets/font/Candcu__.ttf | Bin 0 -> 50368 bytes script.js | 23 ++++++++++++++++++--- styles.css | 43 ++++++++++++++++++++++++++++++++++++--- 3 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 assets/font/Candcu__.ttf diff --git a/assets/font/Candcu__.ttf b/assets/font/Candcu__.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b0926ab94886c264f0be98b62a9c9533220bbe06 GIT binary patch literal 50368 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 { let newDeck = []; @@ -111,6 +115,8 @@ const output = (message) => { ## GAME PLAY LOGIC ## ############## */ const squareClick = (cardElement, column, row) => { + if(lockBoard) return; // check flag + console.log(cardElement); console.log("FIRST CARD DOM ELEMENT", firstCard); @@ -137,15 +143,19 @@ const squareClick = (cardElement, column, row) => { // second turn } else { + lockBoard=true; console.log("second turn"); if ( clickedCard.name === firstCard.name && clickedCard.suit === firstCard.suit ) { //show message for 1.5 seconds + firstCardElement.classList.add("matched"); + cardElement.classList.add("matched"); output("Matched!"); setTimeout (() => { output("Find cards to match"); + lockBoard = false; },1500) // turn this card over @@ -155,6 +165,7 @@ const squareClick = (cardElement, column, row) => { output("Not a match"); setTimeout (() => { output("Find cards to match"); + lockBoard = false; },1500) // turn this card over for 1.5 seconds @@ -167,12 +178,11 @@ const squareClick = (cardElement, column, row) => { cardElement.innerText = ""; cardBackDeco(); cardElement.appendChild(squareDeco); - // reset the first card - firstCard = null; } ,1500); } - + // reset the first card + firstCard = null; } }; @@ -230,6 +240,13 @@ const initGame = () => { gameInfo.classList.add("game-info"); gameInfo.innerText = "Let's play"; document.body.appendChild(gameInfo); + + // set initial timer + countDown = document.createElement("p"); + countDown.classList.add("timer"); + countDown.innerText = "3:00"; + document.body.appendChild(countDown); + // create this special deck by getting the doubled cards and // making a smaller array that is ( boardSize squared ) number of cards let doubleDeck = makeDeck(); diff --git a/styles.css b/styles.css index 82936c4..fa2cf49 100644 --- a/styles.css +++ b/styles.css @@ -3,8 +3,15 @@ src: url("assets/font/Christmas.otf") format("opentype"); } +@font-face { + font-family: "Candy"; + src: url("assets/font/Candcu__.ttf") format("truetype"); +} + html { min-height: 100vh; + cursor: url(https://cur.cursors-4u.net/holidays/hol-1/hol80.ani), + url(https://cur.cursors-4u.net/holidays/hol-1/hol80.png), auto !important; } body { @@ -22,6 +29,11 @@ h1 { font-size: 150%; } +.timer { + font-size: 150%; + color: #2f8d55; + font-family: "Candy"; +} .square { position: relative; padding: 10px; @@ -32,16 +44,41 @@ h1 { width: 75px; vertical-align: top; font-size: 200%; + font-family: "Candy"; box-shadow: 0px 0px 8px 3px #30aac1; border-radius: 8px; } +.square.matched { + animation: dance 1s linear infinite 500ms; +} + +@keyframes dance { + 0%, + 100% { + transform: rotate(0); + } + 25% { + transform: rotate(-3deg); + } + 75% { + transform: rotate(3deg); + } +} + .card-deco { position: absolute; - height: 125%; + height: auto; width: 125%; - margin: -20px; - display: flex; + margin: 50px 0px -20px 40px; + display: block; justify-content: center; align-items: center; + transform: translate(-50%, -50%); + transition: width 100ms ease-in-out, height 100ms ease-in-out; +} + +.square:hover .card-deco { + width: 140%; + height: auto; } From 202b31da33cd570eb957ce3b75901d5611be9cc2 Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Sun, 21 Nov 2021 15:03:05 +0800 Subject: [PATCH 05/15] add countdown timer --- script.js | 29 +++++++++++++++++++++++------ styles.css | 3 ++- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/script.js b/script.js index b46749c..0612c2e 100644 --- a/script.js +++ b/script.js @@ -11,13 +11,12 @@ let cardElement; let deck; let square; let squareDeco; -let countDown; +let timeRemaining; let lockBoard = false; // use flag to not let user click while waiting for timeout /* ############## ## HELPER FUNCTION ## ############## */ - const makeDeck = () => { let newDeck = []; @@ -111,6 +110,23 @@ const output = (message) => { gameInfo.innerText = message; }; +const countDown = () => { + let minute = 2; + let sec = 59; + setInterval(function() { + timeRemaining.innerHTML = + minute + " : " + sec.toString().padStart(2,'0'); + sec--; + if (sec==00) { + minute--; + sec = 59; + if (minute == 0) { + minute = 2; + } + } + },1000); +}; + /* ############## ## GAME PLAY LOGIC ## ############## */ @@ -242,10 +258,11 @@ const initGame = () => { document.body.appendChild(gameInfo); // set initial timer - countDown = document.createElement("p"); - countDown.classList.add("timer"); - countDown.innerText = "3:00"; - document.body.appendChild(countDown); + timeRemaining = document.createElement("span"); + timeRemaining.classList.add("time-remaining"); + timeRemaining.innerHTML = "3:00"; + countDown(); + document.body.appendChild(timeRemaining); // create this special deck by getting the doubled cards and // making a smaller array that is ( boardSize squared ) number of cards diff --git a/styles.css b/styles.css index fa2cf49..770f224 100644 --- a/styles.css +++ b/styles.css @@ -29,10 +29,11 @@ h1 { font-size: 150%; } -.timer { +.time-remaining { font-size: 150%; color: #2f8d55; font-family: "Candy"; + margin-bottom: 40px; } .square { position: relative; From 69d70b0b5d9f4b0e97175522e7743fba350f42bd Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Sun, 21 Nov 2021 21:16:20 +0800 Subject: [PATCH 06/15] start button and timer --- script.js | 49 ++++++++++++++++++++++++++++++++++++------------- styles.css | 12 ++++++++++++ 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/script.js b/script.js index 0612c2e..c993650 100644 --- a/script.js +++ b/script.js @@ -11,7 +11,10 @@ let cardElement; let deck; let square; let squareDeco; +let goStart; let timeRemaining; +let minute = 3; +let sec = 0; let lockBoard = false; // use flag to not let user click while waiting for timeout /* ############## @@ -110,23 +113,30 @@ const output = (message) => { gameInfo.innerText = message; }; +//timer & reset function const countDown = () => { - let minute = 2; - let sec = 59; - setInterval(function() { + const handle = setInterval(function() { timeRemaining.innerHTML = minute + " : " + sec.toString().padStart(2,'0'); - sec--; - if (sec==00) { + if (minute !==0 && sec === 0) { minute--; - sec = 59; - if (minute == 0) { - minute = 2; - } + sec = 60; } + sec--; + if (minute === 0 && sec<0) { + gameInfo.innerText = "Game over!"; + console.log("game is over"); + clearInterval(handle); + setTimeout(gameOver,3000); + } },1000); }; +// function for game reset +const gameOver = () => { + location.reload(); +} + /* ############## ## GAME PLAY LOGIC ## ############## */ @@ -170,12 +180,18 @@ const squareClick = (cardElement, column, row) => { cardElement.classList.add("matched"); output("Matched!"); setTimeout (() => { - output("Find cards to match"); + //if user finish before time is out + if (document.getElementsByClassName("matched").length === boardSize*boardSize) { + output("You won!"); + } else { + output("Find cards to match"); lockBoard = false; + } },1500) // turn this card over cardElement.innerText = `${clickedCard.name} \n\ ${clickedCard.suitSymbol}`; + } else { //show message for 1.5 seconds output("Not a match"); @@ -256,12 +272,19 @@ const initGame = () => { gameInfo.classList.add("game-info"); gameInfo.innerText = "Let's play"; document.body.appendChild(gameInfo); - + //button to start timer + goStart = document.createElement("button"); + goStart.classList.add("start-button"); + goStart.innerText = "Start"; + gameInfo.appendChild(goStart); + goStart.addEventListener("click", () => { + goStart.remove(); + countDown(); + }); // set initial timer timeRemaining = document.createElement("span"); timeRemaining.classList.add("time-remaining"); - timeRemaining.innerHTML = "3:00"; - countDown(); + timeRemaining.innerHTML = minute + " : " + sec.toString().padStart(2,'0'); document.body.appendChild(timeRemaining); // create this special deck by getting the doubled cards and diff --git a/styles.css b/styles.css index 770f224..4434e5b 100644 --- a/styles.css +++ b/styles.css @@ -46,6 +46,7 @@ h1 { vertical-align: top; font-size: 200%; font-family: "Candy"; + color: #2f8d55; box-shadow: 0px 0px 8px 3px #30aac1; border-radius: 8px; } @@ -67,6 +68,17 @@ h1 { } } +.start-button { + font-family: "Candy"; + border: none; + width: 50px; + height: 20px; + position: absolute; + margin-left: 20px; + box-shadow: 0px 0px 8px 3px #30aac1; + border-radius: 8px; +} + .card-deco { position: absolute; height: auto; From b56ff9d0ba8ddf57d8512f13676dc58f0b41a406 Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Sun, 21 Nov 2021 21:28:34 +0800 Subject: [PATCH 07/15] add reset button --- script.js | 22 +++++++++++++++++++--- styles.css | 10 +++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/script.js b/script.js index c993650..d592ad9 100644 --- a/script.js +++ b/script.js @@ -11,7 +11,9 @@ let cardElement; let deck; let square; let squareDeco; +let buttonWrapper; let goStart; +let goReset; let timeRemaining; let minute = 3; let sec = 0; @@ -191,7 +193,7 @@ const squareClick = (cardElement, column, row) => { // turn this card over cardElement.innerText = `${clickedCard.name} \n\ ${clickedCard.suitSymbol}`; - + } else { //show message for 1.5 seconds output("Not a match"); @@ -272,15 +274,29 @@ const initGame = () => { gameInfo.classList.add("game-info"); gameInfo.innerText = "Let's play"; document.body.appendChild(gameInfo); + + //button wrapper + buttonWrapper = document.createElement("div"); + buttonWrapper.classList.add("button-wrapper"); + document.body.appendChild(buttonWrapper); + //button to start timer goStart = document.createElement("button"); - goStart.classList.add("start-button"); + goStart.classList.add("button"); goStart.innerText = "Start"; - gameInfo.appendChild(goStart); + buttonWrapper.appendChild(goStart); goStart.addEventListener("click", () => { + gameInfo.innerText ="Match all cards"; goStart.remove(); countDown(); }); + + goReset = document.createElement("button"); + goReset.classList.add("button"); + goReset.innerText= "Reset"; + buttonWrapper.appendChild(goReset); + goReset.addEventListener("click",gameOver); + // set initial timer timeRemaining = document.createElement("span"); timeRemaining.classList.add("time-remaining"); diff --git a/styles.css b/styles.css index 4434e5b..b93b8d7 100644 --- a/styles.css +++ b/styles.css @@ -68,13 +68,17 @@ h1 { } } -.start-button { +.button-wrapper { + text-align: center; + margin-bottom: 20px; +} + +.button { font-family: "Candy"; border: none; width: 50px; height: 20px; - position: absolute; - margin-left: 20px; + margin: 10px; box-shadow: 0px 0px 8px 3px #30aac1; border-radius: 8px; } From f55a6b9a1ca51bde59e3fd64c0284f750c128a17 Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Sun, 21 Nov 2021 21:40:10 +0800 Subject: [PATCH 08/15] win message --- script.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/script.js b/script.js index d592ad9..cb13289 100644 --- a/script.js +++ b/script.js @@ -17,7 +17,7 @@ let goReset; let timeRemaining; let minute = 3; let sec = 0; -let lockBoard = false; // use flag to not let user click while waiting for timeout +let lockBoard = true; // use flag to not let user click while waiting for timeout and start game /* ############## ## HELPER FUNCTION ## @@ -184,7 +184,8 @@ const squareClick = (cardElement, column, row) => { setTimeout (() => { //if user finish before time is out if (document.getElementsByClassName("matched").length === boardSize*boardSize) { - output("You won!"); + output("You won!"); + setTimeout(gameOver,5000); } else { output("Find cards to match"); lockBoard = false; @@ -286,6 +287,7 @@ const initGame = () => { goStart.innerText = "Start"; buttonWrapper.appendChild(goStart); goStart.addEventListener("click", () => { + lockBoard = false; gameInfo.innerText ="Match all cards"; goStart.remove(); countDown(); From feec0e9f07406541aea2da37433573a329d14ca8 Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Mon, 22 Nov 2021 00:25:11 +0800 Subject: [PATCH 09/15] add overlay text --- script.js | 7 +++++++ styles.css | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/script.js b/script.js index cb13289..f41a62f 100644 --- a/script.js +++ b/script.js @@ -11,6 +11,7 @@ let cardElement; let deck; let square; let squareDeco; +let overlay; let buttonWrapper; let goStart; let goReset; @@ -271,6 +272,12 @@ const buildBoardElements = (board) => { }; const initGame = () => { + //create overlay + overlay = document.createElement("div"); + overlay.classList.add("overlay-text","visible"); + overlay.innerHTML = "Enter your name here"; + document.body.appendChild(overlay); + // fill game info div with starting instructions gameInfo.classList.add("game-info"); gameInfo.innerText = "Let's play"; diff --git a/styles.css b/styles.css index b93b8d7..1d1fc19 100644 --- a/styles.css +++ b/styles.css @@ -99,3 +99,28 @@ h1 { width: 140%; height: auto; } + +.overlay-text { + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 2; + display: none; + width: 100%; /* Full width (cover the whole page) */ + height: 100%; /* Full height (cover the whole page) */ + position: fixed; + justify-content: center; + align-items: center; + flex-direction: column; + background-color: rgba(0, 0, 0, 0.8); /* Black background with opacity */ + font-family: Candy; + color: #2f8d55; + transition: background-color 500ms, font-size 500ms; + font-size: 200%; +} + +.overlay-text.visible { + display: flex; + animation: overlay-grow 500ms forwards; +} From fd924a895717924f94f7ce26a14293c46a149a75 Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Mon, 22 Nov 2021 11:01:45 +0800 Subject: [PATCH 10/15] add username before game --- script.js | 26 +++++++++++++++++++++----- styles.css | 11 +++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/script.js b/script.js index f41a62f..c802f32 100644 --- a/script.js +++ b/script.js @@ -12,6 +12,7 @@ let deck; let square; let squareDeco; let overlay; +let userName; let buttonWrapper; let goStart; let goReset; @@ -272,16 +273,31 @@ const buildBoardElements = (board) => { }; const initGame = () => { + // fill game info div with starting instructions + gameInfo.classList.add("game-info"); + gameInfo.innerText = `Let's play !`; + document.body.appendChild(gameInfo); + //create overlay overlay = document.createElement("div"); overlay.classList.add("overlay-text","visible"); - overlay.innerHTML = "Enter your name here"; + overlay.innerHTML = "Enter your name here and press Enter"; document.body.appendChild(overlay); - // fill game info div with starting instructions - gameInfo.classList.add("game-info"); - gameInfo.innerText = "Let's play"; - document.body.appendChild(gameInfo); + //create userName field + userName = document.createElement("input"); + userName.classList.add("input"); + userName.autofocus = true; + overlay.appendChild(userName); + userName.addEventListener("keydown", (e) => { + if (e.key === 'Enter') { + userName = userName.value; + overlay.classList.remove("visible"); + output(`Let's play, ${userName}!`); + } + else return null; + } + ); //button wrapper buttonWrapper = document.createElement("div"); diff --git a/styles.css b/styles.css index 1d1fc19..0177139 100644 --- a/styles.css +++ b/styles.css @@ -124,3 +124,14 @@ h1 { display: flex; animation: overlay-grow 500ms forwards; } + +.input { + margin-top: 20px; + border: none; + outline: none; + background: transparent; + color: white; + font-family: Candy; + font-size: 150%; + text-align: center; +} From c36bca24a2ef1522194fcda3cc4a7e74ab5ea48d Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Mon, 22 Nov 2021 22:44:57 +0800 Subject: [PATCH 11/15] reset game & show win score --- script.js | 97 +++++++++++++++++++++++++++++++++++++++++++----------- styles.css | 14 +++++--- 2 files changed, 88 insertions(+), 23 deletions(-) diff --git a/script.js b/script.js index c802f32..97930f2 100644 --- a/script.js +++ b/script.js @@ -3,7 +3,9 @@ ############## */ // boardSize has to be an even number const boardSize = 4; -const board = []; +let board = []; +let boardEl; +let boardElement; const gameInfo = document.createElement("div"); let firstCard = null; let firstCardElement; @@ -13,13 +15,17 @@ let square; let squareDeco; let overlay; let userName; +let gridContainer; +let scoreElement; let buttonWrapper; let goStart; let goReset; let timeRemaining; let minute = 3; let sec = 0; +let score = 0; let lockBoard = true; // use flag to not let user click while waiting for timeout and start game +let handle = 0; /* ############## ## HELPER FUNCTION ## @@ -117,28 +123,64 @@ const output = (message) => { gameInfo.innerText = message; }; +// for timer text +const timeOutput = () => { + timeRemaining.innerHTML = + `Time \n + ${minute}:${sec.toString().padStart(2,'0')}` +} + +const scoreOutput = () => { + scoreElement.innerText = `Score ${score}`; +} + //timer & reset function const countDown = () => { - const handle = setInterval(function() { - timeRemaining.innerHTML = - minute + " : " + sec.toString().padStart(2,'0'); + handle = setInterval(function() { + timeOutput(); if (minute !==0 && sec === 0) { minute--; sec = 60; } sec--; + //stop timer if all cards matched + if (document.getElementsByClassName("matched").length === boardSize*boardSize) { + clearInterval(handle); + } + //stop timer if time is out if (minute === 0 && sec<0) { gameInfo.innerText = "Game over!"; console.log("game is over"); clearInterval(handle); - setTimeout(gameOver,3000); + setTimeout(gameReset,3000); } },1000); }; -// function for game reset -const gameOver = () => { - location.reload(); +// function for game reset, score is kept +const gameReset = () => { + //resetTimer + clearInterval(handle); + minute = 3; + sec = 0; + timeOutput(); + //reset start + goStart.disabled = false; + goStart.innerText = "Start again"; + lockBoard = true; + board = []; + deck = []; + firstCard = null; + //reset matched card + let elems = document.getElementsByClassName("matched"); + while(elems.length > 0){ + elems[0].classList.remove("matched"); + } + //reset the board + boardEl = null; + boardElement.remove(); + //init game again + initGame(); } /* ############## @@ -187,7 +229,9 @@ const squareClick = (cardElement, column, row) => { //if user finish before time is out if (document.getElementsByClassName("matched").length === boardSize*boardSize) { output("You won!"); - setTimeout(gameOver,5000); + score +=1; + scoreOutput(); + setTimeout(gameReset,5000); } else { output("Find cards to match"); lockBoard = false; @@ -230,7 +274,7 @@ const squareClick = (cardElement, column, row) => { // return the built board const buildBoardElements = (board) => { // create the element that everything will go inside of - const boardElement = document.createElement("div"); + boardElement = document.createElement("div"); // give it a class for CSS purposes boardElement.classList.add("board"); @@ -272,7 +316,7 @@ const buildBoardElements = (board) => { return boardElement; }; -const initGame = () => { +const buildOtherElements = () => { // fill game info div with starting instructions gameInfo.classList.add("game-info"); gameInfo.innerText = `Let's play !`; @@ -299,6 +343,23 @@ const initGame = () => { } ); + //grid container for time and score + gridContainer = document.createElement("div"); + gridContainer.classList.add("grid-container"); + document.body.appendChild(gridContainer); + + // set initial timer + timeRemaining = document.createElement("span"); + timeRemaining.classList.add("time-remaining"); + timeOutput(); + gridContainer.appendChild(timeRemaining); + + // set initial score + scoreElement = document.createElement("span"); + scoreElement.classList.add("score"); + scoreOutput(); + gridContainer.appendChild(scoreElement); + //button wrapper buttonWrapper = document.createElement("div"); buttonWrapper.classList.add("button-wrapper"); @@ -312,7 +373,7 @@ const initGame = () => { goStart.addEventListener("click", () => { lockBoard = false; gameInfo.innerText ="Match all cards"; - goStart.remove(); + goStart.disabled = true; countDown(); }); @@ -320,14 +381,12 @@ const initGame = () => { goReset.classList.add("button"); goReset.innerText= "Reset"; buttonWrapper.appendChild(goReset); - goReset.addEventListener("click",gameOver); + goReset.addEventListener("click",gameReset); +}; - // set initial timer - timeRemaining = document.createElement("span"); - timeRemaining.classList.add("time-remaining"); - timeRemaining.innerHTML = minute + " : " + sec.toString().padStart(2,'0'); - document.body.appendChild(timeRemaining); +buildOtherElements(); +const initGame = () => { // create this special deck by getting the doubled cards and // making a smaller array that is ( boardSize squared ) number of cards let doubleDeck = makeDeck(); @@ -342,7 +401,7 @@ const initGame = () => { } } - const boardEl = buildBoardElements(board); + boardEl = buildBoardElements(board); document.body.appendChild(boardEl); }; diff --git a/styles.css b/styles.css index 0177139..9614892 100644 --- a/styles.css +++ b/styles.css @@ -29,11 +29,17 @@ h1 { font-size: 150%; } -.time-remaining { - font-size: 150%; +.grid-container { + font-size: 300%; color: #2f8d55; font-family: "Candy"; margin-bottom: 40px; + position: absolute; + right: 100px; + top: 100px; + z-index: 2; + display: grid; + text-align: right; } .square { position: relative; @@ -76,7 +82,7 @@ h1 { .button { font-family: "Candy"; border: none; - width: 50px; + width: 100px; height: 20px; margin: 10px; box-shadow: 0px 0px 8px 3px #30aac1; @@ -105,7 +111,7 @@ h1 { left: 0; right: 0; bottom: 0; - z-index: 2; + z-index: 3; display: none; width: 100%; /* Full width (cover the whole page) */ height: 100%; /* Full height (cover the whole page) */ From 421503f70155bc73cbbee322e3a7734fd1b76a5f Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Mon, 22 Nov 2021 23:07:38 +0800 Subject: [PATCH 12/15] slice deck at random --- script.js | 4 +++- styles.css | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/script.js b/script.js index 97930f2..c299981 100644 --- a/script.js +++ b/script.js @@ -388,9 +388,11 @@ buildOtherElements(); const initGame = () => { // create this special deck by getting the doubled cards and + // slice is done randomly // making a smaller array that is ( boardSize squared ) number of cards let doubleDeck = makeDeck(); - let deckSubset = doubleDeck.slice(0, boardSize * boardSize); + let sliceStart = 2*Math.round(getRandomIndex(88)/2); + let deckSubset = doubleDeck.slice(sliceStart, sliceStart+ boardSize * boardSize); deck = shuffleCards(deckSubset); // array cannot be reassigned thats why the global variable is still empty // deal the cards out to the board data structure to get pairs of each cards diff --git a/styles.css b/styles.css index 9614892..b4d4643 100644 --- a/styles.css +++ b/styles.css @@ -50,7 +50,7 @@ h1 { height: 100px; width: 75px; vertical-align: top; - font-size: 200%; + font-size: 180%; font-family: "Candy"; color: #2f8d55; box-shadow: 0px 0px 8px 3px #30aac1; From cd79c7c3d35fd43d4c97b10e6d7c870b39cccb18 Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Mon, 22 Nov 2021 23:28:27 +0800 Subject: [PATCH 13/15] published to netlify --- README.md | 2 ++ assets/images/card-ace-hearts.svg | 1 + index.html | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 assets/images/card-ace-hearts.svg diff --git a/README.md b/README.md index 93798c6..d809a04 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ # Rocket Academy Coding Bootcamp: Match Game + +Published via Netlify: https://xmas-match-game.netlify.app/ diff --git a/assets/images/card-ace-hearts.svg b/assets/images/card-ace-hearts.svg new file mode 100644 index 0000000..9587a0b --- /dev/null +++ b/assets/images/card-ace-hearts.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/index.html b/index.html index 208588a..64b215b 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,9 @@ - SWE101 + Match Card Game + From 7f529e660bd7621878a3a7ffcf70b989f7085d5b Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Tue, 23 Nov 2021 09:55:33 +0800 Subject: [PATCH 14/15] meta viewport and edit reset --- index.html | 3 +- script.js | 136 +++++++++++++++++++++++++---------------------------- styles.css | 5 +- 3 files changed, 70 insertions(+), 74 deletions(-) diff --git a/index.html b/index.html index 64b215b..5685383 100644 --- a/index.html +++ b/index.html @@ -1,7 +1,8 @@ - + Match Card Game + diff --git a/script.js b/script.js index c299981..6d24db9 100644 --- a/script.js +++ b/script.js @@ -25,7 +25,7 @@ let minute = 3; let sec = 0; let score = 0; let lockBoard = true; // use flag to not let user click while waiting for timeout and start game -let handle = 0; +let handle; /* ############## ## HELPER FUNCTION ## @@ -125,36 +125,31 @@ const output = (message) => { // for timer text const timeOutput = () => { - timeRemaining.innerHTML = - `Time \n - ${minute}:${sec.toString().padStart(2,'0')}` -} + timeRemaining.innerHTML = `Time \n + ${minute}:${sec.toString().padStart(2, "0")}`; +}; const scoreOutput = () => { scoreElement.innerText = `Score ${score}`; -} +}; //timer & reset function const countDown = () => { - handle = setInterval(function() { + handle = setInterval(function () { timeOutput(); - if (minute !==0 && sec === 0) { + if (minute !== 0 && sec === 0) { minute--; sec = 60; } sec--; - //stop timer if all cards matched - if (document.getElementsByClassName("matched").length === boardSize*boardSize) { - clearInterval(handle); - } //stop timer if time is out - if (minute === 0 && sec<0) { + if (minute === 0 && sec < 0) { gameInfo.innerText = "Game over!"; console.log("game is over"); clearInterval(handle); - setTimeout(gameReset,3000); - } - },1000); + setTimeout(gameReset, 3000); + } + }, 1000); }; // function for game reset, score is kept @@ -169,26 +164,23 @@ const gameReset = () => { goStart.innerText = "Start again"; lockBoard = true; board = []; - deck = []; - firstCard = null; - //reset matched card + /*reset matched card let elems = document.getElementsByClassName("matched"); - while(elems.length > 0){ - elems[0].classList.remove("matched"); - } - //reset the board - boardEl = null; + while (elems.length > 0) { + elems[0].classList.remove("matched"); + }*/ boardElement.remove(); //init game again initGame(); -} +}; /* ############## ## GAME PLAY LOGIC ## ############## */ + const squareClick = (cardElement, column, row) => { - if(lockBoard) return; // check flag - + if (lockBoard) return; // check flag + console.log(cardElement); console.log("FIRST CARD DOM ELEMENT", firstCard); @@ -212,46 +204,48 @@ const squareClick = (cardElement, column, row) => { // hold onto this for later when it may not match firstCardElement = cardElement; - - // second turn - } else { - lockBoard=true; + } // second turn + else { + lockBoard = true; console.log("second turn"); if ( clickedCard.name === firstCard.name && clickedCard.suit === firstCard.suit ) { - //show message for 1.5 seconds + //show message for 1 second firstCardElement.classList.add("matched"); cardElement.classList.add("matched"); output("Matched!"); - setTimeout (() => { - //if user finish before time is out - if (document.getElementsByClassName("matched").length === boardSize*boardSize) { - output("You won!"); - score +=1; - scoreOutput(); - setTimeout(gameReset,5000); - } else { - output("Find cards to match"); - lockBoard = false; - } - },1500) + setTimeout(() => { + //if user finish before time is out + if ( + document.getElementsByClassName("matched").length === + boardSize * boardSize + ) { + output("You won!"); + score += 1; + scoreOutput(); + clearInterval(handle); + setTimeout(gameReset, 5000); + } else { + output("Find cards to match"); + lockBoard = false; + } + }, 1000); // turn this card over cardElement.innerText = `${clickedCard.name} \n\ ${clickedCard.suitSymbol}`; - } else { - //show message for 1.5 seconds + //show message for 1 seconds output("Not a match"); - setTimeout (() => { - output("Find cards to match"); - lockBoard = false; - },1500) + setTimeout(() => { + output("Find cards to match"); + lockBoard = false; + }, 1000); - // turn this card over for 1.5 seconds + // turn this card over for 1 seconds cardElement.innerText = `${clickedCard.name} \n\ ${clickedCard.suitSymbol}`; - setTimeout( () => { + setTimeout(() => { // turn this card back over with card back deco firstCardElement.innerText = ""; cardBackDeco(); @@ -259,11 +253,10 @@ const squareClick = (cardElement, column, row) => { cardElement.innerText = ""; cardBackDeco(); cardElement.appendChild(squareDeco); - } - ,1500); + }, 1000); } - // reset the first card - firstCard = null; + // reset the first card + firstCard = null; } }; @@ -321,33 +314,31 @@ const buildOtherElements = () => { gameInfo.classList.add("game-info"); gameInfo.innerText = `Let's play !`; document.body.appendChild(gameInfo); - + //create overlay overlay = document.createElement("div"); - overlay.classList.add("overlay-text","visible"); + overlay.classList.add("overlay-text", "visible"); overlay.innerHTML = "Enter your name here and press Enter"; document.body.appendChild(overlay); - + //create userName field userName = document.createElement("input"); userName.classList.add("input"); userName.autofocus = true; overlay.appendChild(userName); userName.addEventListener("keydown", (e) => { - if (e.key === 'Enter') { + if (e.key === "Enter") { userName = userName.value; overlay.classList.remove("visible"); output(`Let's play, ${userName}!`); - } - else return null; - } - ); + } else return null; + }); //grid container for time and score gridContainer = document.createElement("div"); gridContainer.classList.add("grid-container"); document.body.appendChild(gridContainer); - + // set initial timer timeRemaining = document.createElement("span"); timeRemaining.classList.add("time-remaining"); @@ -372,27 +363,30 @@ const buildOtherElements = () => { buttonWrapper.appendChild(goStart); goStart.addEventListener("click", () => { lockBoard = false; - gameInfo.innerText ="Match all cards"; + gameInfo.innerText = "Match all cards"; goStart.disabled = true; countDown(); }); goReset = document.createElement("button"); goReset.classList.add("button"); - goReset.innerText= "Reset"; + goReset.innerText = "Reset"; buttonWrapper.appendChild(goReset); - goReset.addEventListener("click",gameReset); + goReset.addEventListener("click", gameReset); }; buildOtherElements(); const initGame = () => { // create this special deck by getting the doubled cards and - // slice is done randomly + // slice is done randomly // making a smaller array that is ( boardSize squared ) number of cards let doubleDeck = makeDeck(); - let sliceStart = 2*Math.round(getRandomIndex(88)/2); - let deckSubset = doubleDeck.slice(sliceStart, sliceStart+ boardSize * boardSize); + let sliceStart = 2 * Math.round(getRandomIndex(88) / 2); + let deckSubset = doubleDeck.slice( + sliceStart, + sliceStart + boardSize * boardSize + ); deck = shuffleCards(deckSubset); // array cannot be reassigned thats why the global variable is still empty // deal the cards out to the board data structure to get pairs of each cards diff --git a/styles.css b/styles.css index b4d4643..91ef16c 100644 --- a/styles.css +++ b/styles.css @@ -23,14 +23,15 @@ body { h1 { color: #2f8d55; + margin-top: 40px; } .game-info { - margin: 10px; + margin-top: 100px; font-size: 150%; } .grid-container { - font-size: 300%; + font-size: 250%; color: #2f8d55; font-family: "Candy"; margin-bottom: 40px; From 0547527019466c60b2a9c7cbc4d419185019766e Mon Sep 17 00:00:00 2001 From: Amelia Wibisono Date: Tue, 30 Nov 2021 21:08:54 +0800 Subject: [PATCH 15/15] add lockboard when game over --- script.js | 1 + 1 file changed, 1 insertion(+) diff --git a/script.js b/script.js index 6d24db9..aeb0d90 100644 --- a/script.js +++ b/script.js @@ -146,6 +146,7 @@ const countDown = () => { if (minute === 0 && sec < 0) { gameInfo.innerText = "Game over!"; console.log("game is over"); + lockBoard = true; clearInterval(handle); setTimeout(gameReset, 3000); }