From cfbfbdbb1829d56a940b8066b7375e3f2bdc63b5 Mon Sep 17 00:00:00 2001 From: Hung Viet Nguyen Date: Sat, 22 Oct 2022 15:22:16 +0700 Subject: [PATCH 1/4] feat: Implement previewServer (powered by Vite) --- .prettierignore | 3 + .prettierrc.json | 6 + apps/react-testing-lib/index.html | 13 + apps/react-testing-lib/package.json | 35 + apps/react-testing-lib/public/vitest.png | Bin 0 -> 5328 bytes apps/react-testing-lib/src/App.css | 14 + apps/react-testing-lib/src/App.test.tsx | 15 + apps/react-testing-lib/src/App.tsx | 50 + .../react-testing-lib/src/hooks/useCounter.ts | 7 + apps/react-testing-lib/src/index.css | 13 + apps/react-testing-lib/src/main.tsx | 11 + apps/react-testing-lib/src/media/vite.png | Bin 0 -> 67153 bytes apps/react-testing-lib/src/test/setup.ts | 4 + .../src/utils/test-utils.tsx | 19 + apps/react-testing-lib/tsconfig.json | 20 + apps/react-testing-lib/vite.config.ts | 17 + package.json | 6 +- packages/vitest-preview/index.es.js | 7 - packages/vitest-preview/package.json | 14 +- packages/vitest-preview/playground.js | 2 +- packages/vitest-preview/rollup.config.js | 35 +- packages/vitest-preview/src/constants.ts | 7 +- packages/vitest-preview/src/index.ts | 2 +- .../vitest-preview/src/node/previewServer.ts | 55 + packages/vitest-preview/src/preview.ts | 12 +- pnpm-lock.yaml | 2269 +++++++++++++++-- 26 files changed, 2431 insertions(+), 205 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 apps/react-testing-lib/index.html create mode 100644 apps/react-testing-lib/package.json create mode 100644 apps/react-testing-lib/public/vitest.png create mode 100644 apps/react-testing-lib/src/App.css create mode 100644 apps/react-testing-lib/src/App.test.tsx create mode 100644 apps/react-testing-lib/src/App.tsx create mode 100644 apps/react-testing-lib/src/hooks/useCounter.ts create mode 100644 apps/react-testing-lib/src/index.css create mode 100644 apps/react-testing-lib/src/main.tsx create mode 100644 apps/react-testing-lib/src/media/vite.png create mode 100644 apps/react-testing-lib/src/test/setup.ts create mode 100644 apps/react-testing-lib/src/utils/test-utils.tsx create mode 100644 apps/react-testing-lib/tsconfig.json create mode 100644 apps/react-testing-lib/vite.config.ts delete mode 100644 packages/vitest-preview/index.es.js create mode 100644 packages/vitest-preview/src/node/previewServer.ts diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..5e5d69b --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +.env +.env.* +node_modules diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..ae37bfc --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "bracketSpacing": true, + "tabWidth": 2 +} diff --git a/apps/react-testing-lib/index.html b/apps/react-testing-lib/index.html new file mode 100644 index 0000000..38f3861 --- /dev/null +++ b/apps/react-testing-lib/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/apps/react-testing-lib/package.json b/apps/react-testing-lib/package.json new file mode 100644 index 0000000..a61c8ba --- /dev/null +++ b/apps/react-testing-lib/package.json @@ -0,0 +1,35 @@ +{ + "name": "example-testing-lib-react", + "private": true, + "scripts": { + "build": "tsc && vite build", + "coverage": "vitest run --coverage", + "dev": "vite", + "preview": "vite preview", + "test": "vitest", + "test:ui": "vitest --ui", + "vitest-preview": "vitest-preview" + }, + "dependencies": { + "react": "^17.0.2", + "react-dom": "^17.0.2" + }, + "devDependencies": { + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^12.1.5", + "@testing-library/react-hooks": "^8.0.0", + "@testing-library/user-event": "^13.5.0", + "@types/react": "^17.0.45", + "@types/react-dom": "^17.0.17", + "@types/testing-library__jest-dom": "^5.14.5", + "@vitejs/plugin-react": "^1.3.2", + "@vitest/ui": "latest", + "jsdom": "latest", + "vite": "latest", + "vitest": "latest", + "vitest-preview": "workspace:*" + }, + "stackblitz": { + "startCommand": "npm run test:ui" + } +} diff --git a/apps/react-testing-lib/public/vitest.png b/apps/react-testing-lib/public/vitest.png new file mode 100644 index 0000000000000000000000000000000000000000..e371d3f35df0c2bef38c185ebefe52e9a767f1e7 GIT binary patch literal 5328 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 { + it('should increment count on click', async () => { + render(); + userEvent.click(screen.getByRole('button')); + userEvent.click(screen.getByRole('button')); + userEvent.click(screen.getByRole('button')); + debug(); + expect(await screen.findByText(/count is: 3/i)).toBeInTheDocument(); + }); +}); diff --git a/apps/react-testing-lib/src/App.tsx b/apps/react-testing-lib/src/App.tsx new file mode 100644 index 0000000..7559e08 --- /dev/null +++ b/apps/react-testing-lib/src/App.tsx @@ -0,0 +1,50 @@ +import { useCounter } from './hooks/useCounter'; +import viteLogo from './media/vite.png'; +import './App.css'; + +function App() { + const { count, increment } = useCounter(); + + return ( +
+
+

+ Hello Vitest Preview! +

+
+ Vite Logo + Vitest Logo +
+

+ +

+

+ Edit App.test.tsx and save to test HMR updates. +

+

+ + Learn React + + {' | '} + + Vite Docs + +

+
+
+ ); +} + +export default App; diff --git a/apps/react-testing-lib/src/hooks/useCounter.ts b/apps/react-testing-lib/src/hooks/useCounter.ts new file mode 100644 index 0000000..aae15a8 --- /dev/null +++ b/apps/react-testing-lib/src/hooks/useCounter.ts @@ -0,0 +1,7 @@ +import { useCallback, useState } from 'react'; + +export const useCounter = () => { + const [count, setCount] = useState(0); + const increment = useCallback(() => setCount((x) => x + 1), []); + return { count, increment }; +}; diff --git a/apps/react-testing-lib/src/index.css b/apps/react-testing-lib/src/index.css new file mode 100644 index 0000000..ec2585e --- /dev/null +++ b/apps/react-testing-lib/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/apps/react-testing-lib/src/main.tsx b/apps/react-testing-lib/src/main.tsx new file mode 100644 index 0000000..f452ad2 --- /dev/null +++ b/apps/react-testing-lib/src/main.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import './index.css'; +import App from './App'; + +ReactDOM.render( + + + , + document.getElementById('root'), +); diff --git a/apps/react-testing-lib/src/media/vite.png b/apps/react-testing-lib/src/media/vite.png new file mode 100644 index 0000000000000000000000000000000000000000..8b23c919ed7b9c7216e7dd22c4b1da24b308c2f7 GIT binary patch literal 67153 zcmY&D7jB>wcP;Kvptuxw3vNM*7b{kZL-7`hTT?Jd&+Pp?TV_tQj+P1@HWfAi0KfyPD(V3MsG!M625J3unoZ??!q?j9QU>c-`H_(-?{tP0%fS=ec&bv-XNteS z#z2cn{vj_bhTa=>3FBP@j@?wB;-_#7P~->yPL`NWb&O< zdtqV!8^gVDYDl*vNBfm~wkcJ#nv=(s;%^1C&X()3ajfjkaYSYP7!JUbI8uL)+ z+fVC1BBT`mas4MAn-1_r{K)Qx$44OZJ_1&}iL-9>LaOlpHX1ay3KXHvjkDr$S;3h0 z|88IGZvC$n4JnI4crgYD@@d;lvOAUlXl}_aqpyuB)${MawxTFCCKjITSa$zo#^Dn& zaTH`r%zrI52Zef3(Ksw45j4iX9~o7bL)@9i=f{^Ra?w5m{#$c?(4QVFXH;NbBu-zy zoqS0w%LMzeXmk%mmOvXICCN$R$d0PitlS8WF~!O&!RqtY+-P2n4#~|$({laq|GJdr zXy7E41)xV$1+jEnvGqBXp%Bpp%cp}L5?O*oFQ%hnM#l{j6_+_6ogJ6SB`?SP5Hswa z)yI!mRQNyDsC@p@(*?y&8_GT6R-iECHD`2yZP~`+E{3v)(baV!J0b90|K)^D21_mw z8u-)i?wB%$z9Fg&k#=3Psq2AsRlNL9&}Dfl3?J>Q(L3#>U3v-^GiLn`m(`H}wSUe0 zpQ=??tnv&x;G2dssjH-N7mEiEolAu^#X)`R)4jblNJC=@ZLGd%K3l01y1C}^AMWXE z^7U5Yg9i-Pplad$H&-HpDMd^(hCq>^tW|NZ^@jdn%ij^5q6H*#isPjd3&{I}(X`)8y#{LymqZNzajyT}Z$|xn%73V`ER4LW}8M0_|Gq#Nc zyXo4G`nq@a#B7EoF0hULU~O%O6s`p0^czmNxO;^Nw9d=An(n`0zW#@*_sz-=8_QE( z!+G324zY(Bql0V<@i?UuD*YSLqy1zMpb)_kuU=496k~R;R=5o|0 zDg}xf8ohKUmZS9}-eXjvoZ|%~Wpe3!8w4Ydrn`>BXItr@Cu?sDE}AhD9%8NUvEn+HcKu4%q?8XDxNG zU2ZPIK<&KVe~|NSMuN-++FK%rU^^Au9wcqyM}dTEBgVJLKhbo7HI{Do1`Jrgwu-YI z8k|sqkfL>mBj>751|yWAegWgibFZ1#dFWSK)EE%D^)G+wC(|b541RqFkIu(4r==!= z%li?hTil!gK5Ga!>s7gIS@)Ewe~rUG)%cpjao;Gn+h#**8VBQ`rOguUQ2#KMi}T#x z<<(6hn^*xzLpP>~&f_ZP#p~nd0Po4uEPV|C%beB9p}B%(LCC)K{Fu`5k?W~DTyDGZ zHU*eBA|mbse_%l&LF?*Abf~?+(X)^>s7f78@l9bVjBW>SllHHOb?=Z4cQ@pqylAf(USou;cpi!HQg1fqkBi0ftPy7kgpTxivC*1vbu|@QaSsyA7Bo9{?tuAspd@A>f;zu z?W$*LJ6?mH+2BjApTnX>hAN7Psg9&=u3s#B|JSKXZ5A~7<7kj{>MA`=jroha%-i4L zK~O%jA?p$%*}0fv6}v7H8P8TANkj2wR=p>!NXSESA2g5s%T7=+af%}Dv>Je`>BHyd z7in;Rkjo|m3lIzw>N7;t*cJyNCfI;8lh=xTa>Xg6r4fKT)B_?6mlcN;#RpC$UdKFx zX1y1#xL)p(e=^w56@M=~WU3L{;y5xyz=&myVsccrdw1G*7OyIyIdjv~4M)AgeW&Jv z(_5oLazc!AliFa+%qtMlr)0ubc>q@(=I3UtrRzll(<4uWksiP1(&9yg(iE2>RPh%{ z_f~YiW?scNoNzuM>K@WLxc2!cg0N3LlP^jl{%Ky)f9aDG0bAT6g}^0dm*HXL5P0<# zrRux91C_gZn%a>UaK)(AeUl-W2P{12_4+eZ#L?`f#{2DwaGsRnma`SPIJ3Edotg%3 z-HJ^TEO&6XDCQpnrXc-&GuO3Zn8gT7$F*H-wjZseiyK+n=S~}|*v9l5cg%>clG{io z1M0Ns{E<_e2v>m*5I|{5ezZ=-?sm6|p5>Kx%uT;i{gl=Xr~ga7V}y);_;0p#q>$Ow z+|B6_5f>skYP4ECOudrqNDNva{w&-u$&Aqjc2m3U39SaOHQhO!MKb1M4xEo1v8;a% zex1(tr4-ZZU91t2s zNDeTqnmd)=5Ggi)^I(3DD0h`lX{4zn@%<@!@`A$Zs~OAVe45%re{GB=u?(sjvEy(9 znz*7)B%rk7LkWiwfoJVw%V7J;uK1~E7-{AOnS-?ZZ5Puxh+#T>f<#UX%=8uhkn!#B zZHjCP8kDfBF^MCujIw!=2;BM+7&yq~_?#z*Jb?m_3mgLP=ChGeQOqRgzVSXW_7+qpy}@tQ zzQPp#d?`OtSTsF)cNm?QoiSNsMWTIZP6DPcJOBT_7l@;&w3%N0PB6DAE|^fS$`A`^)eGGi z>UCoch_X6p5NHwD!VYTy-c2>5ih_)uV?OPx&?5!jGLSO8fkh~wReV6x#7hq-^K_H2>n@ds8yKQFwFPf zuRpur$BcB2Ws|Ue5l%Ae2I8E0=IHqK;h27H<>GRLL8Ry4UpYRr-NEDU7^uT-`Ax3g zP+MfrLE)FwPjz#{!fSdnEQEr1rge^t zWpr28p0N|NPFC5KLBO3P(sjXGT3Lz%6jqEk3pV@j(H)ZUQ(ZEc{7a)4*c`~7Nh!4x z5W187p#r+UFWtaD7nxvn#NEwE!!xZf_4F*L4ft&h`Dg8IZh3?xBUYsw7uW-{mt=Wr+u!I!aq(yaN&s`#U>I11;6Cd9 zsSYSKrThSPN*ne%s=HPozDyD?xAN#C>?o(Rk4W6kVmCsv1F>9{^sI6!wYC~@@f}@2HAzTQW4u&A13R|b{_ zWis5A9vS3|&s!ZTifb&q<(0HqWq2rKBkhwiwYBydD8_y;c<{-s3Kf+KB zzRSJt^s4NuISyD6Aq#S9)3BF^K`U)Y9B@f)Go)3x=0?d;yrOSP!Y=&Zr@h%|R&l9T z%wRBK3u2YK+hCay7a)_O2&0Yr&9c4L(YZBG5Ny>ghC?ySoyXt4b2MEF%F#E^5%baG zz7r3o(V)A&-2Nzbf5aP@Nc007ozG3Fq@pwzZcg*$?J4O0ai9i*hq{M->zRC0(y~`Z zTMBF6ca@q}>?J*IP}%~s1-Vy6z29!Va}O2YQ#DEpzQ|M84m`O%PvbS#@%?Xpo(F#g zN1#vvoRJ~(8{w!{dy<~^`){3B9R%&}^z0PWeG}wFLJK^Q|CoZz90G?ww0cM@*Tg%b zruQ*8|C+U9s=_7_>#H-s)wDZ&cs(H~aB2aHoMVIZ zw{S)!+jx6jXf9-4?f3YggfY(E~ctCeNgE(F1{|DIl;N>^!aFXR6(>Zu}qmNDVB z@?~fR=`hTgzp@=_-l%0_QnjF$2ETMEOz)Rc&=Pl`4wmeTx)=N*cjqUNg~aAkwKLD%Y=*-dQ}NC0+w+5QN0+L1;#yZ!YTRc;J#5VWn}e8Oc5vrW zaVrF1#ifuQ-MHUjgjjD`X-rNQQ0_RH4a>Ja2@B0?&G@OyJF8kH{+HXSkU3z(LF+F%JTjq%&~Di^^t zjyPxr(rX`o&Wh>aQq*D7pPX)zTeqQ?vL9Fry1OYU%M*XhZt-+V6BaVyuB@ySCu1nj zoRJ6rkcBsKG5brJzZuSUnXt!MT7%oJsIY{Y2xLg_v_tVr@R-ZsfBOm#_Vxy8*~g7r zS#*XiykGKRol#IwdS+OC{@!zSS#&dJjwQt5**^B2AT282krr1c_~}raeBw5%Q}W{i zkX__WmSCH`iH*(W+2Z2pQi59Vrn0mb4XeMdIjXgw#+l+(&|}N40$w4R1U1(esQ7mg z*&$aL_WQHseciy!+G!KAV%XGv75YJvENcK6>Yn&*?AMzXp{#2bJ$jK7N<>PRP|a08 z(0FsU|CcKa*W*+>Pt1KCNml74?76>dUB?GxN!!bLlr346jb-qe_9U^2iMyJIEomy<;Zb?f zJ;%d2lzopT^DOxA=yzbWF%VPvMl6%j)blS2ZRsm!`rOXL@J;IR4B^Vp`?~dMVmsxH zqWGlwTkQhFFR*|LcTI>xUQzjK)V#_D1K`ReMH9(5 zDNtgGc2k`unkx()x) zssAmuBWMxWdA`~*LcyC0x4k-Cw8OgujZ{`zAL}}%vyh>&a6m_rO&jLe{h96y)*ra4 z?;Bc9l_xpr4bihj4g;W;D@YCSvm|pC?I~W`wi>K)wx+N3n*w!(0}aER3nC8~kX&J6O3?8s={y5Tcxbk(b~yNS3pr4vV1D>xeU@ z*iw+?%{D|^>g0z#x5Q4myQs67!(CX$wNd)$$I1&5o= z6`h~Uca_pxED5^43|n6$kSPjz#f{AA1JT5@cW+R0J~z@5}ZbG(W+dwf9OG`2K7I z6>FL?&mE#`TItWSa-IFQZQb+Ps|PHo?Pew&VzDwsIbE5mnPuor1u#e>P7U09#WW}Y z?sZBW!jn=~qS3dnvC@~EWvQSR!K1*+kL$A@&Q({`DZwkk!4*@-P`@$=tlYDHujl0z zq!XlfStZx_k_N*X81t}@s()#4xp`&esM8|NCZliuzEHkggLtelS(-bq^Eu$$;qmcV z;^RUE`y6l1+aLeq{*k{20_^k%B|@G-`Xc!sWl2Ih3>9%A%1;rf7e6;&U`$8^7I%FH zH|@=TkGotg#V^q;SqZ06aH-uI{GRLD0+sHs;k340%&dv3`AUJ8cK5D)7Vhzrz+Ibf3#c&Z%Jq|If=WbhxG~0;8 zY1K31BLQ$3wdF?{J{`a9f64MFYSvDO#F9vV-l^`Jg1eoCGcTnhfsj`LqfWW|DRPIm zQCkAfq^R~btUBI^B*#JKP`Ht@OA<>~<>!=oraiScbNQafBF9|%l|ja|aTee{ox#q= zqlOUQa((;6MyyV%MmNWi z4pE-(M66`>Dy+c<_4YBcdhg#ap;UZjje$Oaf+`55%!z@~C50*ovM)-2GOF7K%?B4V zYSXI}Y{;C_wP0D2v_)GrLYSmZqkpo=ZZYUcot^GFnP9@yXL-X>-C+!BA>Cf*Wa8~@ z-(CEU?yPMk=uM_S46nZGLACuk=F_D2| z?_SIWG8;{jBdae}Am;ZVGhbq<9c4?vkW(Syt6-n@&UmGF;pIAomNq^yv-{!eMcra; zrDJO`kCq;kv<3#_JkN2;A=TPb*u6@Cyr#j_H`V}XAA$NWKObXDXfc7pjseiv z%=R}q(F|)eXDer)7Nsug2S`%0;?qW|u9tz==0E-6d<$l35*%k+)m|R_!YJ3xgVA&g z^UL;=?7%bslgyTf^q1a9!h%{%=~y=Xgksx&2h;S2KbzJzMiO-=fBaB6Q{0mz z{wWk(uD0lUPf9A%4i zVR#$PJs+X6*LUd*S2F=Tnk?D~<>8N$g{_$4~SmzUqr$f_DT#i$A*o;2^?dS)2dyHf{h~a(M}IuoLKRETX~=k8PuhVD)D^g0T6& zF{cE^=WV5s{4E;VEpQ&bT{)qCg?pxpvr%{04$b)$per#zzC^Afp`^W|paKK`z@r2u zPF0lC@&SIEqIkt4E2sa=EbugbxlvgKL?E`>w+@{0gr}|(JRN32wqx0|gJ$>fMs~-m zO+;)yBkEgQp$!5V|6Zh^^br`)$@rvh)h#l6Fmojniw#SgfZ65UEdQN#S?K^y)$)FE z($8W{Xzfa2F8aecU1#RgeNu645>LZY&TUIwylf4msu5DSF=)SMoeZdkEvXD&xZZvu za?dfMG6YOFE)F7Yhaz{ho=4Yc+YZ0~&@>fsvp7OV?4bX6tPCJ~sT==(j6`ydLdnDU zsFfv}>_7NwN6R#+=3&^9ZAR7bNm1IsCO@05;HOVIM3x8=%0a zafbHVEa-g5x#0R0Qxt0~QwV9scz}g8lWB@b98W3jUm0v_+nU#c2(5TVi0)W43l8D|jEZhgk^S1qs(Sk6dokQV8)cwU3!6osoG5S#ymeNp=SN9@kyDgC(2Zun+t zj-Z3q82H<_(X++O(P$M=%w_DQ>~?LoYO|i)|K(cZ&J9&M3WeV8JN7)vzb{0>HfSj> z%aIkLSr=lNHbe*I zZuL67mAl$t2s0dF@qVe}%O^xOLI!sDa=?WyMwF+BY9#@A_KGG447(SnL1-s;qq%1A{*ZGcvhzrRn*BLWc8parqE4xFoKNCw6)MD zCIKi=_(hE=L1~_4lI_GOb#&)GdedggW~lQ?6h-GLt!v&$dN!sg)#g;KS*hav6P|v z`8!!xb2MJRMcVHLmhe(!3J&ps<%5l$6+O5VdGDV7T8e#~+~i~35cCcdz;ekwA$ zWQqrp5u;=x78k(EHw)?#4S5+yYpYq^yr0zB9F=E@6^8+~*Fl0f0BLGZ+^Jb^jS$o|siQup_K`Ge8-R?w_P$n+% z!$;%$assk1cZayVHEEr==u@0BIf)&kfGg%g( zkBSkP;3zuvtKJj(kg5AMiOp6h^x>jt%ot22ZOG`@dPNEzsGnx_ue$#B2blZDHn<Lx3X?^8dp5YnB?^gl%!Y zS5-l-ppRA$)p1pIw&|ONQmLfh)*2QyI*ky~@P

*Lq|45{F{aRH?$DOOk9x0v7#i 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%0D{^d@z(86y9IA|-$a|=wmm-$nK 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 literal 0 HcmV?d00001 diff --git a/apps/react-testing-lib/src/test/setup.ts b/apps/react-testing-lib/src/test/setup.ts new file mode 100644 index 0000000..45647ab --- /dev/null +++ b/apps/react-testing-lib/src/test/setup.ts @@ -0,0 +1,4 @@ +import '@testing-library/jest-dom'; + +// Import global css to use with vitest-preview +import '../index.css'; diff --git a/apps/react-testing-lib/src/utils/test-utils.tsx b/apps/react-testing-lib/src/utils/test-utils.tsx new file mode 100644 index 0000000..447908d --- /dev/null +++ b/apps/react-testing-lib/src/utils/test-utils.tsx @@ -0,0 +1,19 @@ +/* eslint-disable import/export */ +import { cleanup, render } from '@testing-library/react'; +import { afterEach } from 'vitest'; + +afterEach(() => { + cleanup(); +}); + +const customRender = (ui: React.ReactElement, options = {}) => + render(ui, { + // wrap provider(s) here if needed + wrapper: ({ children }) => children, + ...options, + }); + +export * from '@testing-library/react'; +export { default as userEvent } from '@testing-library/user-event'; +// override render export +export { customRender as render }; diff --git a/apps/react-testing-lib/tsconfig.json b/apps/react-testing-lib/tsconfig.json new file mode 100644 index 0000000..9f83659 --- /dev/null +++ b/apps/react-testing-lib/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": false, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["./src"] +} diff --git a/apps/react-testing-lib/vite.config.ts b/apps/react-testing-lib/vite.config.ts new file mode 100644 index 0000000..3f86bce --- /dev/null +++ b/apps/react-testing-lib/vite.config.ts @@ -0,0 +1,17 @@ +/// +/// + +import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + test: { + globals: true, + environment: 'jsdom', + setupFiles: './src/test/setup.ts', + // Need to enable this to use with vitest-preview + css: true, + }, +}); diff --git a/package.json b/package.json index ec5082b..2db5b79 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "prettier": "prettier apps packages --check", + "prettier:fix": "pnpm run prettier --write" }, "keywords": [], "author": "", @@ -12,6 +14,8 @@ "devDependencies": { "@types/node": "^18.11.3", "esbuild": "^0.15.12", + "prettier": "^2.7.1", + "rimraf": "^3.0.2", "typescript": "^4.8.4" } } diff --git a/packages/vitest-preview/index.es.js b/packages/vitest-preview/index.es.js deleted file mode 100644 index e4efe1d..0000000 --- a/packages/vitest-preview/index.es.js +++ /dev/null @@ -1,7 +0,0 @@ -function log() { - console.log("hello"); -} -console.log("hello"); -export { log }; - -export default { log }; diff --git a/packages/vitest-preview/package.json b/packages/vitest-preview/package.json index 768e825..ae31bf2 100644 --- a/packages/vitest-preview/package.json +++ b/packages/vitest-preview/package.json @@ -1,6 +1,6 @@ { "name": "vitest-preview", - "version": "0.0.1", + "version": "0.0.1-alpha.0", "description": "", "type": "module", "main": "dist/index.js", @@ -9,16 +9,22 @@ "files": [ "dist" ], + "bin": { + "vitest-preview": "./dist/previewServer.js" + }, "scripts": { - "build": "rollup -c", - "build:watch": "rollup -c -w", + "build": "rimraf dist && rollup -c", + "build:watch": "rimraf dist && rollup -c -w", "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { - "@types/node": "^18.11.3" + "@types/express": "^4.17.14", + "@types/node": "^18.11.3", + "express": "^4.18.2", + "vite": "^3.0.0" }, "devDependencies": { "@rollup/plugin-commonjs": "^23.0.2", diff --git a/packages/vitest-preview/playground.js b/packages/vitest-preview/playground.js index fc771f2..62d06ef 100644 --- a/packages/vitest-preview/playground.js +++ b/packages/vitest-preview/playground.js @@ -1,3 +1,3 @@ -import { builtinModules } from "module"; +import { builtinModules } from 'module'; console.log(builtinModules); diff --git a/packages/vitest-preview/rollup.config.js b/packages/vitest-preview/rollup.config.js index 6dd450b..aa6f58a 100644 --- a/packages/vitest-preview/rollup.config.js +++ b/packages/vitest-preview/rollup.config.js @@ -1,22 +1,23 @@ -import { builtinModules } from "module"; -import { defineConfig } from "rollup"; -import esbuild from "rollup-plugin-esbuild"; -import commonjs from "@rollup/plugin-commonjs"; -import dts from "rollup-plugin-dts"; -import nodeResolve from "@rollup/plugin-node-resolve"; -import json from "@rollup/plugin-json"; +import { builtinModules } from 'module'; +import { defineConfig } from 'rollup'; +import esbuild from 'rollup-plugin-esbuild'; +import commonjs from '@rollup/plugin-commonjs'; +import dts from 'rollup-plugin-dts'; +import nodeResolve from '@rollup/plugin-node-resolve'; +import json from '@rollup/plugin-json'; -import pkg from "./package.json" assert { type: "json" }; +import pkg from './package.json' assert { type: 'json' }; -const entries = ["src/index.ts"]; +const entries = ['src/index.ts', 'src/node/previewServer.ts']; -const dtsEntries = ["src/index.ts"]; +const dtsEntries = ['src/index.ts']; const external = [ ...builtinModules, ...Object.keys(pkg.dependencies), ...Object.keys(pkg.devDependencies), - ...Object.keys(pkg.peerDependencies), + // TODO: Do we need any peer deps here? + // ...Object.keys(pkg.peerDependencies), ]; const plugins = [ @@ -26,7 +27,7 @@ const plugins = [ json(), commonjs(), esbuild({ - target: "node14", + target: 'node14', }), ]; @@ -35,8 +36,8 @@ export default ({ watch }) => { input: entries, output: { - dir: "dist", - format: "esm", + dir: 'dist', + format: 'esm', }, external, plugins: [...plugins], @@ -44,9 +45,9 @@ export default ({ watch }) => { input: dtsEntries, output: { - dir: "dist", - entryFileNames: (chunk) => `${chunk.name.replace("src/", "")}.d.ts`, - format: "esm", + dir: 'dist', + entryFileNames: (chunk) => `${chunk.name.replace('src/', '')}.d.ts`, + format: 'esm', }, external, plugins: [dts({ respectExternal: true })], diff --git a/packages/vitest-preview/src/constants.ts b/packages/vitest-preview/src/constants.ts index 353fedb..e0fb89f 100644 --- a/packages/vitest-preview/src/constants.ts +++ b/packages/vitest-preview/src/constants.ts @@ -1,8 +1,7 @@ -import path from "path"; +import path from 'path'; export const CACHE_FOLDER = path.join( process.cwd(), - "node_modules", - ".cache", - "vitest-preview" + 'node_modules', + '.vitest-preview', ); diff --git a/packages/vitest-preview/src/index.ts b/packages/vitest-preview/src/index.ts index b606271..887e218 100644 --- a/packages/vitest-preview/src/index.ts +++ b/packages/vitest-preview/src/index.ts @@ -1,4 +1,4 @@ -import { debug } from "./preview"; +import { debug } from './preview'; export { debug }; diff --git a/packages/vitest-preview/src/node/previewServer.ts b/packages/vitest-preview/src/node/previewServer.ts new file mode 100644 index 0000000..541e001 --- /dev/null +++ b/packages/vitest-preview/src/node/previewServer.ts @@ -0,0 +1,55 @@ +// https://vitejs.dev/guide/ssr.html#setting-up-the-dev-server +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import express from 'express'; +import { createServer as createViteServer } from 'vite'; +import { CACHE_FOLDER } from '../constants'; + +async function createServer() { + const app = express(); + + const vite = await createViteServer({ + server: { + middlewareMode: true, + watch: { + // By default, Vite doesn't watch code under node_modules + // Reference: https://vitejs.dev/config/server-options.html#server-watch + ignored: ['!**/node_modules/.vitest-preview/**'], + }, + }, + optimizeDeps: { + exclude: ['.vitest-preview'], + }, + appType: 'custom', + }); + + app.use(vite.middlewares); + + app.use('*', async (req, res, next) => { + const url = req.originalUrl; + + try { + let template = fs.readFileSync( + path.resolve(CACHE_FOLDER, 'index.html'), + 'utf-8', + ); + + template = await vite.transformIndexHtml(url, template); + + // TODO: We can manipulate the string to modify HTML here. Some actions we can do: + // - document.title = 'Vitest Preview dashboard' (We can do it by js preview.ts, but it might break some tests) + // - add to add more features to Vitest Preview (e.g: preview multiple snapshots) + + res.status(200).set({ 'Content-Type': 'text/html' }).end(template); + } catch (e) { + // @ts-ignore + vite.ssrFixStacktrace(e); + next(e); + } + }); + + app.listen(5006); +} + +createServer(); diff --git a/packages/vitest-preview/src/preview.ts b/packages/vitest-preview/src/preview.ts index 11a1d70..1662dce 100644 --- a/packages/vitest-preview/src/preview.ts +++ b/packages/vitest-preview/src/preview.ts @@ -1,13 +1,13 @@ -import fs from "fs"; -import path from "path"; -import { CACHE_FOLDER } from "./constants"; -import { createCacheFolderIfNeeded } from "./utils"; +import fs from 'fs'; +import path from 'path'; +import { CACHE_FOLDER } from './constants'; +import { createCacheFolderIfNeeded } from './utils'; export function debug(): void { createCacheFolderIfNeeded(); fs.writeFileSync( - path.join(CACHE_FOLDER, "index.html"), - document.documentElement.outerHTML + path.join(CACHE_FOLDER, 'index.html'), + document.documentElement.outerHTML, ); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 15982c3..eedaa76 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,10 +6,14 @@ importers: specifiers: '@types/node': ^18.11.3 esbuild: ^0.15.12 + prettier: ^2.7.1 + rimraf: ^3.0.2 typescript: ^4.8.4 devDependencies: '@types/node': 18.11.3 esbuild: 0.15.12 + prettier: 2.7.1 + rimraf: 3.0.2 typescript: 4.8.4 apps/dev: @@ -18,17 +22,58 @@ importers: dependencies: vitest-preview: link:../../packages/vitest-preview + apps/react-testing-lib: + specifiers: + '@testing-library/jest-dom': ^5.16.4 + '@testing-library/react': ^12.1.5 + '@testing-library/react-hooks': ^8.0.0 + '@testing-library/user-event': ^13.5.0 + '@types/react': ^17.0.45 + '@types/react-dom': ^17.0.17 + '@types/testing-library__jest-dom': ^5.14.5 + '@vitejs/plugin-react': ^1.3.2 + '@vitest/ui': latest + jsdom: latest + react: ^17.0.2 + react-dom: ^17.0.2 + vite: latest + vitest: latest + vitest-preview: workspace:* + dependencies: + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + devDependencies: + '@testing-library/jest-dom': 5.16.5 + '@testing-library/react': 12.1.5_sfoxds7t5ydpegc3knd667wn6m + '@testing-library/react-hooks': 8.0.1_hiunvzosbwliizyirxfy6hjyim + '@testing-library/user-event': 13.5.0 + '@types/react': 17.0.50 + '@types/react-dom': 17.0.17 + '@types/testing-library__jest-dom': 5.14.5 + '@vitejs/plugin-react': 1.3.2 + '@vitest/ui': 0.24.3 + jsdom: 20.0.1 + vite: 3.1.8 + vitest: 0.24.3_i7ukxxwfoxepyk4smtl6oue4oi + vitest-preview: link:../../packages/vitest-preview + packages/vitest-preview: specifiers: '@rollup/plugin-commonjs': ^23.0.2 '@rollup/plugin-json': ^5.0.1 '@rollup/plugin-node-resolve': ^15.0.1 + '@types/express': ^4.17.14 '@types/node': ^18.11.3 + express: ^4.18.2 rollup: ^3.2.3 rollup-plugin-dts: ^5.0.0 rollup-plugin-esbuild: ^4.10.1 + vite: ^3.0.0 dependencies: + '@types/express': 4.17.14 '@types/node': 18.11.3 + express: 4.18.2 + vite: 3.1.8 devDependencies: '@rollup/plugin-commonjs': 23.0.2_rollup@3.2.3 '@rollup/plugin-json': 5.0.1_rollup@3.2.3 @@ -39,6 +84,18 @@ importers: packages: + /@adobe/css-tools/4.0.1: + resolution: {integrity: sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==} + dev: true + + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + /@babel/code-frame/7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} @@ -46,13 +103,151 @@ packages: dependencies: '@babel/highlight': 7.18.6 dev: true - optional: true + + /@babel/compat-data/7.19.4: + resolution: {integrity: sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.19.6: + resolution: {integrity: sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.19.6 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.6 + '@babel/helper-module-transforms': 7.19.6 + '@babel/helpers': 7.19.4 + '@babel/parser': 7.19.6 + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.6 + '@babel/types': 7.19.4 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.19.6: + resolution: {integrity: sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure/7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-compilation-targets/7.19.3_@babel+core@7.19.6: + resolution: {integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.19.4 + '@babel/core': 7.19.6 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + semver: 6.3.0 + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name/7.19.0: + resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-module-transforms/7.19.6: + resolution: {integrity: sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.19.4 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.6 + '@babel/types': 7.19.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils/7.19.0: + resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access/7.19.4: + resolution: {integrity: sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-identifier/7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} dev: true - optional: true + + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers/7.19.4: + resolution: {integrity: sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.6 + '@babel/types': 7.19.4 + transitivePeerDependencies: + - supports-color + dev: true /@babel/highlight/7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} @@ -62,7 +257,111 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 dev: true - optional: true + + /@babel/parser/7.19.6: + resolution: {integrity: sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.4 + dev: true + + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.19.6: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.6 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.19.6: + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.6 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.6 + dev: true + + /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.19.6: + resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.6 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.19.6: + resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.6 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.19.6: + resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.6 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.19.6 + '@babel/types': 7.19.4 + dev: true + + /@babel/runtime/7.19.4: + resolution: {integrity: sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.10 + dev: true + + /@babel/template/7.18.10: + resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.19.6 + '@babel/types': 7.19.4 + dev: true + + /@babel/traverse/7.19.6: + resolution: {integrity: sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.19.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.19.6 + '@babel/types': 7.19.4 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.19.4: + resolution: {integrity: sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: true /@esbuild/android-arm/0.15.12: resolution: {integrity: sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==} @@ -70,7 +369,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/linux-loong64/0.15.12: @@ -79,9 +377,76 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true optional: true + /@jest/expect-utils/29.2.1: + resolution: {integrity: sha512-yr4aHNg5Z1CjKby5ozm7sKjgBlCOorlAoFcvrOQ/4rbZRfgZQdnmh7cth192PYIgiPZo2bBXvqdOApnAMWFJZg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.2.0 + dev: true + + /@jest/schemas/29.0.0: + resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.24.48 + dev: true + + /@jest/types/29.2.1: + resolution: {integrity: sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.0.0 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.11.3 + '@types/yargs': 17.0.13 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@polka/url/1.0.0-next.21: + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + dev: true + /@rollup/plugin-commonjs/23.0.2_rollup@3.2.3: resolution: {integrity: sha512-e9ThuiRf93YlVxc4qNIurvv+Hp9dnD+4PjOqQs5vAYfcZ3+AXSrcdzXnVjWxcGQOa6KGJFcRZyUI3ktWLavFjg==} engines: {node: '>=14.0.0'} @@ -154,103 +519,656 @@ packages: rollup: 3.2.3 dev: true - /@types/estree/1.0.0: - resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + /@sinclair/typebox/0.24.48: + resolution: {integrity: sha512-WPGpRNHbkOsfBDmh8QHU7a5NWzEuYNThST8x1cISvX0RpP+1+V8zjuJqNwGJkHGIlhdIIhv6qVYqXz2q5/gjAA==} dev: true - /@types/node/18.11.3: - resolution: {integrity: sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==} + /@testing-library/dom/8.19.0: + resolution: {integrity: sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==} + engines: {node: '>=12'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/runtime': 7.19.4 + '@types/aria-query': 4.2.2 + aria-query: 5.0.2 + chalk: 4.1.2 + dom-accessibility-api: 0.5.14 + lz-string: 1.4.4 + pretty-format: 27.5.1 + dev: true + + /@testing-library/jest-dom/5.16.5: + resolution: {integrity: sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==} + engines: {node: '>=8', npm: '>=6', yarn: '>=1'} + dependencies: + '@adobe/css-tools': 4.0.1 + '@babel/runtime': 7.19.4 + '@types/testing-library__jest-dom': 5.14.5 + aria-query: 5.0.2 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.5.14 + lodash: 4.17.21 + redent: 3.0.0 + dev: true + + /@testing-library/react-hooks/8.0.1_hiunvzosbwliizyirxfy6hjyim: + resolution: {integrity: sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==} + engines: {node: '>=12'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 + react: ^16.9.0 || ^17.0.0 + react-dom: ^16.9.0 || ^17.0.0 + react-test-renderer: ^16.9.0 || ^17.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-dom: + optional: true + react-test-renderer: + optional: true + dependencies: + '@babel/runtime': 7.19.4 + '@types/react': 17.0.50 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + react-error-boundary: 3.1.4_react@17.0.2 + dev: true - /@types/resolve/1.20.2: - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + /@testing-library/react/12.1.5_sfoxds7t5ydpegc3knd667wn6m: + resolution: {integrity: sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==} + engines: {node: '>=12'} + peerDependencies: + react: <18.0.0 + react-dom: <18.0.0 + dependencies: + '@babel/runtime': 7.19.4 + '@testing-library/dom': 8.19.0 + '@types/react-dom': 17.0.17 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 dev: true - /ansi-styles/3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + /@testing-library/user-event/13.5.0: + resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' dependencies: - color-convert: 1.9.3 + '@babel/runtime': 7.19.4 dev: true - optional: true - /balanced-match/1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /@tootallnate/once/2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} dev: true - /brace-expansion/2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + /@types/aria-query/4.2.2: + resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} + dev: true + + /@types/body-parser/1.19.2: + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: - balanced-match: 1.0.2 + '@types/connect': 3.4.35 + '@types/node': 18.11.3 + dev: false + + /@types/chai-subset/1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.3 dev: true - /builtin-modules/3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} + /@types/chai/4.3.3: + resolution: {integrity: sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==} dev: true - /chalk/2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + /@types/connect/3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + '@types/node': 18.11.3 + dev: false + + /@types/estree/1.0.0: + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true - optional: true - /color-convert/1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + /@types/express-serve-static-core/4.17.31: + resolution: {integrity: sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==} dependencies: - color-name: 1.1.3 - dev: true - optional: true + '@types/node': 18.11.3 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + dev: false - /color-name/1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - optional: true + /@types/express/4.17.14: + resolution: {integrity: sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.31 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.0 + dev: false - /commondir/1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + /@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /debug/4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + /@types/istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: - ms: 2.1.2 + '@types/istanbul-lib-coverage': 2.0.4 dev: true - /deepmerge/4.2.2: - resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} - engines: {node: '>=0.10.0'} + /@types/istanbul-reports/3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 dev: true - /es-module-lexer/0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + /@types/jest/29.2.0: + resolution: {integrity: sha512-KO7bPV21d65PKwv3LLsD8Jn3E05pjNjRZvkm+YTacWhVmykAb07wW6IkZUmQAltwQafNcDUEUrMO2h3jeBSisg==} + dependencies: + expect: 29.2.1 + pretty-format: 29.2.1 dev: true - /esbuild-android-64/0.15.12: - resolution: {integrity: sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true + /@types/mime/3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + dev: false + + /@types/node/18.11.3: + resolution: {integrity: sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==} + + /@types/prop-types/15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: true - optional: true - /esbuild-android-arm64/0.15.12: - resolution: {integrity: sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==} + /@types/qs/6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: false + + /@types/range-parser/1.2.4: + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + dev: false + + /@types/react-dom/17.0.17: + resolution: {integrity: sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==} + dependencies: + '@types/react': 17.0.50 + dev: true + + /@types/react/17.0.50: + resolution: {integrity: sha512-ZCBHzpDb5skMnc1zFXAXnL3l1FAdi+xZvwxK+PkglMmBrwjpp9nKaWuEvrGnSifCJmBFGxZOOFuwC6KH/s0NuA==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.1.1 + dev: true + + /@types/resolve/1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: true + + /@types/scheduler/0.16.2: + resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + dev: true + + /@types/serve-static/1.15.0: + resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} + dependencies: + '@types/mime': 3.0.1 + '@types/node': 18.11.3 + dev: false + + /@types/stack-utils/2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/testing-library__jest-dom/5.14.5: + resolution: {integrity: sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==} + dependencies: + '@types/jest': 29.2.0 + dev: true + + /@types/yargs-parser/21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: true + + /@types/yargs/17.0.13: + resolution: {integrity: sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@vitejs/plugin-react/1.3.2: + resolution: {integrity: sha512-aurBNmMo0kz1O4qRoY+FM4epSA39y3ShWGuqfLRA/3z0oEJAdtoSfgA3aO98/PCCHAqMaduLxIxErWrVKIFzXA==} + engines: {node: '>=12.0.0'} + dependencies: + '@babel/core': 7.19.6 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.6 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.19.6 + '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.19.6 + '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.19.6 + '@rollup/pluginutils': 4.2.1 + react-refresh: 0.13.0 + resolve: 1.22.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/ui/0.24.3: + resolution: {integrity: sha512-f5agYA/sdkiipq42TZayJoeUGjWx+opDjIVeNnb1SG2BNxqObFqh6GuJlzpGHerg4a2+ZSoVo4f4p2+dEyXPmg==} + dependencies: + sirv: 2.0.2 + dev: true + + /abab/2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true + + /accepts/1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn-globals/7.0.1: + resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + dependencies: + acorn: 8.8.0 + acorn-walk: 8.2.0 + dev: true + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/8.8.0: + resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /aria-query/5.0.2: + resolution: {integrity: sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q==} + engines: {node: '>=6.0'} + dev: true + + /array-flatten/1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: false + + /assertion-error/1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /body-parser/1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.4 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist/4.21.4: + resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001423 + electron-to-chromium: 1.4.284 + node-releases: 2.0.6 + update-browserslist-db: 1.0.10_browserslist@4.21.4 + dev: true + + /builtin-modules/3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.3 + dev: false + + /caniuse-lite/1.0.30001423: + resolution: {integrity: sha512-09iwWGOlifvE1XuHokFMP7eR38a0JnajoyL3/i87c8ZjRWRrdKo1fqjNfugfBD0UDBIOz0U+jtNhJ0EPm1VleQ==} + dev: true + + /chai/4.3.6: + resolution: {integrity: sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 3.0.1 + get-func-name: 2.0.0 + loupe: 2.3.4 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk/3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error/1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /ci-info/3.5.0: + resolution: {integrity: sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==} + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commondir/1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type/1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + dev: false + + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /cookie-signature/1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: false + + /cookie/0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + + /css.escape/1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + dev: true + + /cssom/0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom/0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + dev: true + + /cssstyle/2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /csstype/3.1.1: + resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + dev: true + + /data-urls/3.0.2: + resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} + engines: {node: '>=12'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + dev: true + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decimal.js/10.4.2: + resolution: {integrity: sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==} + dev: true + + /deep-eql/3.0.1: + resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} + engines: {node: '>=0.12'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy/1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /diff-sequences/29.2.0: + resolution: {integrity: sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /dom-accessibility-api/0.5.14: + resolution: {integrity: sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==} + dev: true + + /domexception/4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} + dependencies: + webidl-conversions: 7.0.0 + dev: true + + /ee-first/1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /electron-to-chromium/1.4.284: + resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} + dev: true + + /encodeurl/1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /entities/4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + engines: {node: '>=0.12'} + dev: true + + /es-module-lexer/0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + dev: true + + /esbuild-android-64/0.15.12: + resolution: {integrity: sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /esbuild-android-arm64/0.15.12: + resolution: {integrity: sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /esbuild-darwin-64/0.15.12: @@ -259,7 +1177,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /esbuild-darwin-arm64/0.15.12: @@ -268,7 +1185,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /esbuild-freebsd-64/0.15.12: @@ -277,7 +1193,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true /esbuild-freebsd-arm64/0.15.12: @@ -286,7 +1201,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true /esbuild-linux-32/0.15.12: @@ -295,7 +1209,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-64/0.15.12: @@ -304,7 +1217,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-arm/0.15.12: @@ -313,7 +1225,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-arm64/0.15.12: @@ -322,7 +1233,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-mips64le/0.15.12: @@ -331,7 +1241,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-ppc64le/0.15.12: @@ -340,7 +1249,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-riscv64/0.15.12: @@ -349,7 +1257,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-s390x/0.15.12: @@ -358,7 +1265,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-netbsd-64/0.15.12: @@ -367,7 +1273,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true /esbuild-openbsd-64/0.15.12: @@ -376,7 +1281,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true /esbuild-sunos-64/0.15.12: @@ -385,7 +1289,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true /esbuild-windows-32/0.15.12: @@ -394,7 +1297,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /esbuild-windows-64/0.15.12: @@ -403,7 +1305,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /esbuild-windows-arm64/0.15.12: @@ -412,7 +1313,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /esbuild/0.15.12: @@ -443,137 +1343,797 @@ packages: esbuild-windows-32: 0.15.12 esbuild-windows-64: 0.15.12 esbuild-windows-arm64: 0.15.12 + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} dev: true + /escape-html/1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} dev: true - optional: true + + /escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escodegen/2.0.0: + resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true /estree-walker/2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true - /fs.realpath/1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag/1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + + /expect/29.2.1: + resolution: {integrity: sha512-BJtA754Fba0YWRWHgjKUMTA3ltWarKgITXHQnbZ2mTxTXC4yMQlR0FI7HkB3fJYkhWBf4qjNiqvg3LDtXCcVRQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.2.1 + jest-get-type: 29.2.0 + jest-matcher-utils: 29.2.1 + jest-message-util: 29.2.1 + jest-util: 29.2.1 + dev: true + + /express/4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.4 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler/1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /forwarded/0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: false + + /fresh/0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-func-name/2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /get-intrinsic/1.1.3: + resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: false + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob/8.0.3: + resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.0 + once: 1.4.0 + dev: true + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /html-encoding-sniffer/3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + dependencies: + whatwg-encoding: 2.0.0 + dev: true + + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /http-proxy-agent/5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ipaddr.js/1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false + + /is-builtin-module/3.2.0: + resolution: {integrity: sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + + /is-module/1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-potential-custom-element-name/1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + + /is-reference/1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.0 + dev: true + + /jest-diff/29.2.1: + resolution: {integrity: sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.2.0 + jest-get-type: 29.2.0 + pretty-format: 29.2.1 + dev: true + + /jest-get-type/29.2.0: + resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-matcher-utils/29.2.1: + resolution: {integrity: sha512-hUTBh7H/Mnb6GTpihbLh8uF5rjAMdekfW/oZNXUMAXi7bbmym2HiRpzgqf/zzkjgejMrVAkPdVSQj+32enlUww==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.2.1 + jest-get-type: 29.2.0 + pretty-format: 29.2.1 + dev: true + + /jest-message-util/29.2.1: + resolution: {integrity: sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.18.6 + '@jest/types': 29.2.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + pretty-format: 29.2.1 + slash: 3.0.0 + stack-utils: 2.0.5 + dev: true + + /jest-util/29.2.1: + resolution: {integrity: sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.2.1 + '@types/node': 18.11.3 + chalk: 4.1.2 + ci-info: 3.5.0 + graceful-fs: 4.2.10 + picomatch: 2.3.1 + dev: true + + /joycon/3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /jsdom/20.0.1: + resolution: {integrity: sha512-pksjj7Rqoa+wdpkKcLzQRHhJCEE42qQhl/xLMUKHgoSejaKOdaXEAnqs6uDNwMl/fciHTzKeR8Wm8cw7N+g98A==} + engines: {node: '>=14'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.8.0 + acorn-globals: 7.0.1 + cssom: 0.5.0 + cssstyle: 2.3.0 + data-urls: 3.0.2 + decimal.js: 10.4.2 + domexception: 4.0.0 + escodegen: 2.0.0 + form-data: 4.0.0 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.2 + parse5: 7.1.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.2 + w3c-xmlserializer: 3.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + ws: 8.9.0 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser/3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /levn/0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: true + + /local-pkg/0.4.2: + resolution: {integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==} + engines: {node: '>=14'} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /loupe/2.3.4: + resolution: {integrity: sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lz-string/1.4.4: + resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} + hasBin: true + dev: true + + /magic-string/0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /media-typer/0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /merge-descriptors/1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: false + + /methods/1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch/5.1.0: + resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /mrmime/1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} + dev: true + + /nwsapi/2.2.2: + resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-inspect/1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + dev: false + + /on-finished/2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /optionator/0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.3 + dev: true + + /parse5/7.1.1: + resolution: {integrity: sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==} + dependencies: + entities: 4.4.0 + dev: true + + /parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-to-regexp/0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: false - /fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + /pathval/1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true - optional: true - /function-bind/1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} dev: true - /glob/8.0.3: - resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==} - engines: {node: '>=12'} + /postcss/8.4.18: + resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==} + engines: {node: ^10 || ^12 || >=14} dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.0 - once: 1.4.0 + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /prelude-ls/1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} dev: true - /has-flag/3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + /prettier/2.7.1: + resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} + engines: {node: '>=10.13.0'} + hasBin: true dev: true - optional: true - /has/1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + /pretty-format/27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - function-bind: 1.1.1 + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 dev: true - /inflight/1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + /pretty-format/29.2.1: + resolution: {integrity: sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - once: 1.4.0 - wrappy: 1.0.2 + '@jest/schemas': 29.0.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 dev: true - /inherits/2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /proxy-addr/2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: false + + /psl/1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true - /is-builtin-module/3.2.0: - resolution: {integrity: sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==} + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} - dependencies: - builtin-modules: 3.3.0 dev: true - /is-core-module/2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + /qs/6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} dependencies: - has: 1.0.3 - dev: true + side-channel: 1.0.4 + dev: false - /is-module/1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + /querystringify/2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: true - /is-reference/1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - dependencies: - '@types/estree': 1.0.0 - dev: true + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false - /joycon/3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /react-dom/17.0.2_react@17.0.2: + resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} + peerDependencies: + react: 17.0.2 + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react: 17.0.2 + scheduler: 0.20.2 + + /react-error-boundary/3.1.4_react@17.0.2: + resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + react: '>=16.13.1' + dependencies: + '@babel/runtime': 7.19.4 + react: 17.0.2 dev: true - /js-tokens/4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + /react-is/17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: true - optional: true - /jsonc-parser/3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + /react-is/18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /magic-string/0.26.7: - resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} - engines: {node: '>=12'} - dependencies: - sourcemap-codec: 1.4.8 + /react-refresh/0.13.0: + resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==} + engines: {node: '>=0.10.0'} dev: true - /minimatch/5.1.0: - resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} - engines: {node: '>=10'} + /react/17.0.2: + resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + engines: {node: '>=0.10.0'} dependencies: - brace-expansion: 2.0.1 - dev: true - - /ms/2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true + loose-envify: 1.4.0 + object-assign: 4.1.1 - /once/1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + /redent/3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} dependencies: - wrappy: 1.0.2 + indent-string: 4.0.0 + strip-indent: 3.0.0 dev: true - /path-parse/1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /regenerator-runtime/0.13.10: + resolution: {integrity: sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==} dev: true - /picomatch/2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + /requires-port/1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true /resolve/1.22.1: @@ -583,6 +2143,12 @@ packages: is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 dev: true /rollup-plugin-dts/5.0.0_rollup@3.2.3: @@ -615,6 +2181,13 @@ packages: - supports-color dev: true + /rollup/2.78.1: + resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + /rollup/3.2.3: resolution: {integrity: sha512-qfadtkY5kl0F5e4dXVdj2D+GtOdifasXHFMiL1SMf9ADQDv5Eti6xReef9FKj+iQPR2pvtqWna57s/PjARY4fg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -623,29 +2196,397 @@ packages: fsevents: 2.3.2 dev: true + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /saxes/6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /scheduler/0.20.2: + resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /send/0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /serve-static/1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: false + + /setprototypeof/1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + object-inspect: 1.12.2 + dev: false + + /sirv/2.0.2: + resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.21 + mrmime: 1.0.1 + totalist: 3.0.0 + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: true + optional: true + /sourcemap-codec/1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} dev: true + /stack-utils/2.0.5: + resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-literal/0.4.2: + resolution: {integrity: sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==} + dependencies: + acorn: 8.8.0 + dev: true + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - optional: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + + /symbol-tree/3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /tinybench/2.3.1: + resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==} + dev: true + + /tinypool/0.3.0: + resolution: {integrity: sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy/1.0.2: + resolution: {integrity: sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==} + engines: {node: '>=14.0.0'} + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /totalist/3.0.0: + resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==} + engines: {node: '>=6'} + dev: true + + /tough-cookie/4.1.2: + resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.1.1 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + + /tr46/3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + dependencies: + punycode: 2.1.1 + dev: true + + /type-check/0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: true + + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} dev: true + /type-is/1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + /typescript/4.8.4: resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} engines: {node: '>=4.2.0'} hasBin: true dev: true + /universalify/0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /unpipe/1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /update-browserslist-db/1.0.10_browserslist@4.21.4: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.4 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /url-parse/1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + + /utils-merge/1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: false + + /vary/1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /vite/3.1.8: + resolution: {integrity: sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + less: '*' + sass: '*' + stylus: '*' + terser: ^5.4.0 + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.15.12 + postcss: 8.4.18 + resolve: 1.22.1 + rollup: 2.78.1 + optionalDependencies: + fsevents: 2.3.2 + + /vitest/0.24.3_i7ukxxwfoxepyk4smtl6oue4oi: + resolution: {integrity: sha512-aM0auuPPgMSstWvr851hB74g/LKaKBzSxcG3da7ejfZbx08Y21JpZmbmDYrMTCGhVZKqTGwzcnLMwyfz2WzkhQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/chai': 4.3.3 + '@types/chai-subset': 1.3.3 + '@types/node': 18.11.3 + '@vitest/ui': 0.24.3 + chai: 4.3.6 + debug: 4.3.4 + jsdom: 20.0.1 + local-pkg: 0.4.2 + strip-literal: 0.4.2 + tinybench: 2.3.1 + tinypool: 0.3.0 + tinyspy: 1.0.2 + vite: 3.1.8 + transitivePeerDependencies: + - less + - sass + - stylus + - supports-color + - terser + dev: true + + /w3c-xmlserializer/3.0.0: + resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==} + engines: {node: '>=12'} + dependencies: + xml-name-validator: 4.0.0 + dev: true + + /webidl-conversions/7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + dev: true + + /whatwg-encoding/2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /whatwg-mimetype/3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: true + + /whatwg-url/11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + dev: true + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + + /ws/8.9.0: + resolution: {integrity: sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xml-name-validator/4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /xmlchars/2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true From 47327d903170050bcbd610857ab8b1cdb29570de Mon Sep 17 00:00:00 2001 From: Hung Viet Nguyen Date: Sat, 22 Oct 2022 16:06:37 +0700 Subject: [PATCH 2/4] feat: Auto open browser when run `vitest-preview` --- package.json | 2 +- packages/dev-utils/package.json | 34 +++++++ packages/dev-utils/rollup.config.js | 55 +++++++++++ packages/dev-utils/src/index.ts | 7 ++ packages/dev-utils/src/openBrowser.ts | 87 +++++++++++++++++ packages/dev-utils/src/openChrome.applescript | 95 +++++++++++++++++++ packages/vitest-preview/package.json | 11 ++- packages/vitest-preview/playground.js | 3 - .../vitest-preview/src/node/previewServer.ts | 13 ++- pnpm-lock.yaml | 54 +++++++++-- 10 files changed, 344 insertions(+), 17 deletions(-) create mode 100644 packages/dev-utils/package.json create mode 100644 packages/dev-utils/rollup.config.js create mode 100644 packages/dev-utils/src/index.ts create mode 100644 packages/dev-utils/src/openBrowser.ts create mode 100644 packages/dev-utils/src/openChrome.applescript delete mode 100644 packages/vitest-preview/playground.js diff --git a/package.json b/package.json index 2db5b79..321ca6f 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "keywords": [], "author": "", - "license": "ISC", + "license": "MIT", "devDependencies": { "@types/node": "^18.11.3", "esbuild": "^0.15.12", diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json new file mode 100644 index 0000000..cc0a1ca --- /dev/null +++ b/packages/dev-utils/package.json @@ -0,0 +1,34 @@ +{ + "name": "@vitest-preview/dev-utils", + "version": "0.0.1", + "description": "", + "type": "module", + "main": "dist/index.js", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "copy": "mkdir dist && cp src/openChrome.applescript dist/openChrome.applescript", + "build": "rimraf dist && pnpm run copy && rollup -c", + "build:watch": "rimraf dist && pnpm run copy && rollup -c -w" + }, + "keywords": [], + "author": { + "name": "Hung Viet Nguyen", + "url": "https://github.com/nvh95" + }, + "license": "MIT", + "devDependencies": { + "@rollup/plugin-commonjs": "^23.0.2", + "@rollup/plugin-json": "^5.0.1", + "@rollup/plugin-node-resolve": "^15.0.1", + "rollup": "^3.2.3", + "rollup-plugin-dts": "^5.0.0", + "rollup-plugin-esbuild": "^4.10.1" + }, + "dependencies": { + "open": "^8.4.0" + } +} diff --git a/packages/dev-utils/rollup.config.js b/packages/dev-utils/rollup.config.js new file mode 100644 index 0000000..0bc086b --- /dev/null +++ b/packages/dev-utils/rollup.config.js @@ -0,0 +1,55 @@ +import { builtinModules } from 'module'; +import { defineConfig } from 'rollup'; +import esbuild from 'rollup-plugin-esbuild'; +import commonjs from '@rollup/plugin-commonjs'; +import dts from 'rollup-plugin-dts'; +import nodeResolve from '@rollup/plugin-node-resolve'; +import json from '@rollup/plugin-json'; + +import pkg from './package.json' assert { type: 'json' }; + +const entries = ['src/index.ts']; + +const dtsEntries = ['src/index.ts']; + +const external = [ + ...builtinModules, + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.devDependencies), + // TODO: Do we need any peer deps here? + // ...Object.keys(pkg.peerDependencies), +]; + +const plugins = [ + nodeResolve({ + preferBuiltins: true, + }), + json(), + commonjs(), + esbuild({ + target: 'node14', + }), +]; + +export default ({ watch }) => + defineConfig([ + { + input: entries, + output: { + dir: 'dist', + format: 'esm', + }, + external, + plugins: [...plugins], + }, + { + input: dtsEntries, + output: { + dir: 'dist', + entryFileNames: (chunk) => `${chunk.name.replace('src/', '')}.d.ts`, + format: 'esm', + }, + external, + plugins: [dts({ respectExternal: true })], + }, + ]); diff --git a/packages/dev-utils/src/index.ts b/packages/dev-utils/src/index.ts new file mode 100644 index 0000000..79ad98c --- /dev/null +++ b/packages/dev-utils/src/index.ts @@ -0,0 +1,7 @@ +import openBrowser from './openBrowser'; + +export { openBrowser }; + +export default { + openBrowser, +}; diff --git a/packages/dev-utils/src/openBrowser.ts b/packages/dev-utils/src/openBrowser.ts new file mode 100644 index 0000000..20a4d25 --- /dev/null +++ b/packages/dev-utils/src/openBrowser.ts @@ -0,0 +1,87 @@ +#!/usr/bin/env node + +// Credit to https://github.com/bpierre/create-react-app/blob/967db643fc9f85e1f8c84fff4708307c5f006e4f/packages/react-dev-utils/openBrowser.js +import { execSync } from 'child_process'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import open from 'open'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +var OSX_CHROME = 'google chrome'; + +function openBrowser(url: string) { + // Attempt to honor this environment variable. + // It is specific to the operating system. + // See https://github.com/sindresorhus/opn#app for documentation. + let browser = process.env.BROWSER; + + // Special case: BROWSER="none" will prevent opening completely. + if (browser === 'none') { + return false; + } + + // If we're on OS X, the user hasn't specifically + // requested a different browser, we can try opening + // Chrome with AppleScript. This lets us reuse an + // existing tab when possible instead of creating a new one. + const shouldTryOpenChromeWithAppleScript = + process.platform === 'darwin' && + (typeof browser !== 'string' || browser === OSX_CHROME); + + if (shouldTryOpenChromeWithAppleScript) { + // Will use the first open browser found from list + const supportedChromiumBrowsers = [ + 'Google Chrome Canary', + 'Google Chrome Dev', + 'Google Chrome Beta', + 'Google Chrome', + 'Microsoft Edge', + 'Brave Browser', + 'Vivaldi', + 'Chromium', + ]; + + for (let chromiumBrowser of supportedChromiumBrowsers) { + try { + // Try our best to reuse existing tab + // on OS X Google Chrome with AppleScript + // "ps cax" throws error if "chromiumBrowser" is not opened + execSync(`ps cax | grep "${chromiumBrowser}"`); + execSync( + `osascript openChrome.applescript "${encodeURI( + url, + )}" "${chromiumBrowser}"`, + { + cwd: __dirname, + stdio: 'ignore', + }, + ); + return true; + } catch (err) { + // Ignore errors. + } + } + } + + // Another special case: on OS X, check if BROWSER has been set to "open". + // In this case, instead of passing `open` to `opn` (which won't work), + // just ignore it (thus ensuring the intended behavior, i.e. opening the system browser): + // https://github.com/facebookincubator/create-react-app/pull/1690#issuecomment-283518768 + if (process.platform === 'darwin' && browser === 'open') { + browser = undefined; + } + + // Fallback to opn + // (It will always open new tab) + try { + var options = { app: browser }; + // @ts-expect-error: Well, not sure + open(url, options).catch(() => {}); // Prevent `unhandledRejection` error. + return true; + } catch (err) { + return false; + } +} + +export default openBrowser; diff --git a/packages/dev-utils/src/openChrome.applescript b/packages/dev-utils/src/openChrome.applescript new file mode 100644 index 0000000..3955c5b --- /dev/null +++ b/packages/dev-utils/src/openChrome.applescript @@ -0,0 +1,95 @@ +(* +Credit to https://github.com/facebook/create-react-app/blob/d2de54b25cc25800df1764058997e3e274bd79ac/packages/react-dev-utils/openChrome.applescript +Copyright (c) 2015-present, Facebook, Inc. + +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. +*) + +property targetTab: null +property targetTabIndex: -1 +property targetWindow: null +property theProgram: "Google Chrome" + +on run argv + set theURL to item 1 of argv + + -- Allow requested program to be optional, + -- default to Google Chrome + if (count of argv) > 1 then + set theProgram to item 2 of argv + end if + + using terms from application "Google Chrome" + tell application theProgram + + if (count every window) = 0 then + make new window + end if + + -- 1: Looking for tab running debugger + -- then, Reload debugging tab if found + -- then return + set found to my lookupTabWithUrl(theURL) + if found then + set targetWindow's active tab index to targetTabIndex + tell targetTab to reload + tell targetWindow to activate + set index of targetWindow to 1 + return + end if + + -- 2: Looking for Empty tab + -- In case debugging tab was not found + -- We try to find an empty tab instead + set found to my lookupTabWithUrl("chrome://newtab/") + if found then + set targetWindow's active tab index to targetTabIndex + set URL of targetTab to theURL + tell targetWindow to activate + return + end if + + -- 3: Create new tab + -- both debugging and empty tab were not found + -- make a new tab with url + tell window 1 + activate + make new tab with properties {URL:theURL} + end tell + end tell + end using terms from +end run + +-- Function: +-- Lookup tab with given url +-- if found, store tab, index, and window in properties +-- (properties were declared on top of file) +on lookupTabWithUrl(lookupUrl) + using terms from application "Google Chrome" + tell application theProgram + -- Find a tab with the given url + set found to false + set theTabIndex to -1 + repeat with theWindow in every window + set theTabIndex to 0 + repeat with theTab in every tab of theWindow + set theTabIndex to theTabIndex + 1 + if (theTab's URL as string) contains lookupUrl then + -- assign tab, tab index, and window to properties + set targetTab to theTab + set targetTabIndex to theTabIndex + set targetWindow to theWindow + set found to true + exit repeat + end if + end repeat + + if found then + exit repeat + end if + end repeat + end tell + end using terms from + return found +end lookupTabWithUrl diff --git a/packages/vitest-preview/package.json b/packages/vitest-preview/package.json index ae31bf2..89c504e 100644 --- a/packages/vitest-preview/package.json +++ b/packages/vitest-preview/package.json @@ -14,14 +14,17 @@ }, "scripts": { "build": "rimraf dist && rollup -c", - "build:watch": "rimraf dist && rollup -c -w", - "test": "echo \"Error: no test specified\" && exit 1" + "build:watch": "rimraf dist && rollup -c -w" }, "keywords": [], - "author": "", - "license": "ISC", + "author": { + "name": "Hung Viet Nguyen", + "url": "https://github.com/nvh95" + }, + "license": "MIT", "dependencies": { "@types/express": "^4.17.14", + "@vitest-preview/dev-utils": "workspace:*", "@types/node": "^18.11.3", "express": "^4.18.2", "vite": "^3.0.0" diff --git a/packages/vitest-preview/playground.js b/packages/vitest-preview/playground.js deleted file mode 100644 index 62d06ef..0000000 --- a/packages/vitest-preview/playground.js +++ /dev/null @@ -1,3 +0,0 @@ -import { builtinModules } from 'module'; - -console.log(builtinModules); diff --git a/packages/vitest-preview/src/node/previewServer.ts b/packages/vitest-preview/src/node/previewServer.ts index 541e001..9195b6b 100644 --- a/packages/vitest-preview/src/node/previewServer.ts +++ b/packages/vitest-preview/src/node/previewServer.ts @@ -1,14 +1,18 @@ // https://vitejs.dev/guide/ssr.html#setting-up-the-dev-server import fs from 'fs'; import path from 'path'; -import { fileURLToPath } from 'url'; import express from 'express'; import { createServer as createViteServer } from 'vite'; + +import { openBrowser } from '@vitest-preview/dev-utils'; + import { CACHE_FOLDER } from '../constants'; +// TODO: Find the available port +const port = process.env.PORT || 5006; + async function createServer() { const app = express(); - const vite = await createViteServer({ server: { middlewareMode: true, @@ -49,7 +53,10 @@ async function createServer() { } }); - app.listen(5006); + app.listen(port, () => { + console.log(`Vitest Preview Server listening on http://localhost:${port}`); + openBrowser(`http://localhost:${port}`); + }); } createServer(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eedaa76..268fb88 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,12 +16,6 @@ importers: rimraf: 3.0.2 typescript: 4.8.4 - apps/dev: - specifiers: - vitest-preview: workspace:* - dependencies: - vitest-preview: link:../../packages/vitest-preview - apps/react-testing-lib: specifiers: '@testing-library/jest-dom': ^5.16.4 @@ -57,6 +51,25 @@ importers: vitest: 0.24.3_i7ukxxwfoxepyk4smtl6oue4oi vitest-preview: link:../../packages/vitest-preview + packages/dev-utils: + specifiers: + '@rollup/plugin-commonjs': ^23.0.2 + '@rollup/plugin-json': ^5.0.1 + '@rollup/plugin-node-resolve': ^15.0.1 + open: ^8.4.0 + rollup: ^3.2.3 + rollup-plugin-dts: ^5.0.0 + rollup-plugin-esbuild: ^4.10.1 + dependencies: + open: 8.4.0 + devDependencies: + '@rollup/plugin-commonjs': 23.0.2_rollup@3.2.3 + '@rollup/plugin-json': 5.0.1_rollup@3.2.3 + '@rollup/plugin-node-resolve': 15.0.1_rollup@3.2.3 + rollup: 3.2.3 + rollup-plugin-dts: 5.0.0_rollup@3.2.3 + rollup-plugin-esbuild: 4.10.1_rollup@3.2.3 + packages/vitest-preview: specifiers: '@rollup/plugin-commonjs': ^23.0.2 @@ -64,6 +77,7 @@ importers: '@rollup/plugin-node-resolve': ^15.0.1 '@types/express': ^4.17.14 '@types/node': ^18.11.3 + '@vitest-preview/dev-utils': workspace:* express: ^4.18.2 rollup: ^3.2.3 rollup-plugin-dts: ^5.0.0 @@ -72,6 +86,7 @@ importers: dependencies: '@types/express': 4.17.14 '@types/node': 18.11.3 + '@vitest-preview/dev-utils': link:../dev-utils express: 4.18.2 vite: 3.1.8 devDependencies: @@ -1102,6 +1117,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /define-lazy-prop/2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: false + /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1664,6 +1684,12 @@ packages: dependencies: has: 1.0.3 + /is-docker/2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: false + /is-module/1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true @@ -1683,6 +1709,13 @@ packages: '@types/estree': 1.0.0 dev: true + /is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: false + /jest-diff/29.2.1: resolution: {integrity: sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1953,6 +1986,15 @@ packages: wrappy: 1.0.2 dev: true + /open/8.4.0: + resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + /optionator/0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} From f6a107ba8df064ac30a85401cf229f82490d3314 Mon Sep 17 00:00:00 2001 From: Hung Viet Nguyen Date: Sat, 22 Oct 2022 16:51:49 +0700 Subject: [PATCH 3/4] feat: add empty state page --- packages/vitest-preview/package.json | 5 +-- packages/vitest-preview/src/node/empty.html | 35 +++++++++++++++++++ .../vitest-preview/src/node/previewServer.ts | 17 ++++++--- 3 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 packages/vitest-preview/src/node/empty.html diff --git a/packages/vitest-preview/package.json b/packages/vitest-preview/package.json index 89c504e..4b46cf6 100644 --- a/packages/vitest-preview/package.json +++ b/packages/vitest-preview/package.json @@ -13,8 +13,9 @@ "vitest-preview": "./dist/previewServer.js" }, "scripts": { - "build": "rimraf dist && rollup -c", - "build:watch": "rimraf dist && rollup -c -w" + "copy": "mkdir dist && cp src/node/empty.html dist/empty.html", + "build": "rimraf dist && pnpm copy && rollup -c", + "build:watch": "rimraf dist && pnpm copy && rollup -c -w" }, "keywords": [], "author": { diff --git a/packages/vitest-preview/src/node/empty.html b/packages/vitest-preview/src/node/empty.html new file mode 100644 index 0000000..c7ad34b --- /dev/null +++ b/packages/vitest-preview/src/node/empty.html @@ -0,0 +1,35 @@ + + + + + + + Vitest Preview Dashboard + + + +

+ No previews found.
+ Please add following lines to your test:
+
+
+ + import { debug } from 'vitest-preview'; +
+
+ // Inside your tests +
+ describe('my test', () => { +
+   render(<MyComponent />); +
+   debug(); // 👈 Add this line +
+ } +
+
+
+ Then rerun your tests. +
+ + diff --git a/packages/vitest-preview/src/node/previewServer.ts b/packages/vitest-preview/src/node/previewServer.ts index 9195b6b..be1f891 100644 --- a/packages/vitest-preview/src/node/previewServer.ts +++ b/packages/vitest-preview/src/node/previewServer.ts @@ -3,6 +3,7 @@ import fs from 'fs'; import path from 'path'; import express from 'express'; import { createServer as createViteServer } from 'vite'; +import { fileURLToPath } from 'url'; import { openBrowser } from '@vitest-preview/dev-utils'; @@ -11,6 +12,8 @@ import { CACHE_FOLDER } from '../constants'; // TODO: Find the available port const port = process.env.PORT || 5006; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + async function createServer() { const app = express(); const vite = await createViteServer({ @@ -34,10 +37,16 @@ async function createServer() { const url = req.originalUrl; try { - let template = fs.readFileSync( - path.resolve(CACHE_FOLDER, 'index.html'), - 'utf-8', - ); + const snapshotHtmlFile = path.join(CACHE_FOLDER, 'index.html'); + if (!fs.existsSync(snapshotHtmlFile)) { + const emptyHtml = fs.readFileSync( + path.resolve(__dirname, 'empty.html'), + 'utf-8', + ); + res.status(200).set({ 'Content-Type': 'text/html' }).end(emptyHtml); + return; + } + let template = fs.readFileSync(path.resolve(snapshotHtmlFile), 'utf-8'); template = await vite.transformIndexHtml(url, template); From 1aa06fe236b06d4b9d87f19e323f79e1be2403e4 Mon Sep 17 00:00:00 2001 From: Hung Viet Nguyen Date: Sat, 22 Oct 2022 17:01:02 +0700 Subject: [PATCH 4/4] chore: add publish commands --- packages/vitest-preview/package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/vitest-preview/package.json b/packages/vitest-preview/package.json index 4b46cf6..649dacc 100644 --- a/packages/vitest-preview/package.json +++ b/packages/vitest-preview/package.json @@ -15,7 +15,10 @@ "scripts": { "copy": "mkdir dist && cp src/node/empty.html dist/empty.html", "build": "rimraf dist && pnpm copy && rollup -c", - "build:watch": "rimraf dist && pnpm copy && rollup -c -w" + "build:watch": "rimraf dist && pnpm copy && rollup -c -w", + "prepublishOnly": "pnpm run build", + "publish:alpha": "npm publish --tag alpha", + "publish:latest": "npm publish" }, "keywords": [], "author": {