From f1a3dd5f17324b78d481942cefe534524de52400 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 19 Nov 2023 15:21:38 +0100 Subject: [PATCH 001/114] Fix release naming in workflow --- .github/workflows/workflow.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index e3f9211..77ef0bb 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -31,7 +31,7 @@ jobs: python-version: '3.9' - name: Get current date id: dateAndTime - run: echo "dateAndTime=$(date +'%Y-%m-%d-%H-%M')" >> $GITHUB_OUTPUT + run: echo "dateAndTime=$(date +'%Y-%m-%d-%H:%M')" >> $GITHUB_OUTPUT - name: Install mklittlefs run: > git clone https://github.com/earlephilhower/mklittlefs.git /tmp/mklittlefs && @@ -59,7 +59,7 @@ jobs: with: tag: main commit: main - name: release-${{ steps.date.outputs.dateAndTime }} + name: release-${{ steps.dateAndTime.outputs.dateAndTime }} artifacts: "littlefs.bin,webui.tgz" allowUpdates: true removeArtifacts: true -- 2.45.2 From db1e8f70251637025ce80ab10291bc69090a6af4 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 19 Nov 2023 15:36:25 +0100 Subject: [PATCH 002/114] Use block height as version numbering --- .github/workflows/workflow.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 77ef0bb..ed7c836 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -42,6 +42,9 @@ jobs: run: yarn && yarn postinstall - name: Build WebUI run: yarn build + - name: Get current block + id: getBlockHeight + run: echo "blockHeight=$(curl -s https://mempool.space/api/blocks/tip/height)" >> $GITHUB_OUTPUT - name: gzip build for LittleFS run: find dist -type f ! -name ".*" -exec sh -c 'mkdir -p "build_gz/$(dirname "${1#dist/}")" && gzip -k "$1" -c > "build_gz/${1#dist/}".gz' _ {} \; - name: Create tarball @@ -59,7 +62,7 @@ jobs: with: tag: main commit: main - name: release-${{ steps.dateAndTime.outputs.dateAndTime }} + name: release-${{ steps.getBlockHeight.outputs.blockHeight }} artifacts: "littlefs.bin,webui.tgz" allowUpdates: true removeArtifacts: true -- 2.45.2 From 0f8308dff93ab891aa10500733ecf6823e938f84 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 19 Nov 2023 15:40:41 +0100 Subject: [PATCH 003/114] Try to autotag --- .github/workflows/workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index ed7c836..13e2b2a 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -60,7 +60,7 @@ jobs: - name: Create release uses: ncipollo/release-action@v1 with: - tag: main + tag: ${{ steps.getBlockHeight.outputs.blockHeight }} commit: main name: release-${{ steps.getBlockHeight.outputs.blockHeight }} artifacts: "littlefs.bin,webui.tgz" -- 2.45.2 From 8db998eb8e095eb389217e29822391e12b3489ee Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 19 Nov 2023 15:54:44 +0100 Subject: [PATCH 004/114] Do not run workflow on few changes --- .github/workflows/workflow.yml | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 13e2b2a..cfdd5c5 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -6,8 +6,27 @@ env: PUBLIC_BASE_URL: "" jobs: - build: + check-changes: runs-on: ubuntu-latest + continue-on-error: true + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get changed files count + id: changed-files + uses: tj-actions/changed-files@v40.1.1 + + - name: Print changed files count + run: echo "Changed files count: ${{ steps.changed-files.outputs.all_changed_and_modified_files_count }}" + + - name: Fail if less than 2 changes detected + run: exit $(( ${{ steps.changed-files.outputs.all_changed_and_modified_files_count }} < 2 )) + + build: + needs: check-changes + runs-on: ubuntu-latest + if: ${{ needs.check-changes.result == 'success' }} permissions: contents: write -- 2.45.2 From ada12915c5b98b89102462b1105d9cbd77baa5d6 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 19 Nov 2023 16:02:06 +0100 Subject: [PATCH 005/114] Fix YAML --- .github/workflows/workflow.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index cfdd5c5..f885836 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -18,10 +18,13 @@ jobs: uses: tj-actions/changed-files@v40.1.1 - name: Print changed files count - run: echo "Changed files count: ${{ steps.changed-files.outputs.all_changed_and_modified_files_count }}" + run: > + echo "Changed files count: ${{ + steps.changed-files.outputs.all_changed_and_modified_files_count }}" - name: Fail if less than 2 changes detected - run: exit $(( ${{ steps.changed-files.outputs.all_changed_and_modified_files_count }} < 2 )) + if: steps.changed-files.outputs.all_changed_and_modified_files_count < 2 + run: exit 1 build: needs: check-changes -- 2.45.2 From d558e3095846e6d23226cb530fe4e4d3fb78a69e Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 19 Nov 2023 16:05:46 +0100 Subject: [PATCH 006/114] Retry condition --- .github/workflows/workflow.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index f885836..bb1347b 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -22,14 +22,10 @@ jobs: echo "Changed files count: ${{ steps.changed-files.outputs.all_changed_and_modified_files_count }}" - - name: Fail if less than 2 changes detected - if: steps.changed-files.outputs.all_changed_and_modified_files_count < 2 - run: exit 1 - build: needs: check-changes runs-on: ubuntu-latest - if: ${{ needs.check-changes.result == 'success' }} + if: steps.changed-files.outputs.all_changed_and_modified_files_count >= 2 permissions: contents: write -- 2.45.2 From 654d97df9faa54083a068336b18dab4e9825d1f4 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 19 Nov 2023 16:09:04 +0100 Subject: [PATCH 007/114] Fix outputs --- .github/workflows/workflow.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index bb1347b..31a46b9 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -8,7 +8,8 @@ env: jobs: check-changes: runs-on: ubuntu-latest - continue-on-error: true + outputs: + all_changed_and_modified_files_count: ${{ steps.changed-files.outputs.all_changed_and_modified_files_count }} steps: - name: Checkout code uses: actions/checkout@v2 @@ -20,12 +21,12 @@ jobs: - name: Print changed files count run: > echo "Changed files count: ${{ - steps.changed-files.outputs.all_changed_and_modified_files_count }}" + steps.changed-files.outputs.all_changed_and_modified_files_count }}" build: needs: check-changes runs-on: ubuntu-latest - if: steps.changed-files.outputs.all_changed_and_modified_files_count >= 2 + if: ${{ needs.check-changes.outputs >= 2 }} permissions: contents: write -- 2.45.2 From 1023218882b3c23ea85213bdaf3cc616197197e0 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 19 Nov 2023 16:25:31 +0100 Subject: [PATCH 008/114] Update README --- .github/workflows/workflow.yml | 4 +++- README.md | 41 ++++++++++++++++++--------------- doc/screenshot-dark.webp | Bin 0 -> 52660 bytes doc/screenshot.webp | Bin 0 -> 54070 bytes 4 files changed, 25 insertions(+), 20 deletions(-) create mode 100644 doc/screenshot-dark.webp create mode 100644 doc/screenshot.webp diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 31a46b9..e356fde 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -17,7 +17,9 @@ jobs: - name: Get changed files count id: changed-files uses: tj-actions/changed-files@v40.1.1 - + with: + files_ignore: "doc/**,README.md,Dockerfile,.*,.github/**" + files_ignore_separator: ',' - name: Print changed files count run: > echo "Changed files count: ${{ diff --git a/README.md b/README.md index 5c91169..e93e964 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,41 @@ -# create-svelte +# BTClock WebUI -Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte). +[![BTClock CI](https://github.com/btclock/webui/actions/workflows/workflow.yml/badge.svg)](https://github.com/btclock/webui2/actions/workflows/workflow.yml) -## Creating a project +The web user-interface for the BTClock, based on Svelte-kit. It uses Bootstrap for the lay-out. -If you're seeing this, you've probably already done this step. Congrats! - -```bash -# create a new project in the current directory -npm create svelte@latest - -# create a new project in my-app -npm create svelte@latest my-app -``` +![Screenshot](doc/screenshot.webp) +![Screenshot Dark](doc/screenshot-dark.webp) ## Developing -Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: +After installed dependencies with `yarn`, start a development server: ```bash -npm run dev +yarn dev # or start the server and open the app in a new browser tab -npm run dev -- --open +yarn dev -- --open ``` ## Building -To create a production version of your app: +To create a production version of the WebUI: ```bash -npm run build +yarn build ``` -You can preview the production build with `npm run preview`. +Make sure the postinstall script is ran, because otherwise the filenames are to long for the LittleFS filesystem. -> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. +## Deploying + +To upload the firmware to the BTClock, you need to GZIP all the files. You can use the python script `gzip_build.py` for that. + +Then you can make a `LittleFS.bin` with mklittlefs: + +```bash +mklittlefs -c build_gz -s 409600 littlefs.bin +``` + +You can preview the production build with `yarn preview`. \ No newline at end of file diff --git a/doc/screenshot-dark.webp b/doc/screenshot-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..a225afec37851dcb7b4ce348ef730abbb5f384ec GIT binary patch literal 52660 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 kDu2%1a>sEbVy1Z z7>Gl&&Nc&%Av8BGLq8X;LZUx&L;CE<6taLRrw+YpIF@c6d7UAZ) ze!9F*q(iv$+P}AnYsF?%(R#%U{7rYxd73ZqsNv-o)wW#c>!*|A z8)WVA@}~b%+*TaKD7{ST?K+?u;=pn|=5W%QAnOTl)F!|mKKlAX|`BkX0*Zlwwk&5D# z#?o(@;@Ioq^;0F)i>TDkIruT<-RdfwQ$~T@_Qpy$gvi2ox3KNm@w8p9D1|Q>d2NLS zKHL6|WQ#y!c2(J#pgZ-Opb=ojXu<1#k;L@vBv>~LP2&?FzY+C250BO2U>FpDFa$-` zMb+Dt08k`px@y#RzLyTChE#8 z=SrliAWTq?$h>?S=B>ag!YPedGDRXr>}GdWh|Rsip9Rb2etbNeLo0mlwLPu)J;4A|>tLmOGW}sj&>%KMuGdE6`7Mxf)H^lhZclY6Gi;?DcS>pa^x%RSurHkAv{f*1+^g5L zMyctVu`K(l4zln}p1?y|nn^9Dh6qWTq0)L_e)a4l5f5n(S2H$|Sop7xpLDP)WKMgw zCF<7kytS6udYr=?5F5>d32V!%yzTnA5_Au2QCC%*+&kQs_lNu`#B`nYGJ|jcdOnf; z%}3}t5Yaafk1dXIY?JStmMZA0T{})#aQIFcJdQ%Ea}(~T$cyqVbL11PI?jcC`unH!Y3n+!MZt1>xVb`T@?{CW%I z&0Xg*;&|U~K$_^X*}eH#zF{+Nnx~;$8_aIe-5o7sKTtcqe&Y_Gh1Ft#H-;JQ{Rr{L zRfCVQWLXLT%l|IoibpX^1Ib{u?$q|xJ+R0J=ge6>GH?@+wc%r~TKn!sd$=cn3w9wY zPBg&uQ7o--vriQoh(^pzaMhkv?iEi(YS(??p=8L+;`}C6raP&J!gIp;W}-M3V)3ke zCd^^}A+KuVk+i?97nh=P=Qh@MLS~DQyo|(af&voC090Prx28S?n8p2K@#x{pi<_r> zps$EVahb{(o*`Pvf=b^ z&HCus7bUQVo_o>H17TAjS$OnrZS}O~O2?7qy>yzpd{D#34GgucW31X zH9x)}6qazdNfeA+-zS7>y&v%e<@9lwcxal^3T-7Pm*B8r1sp?Q(y?RFjC`OD)R#Xo zzx++`bQ@`FPr+iMc}Ao7(Wt;BFTujd7{Z0Ur=-h8;lq?nU<HAn`| zY-D;nT?nU&b>az+{wAG>qVO(bL@j7>ciD(R4D}*fb)m*dAX}aR`z7YU72namJ6&#( zeethgl)!vN3%zKYSYm@bC!IXAocO9{-eHz>N36oS@)uxQ0iOA*3Gx1WF>45mZ%>V4 zgM|~KIs;QrQHOnVs93ln4mB?b2-AR@r5zZLaQjm9rw4Y49VJp#^uH91=v=;N!xywJ=-+L9UUX(^ zrY;mcOlghsI$6$I-SJNMY=AJ-yPu)+OgPVGi>N~4PWdunZF>5z(q7(hYz(mLW zHVUK}@}fcHd4YnE(M2Z3_e0~E-0>{8W;5)S9P`g!NghgjdlLktFK50oUK^+aB((f> zkc+8$*QxWB@}Mx>Fr;sihf`c1zQvPf_A;b{d&OqW);t8bvnK<)f^d?JPR+<1c@V~y zaGqs&yd)y53E$ME?H>ph=W!&GaT*u=b#&f18m&h=NE}a2S+St9MPum!1?-cj^gays zmEe}-)D0b^-#aDc-sxfe9R}|=mcV=)ts3cnEh4B8J+g5dO>@XFobhTRmTd+V*N(tw{OXIzoDcfXUtTWap7cv zsxTcEdp&L2W%&G(<%>L%GjWT2p|Vw*2#r#n(tUYo6nH&!Zi?exlNcw?fM)^1RPzC2 zn3%3djYrRWqHNIKE-4LeGXFQ$Md;?|a>j@Xj;rwv`SYD>1^>p_!Pf|SmZ2z))wa!#! z--KP8Z?jKsH!pn2cY$0FI?mZUg{)s6%1PY~%DVyV9w#UYRhlbJ)i0_ZQm{&d!m=j@ zW3Rb>fYEe)1!4Mr=cL@`M8RBC7KX{cXiG49I$d3|cm4~ktRjpqJHwKqu5JThYT5#h zcI3JM0D@WGQydfk00nJm=p_2Db8gNuZv2;(yz(Le|7;jOcQk@dVn z>Y-Uyq>V{xj5%-aNkjG%up3hVNmA^_m}GuzD#D?Dplwubvw!1=SAv&M3!tMCRaRrx z*45<(wKO>fh9>sf(1qj%DKYASH}XY}L=F7oEsGp!B7ET+D?BiBe%3@sMgo{Moe#(e zfL>JFviy+MRI|GgJ_8z!Ih_g_%|Cd9`$OxuA2$d)3(4Mn+B__wx0^z0w_|OqsU4)V z?(|kcMe~lg-D)Z&@Hsv5XfD3OZ_OsXm7f&zu3p5Sqo{8*Ev=*0Rx2c21+px)5JQ@h zj3w{l;6aXWzzxdSl`a$Uk0GsTQg$o-LgX%W7=HmgKdvAfE&AsDerboq>7ljkJ0zrc zZKiz{$--YKL6l6vW}Pn+xo450qA8cGo z44<%=p)W>eaDCIPd>LB^DFmSkeCTyiV~YmY1wVb{7sp;FiIa5P3Lnf_dx8&d~oDqM7%V!mKCP$6}iBo`UW__4Q zOq}WAV8w@?;a+t662UZ;3%2gATPE7#l;uR(W&{Ax-)~n3<$H;z`Zkh_?6eSU_l+paA zI7$aF<5B6~g@I7SDBk>Qf@Yw(FCEez)5zJIb&)c|jxRl=e^`1DS^O34OiZT4 z{}dTc`%=p3d~GEh8_)0L>x`?3dLZs900RKozPyl&h!tPVIcD%4h{<0X`1o9OkU&(f z)w<9mUKLfdgciOM8M`@uR^~!U?-5EQh70``&3fc)d5OPZ(@2@~7 z@}CVeLdd1VoYk+>Xc3YYp#^m8j?S&LIZSdv(?cbOc;@C||=3^M)N@yTYon!}-x7K4caVfv$u1 zmGn9|5I%{2GwD4&kNd(T`g&}ilO`jfTYylf&M09YAOev?z~e;CZ?(|JVSH@<3&v+NWAj#;ee31IhE0zgrteWXyffsNcL$f977MQaqb55v<&;nc z)5DLUM98Y#g$xww(ZHVq0000DjDVKf%_%pZJ7<4hb1`=1 z4V4UhBR)lb*p(9dTBB9u20yI|aERdHMpv2G$%|po( zZn724rs%lHS$`2jQtMPG0S54t^tli!v{??D6Rt~!be7vP<78%Gj2&nEVbA95y;527 z+fkGlXg(K0HX>=WGin+@&cB!eDk0@niD|jFCW75vLsT9fOV6;&zV`PjC-3cYwbgVz zc;!nLOnQ0~$T&<*r5WeN_|?|v;Ypx2K#~bY*Vc_Di2pAB-}xrJB?{l7YM`ahhSvfL zyOQL(I>c2A2HQON?6&&#Td9KU%(VCCW87}nP&)=9j3sp=BZ3#^U%r+m8Atl~h^4#x zG3(dG_~uJBe%l6fM)QnH8Pul0Xl48J3c$5jYYZNxx~MPmIB>Y-*T#UFpg8)BwIwJL z+N(x2RPmhGKb_x$?YI+(y023EHO*tTa4s{#=CVP}WjnShMF^eBhGZFeMB9ik9w=Fg zn%eNAe{JlLCVcNF2Q?9#ejVGhB#gLMmEXwr1?4jbr?$-;W|;}m(>}PT!|gs2v_i$O zM-@v=NoOu%_dJLVOVa}zA4-pvISP8Ps%jI@W^05a&@!#akQ?QSWV=2ZE1h$KhzL&P zep~y#^>dwa7mJV__$^gkk^FJRve>ubqQOZ&Zy@_@7hgtUwai}D8;Kd%$&+{32Vs_W?<`ET%g?W8-?C62ushYNr8k;6{B)^yT}NBkzMzo zforuH4l%nCPsmv%8=ziv%z@R~maNE)d)!j039wtb@+E2Yb)t^ly8lB++g_(oLM)hU zLg+wSAd1rGA%oeO4%()CeTwk7-H$xe;k)7#t*SK1yDSux#*81ypjg7EM4{=wt3r^Z zSO1qN;df5fl_KCEfKMa+oar-AT0}*{wtk(-&voFBkJ9j=#@6QO2vK*!E@FYqV5$=` zmHw3m(*Khvd?6INrUk+Ivb7obgr$@$4oE%P;W!eDsD-iM_XlRU#&XC{RNGT$mrUNWPKAuMyg4x=PQY$RMi{brKMxm^CZ+cQ<5re>2-Od3Y zX=$TTEQ8xPi9&Y7{VF-&#e(98d6#6uPnhMg8NhP#8{gUXhRo>GCu+z z9^hYidawknM?bu7+=!dPcY*u*#h000056{Ex@FjcT;4cBkma9BO28Ic)K9%-Uq zvUT@jdM=N|v?WD|z+}@}=JB4Sckk%BGf%v7UMBWIPI(s`6*>^`Dq`w>VA&B$hoTFrdf@OR^3 z8h|B;NYPPTbrjP|;|bxJq94@3%18^Grrv)wH=q4W5x%mXxUyBUGz;FJ?;g=S3sj+bo!+Vo6?Y& z{`#_Lj-yFLEk@av5-2yLd%Q-Ar%V5aEi8U1D`bEN=R3N>MGNqt}?j7v+ z+N_6-*TqW=%<;@*EiG(9F81j<-o3_)f55K@&PzfWN^6gCY6V=mYGfUkK9isL){bvS sv_Jp=00Y=e8o>Yn0GoG&MeqOs0Z~*OFaQ7m000000000000000024hx7XSbN literal 0 HcmV?d00001 diff --git a/doc/screenshot.webp b/doc/screenshot.webp new file mode 100644 index 0000000000000000000000000000000000000000..0a5d87e8a543618f43742da30f9205f30c54ef3f GIT binary patch literal 54070 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 Date: Sun, 19 Nov 2023 16:27:43 +0100 Subject: [PATCH 009/114] Add license --- doc/LICENSE.txt | 202 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 doc/LICENSE.txt diff --git a/doc/LICENSE.txt b/doc/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/doc/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -- 2.45.2 From ca0cf827b29f089d339fe1d8b804196ef272652f Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 19 Nov 2023 18:28:43 +0100 Subject: [PATCH 010/114] Improve Spanish translatoin --- .github/workflows/workflow.yml | 2 +- src/lib/i18n/index.ts | 2 +- src/lib/locales/es.json | 8 ++++---- src/lib/style/app.scss | 5 +++++ 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index e356fde..5cc31b9 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -28,7 +28,7 @@ jobs: build: needs: check-changes runs-on: ubuntu-latest - if: ${{ needs.check-changes.outputs >= 2 }} + if: ${{ needs.check-changes.outputs >= 1 }} permissions: contents: write diff --git a/src/lib/i18n/index.ts b/src/lib/i18n/index.ts index 7f85386..c920fcc 100644 --- a/src/lib/i18n/index.ts +++ b/src/lib/i18n/index.ts @@ -9,5 +9,5 @@ register('es', () => import('../locales/es.json')) init({ fallbackLocale: defaultLocale, - initialLocale: browser ? window.navigator.language : defaultLocale, + initialLocale: browser ? browser && localStorage.getItem('locale') ? localStorage.getItem('locale') : window.navigator.language : defaultLocale, }) \ No newline at end of file diff --git a/src/lib/locales/es.json b/src/lib/locales/es.json index c3958ae..72dbcea 100644 --- a/src/lib/locales/es.json +++ b/src/lib/locales/es.json @@ -28,17 +28,17 @@ "version": "Versión", "ledColor": "color del LED", "systemInfo": "Info del sistema", - "showText": "Poner texto", + "showText": "Mostrar texto", "text": "Texto", "title": "Control", - "buildTime": "Tiempo de construcción", - "hostname": "Nombre de host" + "buildTime": "Tiempo de compilación", + "hostname": "Nombre del host" }, "status": { "memoryFree": "Memoria RAM libre", "wsPriceConnection": "Conexión WebSocket Precio", "wsMempoolConnection": "Conexión WebSocket Mempool.space", - "screenCycle": "Rotacion de pantalla", + "screenCycle": "Ciclo de pantalla", "uptime": "Tiempo de funcionamiento", "fetchEuroNote": "Si utiliza \"Obtener precio en €\", la conexión de Precio WS mostrará ❌ ya que utiliza otra fuente de datos.", "title": "Estado" diff --git a/src/lib/style/app.scss b/src/lib/style/app.scss index 85cf732..4b489b7 100644 --- a/src/lib/style/app.scss +++ b/src/lib/style/app.scss @@ -185,4 +185,9 @@ nav { .card-title { margin-bottom: 0; +} + +.navbar-brand { + font-style: italic; + font-weight: 600; } \ No newline at end of file -- 2.45.2 From 3eaf897dbb6d1597ec71b4323ae0d68a02dee9c9 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 19 Nov 2023 18:31:06 +0100 Subject: [PATCH 011/114] Workflow fix --- .github/workflows/workflow.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 5cc31b9..0875a0b 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -18,7 +18,7 @@ jobs: id: changed-files uses: tj-actions/changed-files@v40.1.1 with: - files_ignore: "doc/**,README.md,Dockerfile,.*,.github/**" + files_ignore: "doc/**,README.md,Dockerfile,.*" files_ignore_separator: ',' - name: Print changed files count run: > @@ -28,7 +28,7 @@ jobs: build: needs: check-changes runs-on: ubuntu-latest - if: ${{ needs.check-changes.outputs >= 1 }} + if: ${{ needs.check-changes.outputs.all_changed_and_modified_files_count >= 1 }} permissions: contents: write -- 2.45.2 From d25284e3a47a9efe6c0a8877e8abeac098ced8af Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 19 Nov 2023 20:27:22 +0100 Subject: [PATCH 012/114] Lint and format all files --- .eslintrc.cjs | 3 + .github/workflows/workflow.yml | 14 +- .prettierignore | 2 +- README.md | 4 +- src/hooks.server.ts | 12 +- src/lib/i18n/index.ts | 20 +- src/lib/locales/en.json | 138 ++--- src/lib/locales/es.json | 138 ++--- src/lib/locales/nl.json | 136 ++--- src/lib/style/app.scss | 244 ++++----- src/routes/+layout.svelte | 26 +- src/routes/+layout.ts | 25 +- src/routes/+page.svelte | 61 ++- src/routes/Control.svelte | 190 ++++--- src/routes/Rendered.svelte | 40 +- src/routes/Settings.svelte | 221 +++++--- src/routes/Status.svelte | 240 +++++---- src/routes/api/+page.svelte | 43 +- static/swagger.json | 926 ++++++++++++++++----------------- static/swagger.yml | 66 +-- svelte.config.js | 20 +- vite.config.ts | 68 +-- 22 files changed, 1357 insertions(+), 1280 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index ebc1958..1105b14 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -18,6 +18,9 @@ module.exports = { es2017: true, node: true }, + rules: { + 'no-empty': ['error', { allowEmptyCatch: true }] + }, overrides: [ { files: ['*.svelte'], diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 0875a0b..c9512f5 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -3,7 +3,7 @@ name: BTClock WebUI CI on: [push] env: - PUBLIC_BASE_URL: "" + PUBLIC_BASE_URL: '' jobs: check-changes: @@ -12,13 +12,13 @@ jobs: all_changed_and_modified_files_count: ${{ steps.changed-files.outputs.all_changed_and_modified_files_count }} steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Get changed files count id: changed-files uses: tj-actions/changed-files@v40.1.1 with: - files_ignore: "doc/**,README.md,Dockerfile,.*" + files_ignore: 'doc/**,README.md,Dockerfile,.*' files_ignore_separator: ',' - name: Print changed files count run: > @@ -33,7 +33,7 @@ jobs: contents: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: recursive - uses: actions/setup-node@v3 @@ -71,7 +71,7 @@ jobs: - name: Create tarball run: tar czf webui.tgz --strip-components=1 dist - name: Build LittleFS - run: /tmp/mklittlefs/mklittlefs -c build_gz -s 409600 littlefs.bin + run: /tmp/mklittlefs/mklittlefs -c build_gz -s 409600 littlefs.bin - name: Upload artifacts uses: actions/upload-artifact@v3 with: @@ -84,7 +84,7 @@ jobs: tag: ${{ steps.getBlockHeight.outputs.blockHeight }} commit: main name: release-${{ steps.getBlockHeight.outputs.blockHeight }} - artifacts: "littlefs.bin,webui.tgz" + artifacts: 'littlefs.bin,webui.tgz' allowUpdates: true removeArtifacts: true - makeLatest: true \ No newline at end of file + makeLatest: true diff --git a/.prettierignore b/.prettierignore index 297772e..96ca2e4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -8,7 +8,7 @@ node_modules !.env.example dist/ build_gz - +dist/** # Ignore files for PNPM, NPM and YARN pnpm-lock.yaml diff --git a/README.md b/README.md index e93e964..805bfa1 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ To upload the firmware to the BTClock, you need to GZIP all the files. You can u Then you can make a `LittleFS.bin` with mklittlefs: ```bash -mklittlefs -c build_gz -s 409600 littlefs.bin +mklittlefs -c build_gz -s 409600 littlefs.bin ``` -You can preview the production build with `yarn preview`. \ No newline at end of file +You can preview the production build with `yarn preview`. diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 2c6aa97..1f9b93e 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,10 +1,10 @@ -import type { Handle } from '@sveltejs/kit' -import { locale } from 'svelte-i18n' +import type { Handle } from '@sveltejs/kit'; +import { locale } from 'svelte-i18n'; export const handle: Handle = async ({ event, resolve }) => { - const lang = event.request.headers.get('accept-language')?.split(',')[0] + const lang = event.request.headers.get('accept-language')?.split(',')[0]; if (lang) { - locale.set(lang) + locale.set(lang); } - return resolve(event) -} \ No newline at end of file + return resolve(event); +}; diff --git a/src/lib/i18n/index.ts b/src/lib/i18n/index.ts index c920fcc..492de13 100644 --- a/src/lib/i18n/index.ts +++ b/src/lib/i18n/index.ts @@ -1,13 +1,17 @@ -import { browser } from '$app/environment' -import { init, register } from 'svelte-i18n' +import { browser } from '$app/environment'; +import { init, register } from 'svelte-i18n'; -const defaultLocale = 'en' +const defaultLocale = 'en'; -register('en', () => import('../locales/en.json')) -register('nl', () => import('../locales/nl.json')) -register('es', () => import('../locales/es.json')) +register('en', () => import('../locales/en.json')); +register('nl', () => import('../locales/nl.json')); +register('es', () => import('../locales/es.json')); init({ fallbackLocale: defaultLocale, - initialLocale: browser ? browser && localStorage.getItem('locale') ? localStorage.getItem('locale') : window.navigator.language : defaultLocale, -}) \ No newline at end of file + initialLocale: browser + ? browser && localStorage.getItem('locale') + ? localStorage.getItem('locale') + : window.navigator.language + : defaultLocale +}); diff --git a/src/lib/locales/en.json b/src/lib/locales/en.json index d634291..7521b3a 100644 --- a/src/lib/locales/en.json +++ b/src/lib/locales/en.json @@ -1,71 +1,71 @@ { - "section": { - "settings": { - "title": "Settings", - "textColor": "Text color", - "backgroundColor": "Background color", - "ledPowerOnTest": "LED power-on test", - "ledFlashOnBlock": "LED flash on new block", - "timePerScreen": "Time per screen", - "ledBrightness": "LED brightness", - "timezoneOffset": "Timezone offset", - "timeBetweenPriceUpdates": "Time between price updates", - "fullRefreshEvery": "Full refresh every", - "mempoolnstance": "Mempool Instance", - "hostnamePrefix": "Hostname prefix", - "StealFocusOnNewBlock": "Steal focus on new block", - "useBigCharsMcap": "Use big characters for market cap", - "otaUpdates": "OTA updates", - "enableMdns": "mDNS", - "fetchEuroPrice": "Fetch € price", - "shortAmountsWarning": "Short amounts might shorten lifespan.", - "tzOffsetHelpText": "A restart is required to apply TZ offset.", - "screens": "Screens" - }, - "control": { - "systemInfo": "System info", - "version": "Version", - "buildTime": "Build time", - "ledColor": "LED color", - "turnOff": "Turn off", - "setColor": "Set color", - "showText": "Show text", - "text": "Text", - "title": "Control", - "hostname": "Hostname" - }, - "status": { - "title": "Status", - "screenCycle": "Screen cycle", - "memoryFree": "Memory free", - "wsPriceConnection": "WS Price connection", - "wsMempoolConnection": "WS Mempool.space connection", - "fetchEuroNote": "If you use \"Fetch € price\" the WS Price connection will show ❌ since it uses another data source.", - "uptime": "Uptime" - } - }, - "colors": { - "black": "Black", - "white": "White" - }, - "time": { - "minutes": "minutes", - "seconds": "seconds" - }, - "restartRequired": "restart required", - "button": { - "save": "Save", - "reset": "Reset", - "restart": "Restart", - "forceFullRefresh": "Force full refresh" - }, - "timer": { - "running": "running", - "stopped": "stopped" - }, - "sections": { - "control": { - "keepSameColor": "Keep same color" - } - } + "section": { + "settings": { + "title": "Settings", + "textColor": "Text color", + "backgroundColor": "Background color", + "ledPowerOnTest": "LED power-on test", + "ledFlashOnBlock": "LED flash on new block", + "timePerScreen": "Time per screen", + "ledBrightness": "LED brightness", + "timezoneOffset": "Timezone offset", + "timeBetweenPriceUpdates": "Time between price updates", + "fullRefreshEvery": "Full refresh every", + "mempoolnstance": "Mempool Instance", + "hostnamePrefix": "Hostname prefix", + "StealFocusOnNewBlock": "Steal focus on new block", + "useBigCharsMcap": "Use big characters for market cap", + "otaUpdates": "OTA updates", + "enableMdns": "mDNS", + "fetchEuroPrice": "Fetch € price", + "shortAmountsWarning": "Short amounts might shorten lifespan.", + "tzOffsetHelpText": "A restart is required to apply TZ offset.", + "screens": "Screens" + }, + "control": { + "systemInfo": "System info", + "version": "Version", + "buildTime": "Build time", + "ledColor": "LED color", + "turnOff": "Turn off", + "setColor": "Set color", + "showText": "Show text", + "text": "Text", + "title": "Control", + "hostname": "Hostname" + }, + "status": { + "title": "Status", + "screenCycle": "Screen cycle", + "memoryFree": "Memory free", + "wsPriceConnection": "WS Price connection", + "wsMempoolConnection": "WS Mempool.space connection", + "fetchEuroNote": "If you use \"Fetch € price\" the WS Price connection will show ❌ since it uses another data source.", + "uptime": "Uptime" + } + }, + "colors": { + "black": "Black", + "white": "White" + }, + "time": { + "minutes": "minutes", + "seconds": "seconds" + }, + "restartRequired": "restart required", + "button": { + "save": "Save", + "reset": "Reset", + "restart": "Restart", + "forceFullRefresh": "Force full refresh" + }, + "timer": { + "running": "running", + "stopped": "stopped" + }, + "sections": { + "control": { + "keepSameColor": "Keep same color" + } + } } diff --git a/src/lib/locales/es.json b/src/lib/locales/es.json index 72dbcea..fb6e7bc 100644 --- a/src/lib/locales/es.json +++ b/src/lib/locales/es.json @@ -1,71 +1,71 @@ { - "section": { - "settings": { - "title": "Configuración", - "textColor": "Color de texto", - "backgroundColor": "Color de fondo", - "ledBrightness": "Brillo LED", - "screens": "Pantallas", - "shortAmountsWarning": "Cantidades pequeñas pueden acortar la vida útil.", - "fullRefreshEvery": "Actualización completa cada", - "timePerScreen": "Tiempo por pantalla", - "tzOffsetHelpText": "Es necesario reiniciar para aplicar la compensación.", - "timezoneOffset": "Compensación de zona horaria", - "StealFocusOnNewBlock": "Presta atención al nuevo bloque", - "ledFlashOnBlock": "El LED parpadea con un bloque nuevo", - "useBigCharsMcap": "Utilice caracteres grandes para la market cap", - "fetchEuroPrice": "Obtener precio en €", - "timeBetweenPriceUpdates": "Tiempo entre actualizaciones de precios", - "ledPowerOnTest": "Prueba de encendido del LED", - "enableMdns": "mDNS", - "hostnamePrefix": "Prefijo de nombre de host", - "mempoolnstance": "Instancia de Mempool", - "otaUpdates": "Actualización por aire" - }, - "control": { - "turnOff": "Apagar", - "setColor": "Establecer el color", - "version": "Versión", - "ledColor": "color del LED", - "systemInfo": "Info del sistema", - "showText": "Mostrar texto", - "text": "Texto", - "title": "Control", - "buildTime": "Tiempo de compilación", - "hostname": "Nombre del host" - }, - "status": { - "memoryFree": "Memoria RAM libre", - "wsPriceConnection": "Conexión WebSocket Precio", - "wsMempoolConnection": "Conexión WebSocket Mempool.space", - "screenCycle": "Ciclo de pantalla", - "uptime": "Tiempo de funcionamiento", - "fetchEuroNote": "Si utiliza \"Obtener precio en €\", la conexión de Precio WS mostrará ❌ ya que utiliza otra fuente de datos.", - "title": "Estado" - } - }, - "button": { - "save": "Guardar", - "reset": "Restaurar", - "restart": "Reiniciar", - "forceFullRefresh": "Forzar refresco" - }, - "colors": { - "black": "Negro", - "white": "Blanco" - }, - "restartRequired": "reinicio requerido", - "time": { - "minutes": "minutos", - "seconds": "segundos" - }, - "timer": { - "running": "funcionando", - "stopped": "detenido" - }, - "sections": { - "control": { - "keepSameColor": "Mantén el mismo color" - } - } + "section": { + "settings": { + "title": "Configuración", + "textColor": "Color de texto", + "backgroundColor": "Color de fondo", + "ledBrightness": "Brillo LED", + "screens": "Pantallas", + "shortAmountsWarning": "Cantidades pequeñas pueden acortar la vida útil.", + "fullRefreshEvery": "Actualización completa cada", + "timePerScreen": "Tiempo por pantalla", + "tzOffsetHelpText": "Es necesario reiniciar para aplicar la compensación.", + "timezoneOffset": "Compensación de zona horaria", + "StealFocusOnNewBlock": "Presta atención al nuevo bloque", + "ledFlashOnBlock": "El LED parpadea con un bloque nuevo", + "useBigCharsMcap": "Utilice caracteres grandes para la market cap", + "fetchEuroPrice": "Obtener precio en €", + "timeBetweenPriceUpdates": "Tiempo entre actualizaciones de precios", + "ledPowerOnTest": "Prueba de encendido del LED", + "enableMdns": "mDNS", + "hostnamePrefix": "Prefijo de nombre de host", + "mempoolnstance": "Instancia de Mempool", + "otaUpdates": "Actualización por aire" + }, + "control": { + "turnOff": "Apagar", + "setColor": "Establecer el color", + "version": "Versión", + "ledColor": "color del LED", + "systemInfo": "Info del sistema", + "showText": "Mostrar texto", + "text": "Texto", + "title": "Control", + "buildTime": "Tiempo de compilación", + "hostname": "Nombre del host" + }, + "status": { + "memoryFree": "Memoria RAM libre", + "wsPriceConnection": "Conexión WebSocket Precio", + "wsMempoolConnection": "Conexión WebSocket Mempool.space", + "screenCycle": "Ciclo de pantalla", + "uptime": "Tiempo de funcionamiento", + "fetchEuroNote": "Si utiliza \"Obtener precio en €\", la conexión de Precio WS mostrará ❌ ya que utiliza otra fuente de datos.", + "title": "Estado" + } + }, + "button": { + "save": "Guardar", + "reset": "Restaurar", + "restart": "Reiniciar", + "forceFullRefresh": "Forzar refresco" + }, + "colors": { + "black": "Negro", + "white": "Blanco" + }, + "restartRequired": "reinicio requerido", + "time": { + "minutes": "minutos", + "seconds": "segundos" + }, + "timer": { + "running": "funcionando", + "stopped": "detenido" + }, + "sections": { + "control": { + "keepSameColor": "Mantén el mismo color" + } + } } diff --git a/src/lib/locales/nl.json b/src/lib/locales/nl.json index 24c2396..77e4ad6 100644 --- a/src/lib/locales/nl.json +++ b/src/lib/locales/nl.json @@ -1,70 +1,70 @@ { - "section": { - "settings": { - "title": "Instellingen", - "textColor": "Tekstkleur", - "backgroundColor": "Achtergrondkleur", - "timeBetweenPriceUpdates": "Tijd tussen prijs updates", - "timezoneOffset": "Tijdzone afwijking", - "ledBrightness": "LED helderheid", - "timePerScreen": "Tijd per scherm", - "fullRefreshEvery": "Volledig verversen elke", - "shortAmountsWarning": "Lage waardes verkorten levensduur", - "tzOffsetHelpText": "Herstart nodig voor toepassen afwijking.", - "enableMdns": "mDNS", - "ledPowerOnTest": "LED test bij aanzetten", - "StealFocusOnNewBlock": "Pak aandacht bij nieuw blok", - "ledFlashOnBlock": "Knipper led bij nieuw blok", - "useBigCharsMcap": "Gebruik grote tekens bij market cap", - "fetchEuroPrice": "Toon € prijs", - "screens": "Schermen", - "hostnamePrefix": "Hostnaam voorvoegsel", - "mempoolnstance": "Mempool instantie", - "otaUpdates": "OTA updates" - }, - "control": { - "systemInfo": "Systeeminformatie", - "version": "Versie", - "buildTime": "Bouwtijd", - "setColor": "Kleur instellen", - "turnOff": "Uitzetten", - "ledColor": "LED kleur", - "showText": "Toon tekst", - "text": "Tekst", - "title": "Besturing" - }, - "status": { - "title": "Status", - "memoryFree": "Geheugen vrij", - "screenCycle": "Scherm cyclus", - "wsPriceConnection": "WS Prijs verbinding", - "wsMempoolConnection": "WS Mempool.space verbinding", - "fetchEuroNote": "Wanneer je \"Toon € prijs\" aanzet, zal de prijsverbinding als ❌ verbroken getoond worden vanwege het gebruik van een andere bron.", - "uptime": "Uptime" - } - }, - "colors": { - "black": "Zwart", - "white": "Wit" - }, - "time": { - "minutes": "minuten", - "seconds": "seconden" - }, - "restartRequired": "herstart nodig", - "button": { - "save": "Opslaan", - "reset": "Herstel", - "restart": "Herstart", - "forceFullRefresh": "Forceer scherm verversen" - }, - "timer": { - "running": "actief", - "stopped": "gestopt" - }, - "sections": { - "control": { - "keepSameColor": "Behoud zelfde kleur" - } - } + "section": { + "settings": { + "title": "Instellingen", + "textColor": "Tekstkleur", + "backgroundColor": "Achtergrondkleur", + "timeBetweenPriceUpdates": "Tijd tussen prijs updates", + "timezoneOffset": "Tijdzone afwijking", + "ledBrightness": "LED helderheid", + "timePerScreen": "Tijd per scherm", + "fullRefreshEvery": "Volledig verversen elke", + "shortAmountsWarning": "Lage waardes verkorten levensduur", + "tzOffsetHelpText": "Herstart nodig voor toepassen afwijking.", + "enableMdns": "mDNS", + "ledPowerOnTest": "LED test bij aanzetten", + "StealFocusOnNewBlock": "Pak aandacht bij nieuw blok", + "ledFlashOnBlock": "Knipper led bij nieuw blok", + "useBigCharsMcap": "Gebruik grote tekens bij market cap", + "fetchEuroPrice": "Toon € prijs", + "screens": "Schermen", + "hostnamePrefix": "Hostnaam voorvoegsel", + "mempoolnstance": "Mempool instantie", + "otaUpdates": "OTA updates" + }, + "control": { + "systemInfo": "Systeeminformatie", + "version": "Versie", + "buildTime": "Bouwtijd", + "setColor": "Kleur instellen", + "turnOff": "Uitzetten", + "ledColor": "LED kleur", + "showText": "Toon tekst", + "text": "Tekst", + "title": "Besturing" + }, + "status": { + "title": "Status", + "memoryFree": "Geheugen vrij", + "screenCycle": "Scherm cyclus", + "wsPriceConnection": "WS Prijs verbinding", + "wsMempoolConnection": "WS Mempool.space verbinding", + "fetchEuroNote": "Wanneer je \"Toon € prijs\" aanzet, zal de prijsverbinding als ❌ verbroken getoond worden vanwege het gebruik van een andere bron.", + "uptime": "Uptime" + } + }, + "colors": { + "black": "Zwart", + "white": "Wit" + }, + "time": { + "minutes": "minuten", + "seconds": "seconden" + }, + "restartRequired": "herstart nodig", + "button": { + "save": "Opslaan", + "reset": "Herstel", + "restart": "Herstart", + "forceFullRefresh": "Forceer scherm verversen" + }, + "timer": { + "running": "actief", + "stopped": "gestopt" + }, + "sections": { + "control": { + "keepSameColor": "Behoud zelfde kleur" + } + } } diff --git a/src/lib/style/app.scss b/src/lib/style/app.scss index 4b489b7..5adf8b8 100644 --- a/src/lib/style/app.scss +++ b/src/lib/style/app.scss @@ -1,193 +1,197 @@ -@import "../node_modules/bootstrap/scss/functions"; -@import "../node_modules/bootstrap/scss/variables"; -@import "../node_modules/bootstrap/scss/variables-dark"; +@import '../node_modules/bootstrap/scss/functions'; +@import '../node_modules/bootstrap/scss/variables'; +@import '../node_modules/bootstrap/scss/variables-dark'; //@import "@fontsource/antonio/latin-400.css"; -@import "@fontsource/ubuntu/latin-400.css"; -@import "@fontsource/oswald/latin-400.css"; +@import '@fontsource/ubuntu/latin-400.css'; +@import '@fontsource/oswald/latin-400.css'; $form-range-track-bg: #fff; $color-mode-type: media-query; -$font-family-base: "Ubuntu"; +$font-family-base: 'Ubuntu'; $font-size-base: 0.9rem; //$font-size-sm: $font-size-base * .875 !default; //$form-label-font-size: $font-size-base * .575 !default; //$input-btn-font-size-sm: 0.4rem; //$form-label-font-size: 0.4rem; -$input-font-size-sm: $font-size-base * .875; +$input-font-size-sm: $font-size-base * 0.875; // $border-radius: .675rem; -@import "../node_modules/bootstrap/scss/mixins"; -@import "../node_modules/bootstrap/scss/maps"; -@import "../node_modules/bootstrap/scss/utilities"; +@import '../node_modules/bootstrap/scss/mixins'; +@import '../node_modules/bootstrap/scss/maps'; +@import '../node_modules/bootstrap/scss/utilities'; -@import "../node_modules/bootstrap/scss/root"; -@import "../node_modules/bootstrap/scss/reboot"; -@import "../node_modules/bootstrap/scss/type"; -@import "../node_modules/bootstrap/scss/containers"; -@import "../node_modules/bootstrap/scss/grid"; -@import "../node_modules/bootstrap/scss/forms"; -@import "../node_modules/bootstrap/scss/buttons"; -@import "../node_modules/bootstrap/scss/button-group"; -@import "../node_modules/bootstrap/scss/pagination"; +@import '../node_modules/bootstrap/scss/root'; +@import '../node_modules/bootstrap/scss/reboot'; +@import '../node_modules/bootstrap/scss/type'; +@import '../node_modules/bootstrap/scss/containers'; +@import '../node_modules/bootstrap/scss/grid'; +@import '../node_modules/bootstrap/scss/forms'; +@import '../node_modules/bootstrap/scss/buttons'; +@import '../node_modules/bootstrap/scss/button-group'; +@import '../node_modules/bootstrap/scss/pagination'; -@import "../node_modules/bootstrap/scss/dropdown"; +@import '../node_modules/bootstrap/scss/dropdown'; -@import "../node_modules/bootstrap/scss/navbar"; -@import "../node_modules/bootstrap/scss/nav"; -@import "../node_modules/bootstrap/scss/card"; -@import "../node_modules/bootstrap/scss/progress"; +@import '../node_modules/bootstrap/scss/navbar'; +@import '../node_modules/bootstrap/scss/nav'; +@import '../node_modules/bootstrap/scss/card'; +@import '../node_modules/bootstrap/scss/progress'; -@import "../node_modules/bootstrap/scss/helpers"; -@import "../node_modules/bootstrap/scss/utilities/api"; +@import '../node_modules/bootstrap/scss/helpers'; +@import '../node_modules/bootstrap/scss/utilities/api'; @include media-breakpoint-down(xl) { - html { - font-size: 85%; - } + html { + font-size: 85%; + } - button.btn, - input[type="button"].btn, - input[type="submit"].btn, - input[type="reset"].btn { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $font-size-sm, $btn-border-radius-sm); - } + button.btn, + input[type='button'].btn, + input[type='submit'].btn, + input[type='reset'].btn { + @include button-size( + $btn-padding-y-sm, + $btn-padding-x-sm, + $font-size-sm, + $btn-border-radius-sm + ); + } } @include media-breakpoint-down(lg) { - html { - font-size: 75%; - } + html { + font-size: 75%; + } } - nav { - margin-bottom: 15px; + margin-bottom: 15px; } .splitText div:first-child::after { - display: block; - content: ''; - margin-top: 0px; - border-bottom: 2px solid; - margin-bottom: 3px; + display: block; + content: ''; + margin-top: 0px; + border-bottom: 2px solid; + margin-bottom: 3px; } #btcclock-wrapper { - margin: 0 auto; + margin: 0 auto; } .btclock { - border: 1px solid darkgray; - background: #000; - border-radius: 5px; - padding: 10px; - max-width: 700px; - margin: 0 auto; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - justify-content: space-between; - align-items: center; - align-content: stretch; - font-family: 'Oswald', sans-serif; + border: 1px solid darkgray; + background: #000; + border-radius: 5px; + padding: 10px; + max-width: 700px; + margin: 0 auto; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + align-items: center; + align-content: stretch; + font-family: 'Oswald', sans-serif; - >div { - padding: 5px; - } + > div { + padding: 5px; + } - .digit, - .splitText, - .mediumText { - border: 2px solid gold; - border-radius: 8px; + .digit, + .splitText, + .mediumText { + border: 2px solid gold; + border-radius: 8px; - @include media-breakpoint-up(sm) { - min-width: 10px; - } + @include media-breakpoint-up(sm) { + min-width: 10px; + } - @include media-breakpoint-up(xxl) { - min-width: 70px; - } + @include media-breakpoint-up(xxl) { + min-width: 70px; + } - text-align: center; - color: #fff; - } + text-align: center; + color: #fff; + } } -.darkMode .btclock>div { - color: #fff; - border-color: #fff; +.darkMode .btclock > div { + color: #fff; + border-color: #fff; } -.lightMode .btclock>div { - background: #fff; +.lightMode .btclock > div { + background: #fff; } -.lightMode .btclock>div { - color: #000; +.lightMode .btclock > div { + color: #000; } -.darkMode .btclock>div { - background: #000; +.darkMode .btclock > div { + background: #000; } .splitText { - @include media-breakpoint-up(sm) { - font-size: 1.0rem; - padding-top: 8px !important; - padding-bottom: 9px !important; - } - @include media-breakpoint-up(xxl) { - font-size: 1.8rem; - padding-top: 19px !important; - padding-bottom: 20px !important; - } + @include media-breakpoint-up(sm) { + font-size: 1rem; + padding-top: 8px !important; + padding-bottom: 9px !important; + } + @include media-breakpoint-up(xxl) { + font-size: 1.8rem; + padding-top: 19px !important; + padding-bottom: 20px !important; + } - text-align: center; + text-align: center; } .mediumText { - font-size: 3rem; - padding-left: 5px; - padding-right: 5px; - padding-top: 20px !important; - padding-bottom: 20px !important; + font-size: 3rem; + padding-left: 5px; + padding-right: 5px; + padding-top: 20px !important; + padding-bottom: 20px !important; } .digit { - font-size: 5rem; - @include media-breakpoint-up(sm) { - font-size: 2.5rem; - } - @include media-breakpoint-up(xxl) { - font-size: 5rem; - } - padding-left: 10px; - padding-right: 10px; + font-size: 5rem; + @include media-breakpoint-up(sm) { + font-size: 2.5rem; + } + @include media-breakpoint-up(xxl) { + font-size: 5rem; + } + padding-left: 10px; + padding-right: 10px; } .digit-blank { - content: "abc"; + content: 'abc'; } #customText { - text-transform: uppercase; + text-transform: uppercase; } .system_info { - padding: 0; + padding: 0; - li { - list-style: none; - } + li { + list-style: none; + } } .card-title { - margin-bottom: 0; + margin-bottom: 0; } .navbar-brand { - font-style: italic; - font-weight: 600; -} \ No newline at end of file + font-style: italic; + font-weight: 600; +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index b7f1a34..9160c21 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,21 +1,19 @@ @@ -65,7 +64,7 @@ - + diff --git a/src/routes/Control.svelte b/src/routes/Control.svelte index 23b13c3..6bdd1cb 100644 --- a/src/routes/Control.svelte +++ b/src/routes/Control.svelte @@ -1,82 +1,78 @@ @@ -87,48 +83,72 @@ onDestroy(firstLedDataSubscription);
- + - + - - +

LEDs

-
+ - + {#if ledStatus} - {#each ledStatus as led, i } - - - - {/each} + {#each ledStatus as led, i} + + + + {/each} {/if} - + - - + +

-

{ $_('section.control.systemInfo') }

+

{$_('section.control.systemInfo')}

    -
  • { $_('section.control.version') }: {$settings.gitRev}
  • -
  • { $_('section.control.buildTime') }: {new Date(($settings.lastBuildTime * 1000)).toLocaleString()}
  • +
  • {$_('section.control.version')}: {$settings.gitRev}
  • +
  • + {$_('section.control.buildTime')}: {new Date( + $settings.lastBuildTime * 1000 + ).toLocaleString()} +
  • IP: {$settings.ip}
  • -
  • { $_('section.control.hostname') }: {$settings.hostname}
  • +
  • {$_('section.control.hostname')}: {$settings.hostname}
- - + +
diff --git a/src/routes/Rendered.svelte b/src/routes/Rendered.svelte index 0003cbf..c763d4a 100644 --- a/src/routes/Rendered.svelte +++ b/src/routes/Rendered.svelte @@ -1,25 +1,25 @@
-
- {#each status.data as char} - {#if isSplitText(char)} -
- {#each char.split("/") as part} -
{part}
- {/each} -
- {:else if char.length === 0 || char === " "} -
  
- {:else} -
{char}
- {/if} - {/each} -
-
\ No newline at end of file +
+ {#each status.data as char} + {#if isSplitText(char)} +
+ {#each char.split('/') as part} +
{part}
+ {/each} +
+ {:else if char.length === 0 || char === ' '} +
  
+ {:else} +
{char}
+ {/if} + {/each} +
+ diff --git a/src/routes/Settings.svelte b/src/routes/Settings.svelte index 994548a..3ee8f67 100644 --- a/src/routes/Settings.svelte +++ b/src/routes/Settings.svelte @@ -1,46 +1,41 @@ @@ -51,7 +46,9 @@
- + - - + + - + - - + + - + - { $_('time.minutes') } + {$_('time.minutes')} - + - { $_('time.minutes') } + {$_('time.minutes')} - + - { $_('time.seconds') } + {$_('time.seconds')} - { $_('section.settings.shortAmountsWarning') } + {$_('section.settings.shortAmountsWarning')} - + - { $_('time.minutes') } + {$_('time.minutes')} - { $_('section.settings.tzOffsetHelpText') } + {$_('section.settings.tzOffsetHelpText')} - + - - + + - + > - - + + - + > + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - -

{ $_('section.settings.screens') }

- {#if $settings.screens} - {#each $settings.screens as s} - - - - {/each} - {/if} -
- - + +

{$_('section.settings.screens')}

+ {#if $settings.screens} + {#each $settings.screens as s} + + + + {/each} + {/if} +
+ +
diff --git a/src/routes/Status.svelte b/src/routes/Status.svelte index 3195ad8..aea9255 100644 --- a/src/routes/Status.svelte +++ b/src/routes/Status.svelte @@ -1,65 +1,71 @@ @@ -68,64 +74,86 @@ {$_('section.status.title', { default: 'Status' })} - {#if $settings.screens} -
- - {#each $settings.screens as s} - - {/each} - -
-
- {#if $status.data} -
- -
- { $_('section.status.screenCycle') }:
{#if $status.timerRunning}⏵ { $_('timer.running') }{:else}⏸ { $_('timer.stopped') }{/if} - {/if} - {/if} -
- - {#if $status.leds} - {#each $status.leds as led} - - - - {/each} - {/if} - -
- { memoryFreePercent }% -
-
{ $_('section.status.memoryFree') }
-
{ Math.round($status.espFreeHeap / 1024) } / { Math.round($status.espHeapSize / 1024) } KiB
-
-
- { $_('section.status.uptime') }: {toUptimeString($status.espUptime)} -
-

- { $_('section.status.wsPriceConnection') }: - - {#if $status.connectionStatus && $status.connectionStatus.price} - ✅ - {:else} - ❌ - {/if} - - - - { $_('section.status.wsMempoolConnection') }: - - {#if $status.connectionStatus && $status.connectionStatus.blocks} - ✅ - {:else} - ❌ - {/if} -
- {#if $settings.fetchEurPrice} - { $_('section.status.fetchEuroNote') } - {/if} -

- - - + {#if $settings.screens} +
+ + {#each $settings.screens as s} + + {/each} + +
+
+ {#if $status.data} +
+ +
+ {$_('section.status.screenCycle')}: + {#if $status.timerRunning}⏵ {$_('timer.running')}{:else}⏸ {$_( + 'timer.stopped' + )}{/if} + {/if} + {/if} +
+ + {#if $status.leds} + {#each $status.leds as led} + + + + {/each} + {/if} + +
+ {memoryFreePercent}% +
+
{$_('section.status.memoryFree')}
+
+ {Math.round($status.espFreeHeap / 1024)} / {Math.round($status.espHeapSize / 1024)} KiB +
+
+
+ {$_('section.status.uptime')}: {toUptimestring($status.espUptime)} +
+

+ {$_('section.status.wsPriceConnection')}: + + {#if $status.connectionStatus && $status.connectionStatus.price} + ✅ + {:else} + ❌ + {/if} + + - + {$_('section.status.wsMempoolConnection')}: + + {#if $status.connectionStatus && $status.connectionStatus.blocks} + ✅ + {:else} + ❌ + {/if} +
+ {#if $settings.fetchEurPrice} + {$_('section.status.fetchEuroNote')} + {/if} +

+ + diff --git a/src/routes/api/+page.svelte b/src/routes/api/+page.svelte index cb11cd6..70ef4b3 100644 --- a/src/routes/api/+page.svelte +++ b/src/routes/api/+page.svelte @@ -1,36 +1,31 @@ @@ -54,11 +49,9 @@ crossorigin="anonymous" referrerpolicy="no-referrer" /> - -
+
- diff --git a/static/swagger.json b/static/swagger.json index a1ef68a..76b6918 100644 --- a/static/swagger.json +++ b/static/swagger.json @@ -1,480 +1,448 @@ { - "openapi": "3.0.3", - "info": { - "title": "BTClock API", - "version": "3.0", - "description": "BTClock V3 API" - }, - "servers": [ - { - "url": "/api/" - } - ], - "paths": { - "/status": { - "get": { - "tags": [ - "system" - ], - "summary": "Get current status", - "responses": { - "200": { - "description": "successful operation" - } - } - } - }, - "/system_status": { - "get": { - "tags": [ - "system" - ], - "summary": "Get system status", - "responses": { - "200": { - "description": "successful operation" - } - } - } - }, - "/settings": { - "get": { - "tags": [ - "system" - ], - "summary": "Get current settings", - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": null - } - } - } - } - } - }, - "post": { - "tags": [ - "system" - ], - "summary": "Save current settings", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Settings" - } - } - } - }, - "responses": { - "200": { - "description": "successful operation" - } - } - }, - "patch": { - "tags": [ - "system" - ], - "summary": "Save current settings", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Settings" - } - } - } - }, - "responses": { - "200": { - "description": "successful operation" - } - } - } - }, - "/action/pause": { - "get": { - "tags": [ - "timer" - ], - "summary": "Pause screen rotation", - "responses": { - "200": { - "description": "successful operation" - } - } - } - }, - "/action/timer_restart": { - "get": { - "tags": [ - "timer" - ], - "summary": "Restart screen rotation", - "responses": { - "200": { - "description": "successful operation" - } - } - } - }, - "/show/screen/{id}": { - "get": { - "tags": [ - "screens" - ], - "summary": "Set screen to show", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer", - "default": 1 - }, - "required": true, - "description": "ID of screen to show" - } - ], - "responses": { - "200": { - "description": "successful operation" - } - } - } - }, - "/show/text/{text}": { - "get": { - "tags": [ - "screens" - ], - "summary": "Set text to show", - "parameters": [ - { - "in": "path", - "name": "text", - "schema": { - "type": "string", - "default": "text" - }, - "required": true, - "description": "Text to show" - } - ], - "responses": { - "200": { - "description": "successful operation" - } - } - } - }, - "/show/custom": { - "post": { - "tags": [ - "screens" - ], - "summary": "Set text to show (advanced)", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CustomText" - } - } - } - }, - "responses": { - "200": { - "description": "successful operation" - } - } - } - }, - "/full_refresh": { - "get": { - "tags": [ - "system" - ], - "summary": "Force full refresh of all displays", - "responses": { - "200": { - "description": "successful operation" - } - } - } - }, - "/lights": { - "get": { - "tags": [ - "lights" - ], - "summary": "Get LEDs status", - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ArrayOfLeds" - } - } - } - } - } - }, - "patch": { - "tags": [ - "lights" - ], - "summary": "Set individual LEDs", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ArrayOfLedsInput" - } - } - } - }, - "responses": { - "200": { - "description": "succesful operation" - }, - "400": { - "description": "invalid colors or wrong amount of LEDs" - } - } - } - }, - "/lights/{color}": { - "get": { - "tags": [ - "lights" - ], - "summary": "Turn on LEDs with specific color", - "parameters": [ - { - "in": "path", - "name": "color", - "schema": { - "type": "string", - "default": "FFCC00" - }, - "required": true, - "description": "Color in RGB hex" - } - ], - "responses": { - "200": { - "description": "successful operation" - } - } - } - }, - "/lights/off": { - "get": { - "tags": [ - "lights" - ], - "summary": "Turn LEDs off", - "responses": { - "200": { - "description": "successful operation" - } - } - } - }, - "/restart": { - "get": { - "tags": [ - "system" - ], - "summary": "Restart BTClock", - "responses": { - "200": { - "description": "successful operation" - } - } - } - } - }, - "components": { - "schemas": { - "RgbColorValues": { - "type": "object", - "properties": { - "red": { - "type": "integer", - "minimum": 0, - "maximum": 255, - "example": 255 - }, - "green": { - "type": "integer", - "minimum": 0, - "maximum": 255, - "example": 204 - }, - "blue": { - "type": "integer", - "minimum": 0, - "maximum": 255, - "example": 0 - } - } - }, - "RgbColorHex": { - "type": "object", - "properties": { - "hex": { - "type": "string", - "pattern": "^#(?:[0-9a-fA-F]{3}){1,2}$", - "example": "#FFCC00" - } - } - }, - "RgbColorValueAndHex": { - "allOf": [ - { - "$ref": "#/components/schemas/RgbColorValues" - }, - { - "$ref": "#/components/schemas/RgbColorHex" - } - ] - }, - "RgbColorValueOrHex": { - "oneOf": [ - { - "$ref": "#/components/schemas/RgbColorValues" - }, - { - "$ref": "#/components/schemas/RgbColorHex" - } - ] - }, - "ArrayOfLeds": { - "type": "array", - "items": { - "$ref": "#/components/schemas/RgbColorValueAndHex" - } - }, - "ArrayOfLedsInput": { - "type": "array", - "items": { - "$ref": "#/components/schemas/RgbColorValueOrHex" - } - }, - "Settings": { - "type": "object", - "properties": { - "fetchEurPrice": { - "type": "boolean", - "description": "Fetch EUR price instead of USD" - }, - "fgColor": { - "type": "string", - "default": 16777215, - "description": "ePaper foreground (text) color" - }, - "bgColor": { - "type": "string", - "default": 0, - "description": "ePaper background color" - }, - "ledTestOnPower": { - "type": "boolean", - "default": true, - "description": "Do LED test on power-on" - }, - "ledFlashOnUpd": { - "type": "boolean", - "default": false, - "description": "Flash LEDs on new block" - }, - "mdnsEnabled": { - "type": "boolean", - "default": true, - "description": "Enable mDNS" - }, - "otaEnabled": { - "type": "boolean", - "default": true, - "description": "Enable over-the-air updates" - }, - "stealFocus": { - "type": "boolean", - "default": false, - "description": "Steal focus on new block" - }, - "mcapBigChar": { - "type": "boolean", - "default": false, - "description": "Use big characters for market cap screen" - }, - "mempoolInstance": { - "type": "string", - "default": "mempool.space", - "description": "Mempool.space instance to connect to" - }, - "ledBrightness": { - "type": "integer", - "default": 128, - "description": "Brightness of LEDs" - }, - "fullRefreshMin": { - "type": "integer", - "default": 60, - "description": "Full refresh time of ePaper displays in minutes" - }, - "screen[0]": { - "type": "boolean" - }, - "screen[1]": { - "type": "boolean" - }, - "screen[2]": { - "type": "boolean" - }, - "screen[3]": { - "type": "boolean" - }, - "screen[4]": { - "type": "boolean" - }, - "screen[5]": { - "type": "boolean" - }, - "tzOffset": { - "type": "integer", - "default": 60, - "description": "Timezone offset in minutes" - }, - "minSecPriceUpd": { - "type": "integer", - "default": 30, - "description": "Minimum time between price updates in seconds" - }, - "timePerScreen": { - "type": "integer", - "default": 30, - "description": "Time between screens when rotating in minutes" - } - } - }, - "CustomText": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 7, - "maxItems": 7 - } - } - } -} \ No newline at end of file + "openapi": "3.0.3", + "info": { + "title": "BTClock API", + "version": "3.0", + "description": "BTClock V3 API" + }, + "servers": [ + { + "url": "/api/" + } + ], + "paths": { + "/status": { + "get": { + "tags": ["system"], + "summary": "Get current status", + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/system_status": { + "get": { + "tags": ["system"], + "summary": "Get system status", + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/settings": { + "get": { + "tags": ["system"], + "summary": "Get current settings", + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": null + } + } + } + } + } + }, + "post": { + "tags": ["system"], + "summary": "Save current settings", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Settings" + } + } + } + }, + "responses": { + "200": { + "description": "successful operation" + } + } + }, + "patch": { + "tags": ["system"], + "summary": "Save current settings", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Settings" + } + } + } + }, + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/action/pause": { + "get": { + "tags": ["timer"], + "summary": "Pause screen rotation", + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/action/timer_restart": { + "get": { + "tags": ["timer"], + "summary": "Restart screen rotation", + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/show/screen/{id}": { + "get": { + "tags": ["screens"], + "summary": "Set screen to show", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer", + "default": 1 + }, + "required": true, + "description": "ID of screen to show" + } + ], + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/show/text/{text}": { + "get": { + "tags": ["screens"], + "summary": "Set text to show", + "parameters": [ + { + "in": "path", + "name": "text", + "schema": { + "type": "string", + "default": "text" + }, + "required": true, + "description": "Text to show" + } + ], + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/show/custom": { + "post": { + "tags": ["screens"], + "summary": "Set text to show (advanced)", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomText" + } + } + } + }, + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/full_refresh": { + "get": { + "tags": ["system"], + "summary": "Force full refresh of all displays", + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/lights": { + "get": { + "tags": ["lights"], + "summary": "Get LEDs status", + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArrayOfLeds" + } + } + } + } + } + }, + "patch": { + "tags": ["lights"], + "summary": "Set individual LEDs", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArrayOfLedsInput" + } + } + } + }, + "responses": { + "200": { + "description": "succesful operation" + }, + "400": { + "description": "invalid colors or wrong amount of LEDs" + } + } + } + }, + "/lights/{color}": { + "get": { + "tags": ["lights"], + "summary": "Turn on LEDs with specific color", + "parameters": [ + { + "in": "path", + "name": "color", + "schema": { + "type": "string", + "default": "FFCC00" + }, + "required": true, + "description": "Color in RGB hex" + } + ], + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/lights/off": { + "get": { + "tags": ["lights"], + "summary": "Turn LEDs off", + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/restart": { + "get": { + "tags": ["system"], + "summary": "Restart BTClock", + "responses": { + "200": { + "description": "successful operation" + } + } + } + } + }, + "components": { + "schemas": { + "RgbColorValues": { + "type": "object", + "properties": { + "red": { + "type": "integer", + "minimum": 0, + "maximum": 255, + "example": 255 + }, + "green": { + "type": "integer", + "minimum": 0, + "maximum": 255, + "example": 204 + }, + "blue": { + "type": "integer", + "minimum": 0, + "maximum": 255, + "example": 0 + } + } + }, + "RgbColorHex": { + "type": "object", + "properties": { + "hex": { + "type": "string", + "pattern": "^#(?:[0-9a-fA-F]{3}){1,2}$", + "example": "#FFCC00" + } + } + }, + "RgbColorValueAndHex": { + "allOf": [ + { + "$ref": "#/components/schemas/RgbColorValues" + }, + { + "$ref": "#/components/schemas/RgbColorHex" + } + ] + }, + "RgbColorValueOrHex": { + "oneOf": [ + { + "$ref": "#/components/schemas/RgbColorValues" + }, + { + "$ref": "#/components/schemas/RgbColorHex" + } + ] + }, + "ArrayOfLeds": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RgbColorValueAndHex" + } + }, + "ArrayOfLedsInput": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RgbColorValueOrHex" + } + }, + "Settings": { + "type": "object", + "properties": { + "fetchEurPrice": { + "type": "boolean", + "description": "Fetch EUR price instead of USD" + }, + "fgColor": { + "type": "string", + "default": 16777215, + "description": "ePaper foreground (text) color" + }, + "bgColor": { + "type": "string", + "default": 0, + "description": "ePaper background color" + }, + "ledTestOnPower": { + "type": "boolean", + "default": true, + "description": "Do LED test on power-on" + }, + "ledFlashOnUpd": { + "type": "boolean", + "default": false, + "description": "Flash LEDs on new block" + }, + "mdnsEnabled": { + "type": "boolean", + "default": true, + "description": "Enable mDNS" + }, + "otaEnabled": { + "type": "boolean", + "default": true, + "description": "Enable over-the-air updates" + }, + "stealFocus": { + "type": "boolean", + "default": false, + "description": "Steal focus on new block" + }, + "mcapBigChar": { + "type": "boolean", + "default": false, + "description": "Use big characters for market cap screen" + }, + "mempoolInstance": { + "type": "string", + "default": "mempool.space", + "description": "Mempool.space instance to connect to" + }, + "ledBrightness": { + "type": "integer", + "default": 128, + "description": "Brightness of LEDs" + }, + "fullRefreshMin": { + "type": "integer", + "default": 60, + "description": "Full refresh time of ePaper displays in minutes" + }, + "screen[0]": { + "type": "boolean" + }, + "screen[1]": { + "type": "boolean" + }, + "screen[2]": { + "type": "boolean" + }, + "screen[3]": { + "type": "boolean" + }, + "screen[4]": { + "type": "boolean" + }, + "screen[5]": { + "type": "boolean" + }, + "tzOffset": { + "type": "integer", + "default": 60, + "description": "Timezone offset in minutes" + }, + "minSecPriceUpd": { + "type": "integer", + "default": 30, + "description": "Minimum time between price updates in seconds" + }, + "timePerScreen": { + "type": "integer", + "default": 30, + "description": "Time between screens when rotating in minutes" + } + } + }, + "CustomText": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 7, + "maxItems": 7 + } + } + } +} diff --git a/static/swagger.yml b/static/swagger.yml index c07a798..a2aa028 100644 --- a/static/swagger.yml +++ b/static/swagger.yml @@ -31,7 +31,7 @@ paths: '200': description: successful operation content: - application/json: + application/json: schema: $ref: #/components/schemas/ArrayOfLeds post: @@ -140,7 +140,7 @@ paths: schema: $ref: '#/components/schemas/ArrayOfLeds' patch: - tags: + tags: - lights summary: Set individual LEDs requestBody: @@ -149,9 +149,9 @@ paths: schema: $ref: '#/components/schemas/ArrayOfLedsInput' responses: - "200": + '200': description: succesful operation - "400": + '400': description: invalid colors or wrong amount of LEDs /lights/{color}: get: @@ -188,38 +188,38 @@ paths: components: schemas: RgbColorValues: - type: object - properties: - red: - type: integer - minimum: 0 - maximum: 255 - example: 255 - green: - type: integer - minimum: 0 - maximum: 255 - example: 204 - blue: - type: integer - minimum: 0 - maximum: 255 - example: 0 + type: object + properties: + red: + type: integer + minimum: 0 + maximum: 255 + example: 255 + green: + type: integer + minimum: 0 + maximum: 255 + example: 204 + blue: + type: integer + minimum: 0 + maximum: 255 + example: 0 RgbColorHex: - type: object - properties: - hex: - type: string - pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$ - example: "#FFCC00" + type: object + properties: + hex: + type: string + pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$ + example: '#FFCC00' RgbColorValueAndHex: - allOf: - - $ref: '#/components/schemas/RgbColorValues' - - $ref: '#/components/schemas/RgbColorHex' + allOf: + - $ref: '#/components/schemas/RgbColorValues' + - $ref: '#/components/schemas/RgbColorHex' RgbColorValueOrHex: - oneOf: - - $ref: '#/components/schemas/RgbColorValues' - - $ref: '#/components/schemas/RgbColorHex' + oneOf: + - $ref: '#/components/schemas/RgbColorValues' + - $ref: '#/components/schemas/RgbColorHex' ArrayOfLeds: type: array items: diff --git a/svelte.config.js b/svelte.config.js index 468ccd1..59a7734 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -5,16 +5,14 @@ import { vitePreprocess } from '@sveltejs/kit/vite'; const config = { // Consult https://kit.svelte.dev/docs/integrations#preprocessors // for more information about preprocessors - preprocess: vitePreprocess({ - - }), -build: { - rollupOptions: { - output: { - assetFilenames: '[hash]' + preprocess: vitePreprocess({}), + build: { + rollupOptions: { + output: { + assetFilenames: '[hash]' + } } - } -}, + }, kit: { // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. // If your environment is not supported or you settled on a specific environment, switch out the adapter. @@ -24,11 +22,11 @@ build: { // these options are set automatically — see below pages: 'dist', assets: 'dist', - fallback: "bundle.html", + fallback: 'bundle.html', precompress: false, strict: true }), - appDir: "build", + appDir: 'build' // inlineStyleThreshold: 9999999999 } }; diff --git a/vite.config.ts b/vite.config.ts index ea53800..7458b5d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,61 +1,71 @@ import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; -import * as fs from 'fs' -import * as path from 'path' +import * as fs from 'fs'; +import * as path from 'path'; const doRewrap = ({ cssClass }) => { try { if (fs.existsSync(path.resolve(__dirname, 'dist/bundle.js'))) { - return + return; } - } catch(e) {} - console.log("\nStart re-wrapping...") - fs.readFile(path.resolve(__dirname, 'dist/bundle.html'), 'utf8', function(err, data){ + } catch (e) {} + console.log('\nStart re-wrapping...'); + fs.readFile(path.resolve(__dirname, 'dist/bundle.html'), 'utf8', function (err, data) { if (!data) { - console.log(`[Error]: No bundle.html generated, check svelte.config.js -> config.kit.adapter -> fallback: "bundle.html"`) - return + console.log( + `[Error]: No bundle.html generated, check svelte.config.js -> config.kit.adapter -> fallback: "bundle.html"` + ); + return; } - let matchData = data.match(/(?<=]*>)([\s\S]*?)(?=<\/script>)/gm) + const matchData = data.match(/(?<=]*>)([\s\S]*?)(?=<\/script>)/gm); if (matchData) { - let cleanData = matchData[0].trim() - .replace(`document.querySelector('[data-sveltekit-hydrate="45h"]').parentNode`, `document.querySelector(".${cssClass}")`) + const cleanData = matchData[0] + .trim() + .replace( + `document.querySelector('[data-sveltekit-hydrate="45h"]').parentNode`, + `document.querySelector(".${cssClass}")` + ); fs.writeFile(path.resolve(__dirname, 'dist/bundle.js'), cleanData, (err) => { - if (err) - console.log(err) + if (err) console.log(err); else { try { - fs.rename(path.resolve(__dirname,'dist/index.page'), path.resolve(__dirname, 'dist/index.html'), (err) => { }) - } catch (e) { } + fs.rename( + path.resolve(__dirname, 'dist/index.page'), + path.resolve(__dirname, 'dist/index.html'), + () => {} + ); + } catch (e) {} try { - fs.unlinkSync(path.resolve(__dirname, 'dist/bundle.html')) - } catch (e) { } - console.log("Finished: bundle.js + index.html have been regenerated.\n") + fs.unlinkSync(path.resolve(__dirname, 'dist/bundle.html')); + } catch (e) {} + console.log('Finished: bundle.js + index.html have been regenerated.\n'); } - }) - } else - console.log(`[Error]: No proper @@ -65,6 +75,20 @@ - + +
+
+ (toastIsOpen = false)} + > + + {toastBody} + + +
+
diff --git a/src/routes/Settings.svelte b/src/routes/Settings.svelte index 1ba05e1..2fb68d3 100644 --- a/src/routes/Settings.svelte +++ b/src/routes/Settings.svelte @@ -1,5 +1,6 @@ -- 2.45.2 From 143a36642d36e461f220b2ef17bde96ba69e24f7 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Tue, 21 Nov 2023 21:27:41 +0100 Subject: [PATCH 018/114] Dependency updates --- yarn.lock | 429 ++++++++++++++++++++++++++---------------------------- 1 file changed, 209 insertions(+), 220 deletions(-) diff --git a/yarn.lock b/yarn.lock index 232417d..2493dd7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,17 +16,17 @@ "@jridgewell/trace-mapping" "^0.3.9" "@babel/runtime-corejs3@^7.20.7", "@babel/runtime-corejs3@^7.22.15", "@babel/runtime-corejs3@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.2.tgz#a5cd9d8b408fb946b2f074b21ea40c04e516795c" - integrity sha512-54cIh74Z1rp4oIjsHjqN+WM4fMyCBYe+LpZ9jWm51CZ1fbH3SkAzQD/3XLoNkjbJ7YEmjobLXyvQrFypRHOrXw== + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.4.tgz#ae5aa568d1320c23459aef5893dc970f6711d02c" + integrity sha512-zQyB4MJGM+rvd4pM58n26kf3xbiitw9MHzL8oLiBMKb8MCtVDfV5nDzzJWWzLMtbvKI9wN6XwJYl479qF4JluQ== dependencies: core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" "@babel/runtime@^7.12.1", "@babel/runtime@^7.3.1", "@babel/runtime@^7.9.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" - integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.4.tgz#36fa1d2b36db873d25ec631dcc4923fdc1cf2e2e" + integrity sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg== dependencies: regenerator-runtime "^0.14.0" @@ -40,220 +40,220 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== -"@esbuild/android-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz#276c5f99604054d3dbb733577e09adae944baa90" - integrity sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ== +"@esbuild/android-arm64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.7.tgz#646156aea43e8e6723de6e94a4ac07c5aed41be1" + integrity sha512-YEDcw5IT7hW3sFKZBkCAQaOCJQLONVcD4bOyTXMZz5fr66pTHnAet46XAtbXAkJRfIn2YVhdC6R9g4xa27jQ1w== "@esbuild/android-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== -"@esbuild/android-arm@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.5.tgz#4a3cbf14758166abaae8ba9c01a80e68342a4eec" - integrity sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA== +"@esbuild/android-arm@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.7.tgz#0827b49aed813c33ea18ee257c1728cdc4a01030" + integrity sha512-YGSPnndkcLo4PmVl2tKatEn+0mlVMr3yEpOOT0BeMria87PhvoJb5dg5f5Ft9fbCVgtAz4pWMzZVgSEGpDAlww== "@esbuild/android-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== -"@esbuild/android-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.5.tgz#21a3d11cd4613d2d3c5ccb9e746c254eb9265b0a" - integrity sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA== +"@esbuild/android-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.7.tgz#fa294ed5214d88219d519e0ab1bbb0253a89b864" + integrity sha512-jhINx8DEjz68cChFvM72YzrqfwJuFbfvSxZAk4bebpngGfNNRm+zRl4rtT9oAX6N9b6gBcFaJHFew5Blf6CvUw== "@esbuild/darwin-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== -"@esbuild/darwin-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz#714cb839f467d6a67b151ee8255886498e2b9bf6" - integrity sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw== +"@esbuild/darwin-arm64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.7.tgz#e24d2ed545749ff251eabe8bce11fefa688892d3" + integrity sha512-dr81gbmWN//3ZnBIm6YNCl4p3pjnabg1/ZVOgz2fJoUO1a3mq9WQ/1iuEluMs7mCL+Zwv7AY5e3g1hjXqQZ9Iw== "@esbuild/darwin-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== -"@esbuild/darwin-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz#2c553e97a6d2b4ae76a884e35e6cbab85a990bbf" - integrity sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA== +"@esbuild/darwin-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.7.tgz#02d1f8a572874c90d8f55dde8a859e5145bd06f6" + integrity sha512-Lc0q5HouGlzQEwLkgEKnWcSazqr9l9OdV2HhVasWJzLKeOt0PLhHaUHuzb8s/UIya38DJDoUm74GToZ6Wc7NGQ== "@esbuild/freebsd-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== -"@esbuild/freebsd-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz#d554f556718adb31917a0da24277bf84b6ee87f3" - integrity sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ== +"@esbuild/freebsd-arm64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.7.tgz#bc6a69b9a7915da278f0a5ebaec069c813982c22" + integrity sha512-+y2YsUr0CxDFF7GWiegWjGtTUF6gac2zFasfFkRJPkMAuMy9O7+2EH550VlqVdpEEchWMynkdhC9ZjtnMiHImQ== "@esbuild/freebsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== -"@esbuild/freebsd-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz#288f7358a3bb15d99e73c65c9adaa3dabb497432" - integrity sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ== +"@esbuild/freebsd-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.7.tgz#ec3708488625d70e565968ceea1355e7c8613865" + integrity sha512-CdXOxIbIzPJmJhrpmJTLx+o35NoiKBIgOvmvT+jeSadYiWJn0vFKsl+0bSG/5lwjNHoIDEyMYc/GAPR9jxusTA== "@esbuild/linux-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== -"@esbuild/linux-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz#95933ae86325c93cb6b5e8333d22120ecfdc901b" - integrity sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA== +"@esbuild/linux-arm64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.7.tgz#8e04b66c306858f92d4f90f8222775270755e88a" + integrity sha512-inHqdOVCkUhHNvuQPT1oCB7cWz9qQ/Cz46xmVe0b7UXcuIJU3166aqSunsqkgSGMtUCWOZw3+KMwI6otINuC9g== "@esbuild/linux-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== -"@esbuild/linux-arm@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz#0acef93aa3e0579e46d33b666627bddb06636664" - integrity sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ== +"@esbuild/linux-arm@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.7.tgz#12d5b65e089029ee1fe4c591b60969c9b1a85355" + integrity sha512-Y+SCmWxsJOdQtjcBxoacn/pGW9HDZpwsoof0ttL+2vGcHokFlfqV666JpfLCSP2xLxFpF1lj7T3Ox3sr95YXww== "@esbuild/linux-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== -"@esbuild/linux-ia32@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz#b6e5c9e80b42131cbd6b1ddaa48c92835f1ed67f" - integrity sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ== +"@esbuild/linux-ia32@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.7.tgz#01eabc2a3ad9039e115db650268e4f48f910dbe2" + integrity sha512-2BbiL7nLS5ZO96bxTQkdO0euGZIUQEUXMTrqLxKUmk/Y5pmrWU84f+CMJpM8+EHaBPfFSPnomEaQiG/+Gmh61g== "@esbuild/linux-loong64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== -"@esbuild/linux-loong64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz#e5f0cf95a180158b01ff5f417da796a1c09dfbea" - integrity sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw== +"@esbuild/linux-loong64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.7.tgz#70681113632970e6a5766607bbdb98aa18cf4d5f" + integrity sha512-BVFQla72KXv3yyTFCQXF7MORvpTo4uTA8FVFgmwVrqbB/4DsBFWilUm1i2Oq6zN36DOZKSVUTb16jbjedhfSHw== "@esbuild/linux-mips64el@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== -"@esbuild/linux-mips64el@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz#ae36fb86c7d5f641f3a0c8472e83dcb6ea36a408" - integrity sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg== +"@esbuild/linux-mips64el@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.7.tgz#f63c022a71a3d70c482d1943a27cb8997021e230" + integrity sha512-DzAYckIaK+pS31Q/rGpvUKu7M+5/t+jI+cdleDgUwbU7KdG2eC3SUbZHlo6Q4P1CfVKZ1lUERRFP8+q0ob9i2w== "@esbuild/linux-ppc64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== -"@esbuild/linux-ppc64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz#7960cb1666f0340ddd9eef7b26dcea3835d472d0" - integrity sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q== +"@esbuild/linux-ppc64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.7.tgz#614eafd08b0c50212f287b948b3c08d6e60f221f" + integrity sha512-JQ1p0SmUteNdUaaiRtyS59GkkfTW0Edo+e0O2sihnY4FoZLz5glpWUQEKMSzMhA430ctkylkS7+vn8ziuhUugQ== "@esbuild/linux-riscv64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== -"@esbuild/linux-riscv64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz#32207df26af60a3a9feea1783fc21b9817bade19" - integrity sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag== +"@esbuild/linux-riscv64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.7.tgz#31d3b63f92f65968268a8e61ba59872538e80e88" + integrity sha512-xGwVJ7eGhkprY/nB7L7MXysHduqjpzUl40+XoYDGC4UPLbnG+gsyS1wQPJ9lFPcxYAaDXbdRXd1ACs9AE9lxuw== "@esbuild/linux-s390x@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== -"@esbuild/linux-s390x@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz#b38d5681db89a3723862dfa792812397b1510a7d" - integrity sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw== +"@esbuild/linux-s390x@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.7.tgz#be94974e0caa0783ae05f9477fd7170b9ac29cb0" + integrity sha512-U8Rhki5PVU0L0nvk+E8FjkV8r4Lh4hVEb9duR6Zl21eIEYEwXz8RScj4LZWA2i3V70V4UHVgiqMpszXvG0Yqhg== "@esbuild/linux-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== -"@esbuild/linux-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz#46feba2ad041a241379d150f415b472fe3885075" - integrity sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A== +"@esbuild/linux-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.7.tgz#84e8018a913dd4ecee954623e395984aef3d0007" + integrity sha512-ZYZopyLhm4mcoZXjFt25itRlocKlcazDVkB4AhioiL9hOWhDldU9n38g62fhOI4Pth6vp+Mrd5rFKxD0/S+7aQ== "@esbuild/netbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== -"@esbuild/netbsd-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz#3b5c1fb068f26bfc681d31f682adf1bea4ef0702" - integrity sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g== +"@esbuild/netbsd-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.7.tgz#98898ba8800374c9df9bb182ca4f69fcecaf4411" + integrity sha512-/yfjlsYmT1O3cum3J6cmGG16Fd5tqKMcg5D+sBYLaOQExheAJhqr8xOAEIuLo8JYkevmjM5zFD9rVs3VBcsjtQ== "@esbuild/openbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== -"@esbuild/openbsd-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz#ca6830316ca68056c5c88a875f103ad3235e00db" - integrity sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA== +"@esbuild/openbsd-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.7.tgz#46dc4eda2adb51f16361b1ad10e9b3f4938c4573" + integrity sha512-MYDFyV0EW1cTP46IgUJ38OnEY5TaXxjoDmwiTXPjezahQgZd+j3T55Ht8/Q9YXBM0+T9HJygrSRGV5QNF/YVDQ== "@esbuild/sunos-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== -"@esbuild/sunos-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz#9efc4eb9539a7be7d5a05ada52ee43cda0d8e2dd" - integrity sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg== +"@esbuild/sunos-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.7.tgz#1650d40dd88412ecc11490119cd23cbaf661a591" + integrity sha512-JcPvgzf2NN/y6X3UUSqP6jSS06V0DZAV/8q0PjsZyGSXsIGcG110XsdmuWiHM+pno7/mJF6fjH5/vhUz/vA9fw== "@esbuild/win32-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== -"@esbuild/win32-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz#29f8184afa7a02a956ebda4ed638099f4b8ff198" - integrity sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg== +"@esbuild/win32-arm64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.7.tgz#e61de6c4eb204d83fd912f3ae6812cc8c7d32d25" + integrity sha512-ZA0KSYti5w5toax5FpmfcAgu3ZNJxYSRm0AW/Dao5up0YV1hDVof1NvwLomjEN+3/GMtaWDI+CIyJOMTRSTdMw== "@esbuild/win32-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== -"@esbuild/win32-ia32@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz#f3de07afb292ecad651ae4bb8727789de2d95b05" - integrity sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw== +"@esbuild/win32-ia32@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.7.tgz#3d9c159d42c67e37a433e44ef8217c661cb6f6d0" + integrity sha512-CTOnijBKc5Jpk6/W9hQMMvJnsSYRYgveN6O75DTACCY18RA2nqka8dTZR+x/JqXCRiKk84+5+bRKXUSbbwsS0A== "@esbuild/win32-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== -"@esbuild/win32-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz#faad84c41ba12e3a0acb52571df9bff37bee75f6" - integrity sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw== +"@esbuild/win32-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.7.tgz#02c4446f802706098d8e6ee70cf2b7aba96ded0b" + integrity sha512-gRaP2sk6hc98N734luX4VpF318l3w+ofrtTu9j5L8EQXF+FzQKV6alCOHMVoJJHvVK/mGbwBXfOL1HETQu9IGQ== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -282,10 +282,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.53.0": - version "8.53.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.53.0.tgz#bea56f2ed2b5baea164348ff4d5a879f6f81f20d" - integrity sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w== +"@eslint/js@8.54.0": + version "8.54.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.54.0.tgz#4fab9a2ff7860082c304f750e94acd644cf984cf" + integrity sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ== "@fastify/busboy@^2.0.0": version "2.1.0" @@ -881,14 +881,14 @@ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/prop-types@*": - version "15.7.10" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.10.tgz#892afc9332c4d62a5ea7e897fe48ed2085bbb08a" - integrity sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A== + version "15.7.11" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== "@types/pug@^2.0.6": - version "2.0.9" - resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.9.tgz#97e765bb8eb0b90380524583f1f10838f29822f9" - integrity sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA== + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.10.tgz#52f8dbd6113517aef901db20b4f3fca543b88c1f" + integrity sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA== "@types/ramda@~0.29.6": version "0.29.9" @@ -898,23 +898,23 @@ types-ramda "^0.29.6" "@types/react@*": - version "18.2.37" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.37.tgz#0f03af69e463c0f19a356c2660dbca5d19c44cae" - integrity sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw== + version "18.2.38" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.38.tgz#3605ca41d3daff2c434e0b98d79a2469d4c2dd52" + integrity sha512-cBBXHzuPtQK6wNthuVMV6IjHAFkdl/FOPFIlkd81/Cd1+IqkHu/A+w4g43kaQQoYHik/ruaQBDL72HyCy1vuMw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/scheduler@*": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.6.tgz#eb26db6780c513de59bee0b869ef289ad3068711" - integrity sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA== + version "0.16.7" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.7.tgz#d62f1bd54724c84089f51f9218393930ba4abcf4" + integrity sha512-8g25Nl3AuB1KulTlSUsUhUo/oBgBU6XIXQ+XURpeioEbEJvkO7qI4vDfREv3vJYHHzqXjcAHvoJy4pTtSQNZtA== "@types/semver@^7.5.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.5.tgz#deed5ab7019756c9c90ea86139106b0346223f35" - integrity sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg== + version "7.5.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== "@types/swagger-ui@^3.52.4": version "3.52.4" @@ -932,15 +932,15 @@ integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== "@typescript-eslint/eslint-plugin@^6.0.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz#52aae65174ff526576351f9ccd41cea01001463f" - integrity sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w== + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.12.0.tgz#2a647d278bb48bf397fef07ba0507612ff9dd812" + integrity sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.11.0" - "@typescript-eslint/type-utils" "6.11.0" - "@typescript-eslint/utils" "6.11.0" - "@typescript-eslint/visitor-keys" "6.11.0" + "@typescript-eslint/scope-manager" "6.12.0" + "@typescript-eslint/type-utils" "6.12.0" + "@typescript-eslint/utils" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -949,71 +949,71 @@ ts-api-utils "^1.0.1" "@typescript-eslint/parser@^6.0.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.11.0.tgz#9640d9595d905f3be4f278bf515130e6129b202e" - integrity sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ== + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.12.0.tgz#9fb21ed7d88065a4a2ee21eb80b8578debb8217c" + integrity sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg== dependencies: - "@typescript-eslint/scope-manager" "6.11.0" - "@typescript-eslint/types" "6.11.0" - "@typescript-eslint/typescript-estree" "6.11.0" - "@typescript-eslint/visitor-keys" "6.11.0" + "@typescript-eslint/scope-manager" "6.12.0" + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/typescript-estree" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz#621f603537c89f4d105733d949aa4d55eee5cea8" - integrity sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A== +"@typescript-eslint/scope-manager@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz#5833a16dbe19cfbad639d4d33bcca5e755c7044b" + integrity sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw== dependencies: - "@typescript-eslint/types" "6.11.0" - "@typescript-eslint/visitor-keys" "6.11.0" + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" -"@typescript-eslint/type-utils@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz#d0b8b1ab6c26b974dbf91de1ebc5b11fea24e0d1" - integrity sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA== +"@typescript-eslint/type-utils@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.12.0.tgz#968f7c95162808d69950ab5dff710ad730e58287" + integrity sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng== dependencies: - "@typescript-eslint/typescript-estree" "6.11.0" - "@typescript-eslint/utils" "6.11.0" + "@typescript-eslint/typescript-estree" "6.12.0" + "@typescript-eslint/utils" "6.12.0" debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/types@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.11.0.tgz#8ad3aa000cbf4bdc4dcceed96e9b577f15e0bf53" - integrity sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA== +"@typescript-eslint/types@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.12.0.tgz#ffc5297bcfe77003c8b7b545b51c2505748314ac" + integrity sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q== -"@typescript-eslint/typescript-estree@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz#7b52c12a623bf7f8ec7f8a79901b9f98eb5c7990" - integrity sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ== +"@typescript-eslint/typescript-estree@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz#764ccc32598549e5b48ec99e3b85f89b1385310c" + integrity sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw== dependencies: - "@typescript-eslint/types" "6.11.0" - "@typescript-eslint/visitor-keys" "6.11.0" + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.11.0.tgz#11374f59ef4cea50857b1303477c08aafa2ca604" - integrity sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g== +"@typescript-eslint/utils@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.12.0.tgz#c6ce8c06fe9b0212620e5674a2036f6f8f611754" + integrity sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.11.0" - "@typescript-eslint/types" "6.11.0" - "@typescript-eslint/typescript-estree" "6.11.0" + "@typescript-eslint/scope-manager" "6.12.0" + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/typescript-estree" "6.12.0" semver "^7.5.4" -"@typescript-eslint/visitor-keys@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz#d991538788923f92ec40d44389e7075b359f3458" - integrity sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ== +"@typescript-eslint/visitor-keys@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz#5877950de42a0f3344261b7a1eee15417306d7e9" + integrity sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw== dependencies: - "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/types" "6.12.0" eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": @@ -1318,9 +1318,9 @@ copy-to-clipboard@^3.3.1: toggle-selection "^1.0.6" core-js-pure@^3.30.2: - version "3.33.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.2.tgz#644830db2507ef84d068a70980ccd99c275f5fa6" - integrity sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q== + version "3.33.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.3.tgz#cbf9180ac4c4653823d784862bfb5c77eac0bf98" + integrity sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ== cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" @@ -1526,32 +1526,32 @@ esbuild@^0.18.10: "@esbuild/win32-x64" "0.18.20" esbuild@^0.19.2: - version "0.19.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.5.tgz#53a0e19dfbf61ba6c827d51a80813cf071239a8c" - integrity sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ== + version "0.19.7" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.7.tgz#b9a7235097b81278dcf090e2532ed13c95a2ee84" + integrity sha512-6brbTZVqxhqgbpqBR5MzErImcpA0SQdoKOkcWK/U30HtQxnokIpG3TX2r0IJqbFUzqLjhU/zC1S5ndgakObVCQ== optionalDependencies: - "@esbuild/android-arm" "0.19.5" - "@esbuild/android-arm64" "0.19.5" - "@esbuild/android-x64" "0.19.5" - "@esbuild/darwin-arm64" "0.19.5" - "@esbuild/darwin-x64" "0.19.5" - "@esbuild/freebsd-arm64" "0.19.5" - "@esbuild/freebsd-x64" "0.19.5" - "@esbuild/linux-arm" "0.19.5" - "@esbuild/linux-arm64" "0.19.5" - "@esbuild/linux-ia32" "0.19.5" - "@esbuild/linux-loong64" "0.19.5" - "@esbuild/linux-mips64el" "0.19.5" - "@esbuild/linux-ppc64" "0.19.5" - "@esbuild/linux-riscv64" "0.19.5" - "@esbuild/linux-s390x" "0.19.5" - "@esbuild/linux-x64" "0.19.5" - "@esbuild/netbsd-x64" "0.19.5" - "@esbuild/openbsd-x64" "0.19.5" - "@esbuild/sunos-x64" "0.19.5" - "@esbuild/win32-arm64" "0.19.5" - "@esbuild/win32-ia32" "0.19.5" - "@esbuild/win32-x64" "0.19.5" + "@esbuild/android-arm" "0.19.7" + "@esbuild/android-arm64" "0.19.7" + "@esbuild/android-x64" "0.19.7" + "@esbuild/darwin-arm64" "0.19.7" + "@esbuild/darwin-x64" "0.19.7" + "@esbuild/freebsd-arm64" "0.19.7" + "@esbuild/freebsd-x64" "0.19.7" + "@esbuild/linux-arm" "0.19.7" + "@esbuild/linux-arm64" "0.19.7" + "@esbuild/linux-ia32" "0.19.7" + "@esbuild/linux-loong64" "0.19.7" + "@esbuild/linux-mips64el" "0.19.7" + "@esbuild/linux-ppc64" "0.19.7" + "@esbuild/linux-riscv64" "0.19.7" + "@esbuild/linux-s390x" "0.19.7" + "@esbuild/linux-x64" "0.19.7" + "@esbuild/netbsd-x64" "0.19.7" + "@esbuild/openbsd-x64" "0.19.7" + "@esbuild/sunos-x64" "0.19.7" + "@esbuild/win32-arm64" "0.19.7" + "@esbuild/win32-ia32" "0.19.7" + "@esbuild/win32-x64" "0.19.7" escape-string-regexp@^4.0.0: version "4.0.0" @@ -1569,9 +1569,9 @@ eslint-config-prettier@^9.0.0: integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw== eslint-plugin-svelte@^2.30.0: - version "2.35.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.0.tgz#bc74c71892621358bea3d094c0acc0bbf8e9419b" - integrity sha512-3WDFxNrkXaMlpqoNo3M1ZOQuoFLMO9+bdnN6oVVXaydXC7nzCJuGy9a0zqoNDHMSRPYt0Rqo6hIdHMEaI5sQnw== + version "2.35.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.1.tgz#7b1e3c263b09dbc9293c25fe02d03d309725d2b9" + integrity sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1600,14 +1600,14 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.28.0: - version "8.53.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.53.0.tgz#14f2c8244298fcae1f46945459577413ba2697ce" - integrity sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag== + version "8.54.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.54.0.tgz#588e0dd4388af91a2e8fa37ea64924074c783537" + integrity sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.3" - "@eslint/js" "8.53.0" + "@eslint/js" "8.54.0" "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -2682,9 +2682,9 @@ prelude-ls@^1.2.1: integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier-plugin-svelte@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/prettier-plugin-svelte/-/prettier-plugin-svelte-3.1.0.tgz#b9ac68d4edd2292939d9fe2cf58455fb5b4e4460" - integrity sha512-96+AZxs2ESqIFA9j+o+DHqY+BsUglezfl553LQd6VOtTyJq5GPuBEb3ElxF2cerFzKlYKttlH/VcVmRNj5oc3A== + version "3.1.1" + resolved "https://registry.yarnpkg.com/prettier-plugin-svelte/-/prettier-plugin-svelte-3.1.1.tgz#29ac59b25e6303c2fef0ca381f0bc239643955bd" + integrity sha512-jLzaHfToav527/I5h2BMQfN3G5gylrJm54zFFyoXvUtfscI47877ftacUb+Eyse/3bXrhY+MtkyiuvruiHc+kg== prettier@^3.0.0: version "3.1.0" @@ -3229,18 +3229,7 @@ svelte-i18n@^4.0.0: sade "^1.8.1" tiny-glob "^0.2.9" -svelte-preprocess@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-5.1.0.tgz#824a1b072da118cba46ad2e5e88a568083acad4b" - integrity sha512-EkErPiDzHAc0k2MF5m6vBNmRUh338h2myhinUw/xaqsLs7/ZvsgREiLGj03VrSzbY/TB5ZXgBOsKraFee5yceA== - dependencies: - "@types/pug" "^2.0.6" - detect-indent "^6.1.0" - magic-string "^0.27.0" - sorcery "^0.11.0" - strip-indent "^3.0.0" - -svelte-preprocess@^5.1.1: +svelte-preprocess@^5.1.0, svelte-preprocess@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-5.1.1.tgz#53d7107c2e8b307afd4418e06239177c4de12025" integrity sha512-p/Dp4hmrBW5mrCCq29lEMFpIJT2FZsRlouxEc5qpbOmXRbaFs7clLs8oKPwD3xCFyZfv1bIhvOzpQkhMEVQdMw== @@ -3252,9 +3241,9 @@ svelte-preprocess@^5.1.1: strip-indent "^3.0.0" svelte@^4.0.5: - version "4.2.3" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-4.2.3.tgz#4e77f7d528a543a0d516af00bc9b3131f01a2721" - integrity sha512-sqmG9KC6uUc7fb3ZuWoxXvqk6MI9Uu4ABA1M0fYDgTlFYu1k02xp96u6U9+yJZiVm84m9zge7rrA/BNZdFpOKw== + version "4.2.7" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-4.2.7.tgz#8594fad998d11d4dd179f5a91e67d1fc04d8f6e3" + integrity sha512-UExR1KS7raTdycsUrKLtStayu4hpdV3VZQgM0akX8XbXgLBlosdE/Sf3crOgyh9xIjqSYB3UEBuUlIQKRQX2hg== dependencies: "@ampproject/remapping" "^2.2.1" "@jridgewell/sourcemap-codec" "^1.4.15" @@ -3300,9 +3289,9 @@ swagger-client@^3.24.5: undici "^5.24.0" swagger-ui@^5.10.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/swagger-ui/-/swagger-ui-5.10.0.tgz#4e1b38a54f0a8e4b333a3001614284c7652b5133" - integrity sha512-eAKTmBjk1dF9JscUjnatughEoAosZvPbwVoVsZbjqHhZhkszCbS3u+fgGVrBa31BqFhXJ1qolx+t7X2Lijkuyw== + version "5.10.1" + resolved "https://registry.yarnpkg.com/swagger-ui/-/swagger-ui-5.10.1.tgz#01aa05143801cea4dd1ce0006ccd0dac38344c11" + integrity sha512-TtOeTAnPdcqwZm4yT2TTi9Key4oZ1Tb7U1oVZKhDyJDIeqVAWgItM0dbIJZsT6NBT6wt63Sv+tMQqMlTFvw1aQ== dependencies: "@babel/runtime-corejs3" "^7.23.2" "@braintree/sanitize-url" "=6.0.4" @@ -3486,9 +3475,9 @@ types-ramda@^0.29.6: ts-toolbelt "^9.6.0" typescript@^5.0.0, typescript@^5.0.3: - version "5.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" - integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== + version "5.3.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43" + integrity sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ== undici@^5.24.0: version "5.27.2" -- 2.45.2 From cea450ba821a1e06b97a2460e3f9ed7e4a09e601 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Tue, 21 Nov 2023 21:33:34 +0100 Subject: [PATCH 019/114] Fix lint --- .eslintignore | 3 ++- .github/workflows/workflow.yml | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.eslintignore b/.eslintignore index 3897265..a42df6d 100644 --- a/.eslintignore +++ b/.eslintignore @@ -6,7 +6,8 @@ node_modules .env .env.* !.env.example - +dist +build_gz # Ignore files for PNPM, NPM and YARN pnpm-lock.yaml package-lock.json diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index bed535a..b3fac1e 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -61,10 +61,11 @@ jobs: make dist - name: Install yarn run: yarn && yarn postinstall - - name: Build WebUI - run: yarn build - name: Run linter run: yarn lint + - name: Build WebUI + run: yarn build + - name: Get current block id: getBlockHeight run: echo "blockHeight=$(curl -s https://mempool.space/api/blocks/tip/height)" >> $GITHUB_OUTPUT -- 2.45.2 From fd492c416ce736726f0fd3f208cd946741ecd918 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Wed, 22 Nov 2023 14:52:41 +0100 Subject: [PATCH 020/114] Fix timezone input --- src/routes/Settings.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/src/routes/Settings.svelte b/src/routes/Settings.svelte index 2fb68d3..7854fb7 100644 --- a/src/routes/Settings.svelte +++ b/src/routes/Settings.svelte @@ -146,7 +146,6 @@ Date: Thu, 23 Nov 2023 02:04:20 +0100 Subject: [PATCH 021/114] Add testing frameworks --- .github/workflows/workflow.yml | 12 + package.json | 14 +- playwright.config.ts | 16 + src/lib/i18n/index.ts | 2 +- src/routes/+layout.svelte | 26 +- src/routes/Control.spec.ts | 30 + src/routes/Settings.spec.ts | 32 + src/routes/Status.spec.ts | 30 + tests/test.ts | 21 + vite.config.ts | 8 +- yarn.lock | 1313 +++++++++++++++++++++++++++----- 11 files changed, 1315 insertions(+), 189 deletions(-) create mode 100644 playwright.config.ts create mode 100644 src/routes/Control.spec.ts create mode 100644 src/routes/Settings.spec.ts create mode 100644 src/routes/Status.spec.ts create mode 100644 tests/test.ts diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index b3fac1e..2f28824 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -63,6 +63,18 @@ jobs: run: yarn && yarn postinstall - name: Run linter run: yarn lint + - name: Run vitest tests + run: yarn vitest run --reporter=json + - name: Install Playwright Browsers + run: npx playwright install --with-deps + - name: Run Playwright tests + run: npx playwright test + - uses: actions/upload-artifact@v3 + if: always() + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 - name: Build WebUI run: yarn build diff --git a/package.json b/package.json index 8484928..859d129 100644 --- a/package.json +++ b/package.json @@ -10,19 +10,26 @@ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "lint": "prettier --check . && eslint .", "format": "prettier --write .", - "postinstall": "patch-package" + "postinstall": "patch-package", + "test": "npm run test:integration && npm run test:unit", + "test:integration": "playwright test", + "test:unit": "vitest" }, "devDependencies": { "@rollup/plugin-json": "^6.0.1", "@sveltejs/adapter-auto": "^2.0.0", "@sveltejs/adapter-static": "^2.0.3", "@sveltejs/kit": "^1.27.4", + "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@testing-library/svelte": "^4.0.5", "@types/swagger-ui": "^3.52.4", "@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/parser": "^6.0.0", + "@vitest/ui": "^0.34.6", "eslint": "^8.28.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-svelte": "^2.30.0", + "jsdom": "^22.1.0", "prettier": "^3.0.0", "prettier-plugin-svelte": "^3.0.0", "sass": "^1.69.5", @@ -31,13 +38,16 @@ "svelte-preprocess": "^5.1.1", "tslib": "^2.4.1", "typescript": "^5.0.0", - "vite": "^4.4.2" + "vite": "^5.0.2", + "vitest": "^0.34.6", + "vitest-dom": "^0.1.1" }, "type": "module", "dependencies": { "@fontsource/antonio": "^5.0.17", "@fontsource/oswald": "^5.0.17", "@fontsource/ubuntu": "^5.0.8", + "@playwright/test": "^1.40.0", "bootstrap": "^5.3.2", "patch-package": "^8.0.0", "svelte-i18n": "^4.0.0", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..65eadc0 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,16 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; + +const config: PlaywrightTestConfig = { + use: { + locale: 'en-GB', + timezoneId: 'Europe/Amsterdam' + }, + webServer: { + command: 'npm run build && npm run preview', + port: 4173 + }, + testDir: 'tests', + testMatch: /(.+\.)?(test|spec)\.[jt]s/ +}; + +export default config; diff --git a/src/lib/i18n/index.ts b/src/lib/i18n/index.ts index 492de13..42c6812 100644 --- a/src/lib/i18n/index.ts +++ b/src/lib/i18n/index.ts @@ -12,6 +12,6 @@ init({ initialLocale: browser ? browser && localStorage.getItem('locale') ? localStorage.getItem('locale') - : window.navigator.language + : window.navigator.language.slice(0, 2) : defaultLocale }); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 9160c21..66781f7 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -13,7 +13,7 @@ } from 'sveltestrap'; import { page } from '$app/stores'; - import { locale, locales } from 'svelte-i18n'; + import { locale, locales, isLoading } from 'svelte-i18n'; export const setLocale = (lang: string) => () => { locale.set(lang); @@ -39,19 +39,15 @@ } }; - export const getLanguageName = (languageCode: string): string | null => { - const languageNames: { [key: string]: { [key: string]: string } } = { - en: { en: 'English', nl: 'English', es: 'English' }, - nl: { en: 'Nederlands', nl: 'Nederlands', es: 'Neerlandés' }, - es: { en: 'Español', nl: 'Spaans', es: 'Español' } - }; + let languageNames = {}; - const lowercaseCode = languageCode.toLowerCase(); + locale.subscribe(() => { + let newLanguageNames = new Intl.DisplayNames([$locale], { type: 'language' }); - return Object.prototype.hasOwnProperty.call(languageNames, lowercaseCode) - ? languageNames[lowercaseCode][lowercaseCode] - : null; - }; + for (let l: string of $locales) { + languageNames[l] = newLanguageNames.of(l); + } + }); @@ -65,16 +61,18 @@ API + {#if !$isLoading} - {getFlagEmoji($locale)} {getLanguageName($locale)} + {getFlagEmoji($locale)} {languageNames[$locale]} {#each $locales as locale} {getFlagEmoji(locale)} {getLanguageName(locale)}{getFlagEmoji(locale)} {languageNames[locale]} {/each} + {/if} diff --git a/src/routes/Control.spec.ts b/src/routes/Control.spec.ts new file mode 100644 index 0000000..763e9a3 --- /dev/null +++ b/src/routes/Control.spec.ts @@ -0,0 +1,30 @@ +import { writable } from 'svelte/store'; +import Control from './Control.svelte'; +import { render } from '@testing-library/svelte'; +import { describe, test, expect, beforeEach } from 'vitest'; +import { addMessages, init, locale } from 'svelte-i18n'; + +import '$lib/i18n/index.ts'; +import en from '$lib/locales/en.json'; +addMessages('en', en); + +describe('Control Component', () => { + beforeEach(() => { + init({ + fallbackLocale: 'en', + initialLocale: 'en' + }); + locale.set('en'); + }); + + test('should render the component', () => { + const host = document.createElement('div'); + document.body.appendChild(host); + const instance = render(Control, { + target: host, + props: { status: writable([]), settings: writable([]) } + }); + expect(instance).toBeTruthy(); + expect(host.innerHTML).toContain('Control'); + }); +}); diff --git a/src/routes/Settings.spec.ts b/src/routes/Settings.spec.ts new file mode 100644 index 0000000..4e1fb07 --- /dev/null +++ b/src/routes/Settings.spec.ts @@ -0,0 +1,32 @@ +import { writable } from 'svelte/store'; +import Settings from './Settings.svelte'; +import { render } from '@testing-library/svelte'; +import { describe, test, expect, beforeEach } from 'vitest'; +import { addMessages, init, locale } from 'svelte-i18n'; + +import '$lib/i18n/index.ts'; +import en from '$lib/locales/en.json'; +addMessages('en', en); + +describe('Settings Component', () => { + beforeEach(() => { + init({ + fallbackLocale: 'en', + initialLocale: 'en' + }); + locale.set('en'); + }); + + test('should render the component', () => { + locale.set('en'); + + const host = document.createElement('div'); + document.body.appendChild(host); + const instance = render(Settings, { + target: host, + props: { settings: writable([]) } + }); + expect(instance).toBeTruthy(); + expect(host.innerHTML).toContain('Settings'); + }); +}); diff --git a/src/routes/Status.spec.ts b/src/routes/Status.spec.ts new file mode 100644 index 0000000..820e2eb --- /dev/null +++ b/src/routes/Status.spec.ts @@ -0,0 +1,30 @@ +import { writable } from 'svelte/store'; +import Status from './Status.svelte'; +import { render } from '@testing-library/svelte'; +import { describe, test, expect, beforeEach } from 'vitest'; +import { locale, init, addMessages } from 'svelte-i18n'; + +import '$lib/i18n/index.ts'; +import en from '$lib/locales/en.json'; +addMessages('en', en); + +describe('Status Component', () => { + beforeEach(() => { + init({ + fallbackLocale: 'en', + initialLocale: 'en' + }); + locale.set('en'); + }); + + test('should render the component', () => { + const host = document.createElement('div'); + document.body.appendChild(host); + const instance = render(Status, { + target: host, + props: { status: writable([]), settings: writable([]) } + }); + expect(instance).toBeTruthy(); + expect(host.innerHTML).toContain('Status'); + }); +}); diff --git a/tests/test.ts b/tests/test.ts new file mode 100644 index 0000000..75b2579 --- /dev/null +++ b/tests/test.ts @@ -0,0 +1,21 @@ +import { expect, test } from '@playwright/test'; + +test('index page has expected status', async ({ page }) => { + await page.goto('/'); + await expect(page.getByRole('heading', { name: 'Status' })).toBeVisible(); +}); + +test('index page has expected settings', async ({ page }) => { + await page.goto('/'); + await expect(page.getByRole('heading', { name: 'Settings' })).toBeVisible(); +}); + +test('index page has expected control', async ({ page }) => { + await page.goto('/'); + await expect(page.getByRole('heading', { name: 'Control' })).toBeVisible(); +}); + +test('api page has expected load button', async ({ page }) => { + await page.goto('/api'); + await expect(page.getByRole('button', { name: 'Load' })).toBeVisible(); +}); diff --git a/vite.config.ts b/vite.config.ts index 7458b5d..7773082 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,5 +1,6 @@ import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig } from 'vite'; +//import { defineConfig } from 'vite'; +import { defineConfig } from 'vitest/config'; import * as fs from 'fs'; import * as path from 'path'; @@ -68,5 +69,10 @@ export default defineConfig({ assetFileNames: '[name][extname]' } } + }, + test: { + include: ['src/**/*.{test,spec}.{js,ts}'], + globals: true, + environment: 'jsdom' } }); diff --git a/yarn.lock b/yarn.lock index 2493dd7..79d8ad5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,6 +15,28 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@babel/code-frame@^7.10.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.4.tgz#03ae5af150be94392cb5c7ccd97db5a19a5da6aa" + integrity sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/runtime-corejs3@^7.20.7", "@babel/runtime-corejs3@^7.22.15", "@babel/runtime-corejs3@^7.23.2": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.4.tgz#ae5aa568d1320c23459aef5893dc970f6711d02c" @@ -23,7 +45,7 @@ core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" -"@babel/runtime@^7.12.1", "@babel/runtime@^7.3.1", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.9.2": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.4.tgz#36fa1d2b36db873d25ec631dcc4923fdc1cf2e2e" integrity sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg== @@ -35,221 +57,111 @@ resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== -"@esbuild/android-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" - integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== - "@esbuild/android-arm64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.7.tgz#646156aea43e8e6723de6e94a4ac07c5aed41be1" integrity sha512-YEDcw5IT7hW3sFKZBkCAQaOCJQLONVcD4bOyTXMZz5fr66pTHnAet46XAtbXAkJRfIn2YVhdC6R9g4xa27jQ1w== -"@esbuild/android-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" - integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== - "@esbuild/android-arm@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.7.tgz#0827b49aed813c33ea18ee257c1728cdc4a01030" integrity sha512-YGSPnndkcLo4PmVl2tKatEn+0mlVMr3yEpOOT0BeMria87PhvoJb5dg5f5Ft9fbCVgtAz4pWMzZVgSEGpDAlww== -"@esbuild/android-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" - integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== - "@esbuild/android-x64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.7.tgz#fa294ed5214d88219d519e0ab1bbb0253a89b864" integrity sha512-jhINx8DEjz68cChFvM72YzrqfwJuFbfvSxZAk4bebpngGfNNRm+zRl4rtT9oAX6N9b6gBcFaJHFew5Blf6CvUw== -"@esbuild/darwin-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" - integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== - "@esbuild/darwin-arm64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.7.tgz#e24d2ed545749ff251eabe8bce11fefa688892d3" integrity sha512-dr81gbmWN//3ZnBIm6YNCl4p3pjnabg1/ZVOgz2fJoUO1a3mq9WQ/1iuEluMs7mCL+Zwv7AY5e3g1hjXqQZ9Iw== -"@esbuild/darwin-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" - integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== - "@esbuild/darwin-x64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.7.tgz#02d1f8a572874c90d8f55dde8a859e5145bd06f6" integrity sha512-Lc0q5HouGlzQEwLkgEKnWcSazqr9l9OdV2HhVasWJzLKeOt0PLhHaUHuzb8s/UIya38DJDoUm74GToZ6Wc7NGQ== -"@esbuild/freebsd-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" - integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== - "@esbuild/freebsd-arm64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.7.tgz#bc6a69b9a7915da278f0a5ebaec069c813982c22" integrity sha512-+y2YsUr0CxDFF7GWiegWjGtTUF6gac2zFasfFkRJPkMAuMy9O7+2EH550VlqVdpEEchWMynkdhC9ZjtnMiHImQ== -"@esbuild/freebsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" - integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== - "@esbuild/freebsd-x64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.7.tgz#ec3708488625d70e565968ceea1355e7c8613865" integrity sha512-CdXOxIbIzPJmJhrpmJTLx+o35NoiKBIgOvmvT+jeSadYiWJn0vFKsl+0bSG/5lwjNHoIDEyMYc/GAPR9jxusTA== -"@esbuild/linux-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" - integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== - "@esbuild/linux-arm64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.7.tgz#8e04b66c306858f92d4f90f8222775270755e88a" integrity sha512-inHqdOVCkUhHNvuQPT1oCB7cWz9qQ/Cz46xmVe0b7UXcuIJU3166aqSunsqkgSGMtUCWOZw3+KMwI6otINuC9g== -"@esbuild/linux-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" - integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== - "@esbuild/linux-arm@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.7.tgz#12d5b65e089029ee1fe4c591b60969c9b1a85355" integrity sha512-Y+SCmWxsJOdQtjcBxoacn/pGW9HDZpwsoof0ttL+2vGcHokFlfqV666JpfLCSP2xLxFpF1lj7T3Ox3sr95YXww== -"@esbuild/linux-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" - integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== - "@esbuild/linux-ia32@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.7.tgz#01eabc2a3ad9039e115db650268e4f48f910dbe2" integrity sha512-2BbiL7nLS5ZO96bxTQkdO0euGZIUQEUXMTrqLxKUmk/Y5pmrWU84f+CMJpM8+EHaBPfFSPnomEaQiG/+Gmh61g== -"@esbuild/linux-loong64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" - integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== - "@esbuild/linux-loong64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.7.tgz#70681113632970e6a5766607bbdb98aa18cf4d5f" integrity sha512-BVFQla72KXv3yyTFCQXF7MORvpTo4uTA8FVFgmwVrqbB/4DsBFWilUm1i2Oq6zN36DOZKSVUTb16jbjedhfSHw== -"@esbuild/linux-mips64el@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" - integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== - "@esbuild/linux-mips64el@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.7.tgz#f63c022a71a3d70c482d1943a27cb8997021e230" integrity sha512-DzAYckIaK+pS31Q/rGpvUKu7M+5/t+jI+cdleDgUwbU7KdG2eC3SUbZHlo6Q4P1CfVKZ1lUERRFP8+q0ob9i2w== -"@esbuild/linux-ppc64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" - integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== - "@esbuild/linux-ppc64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.7.tgz#614eafd08b0c50212f287b948b3c08d6e60f221f" integrity sha512-JQ1p0SmUteNdUaaiRtyS59GkkfTW0Edo+e0O2sihnY4FoZLz5glpWUQEKMSzMhA430ctkylkS7+vn8ziuhUugQ== -"@esbuild/linux-riscv64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" - integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== - "@esbuild/linux-riscv64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.7.tgz#31d3b63f92f65968268a8e61ba59872538e80e88" integrity sha512-xGwVJ7eGhkprY/nB7L7MXysHduqjpzUl40+XoYDGC4UPLbnG+gsyS1wQPJ9lFPcxYAaDXbdRXd1ACs9AE9lxuw== -"@esbuild/linux-s390x@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" - integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== - "@esbuild/linux-s390x@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.7.tgz#be94974e0caa0783ae05f9477fd7170b9ac29cb0" integrity sha512-U8Rhki5PVU0L0nvk+E8FjkV8r4Lh4hVEb9duR6Zl21eIEYEwXz8RScj4LZWA2i3V70V4UHVgiqMpszXvG0Yqhg== -"@esbuild/linux-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" - integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== - "@esbuild/linux-x64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.7.tgz#84e8018a913dd4ecee954623e395984aef3d0007" integrity sha512-ZYZopyLhm4mcoZXjFt25itRlocKlcazDVkB4AhioiL9hOWhDldU9n38g62fhOI4Pth6vp+Mrd5rFKxD0/S+7aQ== -"@esbuild/netbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" - integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== - "@esbuild/netbsd-x64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.7.tgz#98898ba8800374c9df9bb182ca4f69fcecaf4411" integrity sha512-/yfjlsYmT1O3cum3J6cmGG16Fd5tqKMcg5D+sBYLaOQExheAJhqr8xOAEIuLo8JYkevmjM5zFD9rVs3VBcsjtQ== -"@esbuild/openbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" - integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== - "@esbuild/openbsd-x64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.7.tgz#46dc4eda2adb51f16361b1ad10e9b3f4938c4573" integrity sha512-MYDFyV0EW1cTP46IgUJ38OnEY5TaXxjoDmwiTXPjezahQgZd+j3T55Ht8/Q9YXBM0+T9HJygrSRGV5QNF/YVDQ== -"@esbuild/sunos-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" - integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== - "@esbuild/sunos-x64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.7.tgz#1650d40dd88412ecc11490119cd23cbaf661a591" integrity sha512-JcPvgzf2NN/y6X3UUSqP6jSS06V0DZAV/8q0PjsZyGSXsIGcG110XsdmuWiHM+pno7/mJF6fjH5/vhUz/vA9fw== -"@esbuild/win32-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" - integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== - "@esbuild/win32-arm64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.7.tgz#e61de6c4eb204d83fd912f3ae6812cc8c7d32d25" integrity sha512-ZA0KSYti5w5toax5FpmfcAgu3ZNJxYSRm0AW/Dao5up0YV1hDVof1NvwLomjEN+3/GMtaWDI+CIyJOMTRSTdMw== -"@esbuild/win32-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" - integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== - "@esbuild/win32-ia32@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.7.tgz#3d9c159d42c67e37a433e44ef8217c661cb6f6d0" integrity sha512-CTOnijBKc5Jpk6/W9hQMMvJnsSYRYgveN6O75DTACCY18RA2nqka8dTZR+x/JqXCRiKk84+5+bRKXUSbbwsS0A== -"@esbuild/win32-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" - integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== - "@esbuild/win32-x64@0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.7.tgz#02c4446f802706098d8e6ee70cf2b7aba96ded0b" @@ -365,6 +277,13 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + "@jridgewell/gen-mapping@^0.3.0": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" @@ -418,6 +337,13 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@playwright/test@^1.40.0": + version "1.40.0" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.40.0.tgz#d06c506977dd7863aa16e07f2136351ecc1be6ed" + integrity sha512-PdW+kn4eV99iP5gxWNSDQCbhMaDVej+RXL5xr6t04nbKLCBwYtA046t7ofoczHOm8u6c+45hpDKQVZqtqwkeQg== + dependencies: + playwright "1.40.0" + "@polka/url@^1.0.0-next.20": version "1.0.0-next.23" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.23.tgz#498e41218ab3b6a1419c735e5c6ae2c5ed609b6c" @@ -444,6 +370,71 @@ estree-walker "^2.0.2" picomatch "^2.3.1" +"@rollup/rollup-android-arm-eabi@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.5.1.tgz#11bea66c013e5a88a0f53f315b2d49cfd663584e" + integrity sha512-YaN43wTyEBaMqLDYeze+gQ4ZrW5RbTEGtT5o1GVDkhpdNcsLTnLRcLccvwy3E9wiDKWg9RIhuoy3JQKDRBfaZA== + +"@rollup/rollup-android-arm64@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.5.1.tgz#cae505492204c018d1c6335f3b845319b15dc669" + integrity sha512-n1bX+LCGlQVuPlCofO0zOKe1b2XkFozAVRoczT+yxWZPGnkEAKTTYVOGZz8N4sKuBnKMxDbfhUsB1uwYdup/sw== + +"@rollup/rollup-darwin-arm64@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.5.1.tgz#5442ca442fca1a166e41e03b983b2f3e3235c17c" + integrity sha512-QqJBumdvfBqBBmyGHlKxje+iowZwrHna7pokj/Go3dV1PJekSKfmjKrjKQ/e6ESTGhkfPNLq3VXdYLAc+UtAQw== + +"@rollup/rollup-darwin-x64@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.5.1.tgz#e5140b0aaab0ea1424a4c8a1e76442105866290c" + integrity sha512-RrkDNkR/P5AEQSPkxQPmd2ri8WTjSl0RYmuFOiEABkEY/FSg0a4riihWQGKDJ4LnV9gigWZlTMx2DtFGzUrYQw== + +"@rollup/rollup-linux-arm-gnueabihf@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.5.1.tgz#501a336b1dc4cb350a1b8b4e24bba4d049902d74" + integrity sha512-ZFPxvUZmE+fkB/8D9y/SWl/XaDzNSaxd1TJUSE27XAKlRpQ2VNce/86bGd9mEUgL3qrvjJ9XTGwoX0BrJkYK/A== + +"@rollup/rollup-linux-arm64-gnu@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.5.1.tgz#bdb0c8552d167477d2624a4a6df0f71f128dc546" + integrity sha512-FEuAjzVIld5WVhu+M2OewLmjmbXWd3q7Zcx+Rwy4QObQCqfblriDMMS7p7+pwgjZoo9BLkP3wa9uglQXzsB9ww== + +"@rollup/rollup-linux-arm64-musl@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.5.1.tgz#f7e8036c2f771bb366ca0d8c79d2132cffb1d295" + integrity sha512-f5Gs8WQixqGRtI0Iq/cMqvFYmgFzMinuJO24KRfnv7Ohi/HQclwrBCYkzQu1XfLEEt3DZyvveq9HWo4bLJf1Lw== + +"@rollup/rollup-linux-x64-gnu@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.5.1.tgz#079ca543a649b1dcf9832a34dff94ebb46c96745" + integrity sha512-CWPkPGrFfN2vj3mw+S7A/4ZaU3rTV7AkXUr08W9lNP+UzOvKLVf34tWCqrKrfwQ0NTk5GFqUr2XGpeR2p6R4gw== + +"@rollup/rollup-linux-x64-musl@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.5.1.tgz#9cc8c0ea1c0e0d3b18888d5b2fd51ef6c9b42481" + integrity sha512-ZRETMFA0uVukUC9u31Ed1nx++29073goCxZtmZARwk5aF/ltuENaeTtRVsSQzFlzdd4J6L3qUm+EW8cbGt0CKQ== + +"@rollup/rollup-win32-arm64-msvc@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.5.1.tgz#df70597f6639549e79f0801004525d6a7a0075e4" + integrity sha512-ihqfNJNb2XtoZMSCPeoo0cYMgU04ksyFIoOw5S0JUVbOhafLot+KD82vpKXOurE2+9o/awrqIxku9MRR9hozHQ== + +"@rollup/rollup-win32-ia32-msvc@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.5.1.tgz#6f9e8b30a4d6b5c564bfe55cdf44a5b493139838" + integrity sha512-zK9MRpC8946lQ9ypFn4gLpdwr5a01aQ/odiIJeL9EbgZDMgbZjjT/XzTqJvDfTmnE1kHdbG20sAeNlpc91/wbg== + +"@rollup/rollup-win32-x64-msvc@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.5.1.tgz#0e79117bacb5817ff9a88ab19cb59df839638d6d" + integrity sha512-5I3Nz4Sb9TYOtkRwlH0ow+BhMH2vnh38tZ4J4mggE48M/YyJyp/0sPSxhw1UeS1+oBgQ8q7maFtSeKpeRJu41Q== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + "@sveltejs/adapter-auto@^2.0.0": version "2.1.1" resolved "https://registry.yarnpkg.com/@sveltejs/adapter-auto/-/adapter-auto-2.1.1.tgz#e055c71bdb8d2923d63db089752675f70ab1a0f3" @@ -482,6 +473,13 @@ dependencies: debug "^4.3.4" +"@sveltejs/vite-plugin-svelte-inspector@^2.0.0-next.0 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.0.0.tgz#365afaa0dd63517838ce4686a3dc3982be348a9b" + integrity sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg== + dependencies: + debug "^4.3.4" + "@sveltejs/vite-plugin-svelte@^2.5.0": version "2.5.2" resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.2.tgz#de9e9cab3d9614407788702514bc57258a3cac77" @@ -495,6 +493,19 @@ svelte-hmr "^0.15.3" vitefu "^0.2.4" +"@sveltejs/vite-plugin-svelte@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.0.1.tgz#475d3496a2a1c7fb4ec6ee3a4d3f0af01fb052e1" + integrity sha512-CGURX6Ps+TkOovK6xV+Y2rn8JKa8ZPUHPZ/NKgCxAmgBrXReavzFl8aOSCj3kQ1xqT7yGJj53hjcV/gqwDAaWA== + dependencies: + "@sveltejs/vite-plugin-svelte-inspector" "^2.0.0-next.0 || ^2.0.0" + debug "^4.3.4" + deepmerge "^4.3.1" + kleur "^4.1.5" + magic-string "^0.30.5" + svelte-hmr "^0.15.3" + vitefu "^0.2.5" + "@swagger-api/apidom-ast@^0.83.0": version "0.83.0" resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ast/-/apidom-ast-0.83.0.tgz#561b9f9b676270c67064c17c915e060275d3a55b" @@ -850,6 +861,49 @@ "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1" "^0.83.0" "@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.83.0" +"@testing-library/dom@^9.3.1": + version "9.3.3" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.3.tgz#108c23a5b0ef51121c26ae92eb3179416b0434f5" + integrity sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/svelte@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@testing-library/svelte/-/svelte-4.0.5.tgz#a93b105fe8327b471f5dfb208a37c7b41c90d205" + integrity sha512-P7X3mpYv/My4hBZfxVxTFV5KcA+EoWfRCguWP7WQdYj6HMdg/L+LiwG4ocvLe+hupedrC7dwcy85JlxKplJp2g== + dependencies: + "@testing-library/dom" "^9.3.1" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + +"@types/chai-subset@^1.3.3": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.5.tgz#3fc044451f26985f45625230a7f22284808b0a9a" + integrity sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.3.5": + version "4.3.11" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.11.tgz#e95050bf79a932cb7305dd130254ccdf9bde671c" + integrity sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ== + "@types/cookie@^0.5.1": version "0.5.4" resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.5.4.tgz#7e70a20cd695bc48d46b08c2505874cd68b760e0" @@ -880,6 +934,13 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== +"@types/node@*": + version "20.9.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.4.tgz#cc8f970e869c26834bdb7ed480b30ede622d74c7" + integrity sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA== + dependencies: + undici-types "~5.26.4" + "@types/prop-types@*": version "15.7.11" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" @@ -1021,21 +1082,94 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@vitest/expect@0.34.6": + version "0.34.6" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-0.34.6.tgz#608a7b7a9aa3de0919db99b4cc087340a03ea77e" + integrity sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw== + dependencies: + "@vitest/spy" "0.34.6" + "@vitest/utils" "0.34.6" + chai "^4.3.10" + +"@vitest/runner@0.34.6": + version "0.34.6" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-0.34.6.tgz#6f43ca241fc96b2edf230db58bcde5b974b8dcaf" + integrity sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ== + dependencies: + "@vitest/utils" "0.34.6" + p-limit "^4.0.0" + pathe "^1.1.1" + +"@vitest/snapshot@0.34.6": + version "0.34.6" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-0.34.6.tgz#b4528cf683b60a3e8071cacbcb97d18b9d5e1d8b" + integrity sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w== + dependencies: + magic-string "^0.30.1" + pathe "^1.1.1" + pretty-format "^29.5.0" + +"@vitest/spy@0.34.6": + version "0.34.6" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-0.34.6.tgz#b5e8642a84aad12896c915bce9b3cc8cdaf821df" + integrity sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ== + dependencies: + tinyspy "^2.1.1" + +"@vitest/ui@^0.34.6": + version "0.34.6" + resolved "https://registry.yarnpkg.com/@vitest/ui/-/ui-0.34.6.tgz#86a9d58d1514aaea6a4b27ddd3c430646afca488" + integrity sha512-/fxnCwGC0Txmr3tF3BwAbo3v6U2SkBTGR9UB8zo0Ztlx0BTOXHucE0gDHY7SjwEktCOHatiGmli9kZD6gYSoWQ== + dependencies: + "@vitest/utils" "0.34.6" + fast-glob "^3.3.0" + fflate "^0.8.0" + flatted "^3.2.7" + pathe "^1.1.1" + picocolors "^1.0.0" + sirv "^2.0.3" + +"@vitest/utils@0.34.6": + version "0.34.6" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-0.34.6.tgz#38a0a7eedddb8e7291af09a2409cb8a189516968" + integrity sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A== + dependencies: + diff-sequences "^29.4.3" + loupe "^2.3.6" + pretty-format "^29.5.0" + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" + integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== + acorn@^8.10.0, acorn@^8.9.0: version "8.11.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1051,6 +1185,13 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -1058,6 +1199,11 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -1078,6 +1224,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + aria-query@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" @@ -1085,11 +1238,24 @@ aria-query@^5.3.0: dependencies: dequal "^2.0.3" +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1107,6 +1273,11 @@ autolinker@^3.11.0: dependencies: tslib "^2.3.0" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + axios@^1.4.0: version "1.6.2" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" @@ -1187,7 +1358,12 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -call-bind@^1.0.0, call-bind@^1.0.5: +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== @@ -1201,7 +1377,29 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -chalk@^4.0.0, chalk@^4.1.2: +chai@^4.3.10: + version "4.3.10" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" + integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.0.8" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1209,6 +1407,11 @@ chalk@^4.0.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + character-entities-legacy@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" @@ -1224,6 +1427,13 @@ character-reference-invalid@^1.0.0: resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + "chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -1276,6 +1486,13 @@ code-red@^1.0.3: estree-walker "^3.0.3" periscopic "^3.1.0" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -1283,6 +1500,11 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -1339,7 +1561,7 @@ css-tree@^2.3.1: mdn-data "2.0.30" source-map-js "^1.0.1" -css.escape@1.5.1: +css.escape@1.5.1, css.escape@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== @@ -1349,6 +1571,13 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +cssstyle@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" + integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg== + dependencies: + rrweb-cssom "^0.6.0" + csstype@^3.0.2: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" @@ -1362,13 +1591,27 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" -debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +data-urls@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" + integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.0" + +debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +decimal.js@^10.4.3: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -1376,6 +1619,37 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" +deep-eql@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" + +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deep-extend@0.6.0, deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -1391,7 +1665,7 @@ deepmerge@^4.2.2, deepmerge@^4.3.1, deepmerge@~4.3.0: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -define-data-property@^1.1.1: +define-data-property@^1.0.1, define-data-property@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== @@ -1400,6 +1674,15 @@ define-data-property@^1.1.1: gopd "^1.0.1" has-property-descriptors "^1.0.0" +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1425,6 +1708,11 @@ devalue@^4.3.1: resolved "https://registry.yarnpkg.com/devalue/-/devalue-4.3.2.tgz#cc44e4cf3872ac5a78229fbce3b77e57032727b5" integrity sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg== +diff-sequences@^29.4.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1439,6 +1727,23 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-accessibility-api@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + dompurify@=3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.6.tgz#925ebd576d54a9531b5d76f0a5bef32548351dae" @@ -1456,6 +1761,26 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: version "0.10.62" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" @@ -1497,35 +1822,7 @@ es6-weak-map@^2.0.3: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -esbuild@^0.18.10: - version "0.18.20" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" - integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== - optionalDependencies: - "@esbuild/android-arm" "0.18.20" - "@esbuild/android-arm64" "0.18.20" - "@esbuild/android-x64" "0.18.20" - "@esbuild/darwin-arm64" "0.18.20" - "@esbuild/darwin-x64" "0.18.20" - "@esbuild/freebsd-arm64" "0.18.20" - "@esbuild/freebsd-x64" "0.18.20" - "@esbuild/linux-arm" "0.18.20" - "@esbuild/linux-arm64" "0.18.20" - "@esbuild/linux-ia32" "0.18.20" - "@esbuild/linux-loong64" "0.18.20" - "@esbuild/linux-mips64el" "0.18.20" - "@esbuild/linux-ppc64" "0.18.20" - "@esbuild/linux-riscv64" "0.18.20" - "@esbuild/linux-s390x" "0.18.20" - "@esbuild/linux-x64" "0.18.20" - "@esbuild/netbsd-x64" "0.18.20" - "@esbuild/openbsd-x64" "0.18.20" - "@esbuild/sunos-x64" "0.18.20" - "@esbuild/win32-arm64" "0.18.20" - "@esbuild/win32-ia32" "0.18.20" - "@esbuild/win32-x64" "0.18.20" - -esbuild@^0.19.2: +esbuild@^0.19.2, esbuild@^0.19.3: version "0.19.7" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.7.tgz#b9a7235097b81278dcf090e2532ed13c95a2ee84" integrity sha512-6brbTZVqxhqgbpqBR5MzErImcpA0SQdoKOkcWK/U30HtQxnokIpG3TX2r0IJqbFUzqLjhU/zC1S5ndgakObVCQ== @@ -1553,6 +1850,11 @@ esbuild@^0.19.2: "@esbuild/win32-ia32" "0.19.7" "@esbuild/win32-x64" "0.19.7" +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -1718,7 +2020,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.7, fast-glob@^3.2.9: +fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -1758,6 +2060,11 @@ fault@^1.0.0: dependencies: format "^0.2.0" +fflate@^0.8.0: + version "0.8.1" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.1.tgz#1ed92270674d2ad3c73f077cd0acf26486dae6c9" + integrity sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ== + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -1796,7 +2103,7 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.2.9: +flatted@^3.2.7, flatted@^3.2.9: version "3.2.9" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== @@ -1806,6 +2113,13 @@ follow-redirects@^1.15.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -1840,7 +2154,12 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: +fsevents@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -1850,7 +2169,17 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== @@ -1937,6 +2266,16 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +has-bigints@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -1954,11 +2293,18 @@ has-proto@^1.0.1: resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== -has-symbols@^1.0.3: +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + hasown@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" @@ -1994,6 +2340,37 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: dependencies: react-is "^16.7.0" +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -2032,6 +2409,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2050,6 +2432,15 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +internal-slot@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + intl-messageformat@^10.5.3: version "10.5.8" resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.8.tgz#7184da425f360a53a5483a6194e16d666b011fc0" @@ -2080,6 +2471,30 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -2087,6 +2502,26 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-decimal@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" @@ -2114,6 +2549,18 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -2129,6 +2576,11 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-promise@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" @@ -2141,6 +2593,60 @@ is-reference@^3.0.0, is-reference@^3.0.1: dependencies: "@types/estree" "*" +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-wsl@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -2163,7 +2669,7 @@ js-file-download@^0.4.12: resolved "https://registry.yarnpkg.com/js-file-download/-/js-file-download-0.4.12.tgz#10c70ef362559a5b23cdbdc3bd6f399c3d91d821" integrity sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg== -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -2175,6 +2681,35 @@ js-yaml@=4.1.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsdom@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-22.1.0.tgz#0fca6d1a37fbeb7f4aac93d1090d782c56b611c8" + integrity sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw== + dependencies: + abab "^2.0.6" + cssstyle "^3.0.0" + data-urls "^4.0.0" + decimal.js "^10.4.3" + domexception "^4.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.4" + parse5 "^7.1.2" + rrweb-cssom "^0.6.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.1" + ws "^8.13.0" + xml-name-validator "^4.0.0" + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -2200,6 +2735,11 @@ json-stable-stringify@^1.0.2: jsonify "^0.0.1" object-keys "^1.1.1" +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -2251,6 +2791,11 @@ lilconfig@^2.0.5: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== +local-pkg@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" + integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== + locate-character@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-3.0.0.tgz#0305c5b8744f61028ef5d01f444009e00779f974" @@ -2263,6 +2808,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash.debounce@^4: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -2285,6 +2835,13 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + lowlight@^1.17.0: version "1.20.0" resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" @@ -2307,6 +2864,11 @@ lru-queue@^0.1.0: dependencies: es5-ext "~0.10.2" +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + magic-string@^0.27.0: version "0.27.0" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" @@ -2314,7 +2876,7 @@ magic-string@^0.27.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" -magic-string@^0.30.0, magic-string@^0.30.3, magic-string@^0.30.4: +magic-string@^0.30.0, magic-string@^0.30.1, magic-string@^0.30.3, magic-string@^0.30.4, magic-string@^0.30.5: version "0.30.5" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== @@ -2370,7 +2932,7 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -min-indent@^1.0.0: +min-indent@^1.0.0, min-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== @@ -2413,6 +2975,16 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" +mlly@^1.2.0, mlly@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.4.2.tgz#7cf406aa319ff6563d25da6b36610a93f2a8007e" + integrity sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg== + dependencies: + acorn "^8.10.0" + pathe "^1.1.1" + pkg-types "^1.0.3" + ufo "^1.3.0" + mri@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" @@ -2483,6 +3055,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +nwsapi@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -2493,11 +3070,29 @@ object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2537,6 +3132,13 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -2563,6 +3165,13 @@ parse-entities@^2.0.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" +parse5@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + patch-package@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" @@ -2604,6 +3213,16 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^1.1.0, pathe@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" + integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + periscopic@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" @@ -2623,6 +3242,29 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pkg-types@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" + integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== + dependencies: + jsonc-parser "^3.2.0" + mlly "^1.2.0" + pathe "^1.1.0" + +playwright-core@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.40.0.tgz#82f61e5504cb3097803b6f8bbd98190dd34bdf14" + integrity sha512-fvKewVJpGeca8t0ipM56jkVSU6Eo0RmFvQ/MaCQNDYm+sdvKkMBBWTE1FdeMqIdumRaXXjZChWHvIzCGM/tA/Q== + +playwright@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.40.0.tgz#2a1824b9fe5c4fe52ed53db9ea68003543a99df0" + integrity sha512-gyHAgQjiDf1m34Xpwzaqb76KgfzYrhK7iih+2IzcOCoZWr/8ZqmdBw+t0RU85ZmfJMgtgAiNtBQ/KS2325INXw== + dependencies: + playwright-core "1.40.0" + optionalDependencies: + fsevents "2.3.2" + postcss-load-config@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" @@ -2649,7 +3291,7 @@ postcss-selector-parser@^6.0.11: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss@^8.4.27, postcss@^8.4.29, postcss@^8.4.5: +postcss@^8.4.29, postcss@^8.4.31, postcss@^8.4.5: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -2691,6 +3333,24 @@ prettier@^3.0.0: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e" integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^29.5.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + prismjs@^1.27.0: version "1.29.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" @@ -2727,6 +3387,11 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -2735,7 +3400,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -2839,6 +3504,11 @@ react-is@^16.13.1, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-is@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" @@ -2891,6 +3561,14 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +redent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-4.0.0.tgz#0c0ba7caabb24257ab3bb7a4fd95dd1d5c5681f9" + integrity sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag== + dependencies: + indent-string "^5.0.0" + strip-indent "^4.0.0" + redux-immutable@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/redux-immutable/-/redux-immutable-4.0.0.tgz#3a1a32df66366462b63691f0e1dc35e472bbc9f3" @@ -2917,6 +3595,15 @@ regenerator-runtime@^0.14.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== +regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + remarkable@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-2.0.1.tgz#280ae6627384dfb13d98ee3995627ca550a12f31" @@ -2969,13 +3656,30 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rollup@^3.27.1: - version "3.29.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" - integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== +rollup@^4.2.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.5.1.tgz#95661ead5373d46e1c91b38fc1549bc59fc72aa4" + integrity sha512-0EQribZoPKpb5z1NW/QYm3XSR//Xr8BeEXU49Lc/mQmpmVVG5jPUVrpc2iptup/0WMrY9mzas0fxH+TjYvG2CA== optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.5.1" + "@rollup/rollup-android-arm64" "4.5.1" + "@rollup/rollup-darwin-arm64" "4.5.1" + "@rollup/rollup-darwin-x64" "4.5.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.5.1" + "@rollup/rollup-linux-arm64-gnu" "4.5.1" + "@rollup/rollup-linux-arm64-musl" "4.5.1" + "@rollup/rollup-linux-x64-gnu" "4.5.1" + "@rollup/rollup-linux-x64-musl" "4.5.1" + "@rollup/rollup-win32-arm64-msvc" "4.5.1" + "@rollup/rollup-win32-ia32-msvc" "4.5.1" + "@rollup/rollup-win32-x64-msvc" "4.5.1" fsevents "~2.3.2" +rrweb-cssom@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" + integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -2995,6 +3699,11 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + sander@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" @@ -3014,6 +3723,13 @@ sass@^1.69.5: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" @@ -3051,6 +3767,15 @@ set-function-length@^1.1.1: gopd "^1.0.1" has-property-descriptors "^1.0.0" +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + sha.js@^2.4.11: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -3085,6 +3810,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -3099,7 +3829,7 @@ simple-get@^4.0.0: once "^1.3.1" simple-concat "^1.0.0" -sirv@^2.0.2: +sirv@^2.0.2, sirv@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.3.tgz#ca5868b87205a74bef62a469ed0296abceccd446" integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== @@ -3143,11 +3873,28 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + stampit@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/stampit/-/stampit-4.3.2.tgz#cfd3f607dd628a161ce6305621597994b4d56573" integrity sha512-pE2org1+ZWQBnIxRPrBM2gVupkuDD0TTNIo1H6GdT/vO82NXli2z8lRE8cu/nBIHrcOCXFBAHpb9ZldrB2/qOA== +std-env@^3.3.3: + version "3.5.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.5.0.tgz#83010c9e29bd99bf6f605df87c19012d82d63b97" + integrity sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -3169,6 +3916,13 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" +strip-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853" + integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== + dependencies: + min-indent "^1.0.1" + strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -3179,6 +3933,20 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strip-literal@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.3.0.tgz#db3942c2ec1699e6836ad230090b84bb458e3a07" + integrity sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg== + dependencies: + acorn "^8.10.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -3330,6 +4098,11 @@ swagger-ui@^5.10.0: xml-but-prettier "^1.0.1" zenscroll "^4.0.2" +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + tar-fs@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" @@ -3372,6 +4145,21 @@ tiny-glob@^0.2.9: globalyzer "0.1.0" globrex "^0.1.2" +tinybench@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.5.1.tgz#3408f6552125e53a5a48adee31261686fd71587e" + integrity sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg== + +tinypool@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.7.0.tgz#88053cc99b4a594382af23190c609d93fddf8021" + integrity sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww== + +tinyspy@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.0.tgz#9dc04b072746520b432f77ea2c2d17933de5d6ce" + integrity sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -3396,6 +4184,23 @@ totalist@^3.0.0: resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== +tough-cookie@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== + dependencies: + punycode "^2.3.0" + traverse@~0.6.6: version "0.6.7" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe" @@ -3452,6 +4257,11 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-detect@^4.0.0, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -3479,6 +4289,16 @@ typescript@^5.0.0, typescript@^5.0.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43" integrity sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ== +ufo@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496" + integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + undici@^5.24.0: version "5.27.2" resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411" @@ -3493,6 +4313,11 @@ undici@~5.26.2: dependencies: "@fastify/busboy" "^2.0.0" +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" @@ -3510,7 +4335,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-parse@^1.5.10: +url-parse@^1.5.10, url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -3528,22 +4353,83 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -vite@^4.4.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" - integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== +vite-node@0.34.6: + version "0.34.6" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.34.6.tgz#34d19795de1498562bf21541a58edcd106328a17" + integrity sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA== dependencies: - esbuild "^0.18.10" - postcss "^8.4.27" - rollup "^3.27.1" - optionalDependencies: - fsevents "~2.3.2" + cac "^6.7.14" + debug "^4.3.4" + mlly "^1.4.0" + pathe "^1.1.1" + picocolors "^1.0.0" + vite "^3.0.0 || ^4.0.0 || ^5.0.0-0" -vitefu@^0.2.4: +"vite@^3.0.0 || ^4.0.0 || ^5.0.0-0", "vite@^3.1.0 || ^4.0.0 || ^5.0.0-0", vite@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.2.tgz#3c94627dace83b9bf04b64eaf618038e30fb95c0" + integrity sha512-6CCq1CAJCNM1ya2ZZA7+jS2KgnhbzvxakmlIjN24cF/PXhRMzpM/z8QgsVJA/Dm5fWUWnVEsmtBoMhmerPxT0g== + dependencies: + esbuild "^0.19.3" + postcss "^8.4.31" + rollup "^4.2.0" + optionalDependencies: + fsevents "~2.3.3" + +vitefu@^0.2.4, vitefu@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.5.tgz#c1b93c377fbdd3e5ddd69840ea3aa70b40d90969" integrity sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q== +vitest-dom@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/vitest-dom/-/vitest-dom-0.1.1.tgz#a8e44a2662e557d86b84c916f62d9ce4b2eb90b1" + integrity sha512-n/bonR2hcRHCE5hlzG/P0yTXTUXx/gPtsaeUWP86ADfwo/+dHDpnTTV14qY7+kevsUbOZFYECu77MXY7AA0QSA== + dependencies: + aria-query "^5.3.0" + chalk "^5.3.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.6.1" + lodash-es "^4.17.21" + redent "^4.0.0" + +vitest@^0.34.6: + version "0.34.6" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.34.6.tgz#44880feeeef493c04b7f795ed268f24a543250d7" + integrity sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q== + dependencies: + "@types/chai" "^4.3.5" + "@types/chai-subset" "^1.3.3" + "@types/node" "*" + "@vitest/expect" "0.34.6" + "@vitest/runner" "0.34.6" + "@vitest/snapshot" "0.34.6" + "@vitest/spy" "0.34.6" + "@vitest/utils" "0.34.6" + acorn "^8.9.0" + acorn-walk "^8.2.0" + cac "^6.7.14" + chai "^4.3.10" + debug "^4.3.4" + local-pkg "^0.4.3" + magic-string "^0.30.1" + pathe "^1.1.1" + picocolors "^1.0.0" + std-env "^3.3.3" + strip-literal "^1.0.1" + tinybench "^2.5.0" + tinypool "^0.7.0" + vite "^3.1.0 || ^4.0.0 || ^5.0.0-0" + vite-node "0.34.6" + why-is-node-running "^2.2.2" + +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + web-streams-polyfill@^3.0.3: version "3.2.1" resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" @@ -3554,6 +4440,63 @@ web-tree-sitter@=0.20.3: resolved "https://registry.yarnpkg.com/web-tree-sitter/-/web-tree-sitter-0.20.3.tgz#3dd17b283ad63b1d8c07c5ea814f0fefb2b1f776" integrity sha512-zKGJW9r23y3BcJusbgvnOH2OYAW40MXAOi9bi3Gcc7T4Gms9WWgXF8m6adsJWpGJEhgOzCrfiz1IzKowJWrtYw== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^12.0.0, whatwg-url@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-12.0.1.tgz#fd7bcc71192e7c3a2a97b9a8d6b094853ed8773c" + integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.11, which-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -3561,11 +4504,24 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +why-is-node-running@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" + integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@^8.13.0: + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== + xml-but-prettier@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/xml-but-prettier/-/xml-but-prettier-1.0.1.tgz#f5a33267ed42ccd4e355c62557a5e39b01fb40f3" @@ -3573,11 +4529,21 @@ xml-but-prettier@^1.0.1: dependencies: repeat-string "^1.5.2" +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + xml@=1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -3603,6 +4569,11 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + zenscroll@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/zenscroll/-/zenscroll-4.0.2.tgz#e8d5774d1c0738a47bcfa8729f3712e2deddeb25" -- 2.45.2 From e9461cee3d2d6b787ef71bec54e7c57c88a2a23a Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Thu, 23 Nov 2023 02:14:12 +0100 Subject: [PATCH 022/114] Lint files --- .github/workflows/workflow.yml | 2 +- src/routes/+layout.svelte | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 2f28824..8c672af 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -64,7 +64,7 @@ jobs: - name: Run linter run: yarn lint - name: Run vitest tests - run: yarn vitest run --reporter=json + run: yarn vitest run --reporter=json - name: Install Playwright Browsers run: npx playwright install --with-deps - name: Run Playwright tests diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 66781f7..df4e0de 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -62,16 +62,16 @@ {#if !$isLoading} - - {getFlagEmoji($locale)} {languageNames[$locale]} - - {#each $locales as locale} - {getFlagEmoji(locale)} {languageNames[locale]} - {/each} - - + + {getFlagEmoji($locale)} {languageNames[$locale]} + + {#each $locales as locale} + {getFlagEmoji(locale)} {languageNames[locale]} + {/each} + + {/if} -- 2.45.2 From 98f6deb2533cde5f4014b48dd6502bb35c97e486 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Thu, 23 Nov 2023 02:35:09 +0100 Subject: [PATCH 023/114] Add mock api and test reporting --- playwright.config.ts | 1 + tests/test.ts | 62 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/playwright.config.ts b/playwright.config.ts index 65eadc0..d60d61c 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -9,6 +9,7 @@ const config: PlaywrightTestConfig = { command: 'npm run build && npm run preview', port: 4173 }, + reporter: process.env.CI ? 'github' : 'list', testDir: 'tests', testMatch: /(.+\.)?(test|spec)\.[jt]s/ }; diff --git a/tests/test.ts b/tests/test.ts index 75b2579..548435e 100644 --- a/tests/test.ts +++ b/tests/test.ts @@ -1,5 +1,67 @@ import { expect, test } from '@playwright/test'; +test.beforeEach(async ({ page }) => { + await page.route('*/**/api/status', async (route) => { + const json = { + currentScreen: 0, + numScreens: 7, + timerRunning: true, + espUptime: 4479, + espFreeHeap: 58508, + espHeapSize: 342108, + connectionStatus: { price: true, blocks: true }, + rssi: -66, + data: ['BLOCK/HEIGHT', '8', '1', '8', '0', '2', '6'], + rendered: ['BLOCK/HEIGHT', '8', '1', '8', '0', '2', '6'], + leds: [ + { red: 0, green: 0, blue: 0, hex: '#000000' }, + { red: 0, green: 0, blue: 0, hex: '#000000' }, + { red: 0, green: 0, blue: 0, hex: '#000000' }, + { red: 0, green: 0, blue: 0, hex: '#000000' } + ] + }; + await route.fulfill({ json }); + }); + await page.route('*/**/api/settings', async (route) => { + const json = { + numScreens: 7, + fgColor: 415029, + bgColor: 0, + timerSeconds: 1800, + timerRunning: true, + minSecPriceUpd: 30, + fullRefreshMin: 60, + wpTimeout: 600, + tzOffset: 0, + useBitcoinNode: false, + mempoolInstance: 'mempool.space', + ledTestOnPower: true, + ledFlashOnUpd: true, + ledBrightness: 128, + stealFocus: true, + mcapBigChar: true, + mdnsEnabled: true, + otaEnabled: true, + fetchEurPrice: false, + hostnamePrefix: 'btclock', + hostname: 'btclock-d60b14', + ip: '192.168.20.231', + txPower: 78, + gitRev: '25d8b92bcbc8938417c140355ea3ba99ff9eb4b7', + lastBuildTime: '1700666677', + screens: [ + { id: 0, name: 'Block Height', enabled: true }, + { id: 1, name: 'Sats per dollar', enabled: true }, + { id: 2, name: 'Ticker', enabled: true }, + { id: 3, name: 'Time', enabled: true }, + { id: 4, name: 'Halving countdown', enabled: true }, + { id: 5, name: 'Market Cap', enabled: true } + ] + }; + await route.fulfill({ json }); + }); +}); + test('index page has expected status', async ({ page }) => { await page.goto('/'); await expect(page.getByRole('heading', { name: 'Status' })).toBeVisible(); -- 2.45.2 From ee6981656992f69f3bca069b837ba06693a1972d Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Thu, 23 Nov 2023 02:41:58 +0100 Subject: [PATCH 024/114] Test reporting fix --- .github/workflows/workflow.yml | 7 ------- package.json | 3 ++- vite.config.ts | 5 +++-- yarn.lock | 35 +++++++++++++++++++++++++++++++++- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 8c672af..96f3b21 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -69,15 +69,8 @@ jobs: run: npx playwright install --with-deps - name: Run Playwright tests run: npx playwright test - - uses: actions/upload-artifact@v3 - if: always() - with: - name: playwright-report - path: playwright-report/ - retention-days: 30 - name: Build WebUI run: yarn build - - name: Get current block id: getBlockHeight run: echo "blockHeight=$(curl -s https://mempool.space/api/blocks/tip/height)" >> $GITHUB_OUTPUT diff --git a/package.json b/package.json index 859d129..5d332e6 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,8 @@ "typescript": "^5.0.0", "vite": "^5.0.2", "vitest": "^0.34.6", - "vitest-dom": "^0.1.1" + "vitest-dom": "^0.1.1", + "vitest-github-actions-reporter": "^0.11.0" }, "type": "module", "dependencies": { diff --git a/vite.config.ts b/vite.config.ts index 7773082..1e4707c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,6 @@ import { sveltekit } from '@sveltejs/kit/vite'; -//import { defineConfig } from 'vite'; import { defineConfig } from 'vitest/config'; +import GithubActionsReporter from 'vitest-github-actions-reporter'; import * as fs from 'fs'; import * as path from 'path'; @@ -73,6 +73,7 @@ export default defineConfig({ test: { include: ['src/**/*.{test,spec}.{js,ts}'], globals: true, - environment: 'jsdom' + environment: 'jsdom', + reporters: process.env.GITHUB_ACTIONS ? ['default', new GithubActionsReporter()] : 'default' } }); diff --git a/yarn.lock b/yarn.lock index 79d8ad5..202748b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,22 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== +"@actions/core@^1.10.0": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.10.1.tgz#61108e7ac40acae95ee36da074fa5850ca4ced8a" + integrity sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g== + dependencies: + "@actions/http-client" "^2.0.1" + uuid "^8.3.2" + +"@actions/http-client@^2.0.1": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.2.0.tgz#f8239f375be6185fcd07765efdcf0031ad5df1a0" + integrity sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg== + dependencies: + tunnel "^0.0.6" + undici "^5.25.4" + "@ampproject/remapping@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -4250,6 +4266,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -4299,7 +4320,7 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici@^5.24.0: +undici@^5.24.0, undici@^5.25.4: version "5.27.2" resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411" integrity sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ== @@ -4353,6 +4374,11 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + vite-node@0.34.6: version "0.34.6" resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.34.6.tgz#34d19795de1498562bf21541a58edcd106328a17" @@ -4393,6 +4419,13 @@ vitest-dom@^0.1.1: lodash-es "^4.17.21" redent "^4.0.0" +vitest-github-actions-reporter@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/vitest-github-actions-reporter/-/vitest-github-actions-reporter-0.11.0.tgz#7b6c4456d54c2805b24a157b45608cac798baf66" + integrity sha512-zvWOGyGmyZUIJ/veyRkfiMaiktZYfiBsRVdkOP0CiZDhQPZYhoFO/nFwBPn3LLIlBROFfLT+QjRtivocwuyPww== + dependencies: + "@actions/core" "^1.10.0" + vitest@^0.34.6: version "0.34.6" resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.34.6.tgz#44880feeeef493c04b7f795ed268f24a543250d7" -- 2.45.2 From 60360ef76b865b7d61dc0921fb52b5b3a1dd925e Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Thu, 23 Nov 2023 02:46:41 +0100 Subject: [PATCH 025/114] Vitest fix --- .github/workflows/workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 96f3b21..3f80740 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -64,7 +64,7 @@ jobs: - name: Run linter run: yarn lint - name: Run vitest tests - run: yarn vitest run --reporter=json + run: yarn vitest run - name: Install Playwright Browsers run: npx playwright install --with-deps - name: Run Playwright tests -- 2.45.2 From 2a50c76cc0af56f212ae858bad488424bf7c7f40 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sat, 25 Nov 2023 00:42:37 +0100 Subject: [PATCH 026/114] Write more tests --- .gitignore | 1 + src/lib/style/app.scss | 14 +++- src/routes/+layout.svelte | 2 +- src/routes/+page.svelte | 21 ++++-- src/routes/Rendered.svelte | 4 +- src/routes/Settings.svelte | 31 +++++++- src/routes/Status.svelte | 1 + tests/test.ts | 146 ++++++++++++++++++++++++++++++------- 8 files changed, 178 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index 5a5ed98..441fdc9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ dist vite.config.js.timestamp-* vite.config.ts.timestamp-* yarn-error.log +test-results/ \ No newline at end of file diff --git a/src/lib/style/app.scss b/src/lib/style/app.scss index 7a40989..5b996ef 100644 --- a/src/lib/style/app.scss +++ b/src/lib/style/app.scss @@ -80,7 +80,7 @@ nav { margin-bottom: 3px; } -#btcclock-wrapper { +#btclock-wrapper { margin: 0 auto; } @@ -158,8 +158,16 @@ nav { font-size: 3rem; padding-left: 5px; padding-right: 5px; - padding-top: 20px !important; - padding-bottom: 20px !important; + @include media-breakpoint-up(sm) { + font-size: 1.8rem; + padding-top: 13px !important; + padding-bottom: 13px !important; + } + @include media-breakpoint-up(xxl) { + font-size: 3rem; + padding-top: 29px !important; + padding-bottom: 29px !important; + } } .digit { diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index df4e0de..7f4684d 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -62,7 +62,7 @@ {#if !$isLoading} - + {getFlagEmoji($locale)} {languageNames[$locale]} {#each $locales as locale} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 8377a2a..2f13bbe 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -24,7 +24,15 @@ leds: [] }); - onMount(() => { + const fetchStatusData = () => { + fetch(`${PUBLIC_BASE_URL}/api/status`) + .then((res) => res.json()) + .then((data) => { + status.set(data); + }); + }; + + const fetchSettingsData = () => { fetch(PUBLIC_BASE_URL + `/api/settings`) .then((res) => res.json()) .then((data) => { @@ -41,12 +49,11 @@ } settings.set(data); }); + }; - fetch(`${PUBLIC_BASE_URL}/api/status`) - .then((res) => res.json()) - .then((data) => { - status.set(data); - }); + onMount(() => { + fetchSettingsData(); + fetchStatusData(); const evtSource = new EventSource(`${PUBLIC_BASE_URL}/events`); @@ -75,7 +82,7 @@ - +
diff --git a/src/routes/Rendered.svelte b/src/routes/Rendered.svelte index c763d4a..d46a7cd 100644 --- a/src/routes/Rendered.svelte +++ b/src/routes/Rendered.svelte @@ -6,7 +6,7 @@ }; -
+
{#each status.data as char} {#if isSplitText(char)} @@ -15,6 +15,8 @@
{part}
{/each}
+ {:else if char.length >= 3} +
{char}
{:else if char.length === 0 || char === ' '}
  
{:else} diff --git a/src/routes/Settings.svelte b/src/routes/Settings.svelte index 7854fb7..e56364d 100644 --- a/src/routes/Settings.svelte +++ b/src/routes/Settings.svelte @@ -37,6 +37,11 @@ const dispatch = createEventDispatcher(); + const handleReset = (e: Event) => { + e.preventDefault(); + dispatch('formReset'); + }; + const onSave = async (e: Event) => { e.preventDefault(); let formSettings = $settings; @@ -112,7 +117,13 @@ - + {$_('time.minutes')} @@ -123,7 +134,13 @@ > - + {$_('time.minutes')} @@ -134,7 +151,13 @@ > - + {$_('time.seconds')} {$_('section.settings.shortAmountsWarning')} @@ -300,7 +323,7 @@ {/each} {/if} - + diff --git a/src/routes/Status.svelte b/src/routes/Status.svelte index 640df60..fb3b022 100644 --- a/src/routes/Status.svelte +++ b/src/routes/Status.svelte @@ -106,6 +106,7 @@ {$_('section.status.screenCycle')}: { await page.route('*/**/api/status', async (route) => { - const json = { - currentScreen: 0, - numScreens: 7, - timerRunning: true, - espUptime: 4479, - espFreeHeap: 58508, - espHeapSize: 342108, - connectionStatus: { price: true, blocks: true }, - rssi: -66, - data: ['BLOCK/HEIGHT', '8', '1', '8', '0', '2', '6'], - rendered: ['BLOCK/HEIGHT', '8', '1', '8', '0', '2', '6'], - leds: [ - { red: 0, green: 0, blue: 0, hex: '#000000' }, - { red: 0, green: 0, blue: 0, hex: '#000000' }, - { red: 0, green: 0, blue: 0, hex: '#000000' }, - { red: 0, green: 0, blue: 0, hex: '#000000' } - ] - }; - await route.fulfill({ json }); + await route.fulfill({ json: statusJson }); }); await page.route('*/**/api/settings', async (route) => { const json = { @@ -60,24 +61,117 @@ test.beforeEach(async ({ page }) => { }; await route.fulfill({ json }); }); + + await page.route('**/events', (route) => { + //statusJson.data = ['S', 'S', 'E', 'V', 'E', 'N', 'T']; + + // Respond with a custom SSE message + route.fulfill({ + status: 200, + contentType: 'text/event-stream', + body: `data: ${JSON.stringify(statusJson)}\n\n` + }); + }); }); -test('index page has expected status', async ({ page }) => { +test('index page has expected columns control, status, settings', async ({ page }) => { await page.goto('/'); + await expect(page.getByRole('heading', { name: 'Control' })).toBeVisible(); await expect(page.getByRole('heading', { name: 'Status' })).toBeVisible(); -}); - -test('index page has expected settings', async ({ page }) => { - await page.goto('/'); await expect(page.getByRole('heading', { name: 'Settings' })).toBeVisible(); }); -test('index page has expected control', async ({ page }) => { +test('index page has working language selector', async ({ page }) => { await page.goto('/'); - await expect(page.getByRole('heading', { name: 'Control' })).toBeVisible(); + await expect(page.locator('//*[@id="nav-language-dropdown"]/a')).toBeVisible(); + page.locator('//*[@id="nav-language-dropdown"]/a').click(); + await expect(page.locator('//*[@id="nav-language-dropdown"]/div/button[1]')).toBeVisible(); + page.locator('//*[@id="nav-language-dropdown"]/div/button[2]').click(); + await expect(page.getByRole('heading', { name: 'Instellingen' })).toBeVisible(); + page.locator('//*[@id="nav-language-dropdown"]/a').click(); + page.locator('//*[@id="nav-language-dropdown"]/div/button[3]').click(); + await expect(page.getByRole('heading', { name: 'Configuración' })).toBeVisible(); }); test('api page has expected load button', async ({ page }) => { await page.goto('/api'); await expect(page.getByRole('button', { name: 'Load' })).toBeVisible(); }); + +test('timezone can be negative, zero and positive', async ({ page }) => { + await page.goto('/'); + const tzOffsetField = 'input#tzOffset'; + + for (const val of ['-10', '0', '42']) { + await page.fill(tzOffsetField, val); + const resultValue = await page.$eval(tzOffsetField, (input: HTMLInputElement) => input.value); + expect(resultValue).toBe(val); + await page.getByRole('button', { name: 'Save' }).click(); + } +}); + +test('time values can not be zero or negative', async ({ page }) => { + await page.goto('/'); + + for (const field of ['#timePerScreen', '#fullRefreshMin', '#minSecPriceUpd']) { + for (const val of ['42', '210']) { + await page.fill(field, val); + const resultValue = await page.$eval(field, (input: HTMLInputElement) => input.value); + expect(resultValue).toBe(val); + await page.getByRole('button', { name: 'Save' }).click(); + const validationMessage = await page.$eval( + field, + (input: HTMLInputElement) => input.validationMessage + ); + expect(validationMessage).not.toContain('Value must be greater'); + } + + for (const val of ['-10', '0']) { + await page.fill(field, val); + const resultValue = await page.$eval(field, (input: HTMLInputElement) => input.value); + expect(resultValue).toBe(val); + await page.getByRole('button', { name: 'Save' }).click(); + const validationMessage = await page.$eval( + field, + (input: HTMLInputElement) => input.validationMessage + ); + expect(validationMessage).toContain('Value must be greater'); + } + } +}); + +test('info message when fetch eur price is enabled', async ({ page }) => { + await page.goto('/'); + const inputField = 'input#fetchEurPrice'; + const switchElement = await page.$(inputField); + + expect(switchElement).toBeTruthy(); + const isSwitchEnabled = await switchElement.isChecked(); + expect(isSwitchEnabled).toBe(false); + + await expect(page.getByText('the WS Price connection will show')).toBeHidden(); + + await switchElement.click(); + const isSwitchNowEnabled = await switchElement.isChecked(); + expect(isSwitchNowEnabled).toBe(true); + + await expect(page.getByText('the WS Price connection will show')).toBeVisible(); +}); + +test('parse all types of EPD content correctly', async ({ page }) => { + statusJson.data[2] = '123'; + + await page.goto('/'); + + await expect(page.getByRole('heading', { name: 'Status' })).toBeVisible(); + await page.waitForSelector('#timerStatusText:has-text("running")'); + await page.waitForSelector('#btclock-wrapper > div > div:nth-child(1)'); + + expect(statusJson.data[0]).toContain('/'); + await expect(page.locator('#btclock-wrapper > div > div:nth-child(1)')).toBeTruthy(); + await expect(page.locator('#btclock-wrapper > div > div:nth-child(1)')).toHaveClass('splitText'); + expect(statusJson.data[1]).toHaveLength(1); + await expect(page.locator('#btclock-wrapper > div > div:nth-child(2)')).toHaveClass('digit'); + expect(statusJson.data[2]).toHaveLength(3); + await expect(page.locator('#btclock-wrapper > div > div:nth-child(3)')).toHaveClass('mediumText'); +}); -- 2.45.2 From 51366f27e815459eae78b2bda71ee90671415e15 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sat, 25 Nov 2023 22:56:20 +0100 Subject: [PATCH 027/114] Push releases to webflasher --- .github/workflows/workflow.yml | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 3f80740..69b9a76 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -94,20 +94,33 @@ jobs: - name: Create tarball run: tar czf webui.tgz --strip-components=1 dist - name: Build LittleFS - run: /tmp/mklittlefs/mklittlefs -c build_gz -s 409600 littlefs.bin + run: mkdir -p output && /tmp/mklittlefs/mklittlefs -c build_gz -s 409600 output/littlefs.bin - name: Upload artifacts uses: actions/upload-artifact@v3 with: path: | webui.tgz - littlefs.bin + output/littlefs.bin - name: Create release uses: ncipollo/release-action@v1 with: tag: ${{ steps.getBlockHeight.outputs.blockHeight }} commit: main name: release-${{ steps.getBlockHeight.outputs.blockHeight }} - artifacts: 'littlefs.bin,webui.tgz' + artifacts: 'output/littlefs.bin,webui.tgz' allowUpdates: true removeArtifacts: true makeLatest: true + - name: Pushes littlefs.bin to web flasher + id: push_directory + uses: cpina/github-action-push-to-another-repository@main + env: + SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }} + with: + source-directory: output/ + target-directory: webui/ + destination-github-username: 'btclock' + destination-repository-name: 'web-flasher' + target-branch: btclock + user-name: ${{github.actor}} + user-email: ${{github.actor}}@users.noreply.github.com -- 2.45.2 From 655c2764e8f79bb202f3a3c275d6bfbd935fdb00 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 26 Nov 2023 02:01:50 +0100 Subject: [PATCH 028/114] Added more tests --- .github/workflows/workflow.yml | 4 + tests/test.ts | 145 ++++++++++++++++++++++++--------- 2 files changed, 111 insertions(+), 38 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 69b9a76..9ab8dd4 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -74,6 +74,10 @@ jobs: - name: Get current block id: getBlockHeight run: echo "blockHeight=$(curl -s https://mempool.space/api/blocks/tip/height)" >> $GITHUB_OUTPUT + - name: Write block height to file + env: + BLOCK_HEIGHT: ${{ steps.getBlockHeight.outputs.blockHeight }} + run: echo "$BLOCK_HEIGHT" > output/version.txt - name: gzip build for LittleFS run: find dist -type f ! -name ".*" -exec sh -c 'mkdir -p "build_gz/$(dirname "${1#dist/}")" && gzip -k "$1" -c > "build_gz/${1#dist/}".gz' _ {} \; - name: Check GZipped directory size diff --git a/tests/test.ts b/tests/test.ts index 662b0c9..864e8a3 100644 --- a/tests/test.ts +++ b/tests/test.ts @@ -19,57 +19,86 @@ const statusJson = { ] }; +const settingsJson = { + numScreens: 7, + fgColor: 415029, + bgColor: 0, + timerSeconds: 1800, + timerRunning: true, + minSecPriceUpd: 30, + fullRefreshMin: 60, + wpTimeout: 600, + tzOffset: 0, + useBitcoinNode: false, + mempoolInstance: 'mempool.space', + ledTestOnPower: true, + ledFlashOnUpd: true, + ledBrightness: 128, + stealFocus: true, + mcapBigChar: true, + mdnsEnabled: true, + otaEnabled: true, + fetchEurPrice: false, + hostnamePrefix: 'btclock', + hostname: 'btclock-d60b14', + ip: '192.168.20.231', + txPower: 78, + gitRev: '25d8b92bcbc8938417c140355ea3ba99ff9eb4b7', + lastBuildTime: '1700666677', + screens: [ + { id: 0, name: 'Block Height', enabled: true }, + { id: 1, name: 'Sats per dollar', enabled: true }, + { id: 2, name: 'Ticker', enabled: true }, + { id: 3, name: 'Time', enabled: true }, + { id: 4, name: 'Halving countdown', enabled: true }, + { id: 5, name: 'Market Cap', enabled: true } + ] +}; + test.beforeEach(async ({ page }) => { await page.route('*/**/api/status', async (route) => { await route.fulfill({ json: statusJson }); }); + + await page.route('*/**/api/show/screen/1', async (route) => { + //if (route.request().url().includes('*/**/api/show/screen/1')) { + statusJson.currentScreen = 1; + statusJson.data = ['MSCW/TIME', ' ', ' ', '2', '6', '4', '4']; + statusJson.rendered = statusJson.data; + //} + + await route.fulfill({ json: statusJson }); + }); + + await page.route('*/**/api/show/screen/2', async (route) => { + statusJson.currentScreen = 2; + (statusJson.data = ['BTC/USD', '$', '3', '7', '8', '2', '4']), + (statusJson.rendered = statusJson.data); + + await route.fulfill({ json: statusJson }); + }); + + await page.route('*/**/api/show/screen/4', async (route) => { + statusJson.currentScreen = 4; + (statusJson.data = ['BIT/COIN', 'HALV/ING', '0/YRS', '149/DAYS', '8/HRS', '30/MINS', 'TO/GO']), + (statusJson.rendered = statusJson.data); + + await route.fulfill({ json: statusJson }); + }); + await page.route('*/**/api/settings', async (route) => { - const json = { - numScreens: 7, - fgColor: 415029, - bgColor: 0, - timerSeconds: 1800, - timerRunning: true, - minSecPriceUpd: 30, - fullRefreshMin: 60, - wpTimeout: 600, - tzOffset: 0, - useBitcoinNode: false, - mempoolInstance: 'mempool.space', - ledTestOnPower: true, - ledFlashOnUpd: true, - ledBrightness: 128, - stealFocus: true, - mcapBigChar: true, - mdnsEnabled: true, - otaEnabled: true, - fetchEurPrice: false, - hostnamePrefix: 'btclock', - hostname: 'btclock-d60b14', - ip: '192.168.20.231', - txPower: 78, - gitRev: '25d8b92bcbc8938417c140355ea3ba99ff9eb4b7', - lastBuildTime: '1700666677', - screens: [ - { id: 0, name: 'Block Height', enabled: true }, - { id: 1, name: 'Sats per dollar', enabled: true }, - { id: 2, name: 'Ticker', enabled: true }, - { id: 3, name: 'Time', enabled: true }, - { id: 4, name: 'Halving countdown', enabled: true }, - { id: 5, name: 'Market Cap', enabled: true } - ] - }; - await route.fulfill({ json }); + await route.fulfill({ json: settingsJson }); }); await page.route('**/events', (route) => { - //statusJson.data = ['S', 'S', 'E', 'V', 'E', 'N', 'T']; + const newStatus = statusJson; + newStatus.data = ['BLOCK/HEIGHT', '8', '0', '0', '8', '1', '5']; // Respond with a custom SSE message route.fulfill({ status: 200, contentType: 'text/event-stream', - body: `data: ${JSON.stringify(statusJson)}\n\n` + json: `${JSON.stringify(newStatus)}\n\n` }); }); }); @@ -158,9 +187,31 @@ test('info message when fetch eur price is enabled', async ({ page }) => { await expect(page.getByText('the WS Price connection will show')).toBeVisible(); }); +test('screens should be able to change', async ({ page }) => { + await page.goto('/'); + await expect(page.getByRole('button', { name: 'Sats per Dollar' })).toBeVisible(); + const responsePromise = page.waitForRequest('*/**/api/show/screen/*'); + + await page.getByRole('button', { name: 'Sats per Dollar' }).click(); + const response = await responsePromise; + expect(response.url()).toContain('api/show/screen/1'); +}); + test('parse all types of EPD content correctly', async ({ page }) => { statusJson.data[2] = '123'; + await page.route('**/events', (route) => { + const newStatus = statusJson; + newStatus.data = ['BLOCK/HEIGHT', '8', '123', '0', '8', '1', '5']; + + // Respond with a custom SSE message + route.fulfill({ + status: 200, + contentType: 'text/event-stream', + json: `${JSON.stringify(newStatus)}\n\n` + }); + }); + await page.goto('/'); await expect(page.getByRole('heading', { name: 'Status' })).toBeVisible(); @@ -175,3 +226,21 @@ test('parse all types of EPD content correctly', async ({ page }) => { expect(statusJson.data[2]).toHaveLength(3); await expect(page.locator('#btclock-wrapper > div > div:nth-child(3)')).toHaveClass('mediumText'); }); + +test('should work with more than 7 screens', async ({ page }) => { + statusJson.data[2] = '1'; + statusJson.numScreens = 9; + settingsJson.numScreens = 9; + statusJson.data.splice(1, 0, ' ', ' '); + + await page.goto('/'); + + await expect(page.getByRole('heading', { name: 'Status' })).toBeVisible(); + await page.waitForSelector('#timerStatusText:has-text("running")'); + await expect(page.locator('#btclock-wrapper > div > div:nth-child(9)')).toBeTruthy(); + + await expect(page.locator('#customText')).toHaveAttribute( + 'maxlength', + statusJson.numScreens.toString() + ); +}); -- 2.45.2 From e7f3e7a1a6e6f7ca3accaf191e5a9151dd7f1162 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sun, 26 Nov 2023 02:06:24 +0100 Subject: [PATCH 029/114] Fix workflow --- .github/workflows/workflow.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 9ab8dd4..9e07267 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -77,7 +77,7 @@ jobs: - name: Write block height to file env: BLOCK_HEIGHT: ${{ steps.getBlockHeight.outputs.blockHeight }} - run: echo "$BLOCK_HEIGHT" > output/version.txt + run: mkdir -p output && echo "$BLOCK_HEIGHT" > output/version.txt - name: gzip build for LittleFS run: find dist -type f ! -name ".*" -exec sh -c 'mkdir -p "build_gz/$(dirname "${1#dist/}")" && gzip -k "$1" -c > "build_gz/${1#dist/}".gz' _ {} \; - name: Check GZipped directory size @@ -98,7 +98,7 @@ jobs: - name: Create tarball run: tar czf webui.tgz --strip-components=1 dist - name: Build LittleFS - run: mkdir -p output && /tmp/mklittlefs/mklittlefs -c build_gz -s 409600 output/littlefs.bin + run: /tmp/mklittlefs/mklittlefs -c build_gz -s 409600 output/littlefs.bin - name: Upload artifacts uses: actions/upload-artifact@v3 with: -- 2.45.2 From 3f20d67f1abc10b20ddecfb5aa0ff4eb78c4c149 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Thu, 30 Nov 2023 21:53:37 +0100 Subject: [PATCH 030/114] Update dependencies, handle unset env better, improved translations --- src/lib/config.ts | 5 + src/lib/locales/en.json | 2 +- src/lib/locales/es.json | 2 +- src/lib/locales/nl.json | 2 +- src/routes/+page.svelte | 2 +- src/routes/Control.svelte | 2 +- src/routes/Settings.svelte | 2 +- src/routes/Status.svelte | 2 +- yarn.lock | 876 ++++++++++++++++++++++--------------- 9 files changed, 528 insertions(+), 367 deletions(-) create mode 100644 src/lib/config.ts diff --git a/src/lib/config.ts b/src/lib/config.ts new file mode 100644 index 0000000..55130ff --- /dev/null +++ b/src/lib/config.ts @@ -0,0 +1,5 @@ +import * as publicEnv from '$env/static/public'; + +export const PUBLIC_BASE_URL: string = Object.hasOwn(publicEnv, 'PUBLIC_BASE_URL') + ? publicEnv.PUBLIC_BASE_URL + : ''; diff --git a/src/lib/locales/en.json b/src/lib/locales/en.json index ca82f1f..8d95254 100644 --- a/src/lib/locales/en.json +++ b/src/lib/locales/en.json @@ -18,7 +18,7 @@ "otaUpdates": "OTA updates", "enableMdns": "mDNS", "fetchEuroPrice": "Fetch € price", - "shortAmountsWarning": "Short amounts might shorten lifespan.", + "shortAmountsWarning": "Short amounts might shorten lifespan of the displays", "tzOffsetHelpText": "A restart is required to apply TZ offset.", "screens": "Screens", "wifiTxPowerText": "In most cases this does not need to be set.", diff --git a/src/lib/locales/es.json b/src/lib/locales/es.json index f2dd7af..b6cdcc5 100644 --- a/src/lib/locales/es.json +++ b/src/lib/locales/es.json @@ -6,7 +6,7 @@ "backgroundColor": "Color de fondo", "ledBrightness": "Brillo LED", "screens": "Pantallas", - "shortAmountsWarning": "Cantidades pequeñas pueden acortar la vida útil.", + "shortAmountsWarning": "Pequeñas cantidades pueden acortar la vida útil de los displays", "fullRefreshEvery": "Actualización completa cada", "timePerScreen": "Tiempo por pantalla", "tzOffsetHelpText": "Es necesario reiniciar para aplicar la compensación.", diff --git a/src/lib/locales/nl.json b/src/lib/locales/nl.json index adace01..f058294 100644 --- a/src/lib/locales/nl.json +++ b/src/lib/locales/nl.json @@ -9,7 +9,7 @@ "ledBrightness": "LED helderheid", "timePerScreen": "Tijd per scherm", "fullRefreshEvery": "Volledig verversen elke", - "shortAmountsWarning": "Lage waardes verkorten levensduur", + "shortAmountsWarning": "Lage waardes verkorten mogelijk levensduur schermen", "tzOffsetHelpText": "Herstart nodig voor toepassen afwijking.", "enableMdns": "mDNS", "ledPowerOnTest": "LED test bij aanzetten", diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 2f13bbe..4bc81ca 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,5 +1,5 @@ - ₿TClock + BTClock diff --git a/src/routes/Control.svelte b/src/routes/Control.svelte index 01c41a0..84d0cd6 100644 --- a/src/routes/Control.svelte +++ b/src/routes/Control.svelte @@ -55,6 +55,14 @@ fetch(`${PUBLIC_BASE_URL}/api/lights/off`).catch(() => {}); }; + const turnOnFrontlight = () => { + fetch(`${PUBLIC_BASE_URL}/api/frontlight/on`).catch(() => {}); + }; + + const turnOffFrontlight = () => { + fetch(`${PUBLIC_BASE_URL}/api/frontlight/off`).catch(() => {}); + }; + const restartClock = () => { fetch(`${PUBLIC_BASE_URL}/api/restart`).catch(() => {}); }; @@ -146,6 +154,14 @@
{/if} + {#if $settings.hasFrontlight} +

{$_('section.control.frontlight')}

+ + +
+ {/if}

{$_('section.control.systemInfo')}